|
|
|
|
@ -182,6 +182,9 @@ public:
|
|
|
|
|
case '0': |
|
|
|
|
dest[j++] = (char)0; |
|
|
|
|
break; |
|
|
|
|
case 'e': |
|
|
|
|
dest[j++] = '='; |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
dest[j++] = *p; |
|
|
|
|
} |
|
|
|
|
@ -261,8 +264,8 @@ public:
|
|
|
|
|
* Add a new key=value pair |
|
|
|
|
* |
|
|
|
|
* If the key is already present this will append another, but the first |
|
|
|
|
* will always be returned by get(). There is no erase(). This is designed |
|
|
|
|
* to be generated and shipped, not as an editable data structure. |
|
|
|
|
* will always be returned by get(). This is not checked. If you want to |
|
|
|
|
* ensure a key is not present use erase() first. |
|
|
|
|
* |
|
|
|
|
* Use the vlen parameter to add binary values. Nulls will be escaped. |
|
|
|
|
* |
|
|
|
|
@ -293,6 +296,7 @@ public:
|
|
|
|
|
case '\n': |
|
|
|
|
case '\t': |
|
|
|
|
case '\\': |
|
|
|
|
case '=': |
|
|
|
|
_d[j++] = '\\'; |
|
|
|
|
if (j == ZT_DICTIONARY_MAX_SIZE) { |
|
|
|
|
_d[i] = (char)0; |
|
|
|
|
@ -304,6 +308,7 @@ public:
|
|
|
|
|
case '\n': _d[j++] = 'n'; break; |
|
|
|
|
case '\t': _d[j++] = 't'; break; |
|
|
|
|
case '\\': _d[j++] = '\\'; break; |
|
|
|
|
case '=': _d[j++] = 'e'; break; |
|
|
|
|
} |
|
|
|
|
if (j == ZT_DICTIONARY_MAX_SIZE) { |
|
|
|
|
_d[i] = (char)0; |
|
|
|
|
@ -375,6 +380,46 @@ public:
|
|
|
|
|
return (this->get(key,tmp,2) >= 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Erase a key from this dictionary |
|
|
|
|
* |
|
|
|
|
* Use this before add() to ensure that a key is replaced if it might |
|
|
|
|
* already be present. |
|
|
|
|
* |
|
|
|
|
* @param key Key to erase |
|
|
|
|
* @return True if key was found and erased |
|
|
|
|
*/ |
|
|
|
|
inline bool erase(const char *key) |
|
|
|
|
{ |
|
|
|
|
char d2[ZT_DICTIONARY_MAX_SIZE]; |
|
|
|
|
char *saveptr = (char *)0; |
|
|
|
|
unsigned int d2ptr = 0; |
|
|
|
|
bool found = false; |
|
|
|
|
for(char *f=Utils::stok(_d,"\r\n",&saveptr);(f);f=Utils::stok((char *)0,"\r\n",&saveptr)) { |
|
|
|
|
if (*f) { |
|
|
|
|
const char *p = f; |
|
|
|
|
const char *k = key; |
|
|
|
|
while ((*k)&&(*p)) { |
|
|
|
|
if (*k != *p) |
|
|
|
|
break; |
|
|
|
|
++k; |
|
|
|
|
++p; |
|
|
|
|
} |
|
|
|
|
if (*k) { |
|
|
|
|
p = f; |
|
|
|
|
while (*p) |
|
|
|
|
d2[d2ptr++] = *(p++); |
|
|
|
|
d2[d2ptr++] = '\n'; |
|
|
|
|
} else { |
|
|
|
|
found = true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
d2[d2ptr++] = (char)0; |
|
|
|
|
memcpy(_d,d2,d2ptr); |
|
|
|
|
return found; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @return Dictionary data as a 0-terminated C-string |
|
|
|
|
*/ |
|
|
|
|
|