29 #define UTSTRING_VERSION 1.9.9
32 #define _UNUSED_ __attribute__ ((__unused__))
41 #define oom() exit(-1)
49 #define utstring_reserve(s,amt) \
51 if (((s)->n - (s)->i) < (size_t)(amt)) { \
52 (s)->d = (char*)realloc((s)->d, (s)->n + amt); \
53 if ((s)->d == NULL) oom(); \
58 #define utstring_init(s) \
60 (s)->n = 0; (s)->i = 0; (s)->d = NULL; \
61 utstring_reserve(s,100); \
65 #define utstring_done(s) \
67 if ((s)->d != NULL) free((s)->d); \
71 #define utstring_free(s) \
77 #define utstring_new(s) \
79 s = (UT_string*)calloc(sizeof(UT_string),1); \
84 #define utstring_renew(s) \
93 #define utstring_clear(s) \
99 #define utstring_bincpy(s,b,l) \
101 utstring_reserve((s),(l)+1); \
102 if (l) memcpy(&(s)->d[(s)->i], b, l); \
104 (s)->d[(s)->i]='\0'; \
107 #define utstring_concat(dst,src) \
109 utstring_reserve((dst),((src)->i)+1); \
110 if ((src)->i) memcpy(&(dst)->d[(dst)->i], (src)->d, (src)->i); \
111 (dst)->i += (src)->i; \
112 (dst)->d[(dst)->i]='\0'; \
115 #define utstring_len(s) ((unsigned)((s)->i))
117 #define utstring_body(s) ((s)->d)
128 n = vsnprintf (&s->
d[s->
i], s->
n-s->
i, fmt, cp);
131 if ((n > -1) && ((
size_t) n < (s->
n-s->
i))) {
158 const char *P_Needle,
167 while (i < (
long) P_NeedleLen)
169 while ( (j > -1) && (P_Needle[i] != P_Needle[j]) )
175 if (i < (
long) P_NeedleLen)
177 if (P_Needle[i] == P_Needle[j])
179 P_KMP_Table[i] = P_KMP_Table[j];
198 const char *P_Needle,
206 P_KMP_Table[i + 1] = j;
209 while ( (j < (
long) P_NeedleLen) && (P_Needle[i] != P_Needle[j]) )
211 j = P_KMP_Table[j + 1];
217 if (P_Needle[i] == P_Needle[j])
219 P_KMP_Table[i + 1] = P_KMP_Table[j + 1];
223 P_KMP_Table[i + 1] = j;
228 P_KMP_Table[i + 1] = j;
238 const char *P_Haystack,
239 size_t P_HaystackLen,
240 const char *P_Needle,
245 long V_FindPosition = -1;
249 while ( (j < (
int)P_HaystackLen) && (((P_HaystackLen - j) + i) >= P_NeedleLen) )
251 while ( (i > -1) && (P_Needle[i] != P_Haystack[j]) )
257 if (i >= (
int)P_NeedleLen)
260 V_FindPosition = j - i;
265 return V_FindPosition;
271 const char *P_Haystack,
272 size_t P_HaystackLen,
273 const char *P_Needle,
278 long V_FindPosition = -1;
281 j = (P_HaystackLen - 1);
282 i = (P_NeedleLen - 1);
283 while ( (j >= 0) && (j >= i) )
285 while ( (i < (
int)P_NeedleLen) && (P_Needle[i] != P_Haystack[j]) )
287 i = P_KMP_Table[i + 1];
294 V_FindPosition = j + 1;
299 return V_FindPosition;
306 long P_StartPosition,
307 const char *P_Needle,
310 long V_StartPosition;
313 long V_FindPosition = -1;
315 if (P_StartPosition < 0)
317 V_StartPosition = s->
i + P_StartPosition;
321 V_StartPosition = P_StartPosition;
323 V_HaystackLen = s->
i - V_StartPosition;
324 if ( (V_HaystackLen >= (
long) P_NeedleLen) && (P_NeedleLen > 0) )
326 V_KMP_Table = (
long *)malloc(
sizeof(
long) * (P_NeedleLen + 1));
327 if (V_KMP_Table !=
NULL)
336 if (V_FindPosition >= 0)
338 V_FindPosition += V_StartPosition;
345 return V_FindPosition;
352 long P_StartPosition,
353 const char *P_Needle,
356 long V_StartPosition;
359 long V_FindPosition = -1;
361 if (P_StartPosition < 0)
363 V_StartPosition = s->
i + P_StartPosition;
367 V_StartPosition = P_StartPosition;
369 V_HaystackLen = V_StartPosition + 1;
370 if ( (V_HaystackLen >= (
long) P_NeedleLen) && (P_NeedleLen > 0) )
372 V_KMP_Table = (
long *)malloc(
sizeof(
long) * (P_NeedleLen + 1));
373 if (V_KMP_Table !=
NULL)
387 return V_FindPosition;
static long _utstring_findR(const char *P_Haystack, size_t P_HaystackLen, const char *P_Needle, size_t P_NeedleLen, long *P_KMP_Table)
static void utstring_printf_va(UT_string *s, const char *fmt, va_list ap)
static long _utstring_find(const char *P_Haystack, size_t P_HaystackLen, const char *P_Needle, size_t P_NeedleLen, long *P_KMP_Table)
static long utstring_find(UT_string *s, long P_StartPosition, const char *P_Needle, size_t P_NeedleLen)
static void utstring_printf(UT_string *s, const char *fmt,...)
static long utstring_findR(UT_string *s, long P_StartPosition, const char *P_Needle, size_t P_NeedleLen)
static void _utstring_BuildTableR(const char *P_Needle, size_t P_NeedleLen, long *P_KMP_Table)
static void _utstring_BuildTable(const char *P_Needle, size_t P_NeedleLen, long *P_KMP_Table)
void __attribute__((weak))
#define utstring_reserve(s, amt)