68 expr = alloc_tmp_expression(deref->pos, EXPR_DEREF);
69 expr->op = op;
70 expr->deref = deref;
71 expr->member = member;
72 expr->member_offset = -1;
73 return expr;
74 }
75
76 struct expression *preop_expression(struct expression *expr, int op)
77 {
78 struct expression *preop;
79
80 preop = alloc_tmp_expression(expr->pos, EXPR_PREOP);
81 preop->unop = expr;
82 preop->op = op;
83 return preop;
84 }
85
86 struct expression *deref_expression(struct expression *expr)
87 {
88 return preop_expression(expr, '*');
89 }
90
91 struct expression *assign_expression(struct expression *left, int op, struct expression *right)
92 {
93 struct expression *expr;
94
95 if (!right)
96 return NULL;
97
98 /* FIXME: make this a tmp expression. */
99 expr = alloc_expression(right->pos, EXPR_ASSIGNMENT);
100 expr->op = op;
101 expr->left = left;
102 expr->right = right;
103 return expr;
104 }
105
106 struct expression *binop_expression(struct expression *left, int op, struct expression *right)
107 {
145
146 struct expression *string_expression(char *str)
147 {
148 struct expression *ret;
149 struct string *string;
150 int len;
151
152 len = strlen(str) + 1;
153 string = (void *)__alloc_sname(4 + len);
154 string->length = len;
155 string->immutable = 0;
156 memcpy(string->data, str, len);
157
158 ret = alloc_tmp_expression(get_cur_pos(), EXPR_STRING);
159 ret->wide = 0;
160 ret->string = string;
161
162 return ret;
163 }
164
165 static struct expression *get_expression_from_base_and_str(struct expression *base, const char *addition)
166 {
167 struct expression *ret = NULL;
168 struct token *token, *prev, *end;
169 char *alloc;
170
171 if (addition[0] == '\0')
172 return base;
173
174 alloc = alloc_string_newline(addition);
175
176 token = tokenize_buffer(alloc, strlen(alloc), &end);
177 if (!token)
178 goto free;
179 if (token_type(token) != TOKEN_STREAMBEGIN)
180 goto free;
181 token = token->next;
182
183 ret = base;
184 while (token_type(token) == TOKEN_SPECIAL &&
|
68 expr = alloc_tmp_expression(deref->pos, EXPR_DEREF);
69 expr->op = op;
70 expr->deref = deref;
71 expr->member = member;
72 expr->member_offset = -1;
73 return expr;
74 }
75
76 struct expression *preop_expression(struct expression *expr, int op)
77 {
78 struct expression *preop;
79
80 preop = alloc_tmp_expression(expr->pos, EXPR_PREOP);
81 preop->unop = expr;
82 preop->op = op;
83 return preop;
84 }
85
86 struct expression *deref_expression(struct expression *expr)
87 {
88 if (expr->type == EXPR_BINOP)
89 expr = preop_expression(expr, '(');
90 return preop_expression(expr, '*');
91 }
92
93 struct expression *assign_expression(struct expression *left, int op, struct expression *right)
94 {
95 struct expression *expr;
96
97 if (!right)
98 return NULL;
99
100 /* FIXME: make this a tmp expression. */
101 expr = alloc_expression(right->pos, EXPR_ASSIGNMENT);
102 expr->op = op;
103 expr->left = left;
104 expr->right = right;
105 return expr;
106 }
107
108 struct expression *binop_expression(struct expression *left, int op, struct expression *right)
109 {
147
148 struct expression *string_expression(char *str)
149 {
150 struct expression *ret;
151 struct string *string;
152 int len;
153
154 len = strlen(str) + 1;
155 string = (void *)__alloc_sname(4 + len);
156 string->length = len;
157 string->immutable = 0;
158 memcpy(string->data, str, len);
159
160 ret = alloc_tmp_expression(get_cur_pos(), EXPR_STRING);
161 ret->wide = 0;
162 ret->string = string;
163
164 return ret;
165 }
166
167 struct expression *call_expression(struct expression *fn, struct expression_list *args)
168 {
169 struct expression *expr;
170
171 expr = alloc_tmp_expression(fn->pos, EXPR_CALL);
172 expr->fn = fn;
173 expr->args = args;
174
175 return expr;
176 }
177
178 static struct expression *get_expression_from_base_and_str(struct expression *base, const char *addition)
179 {
180 struct expression *ret = NULL;
181 struct token *token, *prev, *end;
182 char *alloc;
183
184 if (addition[0] == '\0')
185 return base;
186
187 alloc = alloc_string_newline(addition);
188
189 token = tokenize_buffer(alloc, strlen(alloc), &end);
190 if (!token)
191 goto free;
192 if (token_type(token) != TOKEN_STREAMBEGIN)
193 goto free;
194 token = token->next;
195
196 ret = base;
197 while (token_type(token) == TOKEN_SPECIAL &&
|