diff --git a/src/runtime/c/Makefile.am b/src/runtime/c/Makefile.am index 8b94fb4db..c47a4fdcb 100644 --- a/src/runtime/c/Makefile.am +++ b/src/runtime/c/Makefile.am @@ -10,6 +10,8 @@ pgfinclude_HEADERS = \ libpgf_la_SOURCES = \ db.cxx \ db.h \ + text.cxx \ + text.h \ pgf.cxx \ reader.cxx \ reader.h \ diff --git a/src/runtime/c/data.h b/src/runtime/c/data.h index a90b882e3..0c1c24d00 100644 --- a/src/runtime/c/data.h +++ b/src/runtime/c/data.h @@ -10,6 +10,7 @@ #include "pgf.h" #include "db.h" +#include "text.h" #include "namespace.h" #include "expr.h" @@ -31,7 +32,7 @@ private: struct PGF_INTERNAL_DECL PgfFlag { PgfLiteral value; - char name[]; + PgfText name; }; typedef struct { diff --git a/src/runtime/c/namespace.h b/src/runtime/c/namespace.h index ab14b67c1..74014bf8e 100644 --- a/src/runtime/c/namespace.h +++ b/src/runtime/c/namespace.h @@ -181,7 +181,7 @@ Namespace namespace_insert(Namespace map, ref value) { if (map == 0) return Node::new_node(value); - int cmp = strcmp(value->name,map->value->name); + int cmp = textcmp(value->name,map->value->name); if (cmp < 0) return Node::balanceL(map->value, namespace_insert(map->left, value),map->right); diff --git a/src/runtime/c/reader.cxx b/src/runtime/c/reader.cxx index 6e6768ffa..32e541056 100644 --- a/src/runtime/c/reader.cxx +++ b/src/runtime/c/reader.cxx @@ -82,9 +82,9 @@ uint64_t PgfReader::read_uint() return u; } -moffset PgfReader::read_name(size_t size) +moffset PgfReader::read_name(size_t struct_size) { - size_t len = read_len(); + size_t len = read_len(); char* buf = (char*) alloca(len*6+1); char* p = buf; @@ -115,10 +115,14 @@ moffset PgfReader::read_name(size_t size) p += len; } + + size_t size = p-buf; *p++ = 0; - moffset offs = current_db->malloc(size+(p-buf)); - strcpy((char*) (current_base+offs+size), buf); + moffset offs = current_db->malloc(struct_size+size+1); + PgfText* ptext = (PgfText*) (current_base+offs+struct_size-sizeof(PgfText)); + ptext->size = size; + memcpy(ptext->text, buf, size+1); return offs; } diff --git a/src/runtime/c/text.cxx b/src/runtime/c/text.cxx new file mode 100644 index 000000000..dd1a8f78a --- /dev/null +++ b/src/runtime/c/text.cxx @@ -0,0 +1,19 @@ +#include "data.h" + +PGF_INTERNAL +int textcmp(PgfText &t1, PgfText &t2) +{ + for (size_t i = 0; ; i++) { + if (i >= t1.size) + return (i - t2.size); + if (i >= t2.size) + return 1; + + if (t1.text[i] > t2.text[i]) + return 1; + else if (t1.text[i] < t2.text[i]) + return -1; + + i++; + } +} diff --git a/src/runtime/c/text.h b/src/runtime/c/text.h new file mode 100644 index 000000000..dfaab88d1 --- /dev/null +++ b/src/runtime/c/text.h @@ -0,0 +1,12 @@ +#ifndef TEXT_H +#define TEXT_H + +typedef struct { + size_t size; + char text[]; +} PgfText; + +PGF_INTERNAL_DECL +int textcmp(PgfText &t1, PgfText &t2); + +#endif