]> git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - typedef.c
merging master
[xonotic/gmqcc.git] / typedef.c
index 0259f350c32d7de88f7e7cd02673fb246b388799..731ab7f2ff1ff545f7cd21fca770957aa13717e3 100644 (file)
--- 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;
         }
     }