Filter: M4 convertors polished a bit.
This commit is contained in:
parent
c0e958e022
commit
c1e97169cd
8 changed files with 150 additions and 123 deletions
|
@ -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([[,]])
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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([[,]])
|
||||||
|
|
||||||
|
|
|
@ -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([[,]])
|
||||||
|
|
|
@ -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([[,]])
|
||||||
|
|
|
@ -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([[,]])
|
||||||
|
|
|
@ -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([[,]])
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
')
|
')
|
||||||
|
|
Loading…
Reference in a new issue