47#define EX_CC_DUMP 0x8000
49static const char quote[] =
"\"";
117 snprintf(buf,
sizeof(buf) - 1,
"(OP=%03o)", op);
128 if ((x = exnode->
data.print.args))
133 while ((x = x->
next)) {
139 for (x = exnode->
data.print.args; x; x = x->
next)
165 if ((x = exnode->
data.print.args))
170 while ((x = x->
next)) {
176 for (x = exnode->
data.print.args; x; x = x->
next)
212 if (exnode->
data.call.args)
213 gen(cc, exnode->
data.call.args);
227 switch (exnode->
type)
280 s = (exnode->
op ==
GSUB ?
"gsub(" : exnode->
op ==
SUB ?
"sub(" :
"substr(");
282 gen(cc, exnode->
data.string.base);
284 gen(cc, exnode->
data.string.pat);
285 if (exnode->
data.string.repl) {
287 gen(cc, exnode->
data.string.repl);
336 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);
365 gen(cc, exnode->
data.split.string);
367 if (exnode->
data.split.seps) {
369 gen(cc, exnode->
data.split.seps);
410 (
unsigned long long)v->
integer);
620 s =
"** unknown string op **";
650static int global(
void *
object,
void *handle) {
667 if (!(
id = disc->
id))
669 if (!(cc = calloc(1,
sizeof(
Excc_t) + strlen(
id) + 2)))
673 cc->
id = (
char*)(cc + 1);
680 snprintf(cc->
id, strlen(
id) + 2,
"%s_",
id);
719 memset(&ccdisc, 0,
sizeof(ccdisc));
static size_t agxbput(agxbuf *xb, const char *s)
append string s into xb
static int agxbprint(agxbuf *xb, const char *fmt,...)
Printf-style output to an agxbuf.
static int agxbputc(agxbuf *xb, char c)
add character to buffer
static char * agxbuse(agxbuf *xb)
char * fmtesq(const char *, const char *)
CDT_API int dtwalk(Dt_t *, int(*)(void *, void *), void *)
static void scan(Excc_t *cc, Exnode_t *exnode)
static int global(void *object, void *handle)
static void print(Excc_t *cc, Exnode_t *exnode)
static Excc_t * exccopen(Expr_t *ex, Exccdisc_t *disc)
static const char quote[]
static int exccclose(Excc_t *cc)
static void gen(Excc_t *, Exnode_t *)
int exdump(Expr_t *ex, Exnode_t *node, agxbuf *xb)
int(* ccf)(Excc_t *, Exnode_t *, Exid_t *, Exref_t *, Exnode_t *, Exccdisc_t *)
struct Exnode_s * param[3]
struct Exdata_u::@87 constant
struct Exdata_u::@88 operand
struct Exdata_u::@89 select
struct Exdata_u::@90 variable