Lines Matching +full:sub +full:-
32 * Memory-efficient string handling.
36 /* A read-only string that may need to be freed after use. */
42 /* A read-only range of a character array, NOT null-terminated. */
102 free(fstr->freeIt); in FStr_Done()
104 fstr->str = NULL; in FStr_Done()
105 fstr->freeIt = NULL; in FStr_Done()
113 Substring sub; in Substring_Init() local
115 sub.start = start; in Substring_Init()
116 sub.end = end; in Substring_Init()
117 return sub; in Substring_Init()
127 Substring_Length(Substring sub) in Substring_Length() argument
129 return (size_t)(sub.end - sub.start); in Substring_Length()
133 Substring_IsEmpty(Substring sub) in Substring_IsEmpty() argument
135 return sub.start == sub.end; in Substring_IsEmpty()
139 Substring_Equals(Substring sub, const char *str) in Substring_Equals() argument
142 return Substring_Length(sub) == len && in Substring_Equals()
143 memcmp(sub.start, str, len) == 0; in Substring_Equals()
147 Substring_Eq(Substring sub, Substring str) in Substring_Eq() argument
149 size_t len = Substring_Length(sub); in Substring_Eq()
151 memcmp(sub.start, str.start, len) == 0; in Substring_Eq()
155 Substring_HasPrefix(Substring sub, Substring prefix) in Substring_HasPrefix() argument
157 return Substring_Length(sub) >= Substring_Length(prefix) && in Substring_HasPrefix()
158 memcmp(sub.start, prefix.start, Substring_Length(prefix)) == 0; in Substring_HasPrefix()
162 Substring_HasSuffix(Substring sub, Substring suffix) in Substring_HasSuffix() argument
165 return Substring_Length(sub) >= suffixLen && in Substring_HasSuffix()
166 memcmp(sub.end - suffixLen, suffix.start, suffixLen) == 0; in Substring_HasSuffix()
169 /* Returns an independent, null-terminated copy of the substring. */
171 Substring_Str(Substring sub) in Substring_Str() argument
173 if (Substring_IsEmpty(sub)) in Substring_Str()
175 return FStr_InitOwn(bmake_strsedup(sub.start, sub.end)); in Substring_Str()
179 Substring_SkipFirst(Substring sub, char ch) in Substring_SkipFirst() argument
183 for (p = sub.start; p != sub.end; p++) in Substring_SkipFirst()
186 return sub.start; in Substring_SkipFirst()
190 Substring_FindLast(Substring sub, char ch) in Substring_FindLast() argument
194 for (p = sub.end; p != sub.start; p--) in Substring_FindLast()
195 if (p[-1] == ch) in Substring_FindLast()
196 return p - 1; in Substring_FindLast()
205 for (p = pathname.end; p != pathname.start; p--) in Substring_Dirname()
206 if (p[-1] == '/') in Substring_Dirname()
207 return Substring_Init(pathname.start, p - 1); in Substring_Dirname()
216 for (p = pathname.end; p != pathname.start; p--) in Substring_Basename()
217 if (p[-1] == '/') in Substring_Basename()
226 buf->data = NULL; in LazyBuf_Init()
227 buf->len = 0; in LazyBuf_Init()
228 buf->cap = 0; in LazyBuf_Init()
229 buf->expected = expected; in LazyBuf_Init()
235 free(buf->data); in LazyBuf_Done()
242 if (buf->data != NULL) { in LazyBuf_Add()
243 if (buf->len == buf->cap) { in LazyBuf_Add()
244 buf->cap *= 2; in LazyBuf_Add()
245 buf->data = bmake_realloc(buf->data, buf->cap); in LazyBuf_Add()
247 buf->data[buf->len++] = ch; in LazyBuf_Add()
249 } else if (ch == buf->expected[buf->len]) { in LazyBuf_Add()
250 buf->len++; in LazyBuf_Add()
254 buf->cap = buf->len + 16; in LazyBuf_Add()
255 buf->data = bmake_malloc(buf->cap); in LazyBuf_Add()
256 memcpy(buf->data, buf->expected, buf->len); in LazyBuf_Add()
257 buf->data[buf->len++] = ch; in LazyBuf_Add()
271 LazyBuf_AddSubstring(LazyBuf *buf, Substring sub) in LazyBuf_AddSubstring() argument
275 for (p = sub.start; p != sub.end; p++) in LazyBuf_AddSubstring()
282 const char *start = buf->data != NULL ? buf->data : buf->expected; in LazyBuf_Get()
283 return Substring_Init(start, start + buf->len); in LazyBuf_Get()
294 if (buf->data != NULL) { in LazyBuf_DoneGet()
296 return FStr_InitOwn(buf->data); in LazyBuf_DoneGet()
317 w->words = NULL; in SubstringWords_Init()
318 w->len = 0; in SubstringWords_Init()
319 w->freeIt = NULL; in SubstringWords_Init()