10 static struct position none;
11 struct expression *expr;
12 struct statement *stmt;
13
14 expr = last_ptr_list((struct ptr_list *)big_expression_stack);
15 stmt = last_ptr_list((struct ptr_list *)big_statement_stack);
16 if (expr)
17 pos = expr->pos;
18 else if (stmt)
19 pos = stmt->pos;
20 else
21 pos = none;
22 return pos;
23 }
24
25 struct expression *alloc_tmp_expression(struct position pos, int type)
26 {
27 struct expression *expr;
28
29 expr = __alloc_tmp_expression(0);
30 expr->smatch_flags |= Fake;
31 expr->type = type;
32 expr->pos = pos;
33 return expr;
34 }
35
36 void free_tmp_expressions(void)
37 {
38 clear_tmp_expression_alloc();
39 }
40
41 struct expression *zero_expr(void)
42 {
43 struct expression *zero;
44
45 zero = alloc_tmp_expression(get_cur_pos(), EXPR_VALUE);
46 zero->value = 0;
47 zero->ctype = &int_ctype;
48 return zero;
49 }
50
283 token = token->next;
284 if (token_type(token) != TOKEN_IDENT)
285 return NULL;
286 ret = deref_expression(ret);
287 ret = member_expression(ret,
288 (prev->special == SPECIAL_DEREFERENCE) ? '*' : '.',
289 token->ident);
290 token = token->next;
291 }
292
293 if (token_type(token) != TOKEN_STREAMEND)
294 return NULL;
295
296 return ret;
297 }
298
299 void expr_set_parent_expr(struct expression *expr, struct expression *parent)
300 {
301 if (!expr)
302 return;
303 if (parent->smatch_flags & Fake)
304 return;
305
306 expr->parent = (unsigned long)parent | 0x1UL;
307 }
308
309 void expr_set_parent_stmt(struct expression *expr, struct statement *parent)
310 {
311 if (!expr)
312 return;
313 expr->parent = (unsigned long)parent;
314 }
315
316 struct expression *expr_get_parent_expr(struct expression *expr)
317 {
318 if (!expr)
319 return NULL;
320 if (!(expr->parent & 0x1UL))
321 return NULL;
322 return (struct expression *)(expr->parent & ~0x1UL);
323 }
|
10 static struct position none;
11 struct expression *expr;
12 struct statement *stmt;
13
14 expr = last_ptr_list((struct ptr_list *)big_expression_stack);
15 stmt = last_ptr_list((struct ptr_list *)big_statement_stack);
16 if (expr)
17 pos = expr->pos;
18 else if (stmt)
19 pos = stmt->pos;
20 else
21 pos = none;
22 return pos;
23 }
24
25 struct expression *alloc_tmp_expression(struct position pos, int type)
26 {
27 struct expression *expr;
28
29 expr = __alloc_tmp_expression(0);
30 expr->smatch_flags |= Tmp;
31 expr->type = type;
32 expr->pos = pos;
33 return expr;
34 }
35
36 void free_tmp_expressions(void)
37 {
38 clear_tmp_expression_alloc();
39 }
40
41 struct expression *zero_expr(void)
42 {
43 struct expression *zero;
44
45 zero = alloc_tmp_expression(get_cur_pos(), EXPR_VALUE);
46 zero->value = 0;
47 zero->ctype = &int_ctype;
48 return zero;
49 }
50
283 token = token->next;
284 if (token_type(token) != TOKEN_IDENT)
285 return NULL;
286 ret = deref_expression(ret);
287 ret = member_expression(ret,
288 (prev->special == SPECIAL_DEREFERENCE) ? '*' : '.',
289 token->ident);
290 token = token->next;
291 }
292
293 if (token_type(token) != TOKEN_STREAMEND)
294 return NULL;
295
296 return ret;
297 }
298
299 void expr_set_parent_expr(struct expression *expr, struct expression *parent)
300 {
301 if (!expr)
302 return;
303 if (parent && parent->smatch_flags & Tmp)
304 return;
305
306 expr->parent = (unsigned long)parent | 0x1UL;
307 }
308
309 void expr_set_parent_stmt(struct expression *expr, struct statement *parent)
310 {
311 if (!expr)
312 return;
313 expr->parent = (unsigned long)parent;
314 }
315
316 struct expression *expr_get_parent_expr(struct expression *expr)
317 {
318 if (!expr)
319 return NULL;
320 if (!(expr->parent & 0x1UL))
321 return NULL;
322 return (struct expression *)(expr->parent & ~0x1UL);
323 }
|