75 if(len+1 >= buf->
cap) {
85 int len = strlen(
string);
86 _buf_cap(buf, buf->
len + len);
95 if(buf != NULL) buf->
len = 0;
102 _buf_cap(buf, buf->
len + 1);
105 buf->
str[buf->
len] =
'\0';
115 _buf_cap(buf, buf->
len + len);
116 avl = buf->
cap - buf->
len;
117 len = vsnprintf(&buf->
str[buf->
len], avl, fmt, ap);
127 __attribute__ ((format (printf, 2, 3)));
143 while( (c = fgetc(f)) != EOF) {
153 if(a)
return b ? strcmp(a->
str, b->
str) : 1;
159 if ( buf->
len <= 1 ) {
164 char * q = buf->
str + buf->
len - 1;
165 while((p-buf->
str) < buf->
len) {
166 if ( ! ( (*p ==
' ') || (*p ==
'\n') || (*p ==
'\r') || (*p == 13) || (*p == 10) || (*p ==
'\t') ) ) {
172 if ( ! ( (*q ==
' ') || (*q == 10) || (*q == 13) || (*q ==
'\t') ) ) {
178 unsigned long realLen = ( q - p ) + 1;
179 if ( p != buf->
str ) {
180 memmove( buf->
str, p, realLen );
183 *(buf->
str + realLen) = 0;
188static inline char _toUpper(
char a) {
189 return (a>=
'a' && a<=
'z') ? a-
'a'+
'A' : a;
193static inline int _eol(
char c) {
194 return c==
'\0' || c==
'\n';
198static inline int _eq(
char pat,
char txt) {
199 return (pat<=
' ') ? (txt<=
' ') : (_toUpper(pat)==_toUpper(txt));
202#define TMP_BUF_POOL 128
203static struct tmp_buf_pool {
212static unsigned int tmp_buf_hash(
unsigned int key) {
213 key ^= (key<<17) | (key>>16);
219 int hash = tmp_buf_hash(((intptr_t)key1)*31 + key2) %
TMP_BUF_POOL;
220 struct tmp_buf_pool *tmp = &tmp_buf_pool[hash];
223 while(tmp->buf!=NULL && (tmp->key1!=key1 || tmp->key2!=key2)) {
230 if(tmp->buf == NULL) {
232 fprintf(stderr,
"TMP_BUF_POOL to short\n");
244 struct tmp_buf_pool *tmp = &tmp_buf_pool[0];
246 if(tmp->key1 == key1) tmp->buf =
po_buf_del(tmp->buf);
252 char *s = _s->
str, *t = _t->
str;
254 while(!_eol(*s) && !_eol(*t) && _eq(*s,*t)) {
258 return _eol(*s) && _eol(*t) ? 0 : _eol(*s) ? 1 : -1;
273 const char *s = _buf->
str, *p = _pattern;
276 va_start(ap, _pattern);
278 while(!_eol(*s) && *p) {
279 if(*p==
' ') {
while(*p==
' ') ++p;
284 while(!_eol(*s) && _eq(
' ', *s)) ++s;
287 while(!_eol(*s) && !_eq(*p, *s)) ++s;
292 }
else if( *p==
'*' ) {
293 if ( *(p+1) ==
'*' ) {
306 while(!_eol(*s) && !_eq(*p, *s))
po_buf_add(m, *s++);
311 }
else if(_toUpper(*s++) != _toUpper(*p++)) {
319 return *p==
'\0' ? ret : NULL;
327 if ( ( (*s) <
'0' || (*s) >
'9' ) && ( (*s) <
'a' || (*s) >
'f' ) && ( (*s) <
'A' || (*s) >
'Z' ) )
343 variable->
name = strdup( _name );
352 if ( strcmp( _name, variable->
name ) == 0 ) {
355 variable = variable->
next;
POBuffer po_buf_match(POBuffer _buf, const char *_pattern,...)
POVariable * po_var_register(char *_name)
POBuffer po_buf_new(int size)
POBuffer po_buf_printf(POBuffer buf, const char *fmt,...)
int po_buf_strcmp(POBuffer _s, POBuffer _t)
POBuffer po_buf_cpy(POBuffer buf, char *string)
POBuffer tmp_buf(void *key1, unsigned int key2)
POBuffer po_buf_del(POBuffer buf)
void tmp_buf_clr(void *key1)
POBuffer po_buf_add(POBuffer buf, char c)
POVariable * po_var_lookup(char *_name)
int po_buf_is_hex(POBuffer _s)
int po_buf_trim(POBuffer buf)
POBuffer po_buf_vprintf(POBuffer buf, const char *fmt, va_list ap)
POBuffer po_buf_cat(POBuffer buf, char *string)
int po_buf_cmp(POBuffer a, POBuffer b)
POVariable * po_var_find(char *_name)
POBuffer po_buf_fgets(POBuffer buf, FILE *f)
struct _POVariable * next
#define MAX_TEMPORARY_STORAGE
struct _POVariable POVariable
struct _POBuffer * POBuffer
char * strcopy(char *_dest, char *_source)