void HASH_put_hash(hash_t *hash, const char *key, hash_t *val){ put_hash(hash, key, 0, val); }
void HASH_put_hash_at(hash_t *hash, const char *key, int i, hash_t *val){ put_hash(hash, key, i, val); int new_size = i+1; if(new_size>hash->num_array_elements) hash->num_array_elements = new_size; }
token_t primary(void) { expr_t *expr; entry_t *entry; token_t token; int ch, lineno, column; if (ahead) { token = ahead->token; push_expr(ahead); ahead = NULL; return (token); } ch = skipws(); lineno = parser.lineno; column = parser.column - 1; switch (ch) { case EOF: token = tok_eof; break; case '(': token = tok_oparen; break; case ')': token = tok_cparen; break; case '[': token = tok_obrack; break; case ']': token = tok_cbrack; break; case '{': token = tok_obrace; break; case '}': token = tok_cbrace; break; case ';': token = tok_semicollon; break; case ':': token = tok_collon; break; case ',': token = tok_comma; break; case '.': if ((ch = getch()) != '.') { ungetch(ch); token = tok_dot; } else if (getch() != '.') error(NULL, "error near '..'"); else token = tok_ellipsis; break; case '=': if ((ch = getch()) == '=') token = tok_eq; else { ungetch(ch); token = tok_set; } break; case '&': if ((ch = getch()) == '&') token = tok_andand; else if (ch == '=') token = tok_andset; else { ungetch(ch); token = tok_and; } break; case '|': if ((ch = getch()) == '|') token = tok_oror; else if (ch == '=') token = tok_orset; else { ungetch(ch); token = tok_or; } break; case '^': if ((ch = getch()) == '=') token = tok_xorset; else { ungetch(ch); token = tok_xor; } break; case '<': if ((ch = getch()) == '=') token = tok_le; else if (ch == '<') { if ((ch = getch()) == '=') token = tok_lshset; else { ungetch(ch); token = tok_lsh; } } else { ungetch(ch); token = tok_lt; } break; case '>': if ((ch = getch()) == '=') token = tok_ge; else if (ch == '>') { if ((ch = getch()) == '=') token = tok_rshset; else { ungetch(ch); token = tok_rsh; } } else { ungetch(ch); token = tok_gt; } break; case '+': if ((ch = getch()) == '+') token = tok_inc; else if (ch == '=') token = tok_addset; else { ungetch(ch); token = tok_add; } break; case '-': if ((ch = getch()) == '-') token = tok_dec; else if (ch == '=') token = tok_subset; else if (ch == '>') token = tok_arrow; else { ungetch(ch); token = tok_sub; } break; case '*': if ((ch = getch()) == '=') token = tok_mulset; else { ungetch(ch); token = tok_mul; } break; case '/': if ((ch = getch()) == '=') token = tok_divset; else { ungetch(ch); token = tok_div; } break; case '%': if ((ch = getch()) == '=') token = tok_remset; else { ungetch(ch); token = tok_rem; } break; case '!': if ((ch = getch()) == '=') token = tok_ne; else { ungetch(ch); token = tok_not; } break; case '~': token = tok_com; break; case '?': token = tok_question; break; case 'a' ... 'z': case 'A' ... 'Z': case '_': token = identifier(ch); break; case '0' ... '9': token = number(ch); break; case '"': token = string(); break; case '\'': token = character(); break; default: error(NULL, "syntax error"); } parser.token = token; expr = new_expr(token, lineno, column); if (token == tok_string) { if ((entry = get_hash(strings, parser.string)) == NULL) { entry = (entry_t *)xmalloc(sizeof(entry_t)); entry->name.string = xstrdup(parser.string); entry->value = entry->name.string; put_hash(strings, entry); } expr->data._unary.cp = entry->value; } else expr->data._unary = parser.value; push_expr(expr); return (token); }