ifstate
struct ifstate *
ifstate_create(struct ifstate *prev, struct place *p, bool startstate)
struct ifstate *is;
ifstate_destroy(struct ifstate *is)
struct ifstate *newstate;
newstate = ifstate_create(ifstate, p, startstate);
if (!ifstate->curtrue) {
ifstate = newstate;
struct ifstate *is;
is = ifstate;
ifstate = ifstate->prev;
doprint = ifstate->curtrue;
if (ifstate->curtrue) {
ifstate->curtrue ? "taken" : "not taken");
doprint = ifstate->curtrue;
line, ifstate->curtrue ? "taken" : "not taken");
doprint = ifstate->curtrue;
line, ifstate->curtrue ? "taken" : "not taken");
if (ifstate->seenelse) {
doprint = ifstate->curtrue;
if (ifstate->evertrue) {
ifstate->curtrue = false;
ifstate->curtrue = eval(&p3, expr);
ifstate->evertrue = ifstate->curtrue;
debuglog2(&lp->current, &ifstate->startplace, "#elif: %s",
ifstate->curtrue ? "taken" : "not taken");
if (ifstate->seenelse) {
doprint = ifstate->curtrue;
ifstate->curtrue = !ifstate->evertrue;
ifstate->evertrue = true;
ifstate->seenelse = true;
debuglog2(&lp->current, &ifstate->startplace, "#else: %s",
ifstate->curtrue ? "taken" : "not taken");
if (ifstate->prev == NULL) {
debuglog2(&lp->current, &ifstate->startplace, "#endif");
struct ifstate *prev;
static struct ifstate *ifstate;
if (directives[i].ifskip && !ifstate->curtrue) {
} else if (ifstate->curtrue) {
while (ifstate->prev != NULL) {
complain(&ifstate->startplace, "...opened at this point");
ifstate = ifstate_create(NULL, NULL, true);
assert(ifstate->prev == NULL);
ifstate_destroy(ifstate);
ifstate = NULL;
static Ifstate ifstate[MAXDEPTH]; /* #if processor state */
ifstate[depth] = is;
trans_table[ifstate[depth]][lineval]();
ifstate_name[ifstate[depth]], depth);
struct ifsd_ifstate *ifstate;
TAILQ_FOREACH(ifstate, &state->interface_states, entries) {
if (strcmp(ifstate->ifname, ifname) == 0) {
if (ifstate->prevstate != s &&
(ifstate->prevstate != -1 || !opt_inhibit)) {
(ifstate->ifstate == IFSD_LINKUNKNOWN &&
(ifstate->ifstate == IFSD_LINKDOWN &&
(ifstate->ifstate == IFSD_LINKUP &&
&ifstate->expressions, entries) {
ifstate->prevstate = s;
struct ifsd_ifstate *ifstate;
TAILQ_FOREACH(ifstate, &state->interface_states, entries) {
if (if_nametoindex(ifstate->ifname) == 0)
scan_ifstate(ifstate->ifname,
TAILQ_REMOVE(&expression->u.ifstate->expressions, expression,
if (--expression->u.ifstate->refcount == 0) {
expression->u.ifstate, entries);
free(expression->u.ifstate);
int ifstate;
struct ifsd_ifstate *ifstate;
%type <v.ifstate> if_test
$$->u.ifstate = $1;
struct ifsd_ifstate *ifstate = NULL;
TAILQ_FOREACH(ifstate, &state->interface_states, entries)
if (strcmp(ifstate->ifname, ifname) == 0 &&
ifstate->ifstate == s)
if (ifstate == NULL) {
if ((ifstate = calloc(1, sizeof(*ifstate))) == NULL)
if (strlcpy(ifstate->ifname, ifname,
sizeof(ifstate->ifname)) >= sizeof(ifstate->ifname))
ifstate->ifstate = s;
TAILQ_INIT(&ifstate->expressions);
TAILQ_INSERT_TAIL(&state->interface_states, ifstate, entries);
ifstate->prevstate = -1;
ifstate->refcount++;
return (ifstate);
struct ifsd_ifstate *ifstate;