/* This file is in the public domain. */ #include #include #include #include "msgs.h" #include "util.h" #include "nested.h" #include "agent-util.h" void reinit_constraints(AGENT_CONSTRAINTS *ac) { ac->initted = 1; ac->time = 0; ac->use = LIMIT_INFINITY; ac->fwd = LIMIT_INFINITY; ac->confirm = 0; } int set_constraints(AGENT_CONSTRAINTS *ac, const char *arg, int len, FILE *errto) { __label__ ret; NESTEDFWD void fail(const char *, ...) __attribute__((__format__(__printf__,1,2))); NESTEDDEF void fail(const char *fmt, ...) { va_list ap; va_start(ap,fmt); vfprintf(errto,fmt,ap); va_end(ap); fprintf(errto,"\n"); goto ret; } NESTED void count_constraint(const char *s, int l, unsigned int *vp) { int n; int o; NESTED char nget(void) { return((o>=l)?'\0':s[o++]); } if ((l == 3) && !bcmp(s,"inf",3)) { *vp = LIMIT_INFINITY; } else { o = 0; n = parse_number(&nget,vp); if (n < 1) fail("Missing/invalid number"); if (nget()) fail("Junk after number"); } } NESTED int foo(const void *el, int len) { if ((len >= 5) && !bcmp(el,"time=",5)) { ac->time = parse_time(5+(const char *)el,len-5,&fail); } else if ((len >= 4) && !bcmp(el,"use=",4)) { count_constraint(4+(const char *)el,len-4,&ac->use); } else if ((len >= 4) && !bcmp(el,"fwd=",4)) { count_constraint(4+(const char *)el,len-4,&ac->fwd); } else if ((len >= 8) && !bcmp(el,"confirm=",8)) { if ((len == 8+2) && !bcmp(8+(const char *)el,"no",2)) { ac->confirm = 0; } else { ac->confirm = 1; } } else { fail("Unrecognized constraint name"); } return(0); } if (len < 0) len = strlen(arg); if (! ac->initted) reinit_constraints(ac); if (comma_list(arg,len,&foo) < 0) return(1); return(0); ret:; return(1); }