void sh_regress(unsigned int index, const char* intercept, const char* info, unsigned int line, const char* file) { char* name; char buf[16]; if (index >= 1 && index <= elementsof(regress_options)) name = (char*)regress_options[index]; else sfsprintf(name = buf, sizeof(buf), "%u", index); sfprintf(sfstderr, REGRESS_HEADER "%s:%s:%s\n", name, intercept, fmtesc(info)); }
static int color(char *color, const char *pattern) { regmatch_t match; regex_t re; char *line; size_t linesz; size_t len; const char *esccolor; const char escreset[] = "\e[0m"; int fg; int bg; int rc; regoff_t off; line = NULL; linesz = 0; parsecolor(color, &fg, &bg); esccolor = fmtesc(fg, bg, bflag); rc = regcomp(&re, pattern, REG_EXTENDED | (iflag ? REG_ICASE : 0)); if (rc != 0) errx(EXIT_FAILURE, "``%s'': %s", pattern, strregerror(rc)); errno = 0; while (getline(&line, &linesz, stdin) != -1) { for (off = 0; (rc = regexec(&re, line + off, 1, &match, 0)) != REG_NOMATCH; /* empty */ ) { if (rc != 0) errx(EXIT_FAILURE, "regexec: %s", strregerror(rc)); match.rm_eo += ins(&line, &linesz, esccolor, match.rm_so + off); off += ins(&line, &linesz, escreset, match.rm_eo + off); off += match.rm_eo; } len = strlen(line); if (write(STDOUT_FILENO, line, len) != len) err(EXIT_FAILURE, "write"); errno = 0; } if (errno != 0) err(EXIT_FAILURE, "getline"); regfree(&re); free(line); return EXIT_SUCCESS; }
static void putrec(register char* s) { register int n; register char* t; if ((ed.print & REG_SUB_LIST) && (t = fmtesc(s))) { s = t; n = strlen(s); while (n > BREAK_LINE) { n -= BREAK_LINE; sfprintf(ed.msg, "%-*.*s\\\n", BREAK_LINE, BREAK_LINE, s); s += BREAK_LINE; } sfprintf(ed.msg, "%s$\n", s); } else sfputr(ed.msg, s, '\n'); }
static void trace(Expr_t* ex, int lev, char* op, int c) { char* s = 0; char* t; char buf[16]; void* x = 0; if (!traceLex) return; t = ""; switch (c) { case 0: s = " EOF"; break; case '=': s = t = buf; *t++ = ' '; if (!lev && exlval.op != c) *t++ = exlval.op; *t++ = c; *t = 0; break; case AND: s = " AND "; t = "&&"; break; case DEC: s = " DEC "; t = "--"; break; case DECLARE: s = " DECLARE "; t = exlval.id->name; break; case PROCEDURE: s = " PROCEDURE "; t = exlval.id->name; break; case DYNAMIC: s = " DYNAMIC "; t = exlval.id->name; x = (void*)(exlval.id); break; case EQ: s = " EQ "; t = "=="; break; case FLOATING: s = " FLOATING "; sfsprintf(t = buf, sizeof(buf), "%f", exlval.floating); break; case GE: s = " GE "; t = ">="; break; case ID: s = " ID "; t = exlval.id->name; break; case INC: s = "INC "; t = "++"; break; case INTEGER: s = " INTEGER "; sfsprintf(t = buf, sizeof(buf), "%I*d", sizeof(exlval.integer), exlval.integer); break; case LABEL: s = " LABEL "; t = exlval.id->name; break; case LE: s = " LE "; t = "<="; break; case LS: s = " LS "; t = "<<"; break; case NAME: s = " NAME "; t = exlval.id->name; x = (void*)(exlval.id); break; case NE: s = " NE "; t = "!="; break; case OR: s = " OR "; t = "||"; break; case RS: s = " RS "; t = ">>"; break; case STRING: s = " STRING "; t = fmtesc(exlval.string); break; case UNSIGNED: s = " UNSIGNED "; sfsprintf(t = buf, sizeof(buf), "%I*u", sizeof(exlval.integer), exlval.integer); break; case BREAK: s = " break"; break; case CASE: s = " case"; break; case CONTINUE: s = " continue"; break; case DEFAULT: s = " default"; break; case ELSE: s = " else"; break; case EXIT: s = " exit"; break; case FOR: s = " for"; break; case GSUB: s = " gsub"; break; case IF: s = " if"; break; case PRAGMA: s = " pragma"; break; case PRINT: s = " print"; break; case PRINTF: s = " printf"; break; case QUERY: s = " query"; break; case RAND: s = " rand"; break; case RETURN: s = " return"; break; case SPRINTF: s = " sprintf"; break; case SRAND: s = " srand"; break; case SUB: s = " sub"; break; case SUBSTR: s = " substr"; break; case SWITCH: s = " switch"; break; case WHILE: s = " while"; break; default: if (c < 0177) { s = buf; *s++ = c; *s = 0; t = fmtesc(buf); s = " "; } break; } if (x) error(TRACE_lex + lev, "%s: [%d] %04d%s%s (%x)", op, ex->input->nesting, c, s, t, x); else error(TRACE_lex + lev, "%s: [%d] %04d%s%s", op, ex->input->nesting, c, s, t); }