/* -*-c-*-
*
- * $Id: traceopt.c,v 1.1 1999/10/22 22:40:08 mdw Exp $
+ * $Id: traceopt.c,v 1.2 2001/02/03 16:25:43 mdw Exp $
*
* Parsing tracing options
*
/*----- Revision history --------------------------------------------------*
*
* $Log: traceopt.c,v $
+ * Revision 1.2 2001/02/03 16:25:43 mdw
+ * Various bug fixes: understand requests for help properly, and fix the
+ * logic for flag letters with `bad' flags.
+ *
* Revision 1.1 1999/10/22 22:40:08 mdw
* Separate function for parsing user trace specs.
*
/* --- @traceopt@ --- *
*
- * Arguments: @trace_opt *t@ = pointer to trace options table
+ * Arguments: @const trace_opt *t@ = pointer to trace options table
* @const char *p@ = option string supplied by user
* @unsigned f@ = initial tracing flags
* @unsigned bad@ = forbidden tracing flags
* `?' character, a help message is displayed.
*/
-unsigned traceopt(trace_opt *t, const char *p, unsigned f, unsigned bad)
+unsigned traceopt(const trace_opt *t, const char *p,
+ unsigned f, unsigned bad)
{
unsigned sense = 1;
/* --- Dump out help text --- */
- if (!p || strcmp(p, "?")) {
+ if (!p || !strcmp(p, "?")) {
+ const trace_opt *tt;
puts("Trace options:");
- while (t->ch) {
- if (t->f & bad || !t->help)
+ for (tt = t; tt->ch; tt++) {
+ if (!(tt->f & ~bad) || !tt->help)
continue;
- printf(" `%c': %s\n", t->ch, t->help);
+ printf(" `%c': %s\n", tt->ch, tt->help);
}
return (f);
}
sense = 0;
break;
default: {
- trace_opt *tt;
+ const trace_opt *tt;
for (tt = t; tt->ch; tt++) {
- if (tt->f & bad)
+ if (!(tt->f & ~bad))
continue;
if (tt->ch == *p) {
if (sense)
f |= (tt->f & ~bad);
else
f &= ~(tt->f & ~bad);
+ goto ok;
}
- goto ok;
}
moan("unknown trace option `%c'", *p);
ok:;