logic for flag letters with `bad' flags.
- * $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
*
*
* Parsing tracing options
*
/*----- Revision history --------------------------------------------------*
*
* $Log: traceopt.c,v $
/*----- 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.
*
* Revision 1.1 1999/10/22 22:40:08 mdw
* Separate function for parsing user trace specs.
*
/* --- @traceopt@ --- *
*
/* --- @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
* @const char *p@ = option string supplied by user
* @unsigned f@ = initial tracing flags
* @unsigned bad@ = forbidden tracing flags
* `?' character, a help message is displayed.
*/
* `?' 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 --- */
{
unsigned sense = 1;
/* --- Dump out help text --- */
- if (!p || strcmp(p, "?")) {
+ if (!p || !strcmp(p, "?")) {
+ const trace_opt *tt;
- while (t->ch) {
- if (t->f & bad || !t->help)
+ for (tt = t; tt->ch; tt++) {
+ if (!(tt->f & ~bad) || !tt->help)
- printf(" `%c': %s\n", t->ch, t->help);
+ printf(" `%c': %s\n", tt->ch, tt->help);
sense = 0;
break;
default: {
sense = 0;
break;
default: {
for (tt = t; tt->ch; tt++) {
for (tt = t; tt->ch; tt++) {
continue;
if (tt->ch == *p) {
if (sense)
f |= (tt->f & ~bad);
else
f &= ~(tt->f & ~bad);
continue;
if (tt->ch == *p) {
if (sense)
f |= (tt->f & ~bad);
else
f &= ~(tt->f & ~bad);
}
moan("unknown trace option `%c'", *p);
ok:;
}
moan("unknown trace option `%c'", *p);
ok:;