From 00227014b82bb2972e30b43e29ea69e8f5b5b8aa Mon Sep 17 00:00:00 2001 From: Krasimir Angelov Date: Sat, 10 Dec 2022 18:43:26 +0100 Subject: [PATCH] simpler but working name allocator --- src/runtime/c/pgf/namespace.h | 80 ++++++++++++++--------------------- 1 file changed, 32 insertions(+), 48 deletions(-) diff --git a/src/runtime/c/pgf/namespace.h b/src/runtime/c/pgf/namespace.h index 5ff7945b2..a74c950fa 100644 --- a/src/runtime/c/pgf/namespace.h +++ b/src/runtime/c/pgf/namespace.h @@ -324,6 +324,8 @@ Namespace namespace_insert(Namespace map, ref value) } } +static constexpr char alphabet[] = "0123456789abcdefghijklmnopqrstuvwxyz"; + template class PgfNameAllocator { size_t available; @@ -332,6 +334,32 @@ class PgfNameAllocator { ref value; PgfText *name; + Namespace insert(Namespace map) + { + if (map == 0) { + value = PgfDB::malloc(name->size+1); + memcpy(&value->name, name, sizeof(PgfText)+name->size+1); + return Node>::new_node(value); + } + + int cmp = textcmp(name,&map->value->name); + if (cmp < 0) { + Namespace left = insert(map->left); + if (left != 0) { + map = Node>::upd_node(map,left,map->right); + return Node>::balanceL(map); + } + } else if (cmp > 0) { + Namespace right = insert(map->right); + if (right != 0) { + map = Node>::upd_node(map,map->left,right); + return Node>::balanceR(map); + } + } + + return 0; + } + public: PgfNameAllocator(PgfText *name_pattern) { @@ -383,54 +411,10 @@ public: Namespace allocate(Namespace map) { - static char alphabet[] = "0123456789abcdefghijklmnopqrstuvwxyz"; - - if (map == 0) { - value = PgfDB::malloc(name->size+1); - memcpy(&value->name, name, sizeof(PgfText)+name->size+1); - return Node>::new_node(value); - } - for (;;) { - int cmp; - size_t i; - for (i = 0; ; i++) { - if (i >= name->size) { - cmp = -(i < map->value->name.size); - break; - } - if (i >= map->value->name.size) { - cmp = 1; - break; - } - - if (name->text[i] > map->value->name.text[i]) { - cmp = 1; - break; - } else if (name->text[i] < map->value->name.text[i]) { - cmp = -1; - break; - } - } - - if (cmp < 0) { - Namespace left = allocate(map->left); - if (left != 0) { - map = Node>::upd_node(map,left,map->right); - return Node>::balanceL(map); - } - } else if (cmp > 0) { - Namespace right = allocate(map->right); - if (right != 0) { - map = Node>::upd_node(map,map->left,right); - return Node>::balanceR(map); - } - } else { - return 0; - } - - if (i >= fixed) - return 0; + Namespace new_map = insert(map); + if (new_map != 0) + return new_map; if (name->size >= available) { size_t new_size = name->size + 10; @@ -443,7 +427,7 @@ public: available = new_size; } - i = name->size++; + size_t i = name->size++; while (i >= fixed) { name->text[i+1] = name->text[i]; i--;