- struct servent *s;
- if (isdigit((unsigned char)*p))
- return (htons(atoi(p)));
- if ((s = getservbyname(p, "tcp")) == 0)
- error(sc, "unknown tcp service `%s'", p);
- return (s->s_port);
+ const char *p, *q;
+ int chosen = -1;
+ int ok;
+ int index;
+
+ /* --- Make sure it's a string --- */
+
+ if (sc->t != CTOK_WORD)
+ error(sc, "parse error, expected %s", err);
+
+ /* --- Grind through the list --- */
+
+ q = sc->d.buf;
+ ok = 1;
+ index = 0;
+ p = list;
+ for (;;) {
+ switch (*p) {
+ case 0:
+ if (ok && !*q) {
+ token(sc);
+ return (index);
+ } else if (chosen != -1) {
+ token(sc);
+ return (chosen);
+ }
+ else if (f & ENUM_NONE)
+ return (-1);
+ else
+ error(sc, "unknown %s `%s'", err, sc->d.buf);
+ break;
+ case ',':
+ if (ok && !*q) {
+ token(sc);
+ return (index);
+ }
+ ok = 1;
+ q = sc->d.buf;
+ index++;
+ break;
+ default:
+ if (!ok)
+ break;
+ if ((f & ENUM_ABBREV) && !*q) {
+ if (chosen != -1)
+ error(sc, "ambiguous %s `%s'", err, sc->d.buf);
+ chosen = index;
+ ok = 0;
+ }
+ if (*p == *q)
+ q++;
+ else
+ ok = 0;
+ break;
+ }
+ p++;
+ }