annotate PsiCLASS-1.0.2/samtools-0.1.19/kstring.h @ 0:903fc43d6227 draft default tip

Uploaded
author lsong10
date Fri, 26 Mar 2021 16:52:45 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
1 /* The MIT License
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
2
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
3 Copyright (c) by Attractive Chaos <attractor@live.co.uk>
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
4
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
5 Permission is hereby granted, free of charge, to any person obtaining
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
6 a copy of this software and associated documentation files (the
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
7 "Software"), to deal in the Software without restriction, including
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
8 without limitation the rights to use, copy, modify, merge, publish,
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
9 distribute, sublicense, and/or sell copies of the Software, and to
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
10 permit persons to whom the Software is furnished to do so, subject to
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
11 the following conditions:
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
12
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
13 The above copyright notice and this permission notice shall be
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
14 included in all copies or substantial portions of the Software.
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
15
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
17 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
18 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
19 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
20 BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
21 ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
22 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
23 SOFTWARE.
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
24 */
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
25
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
26 #ifndef KSTRING_H
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
27 #define KSTRING_H
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
28
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
29 #include <stdlib.h>
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
30 #include <string.h>
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
31 #include <stdint.h>
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
32
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
33 #ifndef kroundup32
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
34 #define kroundup32(x) (--(x), (x)|=(x)>>1, (x)|=(x)>>2, (x)|=(x)>>4, (x)|=(x)>>8, (x)|=(x)>>16, ++(x))
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
35 #endif
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
36
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
37 #ifndef KSTRING_T
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
38 #define KSTRING_T kstring_t
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
39 typedef struct __kstring_t {
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
40 size_t l, m;
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
41 char *s;
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
42 } kstring_t;
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
43 #endif
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
44
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
45 typedef struct {
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
46 uint64_t tab[4];
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
47 int sep, finished;
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
48 const char *p; // end of the current token
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
49 } ks_tokaux_t;
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
50
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
51 #ifdef __cplusplus
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
52 extern "C" {
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
53 #endif
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
54
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
55 int ksprintf(kstring_t *s, const char *fmt, ...);
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
56 int ksplit_core(char *s, int delimiter, int *_max, int **_offsets);
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
57 char *kstrstr(const char *str, const char *pat, int **_prep);
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
58 char *kstrnstr(const char *str, const char *pat, int n, int **_prep);
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
59 void *kmemmem(const void *_str, int n, const void *_pat, int m, int **_prep);
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
60
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
61 /* kstrtok() is similar to strtok_r() except that str is not
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
62 * modified and both str and sep can be NULL. For efficiency, it is
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
63 * actually recommended to set both to NULL in the subsequent calls
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
64 * if sep is not changed. */
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
65 char *kstrtok(const char *str, const char *sep, ks_tokaux_t *aux);
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
66
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
67 #ifdef __cplusplus
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
68 }
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
69 #endif
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
70
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
71 static inline void ks_resize(kstring_t *s, size_t size)
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
72 {
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
73 if (s->m < size) {
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
74 s->m = size;
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
75 kroundup32(s->m);
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
76 s->s = (char*)realloc(s->s, s->m);
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
77 }
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
78 }
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
79
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
80 static inline int kputsn(const char *p, int l, kstring_t *s)
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
81 {
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
82 if (s->l + l + 1 >= s->m) {
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
83 s->m = s->l + l + 2;
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
84 kroundup32(s->m);
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
85 s->s = (char*)realloc(s->s, s->m);
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
86 }
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
87 memcpy(s->s + s->l, p, l);
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
88 s->l += l;
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
89 s->s[s->l] = 0;
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
90 return l;
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
91 }
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
92
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
93 static inline int kputs(const char *p, kstring_t *s)
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
94 {
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
95 return kputsn(p, strlen(p), s);
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
96 }
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
97
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
98 static inline int kputc(int c, kstring_t *s)
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
99 {
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
100 if (s->l + 1 >= s->m) {
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
101 s->m = s->l + 2;
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
102 kroundup32(s->m);
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
103 s->s = (char*)realloc(s->s, s->m);
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
104 }
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
105 s->s[s->l++] = c;
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
106 s->s[s->l] = 0;
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
107 return c;
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
108 }
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
109
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
110 static inline int kputw(int c, kstring_t *s)
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
111 {
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
112 char buf[16];
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
113 int l, x;
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
114 if (c == 0) return kputc('0', s);
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
115 if(c < 0) for (l = 0, x = c; x < 0; x /= 10) buf[l++] = '0' - (x%10);
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
116 else for (l = 0, x = c; x > 0; x /= 10) buf[l++] = x%10 + '0';
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
117 if (c < 0) buf[l++] = '-';
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
118 if (s->l + l + 1 >= s->m) {
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
119 s->m = s->l + l + 2;
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
120 kroundup32(s->m);
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
121 s->s = (char*)realloc(s->s, s->m);
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
122 }
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
123 for (x = l - 1; x >= 0; --x) s->s[s->l++] = buf[x];
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
124 s->s[s->l] = 0;
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
125 return 0;
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
126 }
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
127
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
128 static inline int kputuw(unsigned c, kstring_t *s)
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
129 {
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
130 char buf[16];
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
131 int l, i;
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
132 unsigned x;
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
133 if (c == 0) return kputc('0', s);
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
134 for (l = 0, x = c; x > 0; x /= 10) buf[l++] = x%10 + '0';
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
135 if (s->l + l + 1 >= s->m) {
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
136 s->m = s->l + l + 2;
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
137 kroundup32(s->m);
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
138 s->s = (char*)realloc(s->s, s->m);
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
139 }
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
140 for (i = l - 1; i >= 0; --i) s->s[s->l++] = buf[i];
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
141 s->s[s->l] = 0;
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
142 return 0;
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
143 }
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
144
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
145 static inline int kputl(long c, kstring_t *s)
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
146 {
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
147 char buf[32];
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
148 long l, x;
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
149 if (c == 0) return kputc('0', s);
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
150 for (l = 0, x = c < 0? -c : c; x > 0; x /= 10) buf[l++] = x%10 + '0';
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
151 if (c < 0) buf[l++] = '-';
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
152 if (s->l + l + 1 >= s->m) {
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
153 s->m = s->l + l + 2;
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
154 kroundup32(s->m);
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
155 s->s = (char*)realloc(s->s, s->m);
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
156 }
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
157 for (x = l - 1; x >= 0; --x) s->s[s->l++] = buf[x];
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
158 s->s[s->l] = 0;
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
159 return 0;
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
160 }
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
161
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
162 static inline int *ksplit(kstring_t *s, int delimiter, int *n)
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
163 {
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
164 int max = 0, *offsets = 0;
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
165 *n = ksplit_core(s->s, delimiter, &max, &offsets);
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
166 return offsets;
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
167 }
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
168
903fc43d6227 Uploaded
lsong10
parents:
diff changeset
169 #endif