* internal excc
*/
-static void
-gen(Excc_t* cc, Exnode_t* expr)
-{
+static void gen(Excc_t *cc, Exnode_t *exnode) {
Exnode_t* x;
Exnode_t* y;
int n;
Extype_t* v;
Extype_t** p;
- if (!expr)
+ if (!exnode)
return;
- if (expr->op == CALL) {
- agxbprint(cc->ccdisc->text, "%s(", expr->data.call.procedure->name);
- if (expr->data.call.args)
- gen(cc, expr->data.call.args);
+ if (exnode->op == CALL) {
+ agxbprint(cc->ccdisc->text, "%s(", exnode->data.call.procedure->name);
+ if (exnode->data.call.args)
+ gen(cc, exnode->data.call.args);
agxbputc(cc->ccdisc->text, ')');
return;
}
- x = expr->data.operand.left;
- switch (expr->op)
+ x = exnode->data.operand.left;
+ switch (exnode->op)
{
case BREAK:
agxbput(cc->ccdisc->text, "break;\n");
agxbput(cc->ccdisc->text, "continue;\n");
return;
case CONSTANT:
- switch (expr->type)
+ switch (exnode->type)
{
case FLOATING:
- agxbprint(cc->ccdisc->text, "%g", expr->data.constant.value.floating);
+ agxbprint(cc->ccdisc->text, "%g", exnode->data.constant.value.floating);
break;
case STRING:
- agxbprint(cc->ccdisc->text, "\"%s\"", fmtesq(expr->data.constant.value.string, quote));
+ agxbprint(cc->ccdisc->text, "\"%s\"", fmtesq(exnode->data.constant.value.string, quote));
break;
case UNSIGNED:
agxbprint(cc->ccdisc->text, "%llu",
- (long long unsigned)expr->data.constant.value.integer);
+ (long long unsigned)exnode->data.constant.value.integer);
break;
default:
- agxbprint(cc->ccdisc->text, "%lld", expr->data.constant.value.integer);
+ agxbprint(cc->ccdisc->text, "%lld", exnode->data.constant.value.integer);
break;
}
return;
agxbprint(cc->ccdisc->text, "%s--", x->data.variable.symbol->name);
return;
case DYNAMIC:
- agxbput(cc->ccdisc->text, expr->data.variable.symbol->name);
+ agxbput(cc->ccdisc->text, exnode->data.variable.symbol->name);
return;
case EXIT:
agxbput(cc->ccdisc->text, "exit(");
case FUNCTION:
gen(cc, x);
agxbputc(cc->ccdisc->text, '(');
- if ((y = expr->data.operand.right)) {
+ if ((y = exnode->data.operand.right)) {
gen(cc, y);
}
agxbputc(cc->ccdisc->text, ')');
agxbput(cc->ccdisc->text, "rand();\n");
return;
case SRAND:
- if (expr->binary) {
+ if (exnode->binary) {
agxbput(cc->ccdisc->text, "srand(");
gen(cc, x);
agxbput(cc->ccdisc->text, ");\n");
case GSUB:
case SUB:
case SUBSTR:
- s = (expr->op == GSUB ? "gsub(" : expr->op == SUB ? "sub(" : "substr(");
+ s = (exnode->op == GSUB ? "gsub(" : exnode->op == SUB ? "sub(" : "substr(");
agxbput(cc->ccdisc->text, s);
- gen(cc, expr->data.string.base);
+ gen(cc, exnode->data.string.base);
agxbput(cc->ccdisc->text, ", ");
- gen(cc, expr->data.string.pat);
- if (expr->data.string.repl) {
+ gen(cc, exnode->data.string.pat);
+ if (exnode->data.string.repl) {
agxbput(cc->ccdisc->text, ", ");
- gen(cc, expr->data.string.repl);
+ gen(cc, exnode->data.string.repl);
}
agxbputc(cc->ccdisc->text, ')');
return;
case IN_OP:
- gen(cc, expr->data.variable.index);
- agxbprint(cc->ccdisc->text, " in %s", expr->data.variable.symbol->name);
+ gen(cc, exnode->data.variable.index);
+ agxbprint(cc->ccdisc->text, " in %s", exnode->data.variable.symbol->name);
return;
case IF:
agxbput(cc->ccdisc->text, "if (");
gen(cc, x);
agxbput(cc->ccdisc->text, ") {\n");
- gen(cc, expr->data.operand.right->data.operand.left);
- if (expr->data.operand.right->data.operand.right)
+ gen(cc, exnode->data.operand.right->data.operand.left);
+ if (exnode->data.operand.right->data.operand.right)
{
agxbput(cc->ccdisc->text, "} else {\n");
- gen(cc, expr->data.operand.right->data.operand.right);
+ gen(cc, exnode->data.operand.right->data.operand.right);
}
agxbput(cc->ccdisc->text, "}\n");
return;
agxbput(cc->ccdisc->text, "for (;");
gen(cc, x);
agxbput(cc->ccdisc->text, ");");
- if (expr->data.operand.left)
+ if (exnode->data.operand.left)
{
agxbputc(cc->ccdisc->text, '(');
- gen(cc, expr->data.operand.left);
+ gen(cc, exnode->data.operand.left);
agxbputc(cc->ccdisc->text, ')');
}
agxbput(cc->ccdisc->text, ") {");
- if (expr->data.operand.right)
- gen(cc, expr->data.operand.right);
+ if (exnode->data.operand.right)
+ gen(cc, exnode->data.operand.right);
agxbputc(cc->ccdisc->text, '}');
return;
case ID:
if (cc->ccdisc->ccf)
- cc->ccdisc->ccf(cc, expr, expr->data.variable.symbol, expr->data.variable.reference, expr->data.variable.index, cc->ccdisc);
+ cc->ccdisc->ccf(cc, exnode, exnode->data.variable.symbol, exnode->data.variable.reference, exnode->data.variable.index, cc->ccdisc);
else
- agxbput(cc->ccdisc->text, expr->data.variable.symbol->name);
+ agxbput(cc->ccdisc->text, exnode->data.variable.symbol->name);
return;
case INC:
agxbprint(cc->ccdisc->text, "%s++", x->data.variable.symbol->name);
return;
case ITERATE:
case ITERATER:
- if (expr->op == DYNAMIC)
+ if (exnode->op == DYNAMIC)
{
agxbprint(cc->ccdisc->text, "{ Exassoc_t* %stmp_%d;", cc->id, ++cc->tmp);
- agxbprint(cc->ccdisc->text, "for (%stmp_%d = (Exassoc_t*)dtfirst(%s); %stmp_%d && (%s = %stmp_%d->name); %stmp_%d = (Exassoc_t*)dtnext(%s, %stmp_%d)) {", cc->id, cc->tmp, expr->data.generate.array->data.variable.symbol->name, cc->id, cc->tmp, expr->data.generate.index->name, cc->id, cc->tmp, cc->id, cc->tmp, expr->data.generate.array->data.variable.symbol->name, cc->id, cc->tmp);
- gen(cc, expr->data.generate.statement);
+ agxbprint(cc->ccdisc->text, "for (%stmp_%d = (Exassoc_t*)dtfirst(%s); %stmp_%d && (%s = %stmp_%d->name); %stmp_%d = (Exassoc_t*)dtnext(%s, %stmp_%d)) {", cc->id, cc->tmp, exnode->data.generate.array->data.variable.symbol->name, cc->id, cc->tmp, exnode->data.generate.index->name, cc->id, cc->tmp, cc->id, cc->tmp, exnode->data.generate.array->data.variable.symbol->name, cc->id, cc->tmp);
+ gen(cc, exnode->data.generate.statement);
agxbput(cc->ccdisc->text, "} }");
}
return;
agxbput(cc->ccdisc->text, "()");
return;
case PRINTF:
- print(cc, expr);
+ print(cc, exnode);
return;
case RETURN:
agxbput(cc->ccdisc->text, "return(");
agxbput(cc->ccdisc->text, ");\n");
return;
case SCANF:
- scan(cc, expr);
+ scan(cc, exnode);
return;
case SPLIT:
case TOKENS:
- if (expr->op == SPLIT)
+ if (exnode->op == SPLIT)
agxbput(cc->ccdisc->text, "split (");
else
agxbput(cc->ccdisc->text, "tokens (");
- gen(cc, expr->data.split.string);
- agxbprint(cc->ccdisc->text, ", %s", expr->data.split.array->name);
- if (expr->data.split.seps) {
+ gen(cc, exnode->data.split.string);
+ agxbprint(cc->ccdisc->text, ", %s", exnode->data.split.array->name);
+ if (exnode->data.split.seps) {
agxbputc(cc->ccdisc->text, ',');
- gen(cc, expr->data.split.seps);
+ gen(cc, exnode->data.split.seps);
}
agxbputc(cc->ccdisc->text, ')');
return;
agxbprint(cc->ccdisc->text, "{ %s %stmp_%d = ", extype(t), cc->id, ++cc->tmp);
gen(cc, x);
agxbputc(cc->ccdisc->text, ';');
- x = expr->data.operand.right;
+ x = exnode->data.operand.right;
y = x->data.select.statement;
n = 0;
while ((x = x->data.select.next))
agxbputc(cc->ccdisc->text, '}');
return;
case UNSET:
- agxbprint(cc->ccdisc->text, "unset(%s", expr->data.variable.symbol->name);
- if (expr->data.variable.index) {
+ agxbprint(cc->ccdisc->text, "unset(%s", exnode->data.variable.symbol->name);
+ if (exnode->data.variable.index) {
agxbputc(cc->ccdisc->text, ',');
- gen(cc, expr->data.variable.index);
+ gen(cc, exnode->data.variable.index);
}
agxbputc(cc->ccdisc->text, ')');
return;
agxbput(cc->ccdisc->text, "while (");
gen(cc, x);
agxbput(cc->ccdisc->text, ") {");
- if (expr->data.operand.right)
- gen(cc, expr->data.operand.right);
+ if (exnode->data.operand.right)
+ gen(cc, exnode->data.operand.right);
agxbputc(cc->ccdisc->text, '}');
return;
case '#':
- agxbprint(cc->ccdisc->text, "# %s", expr->data.variable.symbol->name);
+ agxbprint(cc->ccdisc->text, "# %s", exnode->data.variable.symbol->name);
return;
case '=':
- agxbprint(cc->ccdisc->text, "(%s%s=", x->data.variable.symbol->name, expr->subop == '=' ? "" : exopname(expr->subop));
- gen(cc, expr->data.operand.right);
+ agxbprint(cc->ccdisc->text, "(%s%s=", x->data.variable.symbol->name, exnode->subop == '=' ? "" : exopname(exnode->subop));
+ gen(cc, exnode->data.operand.right);
agxbputc(cc->ccdisc->text, ')');
return;
case ';':
for (;;)
{
- if (!(x = expr->data.operand.right))
- switch (cc->lastop = expr->data.operand.left->op)
+ if (!(x = exnode->data.operand.right))
+ switch (cc->lastop = exnode->data.operand.left->op)
{
case FOR:
case IF:
agxbprint(cc->ccdisc->text, "_%svalue=", cc->id);
break;
}
- gen(cc, expr->data.operand.left);
+ gen(cc, exnode->data.operand.left);
agxbput(cc->ccdisc->text, ";\n");
- if (!(expr = x))
+ if (!(exnode = x))
break;
- switch (cc->lastop = expr->op)
+ switch (cc->lastop = exnode->op)
{
case ';':
continue;
agxbprint(cc->ccdisc->text, "_%svalue=", cc->id);
break;
}
- gen(cc, expr);
+ gen(cc, exnode);
agxbput(cc->ccdisc->text, ";\n");
break;
}
case ',':
agxbputc(cc->ccdisc->text, '(');
gen(cc, x);
- while ((expr = expr->data.operand.right) && expr->op == ',')
+ while ((exnode = exnode->data.operand.right) && exnode->op == ',')
{
agxbput(cc->ccdisc->text, "), (");
- gen(cc, expr->data.operand.left);
+ gen(cc, exnode->data.operand.left);
}
- if (expr)
+ if (exnode)
{
agxbput(cc->ccdisc->text, "), (");
- gen(cc, expr);
+ gen(cc, exnode);
}
agxbputc(cc->ccdisc->text, ')');
return;
agxbputc(cc->ccdisc->text, '(');
gen(cc, x);
agxbput(cc->ccdisc->text, ") ? (");
- gen(cc, expr->data.operand.right->data.operand.left);
+ gen(cc, exnode->data.operand.right->data.operand.left);
agxbput(cc->ccdisc->text, ") : (");
- gen(cc, expr->data.operand.right->data.operand.right);
+ gen(cc, exnode->data.operand.right->data.operand.right);
agxbputc(cc->ccdisc->text, ')');
return;
case AND:
agxbputc(cc->ccdisc->text, '(');
gen(cc, x);
agxbput(cc->ccdisc->text, ") && (");
- gen(cc, expr->data.operand.right);
+ gen(cc, exnode->data.operand.right);
agxbputc(cc->ccdisc->text, ')');
return;
case OR:
agxbputc(cc->ccdisc->text, '(');
gen(cc, x);
agxbput(cc->ccdisc->text, ") || (");
- gen(cc, expr->data.operand.right);
+ gen(cc, exnode->data.operand.right);
agxbputc(cc->ccdisc->text, ')');
return;
case F2I:
agxbputc(cc->ccdisc->text, ')');
return;
}
- y = expr->data.operand.right;
+ y = exnode->data.operand.right;
if (x->type == STRING)
{
- switch (expr->op)
+ switch (exnode->op)
{
case S2B:
agxbput(cc->ccdisc->text, "*(");
agxbput(cc->ccdisc->text, "** string bits not supported **");
return;
}
- switch (expr->op)
+ switch (exnode->op)
{
case '<':
s = "<0";
else
{
if (!y)
- agxbput(cc->ccdisc->text, exopname(expr->op));
+ agxbput(cc->ccdisc->text, exopname(exnode->op));
agxbputc(cc->ccdisc->text, '(');
gen(cc, x);
if (y)
{
- agxbprint(cc->ccdisc->text, ")%s(", exopname(expr->op));
+ agxbprint(cc->ccdisc->text, ")%s(", exopname(exnode->op));
gen(cc, y);
}
agxbputc(cc->ccdisc->text, ')');