From b1e47622ae599029e59914f4c6ce6db2c4a419c3 Mon Sep 17 00:00:00 2001 From: Dmitrii Krosh Date: Mon, 13 Jul 2026 20:36:30 +0300 Subject: [PATCH] start on newset.c --- .clang-format | 3 +++ reimplement/newset.c | 52 ++++++++++++++++++++++++++++++++++++++++++++ reimplement/plans.md | 31 ++++++++++++++++++++++++++ 3 files changed, 86 insertions(+) create mode 100644 .clang-format create mode 100644 reimplement/newset.c create mode 100644 reimplement/plans.md diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..b764d98 --- /dev/null +++ b/.clang-format @@ -0,0 +1,3 @@ +BasedOnStyle: Google +IndentWidth: 2 +ColumnLimit: 100 \ No newline at end of file diff --git a/reimplement/newset.c b/reimplement/newset.c new file mode 100644 index 0000000..fecd954 --- /dev/null +++ b/reimplement/newset.c @@ -0,0 +1,52 @@ +#include "system.h" + +struct set { + int cnt; + struct symbols { + const char* str; + unsigned hash; + }* symbols_v; +}; + +struct set* set_new() { + // should we use x___ funcs? + struct set* set = xmalloc(sizeof *set); + set->cnt = 0; + set->symbols_v = NULL; + + return set; +} + +void set_add(struct set* set, const char* sym) { + const int delta = 1024; + + if ((set->cnt & (delta - 1)) == 0) { + set->symbols_v = xrealloc(set->symbols_v, sizeof(*set->symbols_v) * (set->cnt + delta)); + } + + set->symbols_v[set->cnt].str = xstrdup(sym); + set->symbols_v[set->cnt].hash = 0; + set->cnt++; + + return; +} + +struct set* set_free(struct set* set) { + if (set) { + for (int i = 0; i < set->cnt; i++) { + _free((char*)set->symbols_v[i].str); + } + + _free(set->symbols_v); + set = _free(set); + } + + return NULL; +} + +// --- + +const char* set_fini(struct set* set, int bpp) { + // Implementation for finalizing the set + return NULL; +} diff --git a/reimplement/plans.md b/reimplement/plans.md new file mode 100644 index 0000000..76eb40e --- /dev/null +++ b/reimplement/plans.md @@ -0,0 +1,31 @@ +1. `set.c` используется в двух местах - `rpm` и `rpm-build` + - в `rpm` используется только `rpmsetcmp`, который оборачивается в `setcmp` и используется как бинарник + - в `rpm-build` используются оставшиеся 4 функции для создания, оборачиваются в бинарник `mkset` + +2. Логично, что всю логику работы при таком исходе можно разделить + - вероятно, начать стоит с составления (хотя хочется с сравнения, ибо 1 функция) + +3. Другой вывод - бинарник, вообще говоря, можно написать и на другом ЯП в таком случае + +4. Реимпементация не будет предполагать оптимизации, которая и не особо нужна при создании, но была бы полезна при сравнении + +5. Используещиеся в данный момент оптимизации: + - кэширование "левых" (provides) строк + - pre-compiled таблица 2хбайт символов + - прыжки по 4/8 символов хэша + +6. Что можно было бы оставить из оптимизаций в сравнении: + - теоритически кэш + - прыжки сделать длиной `len(s1)/len(s2)` + +7. Оптимизации при создании строк: + - сторонняя хэш функция + - также даёт преимущество на 64 бит хэше ("на всякий") + +8. Возможно изменение структуры кода для читаемости, например: + - много init функций + - много проверок, ошибки с отрицательными значениями + +9. А какую реализацию оставляем?.. + +!!! `lib/rpmds.c` стоит исследовать, т.к. сейчас есть шанс, что это единственное место, где используется оптимизация кэширования, если исользуется вовсе