r681 - trunk
lordhavoc at icculus.org
lordhavoc at icculus.org
Mon Mar 27 04:08:46 EST 2006
Author: lordhavoc
Date: 2006-03-27 04:08:46 -0500 (Mon, 27 Mar 2006)
New Revision: 681
Modified:
trunk/nstring.c
trunk/nstring.h
Log:
added a StringKeys system which uses the minimum amount of memory to
store a database of key/value pairs, NUL separated (so anything but NUL
characters are allowed in them, unlike infostrings)
added some String_ToDouble/Vector/etc functions for convenience
Modified: trunk/nstring.c
===================================================================
--- trunk/nstring.c 2006-03-27 09:07:36 UTC (rev 680)
+++ trunk/nstring.c 2006-03-27 09:08:46 UTC (rev 681)
@@ -353,5 +353,154 @@
return out;
}
+void StringKeys_Init(NStringKeys *s, Mem_Zone *zone, NUint32 initialsize)
+{
+ memset(s, 0, sizeof(*s));
+ if (initialsize)
+ {
+ s->maxsize = initialsize;
+ s->keys = Mem_Alloc(zone, initialsize);
+ }
+}
+void StringKeys_FreeKeys(NStringKeys *s)
+{
+ s->cursize = 0;
+ s->maxsize = 0;
+ if (s->keys)
+ Mem_Free(&s->keys);
+}
+void StringKeys_Empty(NStringKeys *s)
+{
+ s->cursize = 0;
+}
+
+void StringKeys_Clone(NStringKeys *dest, Mem_Zone *zone, NStringKeys *src)
+{
+ StringKeys_Init(dest, zone, src->cursize);
+ memcpy(dest->keys, src->keys, src->cursize);
+}
+
+void StringKeys_SetKey(NStringKeys *s, Mem_Zone *zone, const char *key, const char *value)
+{
+ Nsize keysize;
+ Nsize valuesize;
+ Nsize l;
+ char *t, *k, *v;
+ if (!key || !key[0])
+ return;
+ keysize = strlen(key) + 1;
+ valuesize = strlen(value) + 1;
+ if (s->maxsize < s->cursize + keysize + valuesize)
+ {
+ s->maxsize *= 2;
+ if (s->maxsize < 128)
+ s->maxsize = 128;
+ Mem_ReAlloc(zone, &s->keys, s->maxsize);
+ }
+ t = s->keys;
+ while (t < s->keys + s->cursize)
+ {
+ k = t;
+ t += strlen(t) + 1;
+ v = t;
+ t += strlen(t) + 1;
+ if (!String_Compare(k, key))
+ {
+ if (value && value[0])
+ {
+ // move the text that follows and replace the key
+ l = valuesize - (strlen(v) + 1);
+ memmove(t + l, t, (s->keys + s->cursize) - t);
+ s->cursize += l;
+ memcpy(k, key, keysize);
+ memcpy(k + keysize, value, valuesize);
+ }
+ else
+ {
+ // remove the key
+ l = 0 - (strlen(k) + 1) - (strlen(v) + 1);
+ memmove(t + l, t, (s->keys + s->cursize) - t);
+ s->cursize += l;
+ }
+ return;
+ }
+ }
+ // add the key
+ s->cursize += keysize + valuesize;
+ memcpy(t, key, keysize);
+ memcpy(t + keysize, value, valuesize);
+}
+
+const char *StringKeys_GetValue(NStringKeys *s, const char *key)
+{
+ char *t;
+ t = s->keys;
+ while (t < s->keys + s->cursize)
+ {
+ if (!String_Compare(t, key))
+ return t + strlen(t) + 1;
+ t += strlen(t) + 1;
+ t += strlen(t) + 1;
+ }
+ return NULL;
+}
+
+Nbool StringKeys_GetByNumber(NStringKeys *s, NUint32 index, const char **key, const char **value)
+{
+ char *t;
+ t = s->keys;
+ while (t < s->keys + s->cursize)
+ {
+ if (index-- == 0)
+ {
+ if (key)
+ *key = t;
+ if (value)
+ *value = t + strlen(t) + 1;
+ return true;
+ }
+ t += strlen(t) + 1;
+ t += strlen(t) + 1;
+ }
+ return false;
+}
+
+NSint32 String_ToInteger(const char *s)
+{
+ if (!s)
+ return 0;
+ while (*s && *s <= ' ')
+ s++;
+ return atoi(s);
+}
+
+double String_ToDouble(const char *s)
+{
+ if (!s)
+ return 0;
+ while (*s && *s <= ' ')
+ s++;
+ return atof(s);
+}
+
+NUint32 String_ToVector(const char *s, Nvec *v, NUint32 maxcomponents)
+{
+ NUint32 c;
+ for (c = 0;c < maxcomponents;c++)
+ v[c] = 0;
+ if (!s)
+ return 0;
+ for (c = 0;c < maxcomponents;c++)
+ {
+ while (*s && *s <= ' ')
+ s++;
+ if (!*s)
+ break;
+ v[c] = atof(s);
+ while (*s > ' ')
+ s++;
+ }
+ return c;
+}
Modified: trunk/nstring.h
===================================================================
--- trunk/nstring.h 2006-03-27 09:07:36 UTC (rev 680)
+++ trunk/nstring.h 2006-03-27 09:08:46 UTC (rev 681)
@@ -44,4 +44,24 @@
#define String_SetCharacter(s, zone, c ) _String_SetCharacter((s), (zone), (c), __FILE__, __LINE__)
#define String_Substring(s, zone, t, position, length) _String_Substring((s), (zone), (t),(position), (length), __FILE__, __LINE__)
+typedef struct NStringKeys
+{
+ Nsize cursize;
+ Nsize maxsize;
+ char *keys;
+}
+NStringKeys;
+
+void StringKeys_Init(NStringKeys *s, Mem_Zone *zone, NUint32 initialsize);
+void StringKeys_FreeKeys(NStringKeys *s);
+void StringKeys_Empty(NStringKeys *s);
+void StringKeys_Clone(NStringKeys *dest, Mem_Zone *zone, NStringKeys *src);
+void StringKeys_SetKey(NStringKeys *s, Mem_Zone *zone, const char *key, const char *value);
+const char *StringKeys_GetValue(NStringKeys *s, const char *key);
+Nbool StringKeys_GetByNumber(NStringKeys *s, NUint32 index, const char **key, const char **value);
+
+NSint32 String_ToInteger(const char *s);
+double String_ToDouble(const char *s);
+NUint32 String_ToVector(const char *s, Nvec *v, NUint32 maxcomponents);
+
#endif
More information about the neither-commits
mailing list