/* Insert a new entry into a symhashtable, but only if it is not already present. */ symnode_t *insert_into_symhashtable(symhashtable_t *hashtable, var_lookup_type type, char *name, int lineno, var_type vType) { assert(hashtable); int slot = hashPJW(name, hashtable->size); symnode_t *node = lookup_symhashtable(hashtable, name, slot); /* error check if node already existed! */ if (node == NULL) { node = create_symnode(name, type, hashtable, lineno); node->vType = vType; node->next = hashtable->table[slot]; hashtable->table[slot] = node; } return node; }
/* Insert a new entry into a symhashtable, but only if it is not already present. Return*/ symnode_t *insert_into_symhashtable(symhashtable_t *hashtable, ast_node astnode) { char* name = astnode->value_string; assert(hashtable); int slot = hashPJW(name, hashtable->size); symnode_t *node = lookup_symhashtable(hashtable, name, slot); /* error check if node already existed! */ if (node == NULL) { node = create_symnode(name, hashtable); node->abnode = astnode; astnode->snode = node; if(astnode->node_type == INT_LITERAL_N){ node->num_val = astnode->value_int; } if(astnode->node_type == ARRAY_TYPE_N) { if(astnode->left_child != NULL ){ astnode->array_length = astnode->left_child->value_int; node->array_length = astnode->array_length; } } if(astnode->node_type == STRING_LITERAL_N){ node->type = STRING_T; } if(astnode->node_type == FUNC_DECLARATION_N) { //printf("FUNC_DEC detected!"); if(astnode->return_type == INT_TYPE_N) { node->type = FUNC_INT_T; //printf(" %s\n", TYPE_NAME(node->type)); } else if(astnode->return_type == VOID_TYPE_N) { node->type = FUNC_VOID_T; //printf(" %s\n", TYPE_NAME(node->type)); } ast_node anode; int i = 0; assert(astnode->left_child != NULL); for(anode = astnode->left_child->left_child; anode != NULL; anode = anode->right_sibling) { i++; } node->num_parameters = i; node->parameters = calloc(sizeof(decl_type), i); assert(node->parameters); i = 0; for(anode = astnode->left_child->left_child; anode != NULL; anode = anode->right_sibling) { if(anode->return_type == INT_TYPE_N) { node->parameters[i] = VAR_INT_T; } else if(anode->return_type == ARRAY_TYPE_N){ node->parameters[i] = VAR_ARRAY_INT_T; } i++; } } else if(astnode->node_type == ID_N) { //printf("VAR detected!"); if(astnode->return_type == INT_TYPE_N) { node->type = VAR_INT_T; //printf(" %s\n", TYPE_NAME(node->type)); } } else if(astnode->node_type == ARRAY_TYPE_N){ if(astnode->return_type == INT_TYPE_N) { node->type = VAR_ARRAY_INT_T; //printf(" %s\n", TYPE_NAME(node->type)); } } node->next = hashtable->table[slot]; hashtable->table[slot] = node; } else{ if(node->abnode->node_type == ARRAY_TYPE_N || node->abnode->return_type == ARRAY_TYPE_N) { node->abnode->array_length = node->array_length; } } return node; }