3 __ALLOCATOR(struct expression
, "temporary expr", tmp_expression
);
5 static struct position
get_cur_pos(void)
7 static struct position pos
;
8 static struct position none
;
9 struct expression
*expr
;
10 struct statement
*stmt
;
12 expr
= last_ptr_list((struct ptr_list
*)big_expression_stack
);
13 stmt
= last_ptr_list((struct ptr_list
*)big_statement_stack
);
23 struct expression
*alloc_tmp_expression(struct position pos
, int type
)
25 struct expression
*expr
= __alloc_tmp_expression(0);
31 void free_tmp_expressions(void)
33 clear_tmp_expression_alloc();
36 struct expression
*zero_expr(void)
38 static struct expression
*zero
;
43 zero
= alloc_expression(get_cur_pos(), EXPR_VALUE
);
45 zero
->ctype
= &char_ctype
;
49 struct expression
*value_expr(long long val
)
51 struct expression
*expr
;
56 expr
= alloc_tmp_expression(get_cur_pos(), EXPR_VALUE
);
58 expr
->ctype
= &llong_ctype
;
62 struct expression
*member_expression(struct expression
*deref
, int op
, struct ident
*member
)
64 struct expression
*expr
;
66 expr
= alloc_tmp_expression(deref
->pos
, EXPR_DEREF
);
69 expr
->member
= member
;
70 expr
->member_offset
= -1;
74 struct expression
*deref_expression(struct expression
*expr
)
76 struct expression
*preop
;
78 preop
= alloc_tmp_expression(expr
->pos
, EXPR_PREOP
);
84 struct expression
*assign_expression(struct expression
*left
, struct expression
*right
)
86 struct expression
*expr
;
88 expr
= alloc_tmp_expression(right
->pos
, EXPR_ASSIGNMENT
);
95 struct expression
*binop_expression(struct expression
*left
, int op
, struct expression
*right
)
97 struct expression
*expr
;
99 expr
= alloc_tmp_expression(right
->pos
, EXPR_BINOP
);
106 struct expression
*array_element_expression(struct expression
*array
, struct expression
*offset
)
108 struct expression
*expr
;
110 expr
= binop_expression(array
, '+', offset
);
111 return deref_expression(expr
);
114 struct expression
*symbol_expression(struct symbol
*sym
)
116 struct expression
*expr
;
118 expr
= alloc_tmp_expression(sym
->pos
, EXPR_SYMBOL
);
120 expr
->symbol_name
= sym
->ident
;
124 struct expression
*compare_expression(struct expression
*left
, int op
, struct expression
*right
)
126 struct expression
*expr
;
128 expr
= alloc_tmp_expression(get_cur_pos(), EXPR_COMPARE
);
135 struct expression
*gen_expression_from_key(struct expression
*arg
, const char *key
)
137 struct expression
*ret
= NULL
;
138 struct token
*token
, *end
;
144 /* The idea is that we can parse either $0->foo or $->foo */
148 while (*p
>= '0' && *p
<= '9')
150 len
= snprintf(buf
, sizeof(buf
), "%s\n", p
);
151 alloc
= alloc_string(buf
);
153 token
= tokenize_buffer(alloc
, len
, &end
);
156 if (token_type(token
) != TOKEN_STREAMBEGIN
)
161 while (token_type(token
) == TOKEN_SPECIAL
&&
162 token
->special
== SPECIAL_DEREFERENCE
) {
164 if (token_type(token
) != TOKEN_IDENT
) {
168 ret
= deref_expression(ret
);
169 ret
= member_expression(ret
, '*', token
->ident
);
173 if (token_type(token
) != TOKEN_STREAMEND
)