summaryrefslogtreecommitdiff
path: root/node
diff options
context:
space:
mode:
Diffstat (limited to 'node')
-rw-r--r--node/Dictionary.hpp49
1 files changed, 47 insertions, 2 deletions
diff --git a/node/Dictionary.hpp b/node/Dictionary.hpp
index ccca00c8..e4c7ff20 100644
--- a/node/Dictionary.hpp
+++ b/node/Dictionary.hpp
@@ -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;
@@ -376,6 +381,46 @@ public:
}
/**
+ * 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
*/
inline const char *data() const { return _d; }