/***********************************************************************
* *
* This software is part of the ast package *
* Copyright (c) 1989-2011 AT&T Intellectual Property *
* and is licensed under the *
* Eclipse Public License, Version 1.0 *
* by AT&T Intellectual Property *
* *
* A copy of the License is available at *
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
* *
* Information and Software Systems Research *
* AT&T Research *
* Florham Park NJ *
* *
* Glenn Fowler <gsf@research.att.com> *
* *
***********************************************************************/
#pragma prototyped
/*
* Glenn Fowler
* AT&T Research
*
* expression library C program generator
*/
#define _EX_CC_PRIVATE_ \
char* id; /* prefix + _ */ \
int lastop; /* last op */ \
int tmp; /* temp var index */ \
#include "exlib.h"
/*
* return C name for op
*/
static char*
{
switch (op)
{
case '!':
return "!";
case '%':
return "%";
case '&':
return "&";
case '(':
return "(";
case '*':
return "*";
case '+':
return "+";
case ',':
return ",";
case '-':
return "-";
case '/':
return "/";
case ':':
return ":";
case '<':
return "<";
case '=':
return "=";
case '>':
return ">";
case '?':
return "?";
case '^':
return "^";
case '|':
return "|";
case '~':
return "~";
case AND:
return "&&";
case EQ:
return "==";
case GE:
return ">=";
case LE:
return "<=";
case LS:
return "<<";
case NE:
return "!=";
case OR:
return "||";
case RS:
return ">>";
}
return buf;
}
/*
* generate printf()
*/
static void
{
register Print_t* x;
register int i;
{
sfprintf(cc->ccdisc->text, "sfprintf(%s, \"%s", expr->data.print.descriptor->op == CONSTANT && expr->data.print.descriptor->data.constant.value.integer == 2 ? "sfstderr" : "sfstdout", fmtesq(x->format, quote));
while (x = x->next)
{
if (x->arg)
{
{
}
}
}
}
}
/*
* generate scanf()
*/
static void
{
register Print_t* x;
register int i;
{
while (x = x->next)
{
if (x->arg)
{
{
}
}
}
}
}
/*
* internal excc
*/
static void
{
register Exnode_t* x;
register Exnode_t* y;
register int n;
register int m;
register int t;
char* s;
Extype_t* v;
Extype_t** p;
if (!expr)
return;
{
case BREAK:
return;
case CONTINUE:
return;
case CONSTANT:
{
case FLOATING:
break;
case STRING:
break;
case UNSIGNED:
sfprintf(cc->ccdisc->text, "%I*u", sizeof(expr->data.constant.value.integer), expr->data.constant.value.integer);
break;
default:
sfprintf(cc->ccdisc->text, "%I*d", sizeof(expr->data.constant.value.integer), expr->data.constant.value.integer);
break;
}
return;
case DEC:
return;
case DYNAMIC:
return;
case EXIT:
return;
case IF:
{
}
return;
case FOR:
{
}
return;
case ID:
(*cc->ccdisc->ccf)(cc, expr, expr->data.variable.symbol, expr->data.variable.reference, expr->data.variable.index, cc->ccdisc);
else
return;
case INC:
return;
case ITERATE:
{
sfprintf(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);
}
return;
case PRINTF:
return;
case RETURN:
return;
case SCANF:
return;
case SWITCH:
t = x->type;
n = 0;
{
if (n)
else
{
m = 0;
while (v = *p++)
{
if (m)
else
{
m = 1;
}
if (t == STRING)
sfprintf(cc->ccdisc->text, "strmatch(%stmp_%d, \"%s\")", cc->id, cc->tmp, fmtesq(v->string, quote));
else
{
switch (t)
{
case INTEGER:
case UNSIGNED:
break;
default:
break;
}
}
}
}
}
if (y)
{
if (n)
}
return;
case WHILE:
return;
case '=':
sfprintf(cc->ccdisc->text, "(%s%s=", x->data.variable.symbol->name, expr->subop == '=' ? "" : opname(expr->subop));
return;
case ';':
for (;;)
{
{
case FOR:
case IF:
case PRINTF:
case RETURN:
case WHILE:
break;
default:
break;
}
if (!(expr = x))
break;
{
case ';':
continue;
case FOR:
case IF:
case PRINTF:
case RETURN:
case WHILE:
break;
default:
break;
}
break;
}
return;
case ',':
{
}
if (expr)
{
}
return;
case '?':
return;
case AND:
return;
case OR:
return;
case F2I:
return;
case I2F:
return;
case S2I:
return;
}
{
{
case S2B:
return;
case S2F:
return;
case S2I:
return;
case S2X:
return;
case NE:
/*FALLTHROUGH*/
case EQ:
return;
case '+':
case '|':
case '&':
case '^':
case '%':
case '*':
return;
}
{
case '<':
s = "<0";
break;
case LE:
s = "<=0";
break;
case GE:
s = ">=0";
break;
case '>':
s = ">0";
break;
default:
s = "** unknown string op **";
break;
}
return;
}
else
{
if (!y)
if (y)
{
}
}
return;
}
/*
* generate global declarations
*/
static int
{
return 0;
}
/*
* open C program generator context
*/
{
char* id;
id = "";
return 0;
{
if (*id)
}
return cc;
}
/*
* close C program generator context
*/
int
{
int r = 0;
if (!cc)
r = -1;
else
{
{
else
r = -1;
}
}
return r;
}
/*
* generate the program for name or sym coerced to type
*/
int
{
register char* t;
if (!cc)
return -1;
if (!sym)
{
sfprintf(cc->ccdisc->text, "\n%s %s%s(data) char** data; {\n%s _%svalue = 0;\n", t, cc->id, sym->name, t, cc->id);
return 0;
}
return -1;
}
/*
* dump an expression tree on sp
*/
int
{
return -1;
if (node)
else
{
}
}