blob: 310e99920c62e7ad93673e0de6f434c2faff4aa5 [file] [log] [blame]
/*
* Copyright (C) NGINX, Inc.
*/
#include <njs_main.h>
#include <njs_lexer_tables.h>
njs_inline int
njs_lexer_keyword_hash(const u_char *key, size_t size, size_t table_size)
{
return ((((key[0] * key[size - 1]) + size) % table_size) + 0x01);
}
njs_inline const njs_lexer_keyword_entry_t *
njs_lexer_keyword_entry(const njs_lexer_keyword_entry_t *root,
const u_char *key, size_t length)
{
const njs_lexer_keyword_entry_t *entry;
entry = root + njs_lexer_keyword_hash(key, length, root->length);
while (entry->key != NULL) {
if (entry->length == length) {
if (strncmp(entry->key, (char *) key, length) == 0) {
return entry;
}
entry = &root[entry->next];
} else if (entry->length > length) {
return NULL;
} else {
entry = &root[entry->next];
}
}
return NULL;
}
const njs_lexer_keyword_entry_t *
njs_lexer_keyword(const u_char *key, size_t length)
{
const njs_lexer_keyword_entry_t *entry;
entry = njs_lexer_keyword_entry(njs_lexer_keyword_entries, key, length);
if (njs_slow_path(entry == NULL)) {
return NULL;
}
return entry;
}
njs_int_t
njs_lexer_keywords(njs_arr_t *list)
{
njs_str_t *kw;
njs_uint_t i;
for (i = 0; i < sizeof(njs_lexer_kws) / sizeof(njs_keyword_t); i++) {
kw = njs_arr_add(list);
if (njs_slow_path(kw == NULL)) {
return NJS_ERROR;
}
*kw = njs_lexer_kws[i].entry.name;
}
return NJS_OK;
}