Ejemplo n.º 1
0
void HASH_put_hash(hash_t *hash, const char *key, hash_t *val){
  put_hash(hash, key, 0, val);
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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);
}