1 #ifndef EL_DOM_STRING_H
2 #define EL_DOM_STRING_H
4 #include "util/memory.h"
6 /* For now DOM has it's own little string library. Mostly because there are
7 * some memory overhead associated with util/string's block-based allocation
8 * scheme which is optimized for building strings and quickly dispose of it.
9 * Also, at some point we need to switch to use mainly UTF-8 strings for DOM
10 * and it needs to be possible to adapt the string library to that. --jonas */
14 unsigned char *string
;
17 #define INIT_DOM_STRING(strvalue, strlength) \
18 { (strlength), (strvalue) }
20 #define STATIC_DOM_STRING(strvalue) \
21 { sizeof(strvalue) - 1, (strvalue) }
24 set_dom_string(struct dom_string
*string
, unsigned char *value
, size_t length
)
26 string
->string
= value
;
27 string
->length
= length
== -1 ? strlen(value
) : length
;
31 dom_string_casecmp(const struct dom_string
*string1
, const struct dom_string
*string2
)
33 size_t length
= int_min(string1
->length
, string2
->length
);
34 size_t string_diff
= strncasecmp(string1
->string
, string2
->string
, length
);
36 /* If the lengths or strings don't match strncasecmp() does the
37 * job else return which ever is bigger. */
38 return string_diff
? string_diff
: string1
->length
- string2
->length
;
42 dom_string_ncasecmp(struct dom_string
*string1
, struct dom_string
*string2
, size_t length
)
44 return strncasecmp(string1
->string
, string2
->string
, length
);
47 #define copy_dom_string(string1, string2) \
48 set_dom_string(string1, (string2)->string, (string2)->length)
50 static inline struct dom_string
*
51 add_to_dom_string(struct dom_string
*string
, unsigned char *str
, size_t len
)
53 unsigned char *newstring
;
55 newstring
= mem_realloc(string
->string
, string
->length
+ len
+ 1);
59 string
->string
= newstring
;
60 memcpy(string
->string
+ string
->length
, str
, len
);
61 string
->length
+= len
;
62 string
->string
[string
->length
] = 0;
67 #define init_dom_string(string, str, len) add_to_dom_string(string, str, len)
69 #define is_dom_string_set(str) ((str)->string && (str)->length)
71 #define done_dom_string(str) \
72 do { mem_free_set(&(str)->string, NULL); (str)->length = 0; } while (0)
74 #define isquote(c) ((c) == '"' || (c) == '\'')