void* hash_put(struct hash* table, char* key, void* data){ unsigned long val = calc_hash(key) % table->size; hash_bucket* bucket; if ((table->table)[val] == NULL) { bucket = (hash_bucket*)malloc(sizeof(hash_bucket)); if (bucket == NULL) OUT_OF_MEM(); bucket->key = strdup(key); bucket->next = NULL; bucket->data = data; (table->table)[val] = bucket; table->n++; table->used++; return bucket->data; } for (bucket = (table->table)[val]; bucket != NULL; bucket = bucket->next) if (strcmp(key, bucket->key) == 0) { void* old_data = bucket->data; bucket->data = data; return old_data; } bucket = (hash_bucket*) malloc(sizeof(hash_bucket)); if (bucket == NULL) OUT_OF_MEM(); bucket->key = strdup(key); bucket->data = data; bucket->next = (table->table)[val]; (table->table)[val] = bucket; table->n++; return data; }
char *xstrdup(const char *s) { char* result = strdup(s); if (result == NULL) { OUT_OF_MEM(strlen(s) + 1); } return result; }
rstruct newrstruct() { rstruct hlp; hlp = (rstruct) calloc(1, sizeof(struct r_struct)); if(hlp == NULL) { #ifdef DEBUG perror("newrstruct 1"); #endif OUT_OF_MEM(); } return hlp; } /* newrstruct */
d_class newdclass() { d_class hlp; hlp = (d_class) calloc(1, sizeof(struct dclass)); if(hlp == NULL) { #ifdef DEBUG perror("newdclass 1"); #endif OUT_OF_MEM(); } return hlp; } /* newdclass */
monoid newmon() { monoid hlp; hlp = (monoid) calloc(1, sizeof(struct mono)); if(hlp == NULL) { #ifdef DEBUG perror("newmon 1"); #endif OUT_OF_MEM(); } return hlp; } /* newmon */
darray newdarray(posint a) { darray hlp; hlp = (darray) calloc(a, sizeof(d_class)); if(hlp == NULL) { #ifdef DEBUG perror("newdarray 1"); #endif OUT_OF_MEM(); } return hlp; } /* newdarray */
struct hash* hash_create(long size){ struct hash* table; hash_bucket** bucket; long i; table = (struct hash*)malloc(sizeof(struct hash)); if(table == NULL){ OUT_OF_MEM(); } if (size <= 0){ free(table); return NULL; } table->size = size; table->table = (hash_bucket**)malloc(sizeof(hash_bucket*) * size); if(table->table == NULL) OUT_OF_MEM(); bucket = table->table; if (bucket == NULL) { free(table); return NULL; } for (i = 0; i < size; i++) bucket[i] = NULL; table->n = 0; table->used = 0; return table; }
void *xmalloc(size_t size) { if (size == 0) return NULL; void* ptr = malloc(size); if (ptr == NULL) { OUT_OF_MEM(size); } else { return ptr; } }
void *xcalloc(size_t nmemb, size_t size) { if (nmemb == 0 || size == 0) return NULL; void* ptr = calloc(nmemb, size); if (ptr == NULL) { OUT_OF_MEM(nmemb * size); } else { return ptr; } }
void *xrealloc(void *ptr, size_t size) { if (size == 0) { xfree(ptr); return NULL; } else { void *res = realloc(ptr, size); if (res == NULL) { OUT_OF_MEM(size); } else { return res; } } }