1
0
mirror of https://github.com/nmap/nmap.git synced 2025-12-06 04:31:29 +00:00

Use lookup table for 1-char strings, not std::map for string_pool.

This commit is contained in:
dmiller
2022-11-10 18:57:58 +00:00
parent 70dc5434f4
commit 1fb680b93f
3 changed files with 30 additions and 0 deletions

View File

@@ -84,6 +84,24 @@ void cp_free(void) {
return g_charpool.clear();
}
class StrTable {
public:
StrTable() {
memset(table, 0, sizeof(table));
for (int i = 1; i <= CHAR_MAX; i++) {
table[i*2] = static_cast<char>(i);
}
}
const char *get(char c) { assert(c >= 0); return &table[c*2]; }
private:
char table[2*(CHAR_MAX + 1)];
};
static StrTable g_table;
const char *cp_char2str(char c) {
return g_table.get(c);
}
CharPool::CharPool(size_t init_sz) {
assert(init_sz >= 256);
/* Create our char pool */
@@ -103,6 +121,11 @@ void CharPool::clear(void) {
const char *CharPool::dup(const char *src, int len) {
if (len < 0)
len = strlen(src);
if (len == 0)
return g_table.get('\0');
else if (len == 1)
return g_table.get(*src);
int sz = len + 1;
char *p = buckets.back() + nexti;

View File

@@ -70,6 +70,8 @@
/* len does not include null terminator */
const char *cp_strndup(const char *src, int len);
const char *cp_strdup(const char *src);
// Returns a pointer to a 1-char string
const char *cp_char2str(char c);
void cp_free(void);

View File

@@ -100,6 +100,11 @@ typedef std::set<StringPoolItem> StringPool;
const char *string_pool_insert_len(const char *s, int len)
{
static StringPool pool;
if (len == 0)
return "";
else if (len == 1)
return cp_char2str(*s);
StringPoolItem spi (s, len);
StringPool::iterator it = pool.insert(spi).first;