X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=typedef.c;h=731ab7f2ff1ff545f7cd21fca770957aa13717e3;hb=911c2bddb661b0b8c788ed6c564f08680c6f8125;hp=0259f350c32d7de88f7e7cd02673fb246b388799;hpb=477e80f1fb79c5d74a97ad5ed756f03cc21445f4;p=xonotic%2Fgmqcc.git diff --git a/typedef.c b/typedef.c index 0259f35..731ab7f 100644 --- a/typedef.c +++ b/typedef.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012 + * Copyright (C) 2012 * Dale Weiler * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -29,21 +29,8 @@ void typedef_init() { typedef_table[i] = NULL; } -unsigned int typedef_hash(const char *s) { - unsigned int hash = 0; - unsigned int size = strlen(s); - unsigned int iter; - - for (iter = 0; iter < size; iter++) { - hash += s[iter]; - hash += (hash << 10); - hash ^= (hash >> 6); - } - hash += (hash << 3); - hash ^= (hash >> 11); - hash += (hash << 15); - - return hash % 1024; +uint32_t typedef_hash(const char *s) { + return util_crc32(s, strlen(s), 1024); } typedef_node *typedef_find(const char *s) { @@ -62,29 +49,35 @@ void typedef_clear() { } } -int typedef_add(struct lex_file *file, const char *from, const char *to) { +int typedef_add(lex_file *file, const char *from, const char *to) { unsigned int hash = typedef_hash(to); typedef_node *find = typedef_table[hash]; - + if (find) return error(file, ERROR_PARSE, "typedef for %s already exists or conflicts\n", to); - + /* check if the type exists first */ if (strncmp(from, "float", sizeof("float")) == 0 || strncmp(from, "vector", sizeof("vector")) == 0 || strncmp(from, "string", sizeof("string")) == 0 || strncmp(from, "entity", sizeof("entity")) == 0 || strncmp(from, "void", sizeof("void")) == 0) { - - typedef_table[hash] = mem_a(sizeof(typedef_node)); - typedef_table[hash]->name = util_strdup(from); + + typedef_table[hash] = mem_a(sizeof(typedef_node)); + if (typedef_table[hash]) + typedef_table[hash]->name = util_strdup(from); + else + return error(file, ERROR_PARSE, "ran out of resources for typedef %s\n", to); return -100; } else { /* search the typedefs for it (typedef-a-typedef?) */ - typedef_node *find = typedef_table[typedef_hash(from)]; + find = typedef_table[typedef_hash(from)]; if (find) { - typedef_table[hash] = mem_a(sizeof(typedef_node)); - typedef_table[hash]->name = util_strdup(find->name); + typedef_table[hash] = mem_a(sizeof(typedef_node)); + if (typedef_table[hash]) + typedef_table[hash]->name = util_strdup(find->name); + else + return error(file, ERROR_PARSE, "ran out of resources for typedef %s\n", to); return -100; } }