static int iskw(register char *s) { register char **ss = l_keywds; register int i = 1; register char *cp = s; while (++cp, isidchr(*cp)) i++; while ((cp = *ss++)) if (!STRNCMP(s,cp,i) && !isidchr(cp[i])) return (i); return (0); }
static int iskw(char *s) { char **ss = l_keywds; int i = 1; char *cp = s; while (++cp, isidchr((unsigned char)*cp)) i++; while ((cp = *ss++) != NULL) if (!STRNCMP(s,cp,i) && !isidchr((unsigned char)cp[i])) return i; return 0; }
static void putKcp( char *start, /* start of string to write */ char *end, /* end of string to write */ bool force) /* true if we should force nokeyw */ { int i; int xfld = 0; while (start <= end) { if (idx) { if (*start == ' ' || *start == '\t') { if (xfld == 0) printf(""); printf("\t"); xfld = 1; while (*start == ' ' || *start == '\t') start++; continue; } } /* take care of nice tab stops */ if (*start == '\t') { while (*start == '\t') start++; i = tabs(x_start, start) - margin / 8; printf("\\h'|%dn'", i * 10 + 1 - margin % 8); continue; } if (!nokeyw && !force) if ((*start == '#' || isidchr(*start)) && (start == x_start || !isidchr(start[-1]))) { i = iskw(start); if (i > 0) { ps("\\*(+K"); do putcp(*start++); while (--i > 0); ps("\\*(-K"); continue; } } putcp(*start++); } }
/* * start: start of string to write * end: end of string to write * force: true if we should force nokeyw */ static void putKcp(char *start, char *end, bool force) { int i; int xfld = 0; while (start <= end) { if (idx) { if (*start == ' ' || *start == '\t') { if (xfld == 0) printf("\001"); printf("\t"); xfld = 1; while (*start == ' ' || *start == '\t') start++; continue; } } /* take care of nice tab stops */ if (*start == '\t') { while (*start == '\t') start++; i = tabs(s_start, start) - margin / 8; printf("\\h'|%dn'", i * 10 + 1 - margin % 8); continue; } if (!nokeyw && !force) if ((*start == '#' || isidchr(*start)) && (start == s_start || !isidchr(start[-1]))) { i = iskw(start); if (i > 0) { ps("\\*(+K"); do putcp((unsigned char)*start++); while (--i > 0); ps("\\*(-K"); continue; } } putcp((unsigned char)*start++); } }
char * expmatch(char *s, char *re, char *mstring) /* s - string to check for a match in */ /* re - a converted irregular expression */ /* mstring - where to put whatever matches a \p */ { char *cs; /* the current symbol */ char *ptr, *s1; /* temporary pointer */ boolean matched; /* a temporary boolean */ /* initial conditions */ if (re == NIL) return (NIL); cs = re; matched = FALSE; /* loop till expression string is exhausted (or at least pretty tired) */ while (*cs) { switch (*cs & (OPER | STR | META)) { /* try to match a string */ case STR: matched = !STRNCMP (s, SSTR(cs), SCNT(cs)); if (matched) { /* hoorah it matches */ s += SCNT(cs); cs = SNEXT(cs); } else if (*cs & ALT) { /* alternation, skip to next expression */ cs = SNEXT(cs); } else if (*cs & OPT) { /* the match is optional */ cs = SNEXT(cs); matched = 1; /* indicate a successful match */ } else { /* no match, error return */ return (NIL); } break; /* an operator, do something fancy */ case OPER: switch (OSYM(cs)) { /* this is an alternation */ case '|': if (matched) /* last thing in the alternation was a match, skip ahead */ cs = OPTR(cs); else /* no match, keep trying */ cs = ONEXT(cs); break; /* this is a grouping, recurse */ case '(': ptr = expmatch (s, ONEXT(cs), mstring); if (ptr != NIL) { /* the subexpression matched */ matched = 1; s = ptr; } else if (*cs & ALT) { /* alternation, skip to next expression */ matched = 0; } else if (*cs & OPT) { /* the match is optional */ matched = 1; /* indicate a successful match */ } else { /* no match, error return */ return (NIL); } cs = OPTR(cs); break; } break; /* try to match a metasymbol */ case META: switch (MSYM(cs)) { /* try to match anything and remember what was matched */ case 'p': /* * This is really the same as trying the match the * remaining parts of the expression to any subset * of the string. */ s1 = s; do { ptr = expmatch (s1, MNEXT(cs), mstring); if (ptr != NIL && s1 != s) { /* we have a match, remember the match */ strncpy (mstring, s, s1 - s); mstring[s1 - s] = '\0'; return (ptr); } else if (ptr != NIL && (*cs & OPT)) { /* it was aoptional so no match is ok */ return (ptr); } else if (ptr != NIL) { /* not optional and we still matched */ return (NIL); } if (!isidchr(*s1)) return (NIL); if (*s1 == '\\') _escaped = _escaped ? FALSE : TRUE; else _escaped = FALSE; } while (*s1++); return (NIL); /* try to match anything */ case 'a': /* * This is really the same as trying the match the * remaining parts of the expression to any subset * of the string. */ s1 = s; do { ptr = expmatch (s1, MNEXT(cs), mstring); if (ptr != NIL && s1 != s) { /* we have a match */ return (ptr); } else if (ptr != NIL && (*cs & OPT)) { /* it was aoptional so no match is ok */ return (ptr); } else if (ptr != NIL) { /* not optional and we still matched */ return (NIL); } if (*s1 == '\\') _escaped = _escaped ? FALSE : TRUE; else _escaped = FALSE; } while (*s1++); return (NIL); /* fail if we are currently _escaped */ case 'e': if (_escaped) return(NIL); cs = MNEXT(cs); break; /* match any number of tabs and spaces */ case 'd': ptr = s; while (*s == ' ' || *s == '\t') s++; if (s != ptr || s == Start) { /* match, be happy */ matched = 1; cs = MNEXT(cs); } else if (*s == '\n' || *s == '\0') { /* match, be happy */ matched = 1; cs = MNEXT(cs); } else if (*cs & ALT) { /* try the next part */ matched = 0; cs = MNEXT(cs); } else if (*cs & OPT) { /* doesn't matter */ matched = 1; cs = MNEXT(cs); } else /* no match, error return */ return (NIL); break; /* check for end of line */ case '$': if (*s == '\0' || *s == '\n') { /* match, be happy */ s++; matched = 1; cs = MNEXT(cs); } else if (*cs & ALT) { /* try the next part */ matched = 0; cs = MNEXT(cs); } else if (*cs & OPT) { /* doesn't matter */ matched = 1; cs = MNEXT(cs); } else /* no match, error return */ return (NIL); break; /* check for start of line */ case '^': if (s == Start) { /* match, be happy */ matched = 1; cs = MNEXT(cs); } else if (*cs & ALT) { /* try the next part */ matched = 0; cs = MNEXT(cs); } else if (*cs & OPT) { /* doesn't matter */ matched = 1; cs = MNEXT(cs); } else /* no match, error return */ return (NIL); break; /* end of a subexpression, return success */ case ')': return (s); } break; } } return (s); }