Filter: M4 convertors polished a bit.

This commit is contained in:
Maria Matejka 2019-02-06 14:41:39 +01:00
parent c0e958e022
commit c1e97169cd
8 changed files with 150 additions and 123 deletions

View file

@ -10,34 +10,42 @@ m4_divert(-1)m4_dnl
# Common aliases # Common aliases
m4_define(DNL, `m4_dnl') m4_define(DNL, `m4_dnl')
m4_define(INST, `m4_divert(1)break; case $1: m4_define(INST_FLUSH, `m4_ifdef([[INST_NAME]], [[
m4_divert(-1)')) m4_divert(1)
m4_define(LINE, `m4_divert(1)f_dump_line(item->lines[$2], indent + 1); case INST_NAME():
m4_undivert(2)
break;
m4_divert(-1)
]])')
m4_define(INST, `INST_FLUSH()m4_define([[INST_NAME]], [[$1]])')
m4_define(LINE, `m4_divert(2)f_dump_line(item->lines[$2], indent + 1);
m4_divert(-1)') m4_divert(-1)')
m4_define(LINEP, `LINE($@)') m4_define(LINEP, `LINE($@)')
m4_define(SYMBOL, `m4_divert(1)debug("%ssymbol %s\n", INDENT, item->sym->name); m4_define(SYMBOL, `m4_divert(2)debug("%ssymbol %s\n", INDENT, item->sym->name);
m4_divert(-1)') m4_divert(-1)')
m4_define(VALI, `m4_divert(1)debug("%svalue %s\n", INDENT, val_dump(&item->val)); m4_define(VALI, `m4_divert(2)debug("%svalue %s\n", INDENT, val_dump(&item->val));
m4_divert(-1)') m4_divert(-1)')
m4_define(VAR, `m4_divert(1)debug("%svar %s: value %s\n", INDENT, item->sym->name, val_dump(item->vp)); m4_define(VAR, `m4_divert(2)debug("%svar %s: value %s\n", INDENT, item->sym->name, val_dump(item->vp));
m4_divert(-1)') m4_divert(-1)')
m4_define(FRET, `m4_divert(1)debug("%sfilter return value %d\n", INDENT, item->fret); m4_define(FRET, `m4_divert(2)debug("%sfilter return value %d\n", INDENT, item->fret);
m4_divert(-1)') m4_divert(-1)')
m4_define(ECS, `m4_divert(1)debug("%sec subtype %d\n", INDENT, item->ecs); m4_define(ECS, `m4_divert(2)debug("%sec subtype %d\n", INDENT, item->ecs);
m4_divert(-1)') m4_divert(-1)')
m4_define(RTC, `m4_divert(1)debug("%sroute table %s\n", INDENT, item->rtc->name); m4_define(RTC, `m4_divert(2)debug("%sroute table %s\n", INDENT, item->rtc->name);
m4_divert(-1)') m4_divert(-1)')
m4_define(STATIC_ATTR, `m4_divert(1)debug("%sstatic attribute %u/%u/%u\n", INDENT, item->sa.f_type, item->sa.sa_code, item->sa.readonly); m4_define(STATIC_ATTR, `m4_divert(2)debug("%sstatic attribute %u/%u/%u\n", INDENT, item->sa.f_type, item->sa.sa_code, item->sa.readonly);
m4_divert(-1)') m4_divert(-1)')
m4_define(DYNAMIC_ATTR, `m4_divert(1)debug("%sdynamic attribute %u/%u/%u/%u\n", INDENT, item->da.type, item->da.bit, item->da.f_type, item->da.ea_code); m4_define(DYNAMIC_ATTR, `m4_divert(2)debug("%sdynamic attribute %u/%u/%u/%u\n", INDENT, item->da.type, item->da.bit, item->da.f_type, item->da.ea_code);
m4_divert(-1)') m4_divert(-1)')
m4_define(DUMP, `m4_divert(1)$1m4_divert(-1)') m4_define(DUMP, `m4_divert(2)$1m4_divert(-1)')
m4_m4wrap(` m4_m4wrap(`
INST_FLUSH()
m4_divert(0)DNL m4_divert(0)DNL
case FI_NOP: bug("This shall not happen");
m4_undivert(1) m4_undivert(1)
break; default: bug( "Unknown instruction %d (%c)", item->fi_code, item->fi_code & 0xff);
default: bug( "Unknown instruction %d (%c)", item->fi_code, item->fi_code & 0xff);
') ')
m4_changequote([[,]]) m4_changequote([[,]])

View file

@ -626,7 +626,6 @@ inst_line_size(const struct f_inst *what_)
return cnt; return cnt;
} }
#if DEBUGGING
#define INDENT (((const char *) f_dump_line_indent_str) + sizeof(f_dump_line_indent_str) - (indent) - 1) #define INDENT (((const char *) f_dump_line_indent_str) + sizeof(f_dump_line_indent_str) - (indent) - 1)
static const char f_dump_line_indent_str[] = " "; static const char f_dump_line_indent_str[] = " ";
@ -667,9 +666,6 @@ f_dump_line(const struct f_line *dest, int indent)
debug("%sFilter line %p dump done\n", INDENT, dest); debug("%sFilter line %p dump done\n", INDENT, dest);
#undef INDENT #undef INDENT
} }
#else
#define f_dump_line(...)
#endif
static uint static uint
postfixify(struct f_line *dest, const struct f_inst *what_, uint pos) postfixify(struct f_line *dest, const struct f_inst *what_, uint pos)
@ -695,7 +691,9 @@ f_postfixify_concat(const struct f_inst * const inst[], uint count)
for (uint i=0; i<count; i++) for (uint i=0; i<count; i++)
out->len = postfixify(out, inst[i], out->len); out->len = postfixify(out, inst[i], out->len);
#if DEBUGGING
f_dump_line(out, 0); f_dump_line(out, 0);
#endif
return out; return out;
} }

View file

@ -10,10 +10,16 @@ m4_divert(-1)m4_dnl
# Common aliases # Common aliases
m4_define(DNL, `m4_dnl') m4_define(DNL, `m4_dnl')
m4_define(INST, `break; case $1: m4_define(INST_FLUSH, `m4_ifdef([[INST_NAME]], [[
m4_ifelse(eval($2 > 0), `if (vstk.cnt < $2) runtime("Stack underflow");', `') m4_divert(1)
vstk.cnt -= $2; case INST_NAME():
') m4_ifelse(m4_eval(INST_INVAL() > 0), 1, [[if (vstk.cnt < INST_INVAL()) runtime("Stack underflow"); vstk.cnt -= INST_INVAL(); ]])
m4_undivert(2)
break;
m4_divert(-1)
]])')
m4_define(INST, `INST_FLUSH()m4_define([[INST_NAME]], [[$1]])m4_define([[INST_INVAL]], [[$2]])m4_divert(2)')
m4_define(ARG, `if (v$1.type != $2) runtime("Argument $1 of instruction %s must be of type $2, got 0x%02x", f_instruction_name(what->fi_code), v$1.type)') m4_define(ARG, `if (v$1.type != $2) runtime("Argument $1 of instruction %s must be of type $2, got 0x%02x", f_instruction_name(what->fi_code), v$1.type)')
@ -63,12 +69,11 @@ m4_define(STRUCT, `')
m4_define(NEW, `') m4_define(NEW, `')
m4_m4wrap(` m4_m4wrap(`
INST_FLUSH()
m4_divert(0)DNL m4_divert(0)DNL
case FI_NOP: bug("This shall not happen");
m4_undivert(1) m4_undivert(1)
break; default: bug( "Unknown instruction %d (%c)", what->fi_code, what->fi_code & 0xff); default: bug( "Unknown instruction %d (%c)", what->fi_code, what->fi_code & 0xff);
') ')
m4_divert(1)
m4_changequote([[,]]) m4_changequote([[,]])

View file

@ -10,25 +10,32 @@ m4_divert(-1)m4_dnl
# Common aliases # Common aliases
m4_define(DNL, `m4_dnl') m4_define(DNL, `m4_dnl')
m4_define(INST, `m4_divert(1) m4_define(INST_FLUSH, `m4_ifdef([[INST_NAME]], [[
m4_divert(1)
case INST_NAME():
cnt += 1;
#define what ((const struct f_inst_]]INST_NAME()[[ *) &(what_->i_]]INST_NAME()[[))
m4_undivert(2)
#undef what #undef what
break; case $1: cnt += 1; break;
#define what ((const struct f_inst_$1 *) &(what_->i_$1)) m4_divert(-1)
]])')
m4_define(INST, `INST_FLUSH()m4_define([[INST_NAME]], [[$1]])')
m4_define(ARG, `m4_divert(2)cnt += inst_line_size(what->f$1);
m4_divert(-1)') m4_divert(-1)')
m4_define(ARG, `m4_divert(1)cnt += inst_line_size(what->f$1); m4_define(ARG_T, `m4_divert(2)cnt += inst_line_size(what->f$1);
m4_divert(-1)') m4_divert(-1)')
m4_define(ARG_T, `m4_divert(1)cnt += inst_line_size(what->f$1); m4_define(ARG_ANY, `m4_divert(2)cnt += inst_line_size(what->f$1);
m4_divert(-1)') m4_divert(-1)')
m4_define(ARG_ANY, `m4_divert(1)cnt += inst_line_size(what->f$1); m4_define(LINE_SIZE, `m4_divert(2)$1m4_divert(-1)')
m4_divert(-1)')
m4_define(LINE_SIZE, `m4_divert(1)$1m4_divert(-1)')
m4_m4wrap(` m4_m4wrap(`
INST_FLUSH()
m4_divert(0)DNL m4_divert(0)DNL
case FI_NOP: bug("This shall not happen");
m4_undivert(1) m4_undivert(1)
#undef what
break; default: bug( "Unknown instruction %d (%c)", what_->fi_code, what_->fi_code & 0xff); default: bug( "Unknown instruction %d (%c)", what_->fi_code, what_->fi_code & 0xff);
') ')
m4_changequote([[,]]) m4_changequote([[,]])

View file

@ -20,18 +20,22 @@ m4_define(FNOUT, `m4_divert(1)')
m4_define(FNARG, `m4_divert(2)') m4_define(FNARG, `m4_divert(2)')
m4_define(FNBODY, `m4_divert(3)') m4_define(FNBODY, `m4_divert(3)')
m4_define(INST, `m4_define([[INST_NAME]], [[$1]])FNOUT()DNL m4_define(INST_FLUSH, `m4_ifdef([[INST_NAME]], [[
m4_undivert(2)DNL FNOUT()DNL
m4_undivert(3)DNL struct f_inst *f_new_inst_]]INST_NAME()[[(enum f_instruction_code fi_code
return what; m4_undivert(2)
} ) {
struct f_inst *f_new_inst_$1(enum f_instruction_code fi_code
FNBODY()) {
struct f_inst *what = cfg_allocz(sizeof(struct f_inst)); struct f_inst *what = cfg_allocz(sizeof(struct f_inst));
what->fi_code = fi_code; what->fi_code = fi_code;
what->lineno = ifs->lino; what->lineno = ifs->lino;
FNSTOP()') m4_undivert(3)
return what;
}
FNSTOP()
]]DNL
)')
m4_define(INST, `INST_FLUSH()m4_define([[INST_NAME]], [[$1]])')
m4_define(WHAT, `what->i_[[]]INST_NAME()') m4_define(WHAT, `what->i_[[]]INST_NAME()')
@ -60,25 +64,15 @@ FNBODY()$2
FNSTOP()') FNSTOP()')
m4_m4wrap(` m4_m4wrap(`
FNOUT() INST_FLUSH()
m4_undivert(2)
m4_undivert(3)
m4_divert(0) m4_divert(0)
#include "nest/bird.h" #include "nest/bird.h"
#include "conf/conf.h" #include "conf/conf.h"
#include "filter/filter.h" #include "filter/filter.h"
#include "filter/f-inst-struct.h" #include "filter/f-inst-struct.h"
struct f_inst *f_new_inst_FI_NOP(enum f_instruction_code fi_code) {
struct f_inst *what = cfg_allocz(sizeof(struct f_inst));
what->fi_code = fi_code;
what->lineno = ifs->lino;
m4_undivert(1) m4_undivert(1)
return what;
}
') ')
m4_changequote([[,]]) m4_changequote([[,]])

View file

@ -10,55 +10,59 @@ m4_divert(-1)m4_dnl
# Common aliases # Common aliases
m4_define(DNL, `m4_dnl') m4_define(DNL, `m4_dnl')
m4_define(POSTFIXIFY_TRAILER, `dest->items[pos].fi_code = what_->fi_code; m4_define(INST_FLUSH, `m4_ifdef([[INST_NAME]], [[
dest->items[pos].lineno = what_->lineno;') m4_divert(1)
case INST_NAME():
m4_define(INST, `m4_divert(1)POSTFIXIFY_TRAILER #define what ((const struct f_inst_]]INST_NAME()[[ *) &(what_->i_]]INST_NAME()[[))
m4_undivert(2)
#undef what #undef what
break; case $1: dest->items[pos].fi_code = what_->fi_code;
#define what ((const struct f_inst_$1 *) &(what_->i_$1)) dest->items[pos].lineno = what_->lineno;
m4_divert(-1)')) break;
m4_define(ARG, `m4_divert(1)pos = postfixify(dest, what->f$1, pos); m4_divert(-1)
]])')
m4_define(INST, `INST_FLUSH()m4_define([[INST_NAME]], [[$1]])')
m4_define(ARG, `m4_divert(2)pos = postfixify(dest, what->f$1, pos);
m4_divert(-1)') m4_divert(-1)')
m4_define(ARG_ANY, `m4_divert(1)pos = postfixify(dest, what->f$1, pos); m4_define(ARG_ANY, `m4_divert(2)pos = postfixify(dest, what->f$1, pos);
m4_divert(-1)') m4_divert(-1)')
m4_define(LINE, `m4_divert(1)dest->items[pos].lines[$2] = f_postfixify(what->f$1); m4_define(LINE, `m4_divert(2)dest->items[pos].lines[$2] = f_postfixify(what->f$1);
m4_divert(-1)') m4_divert(-1)')
m4_define(LINEP, `m4_divert(1)dest->items[pos].lines[$2] = what->fl$1; m4_define(LINEP, `m4_divert(2)dest->items[pos].lines[$2] = what->fl$1;
m4_divert(-1)') m4_divert(-1)')
m4_define(SYMBOL, `m4_divert(1)dest->items[pos].sym = what->sym; m4_define(SYMBOL, `m4_divert(2)dest->items[pos].sym = what->sym;
m4_divert(-1)') m4_divert(-1)')
m4_define(VALI, `m4_divert(1)dest->items[pos].val = what->vali; m4_define(VALI, `m4_divert(2)dest->items[pos].val = what->vali;
m4_divert(-1)') m4_divert(-1)')
m4_define(VALP, `m4_divert(1)dest->items[pos].val = *(what->valp); m4_define(VALP, `m4_divert(2)dest->items[pos].val = *(what->valp);
m4_divert(-1)') m4_divert(-1)')
m4_define(VAR, `m4_divert(1)dest->items[pos].vp = (dest->items[pos].sym = what->sym)->def; m4_define(VAR, `m4_divert(2)dest->items[pos].vp = (dest->items[pos].sym = what->sym)->def;
m4_divert(-1)') m4_divert(-1)')
m4_define(FRET, `m4_divert(1)dest->items[pos].fret = what->fret; m4_define(FRET, `m4_divert(2)dest->items[pos].fret = what->fret;
m4_divert(-1)') m4_divert(-1)')
m4_define(ECS, `m4_divert(1)dest->items[pos].ecs = what->ecs; m4_define(ECS, `m4_divert(2)dest->items[pos].ecs = what->ecs;
m4_divert(-1)') m4_divert(-1)')
m4_define(RTC, `m4_divert(1)dest->items[pos].rtc = what->rtc; m4_define(RTC, `m4_divert(2)dest->items[pos].rtc = what->rtc;
m4_divert(-1)') m4_divert(-1)')
m4_define(STATIC_ATTR, `m4_divert(1)dest->items[pos].sa = what->sa; m4_define(STATIC_ATTR, `m4_divert(2)dest->items[pos].sa = what->sa;
m4_divert(-1)') m4_divert(-1)')
m4_define(DYNAMIC_ATTR, `m4_divert(1)dest->items[pos].da = what->da; m4_define(DYNAMIC_ATTR, `m4_divert(2)dest->items[pos].da = what->da;
m4_divert(-1)') m4_divert(-1)')
m4_define(COUNT, `m4_divert(1)dest->items[pos].count = what->count; m4_define(COUNT, `m4_divert(2)dest->items[pos].count = what->count;
m4_divert(-1)') m4_divert(-1)')
m4_define(TREE, `m4_divert(1)dest->items[pos].tree = what->tree; m4_define(TREE, `m4_divert(2)dest->items[pos].tree = what->tree;
m4_divert(-1)') m4_divert(-1)')
m4_define(STRING, `m4_divert(1)dest->items[pos].s = what->s; m4_define(STRING, `m4_divert(2)dest->items[pos].s = what->s;
m4_divert(-1)') m4_divert(-1)')
m4_define(POSTFIXIFY, `m4_divert(1)$1m4_divert(-1)') m4_define(POSTFIXIFY, `m4_divert(2)$1m4_divert(-1)')
m4_m4wrap(` m4_m4wrap(`
INST_FLUSH()
m4_divert(0)DNL m4_divert(0)DNL
case FI_NOP: bug("This shall not happen");
m4_undivert(1) m4_undivert(1)
POSTFIXIFY_TRAILER
#undef what default: bug( "Unknown instruction %d (%c)", what_->fi_code, what_->fi_code & 0xff);
break; default: bug( "Unknown instruction %d (%c)", what_->fi_code, what_->fi_code & 0xff);
') ')
m4_changequote([[,]]) m4_changequote([[,]])

View file

@ -10,49 +10,54 @@ m4_divert(-1)m4_dnl
# Common aliases # Common aliases
m4_define(DNL, `m4_dnl') m4_define(DNL, `m4_dnl')
m4_define(INST, `m4_divert(1)break; case $1: m4_define(INST_FLUSH, `m4_ifdef([[INST_NAME]], [[
m4_divert(-1)') m4_divert(1)
case INST_NAME():
m4_undivert(2)
break;
m4_divert(-1)
]])')
m4_define(INST, `INST_FLUSH()m4_define([[INST_NAME]], [[$1]])')
m4_define(ARG, `') m4_define(ARG, `')
m4_define(ARG_ANY, `') m4_define(ARG_ANY, `')
m4_define(LINE, `m4_divert(1)if (!f_same(f1->lines[$2], f2->lines[$2])) return 0; m4_define(LINE, `m4_divert(2)if (!f_same(f1->lines[$2], f2->lines[$2])) return 0;
m4_divert(-1)') m4_divert(-1)')
m4_define(LINEP, LINE) m4_define(LINEP, LINE)
m4_define(SYMBOL, `m4_divert(1){ m4_define(SYMBOL, `m4_divert(2){
const struct symbol *s1 = f1->sym, *s2 = f2->sym; const struct symbol *s1 = f1->sym, *s2 = f2->sym;
if (strcmp(s1->name, s2->name)) return 0; if (strcmp(s1->name, s2->name)) return 0;
if (s1->class != s2->class) return 0; if (s1->class != s2->class) return 0;
} }
m4_divert(-1)') m4_divert(-1)')
m4_define(VALI, `m4_divert(1)if (!val_same(f1->vp, f2->vp)) return 0; m4_define(VALI, `m4_divert(2)if (!val_same(f1->vp, f2->vp)) return 0;
m4_divert(-1)') m4_divert(-1)')
m4_define(VALP, `m4_divert(1)if (!val_same(f1->vp, f2->vp)) return 0; m4_define(VALP, `m4_divert(2)if (!val_same(f1->vp, f2->vp)) return 0;
m4_divert(-1)') m4_divert(-1)')
m4_define(VAR, `SYMBOL()VALP()') m4_define(VAR, `SYMBOL()VALP()')
m4_define(FRET, `m4_divert(1)if (f1->fret != f2->fret) return 0; m4_define(FRET, `m4_divert(2)if (f1->fret != f2->fret) return 0;
m4_divert(-1)') m4_divert(-1)')
m4_define(ECS, `m4_divert(1)if (f1->ecs != f2->ecs) return 0; m4_define(ECS, `m4_divert(2)if (f1->ecs != f2->ecs) return 0;
m4_divert(-1)') m4_divert(-1)')
m4_define(RTC, `m4_divert(1)if (strcmp(f1->rtc->name, f2->rtc->name)) return 0; m4_define(RTC, `m4_divert(2)if (strcmp(f1->rtc->name, f2->rtc->name)) return 0;
m4_divert(-1)') m4_divert(-1)')
m4_define(STATIC_ATTR, `m4_divert(1)if (f1->sa.sa_code != f2->sa.sa_code) return 0; m4_define(STATIC_ATTR, `m4_divert(2)if (f1->sa.sa_code != f2->sa.sa_code) return 0;
m4_divert(-1)') m4_divert(-1)')
m4_define(DYNAMIC_ATTR, `m4_divert(1)if (f1->da.ea_code != f2->da.ea_code) return 0; m4_define(DYNAMIC_ATTR, `m4_divert(2)if (f1->da.ea_code != f2->da.ea_code) return 0;
m4_divert(-1)') m4_divert(-1)')
m4_define(SAME, `m4_divert(1)$1m4_divert(-1)') m4_define(SAME, `m4_divert(2)$1m4_divert(-1)')
m4_m4wrap(` m4_m4wrap(`
INST_FLUSH()
m4_divert(0)DNL m4_divert(0)DNL
case FI_NOP: bug("This shall not happen");
m4_undivert(1) m4_undivert(1)
break; default: bug( "Unknown instruction %d (%c)", f1->fi_code, f1->fi_code & 0xff); default: bug( "Unknown instruction %d (%c)", f1->fi_code, f1->fi_code & 0xff);
') ')
m4_divert(1)
m4_changequote([[,]]) m4_changequote([[,]])

View file

@ -10,56 +10,62 @@ m4_divert(-1)m4_dnl
# Common aliases # Common aliases
m4_define(DNL, `m4_dnl') m4_define(DNL, `m4_dnl')
m4_define(INST, `m4_divert(2)struct f_inst_$1 i_$1; m4_define(INST_FLUSH, `m4_ifdef([[INST_NAME]], [[
m4_divert(1)}; m4_divert(1)
struct f_inst_$1 { struct f_inst_[[]]INST_NAME() {
m4_divert(-1)')) m4_undivert(2)
m4_define(ARG, `m4_divert(1)const struct f_inst *f$1; };
m4_divert(3)
struct f_inst_[[]]INST_NAME() i_[[]]INST_NAME();
m4_divert(-1)
]])')
m4_define(INST, `INST_FLUSH()m4_define([[INST_NAME]], [[$1]])')
m4_define(ARG, `m4_divert(2)const struct f_inst *f$1;
m4_divert(-1)') m4_divert(-1)')
m4_define(ARG_ANY, `m4_divert(1)const struct f_inst *f$1; m4_define(ARG_ANY, `m4_divert(2)const struct f_inst *f$1;
m4_divert(-1)') m4_divert(-1)')
m4_define(LINE, `m4_divert(1)const struct f_inst *f$1; m4_define(LINE, `m4_divert(2)const struct f_inst *f$1;
m4_divert(-1)') m4_divert(-1)')
m4_define(LINEP, `m4_divert(1)const struct f_line *fl$1; m4_define(LINEP, `m4_divert(2)const struct f_line *fl$1;
m4_divert(-1)') m4_divert(-1)')
m4_define(SYMBOL, `m4_divert(1)const struct symbol *sym; m4_define(SYMBOL, `m4_divert(2)const struct symbol *sym;
m4_divert(-1)') m4_divert(-1)')
m4_define(VALI, `m4_divert(1)struct f_val vali; m4_define(VALI, `m4_divert(2)struct f_val vali;
m4_divert(-1)') m4_divert(-1)')
m4_define(VALP, `m4_divert(1)const struct f_val *valp; m4_define(VALP, `m4_divert(2)const struct f_val *valp;
m4_divert(-1)') m4_divert(-1)')
m4_define(VAR, `VALP()SYMBOL()') m4_define(VAR, `VALP()SYMBOL()')
m4_define(FRET, `m4_divert(1)enum filter_return fret; m4_define(FRET, `m4_divert(2)enum filter_return fret;
m4_divert(-1)') m4_divert(-1)')
m4_define(ECS, `m4_divert(1)enum ec_subtype ecs; m4_define(ECS, `m4_divert(2)enum ec_subtype ecs;
m4_divert(-1)') m4_divert(-1)')
m4_define(RTC, `m4_divert(1)const struct rtable_config *rtc; m4_define(RTC, `m4_divert(2)const struct rtable_config *rtc;
m4_divert(-1)') m4_divert(-1)')
m4_define(STATIC_ATTR, `m4_divert(1)struct f_static_attr sa; m4_define(STATIC_ATTR, `m4_divert(2)struct f_static_attr sa;
m4_divert(-1)') m4_divert(-1)')
m4_define(DYNAMIC_ATTR, `m4_divert(1)struct f_dynamic_attr da; m4_define(DYNAMIC_ATTR, `m4_divert(2)struct f_dynamic_attr da;
m4_divert(-1)') m4_divert(-1)')
m4_define(COUNT, `m4_divert(1)uint count; m4_define(COUNT, `m4_divert(2)uint count;
m4_divert(-1)') m4_divert(-1)')
m4_define(TREE, `m4_divert(1)const struct f_tree *tree; m4_define(TREE, `m4_divert(2)const struct f_tree *tree;
m4_divert(-1)') m4_divert(-1)')
m4_define(STRING, `m4_divert(1)const char *s; m4_define(STRING, `m4_divert(2)const char *s;
m4_divert(-1)') m4_divert(-1)')
m4_define(STRUCT, `m4_divert(1)$1 m4_define(STRUCT, `m4_divert(2)$1
m4_divert(-1)') m4_divert(-1)')
m4_m4wrap(` m4_m4wrap(`
INST_FLUSH()
m4_divert(0)DNL m4_divert(0)DNL
struct f_inst_FI_NOP {
m4_undivert(1) m4_undivert(1)
};
struct f_inst { struct f_inst {
const struct f_inst *next; /* Next instruction */ const struct f_inst *next; /* Next instruction */
enum f_instruction_code fi_code; /* Instruction code */ enum f_instruction_code fi_code; /* Instruction code */
int lineno; /* Line number */ int lineno; /* Line number */
union { union {
m4_undivert(2) m4_undivert(3)
}; };
}; };
') ')