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