=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/m4/gnum4.c,v retrieving revision 1.45 retrieving revision 1.46 diff -c -r1.45 -r1.46 *** src/usr.bin/m4/gnum4.c 2014/05/12 19:11:19 1.45 --- src/usr.bin/m4/gnum4.c 2014/07/10 14:12:31 1.46 *************** *** 1,4 **** ! /* $OpenBSD: gnum4.c,v 1.45 2014/05/12 19:11:19 espie Exp $ */ /* * Copyright (c) 1999 Marc Espie --- 1,4 ---- ! /* $OpenBSD: gnum4.c,v 1.46 2014/07/10 14:12:31 espie Exp $ */ /* * Copyright (c) 1999 Marc Espie *************** *** 194,203 **** static void addchar(int); static char *twiddle(const char *); static char *getstring(void); ! static void exit_regerror(int, regex_t *); ! static void do_subst(const char *, regex_t *, const char *, regmatch_t *); ! static void do_regexpindex(const char *, regex_t *, regmatch_t *); ! static void do_regexp(const char *, regex_t *, const char *, regmatch_t *); static void add_sub(int, const char *, regex_t *, regmatch_t *); static void add_replace(const char *, regex_t *, const char *, regmatch_t *); #define addconstantstring(s) addchars((s), sizeof(s)-1) --- 194,205 ---- static void addchar(int); static char *twiddle(const char *); static char *getstring(void); ! static void exit_regerror(int, regex_t *, const char *); ! static void do_subst(const char *, regex_t *, const char *, const char *, ! regmatch_t *); ! static void do_regexpindex(const char *, regex_t *, const char *, regmatch_t *); ! static void do_regexp(const char *, regex_t *, const char *, const char *, ! regmatch_t *); static void add_sub(int, const char *, regex_t *, regmatch_t *); static void add_replace(const char *, regex_t *, const char *, regmatch_t *); #define addconstantstring(s) addchars((s), sizeof(s)-1) *************** *** 241,247 **** static void ! exit_regerror(int er, regex_t *re) { size_t errlen; char *errbuf; --- 243,249 ---- static void ! exit_regerror(int er, regex_t *re, const char *source) { size_t errlen; char *errbuf; *************** *** 250,256 **** errbuf = xalloc(errlen, "malloc in regerror: %lu", (unsigned long)errlen); regerror(er, re, errbuf, errlen); ! m4errx(1, "regular expression error: %s.", errbuf); } static void --- 252,258 ---- errbuf = xalloc(errlen, "malloc in regerror: %lu", (unsigned long)errlen); regerror(er, re, errbuf, errlen); ! m4errx(1, "regular expression error in %s: %s.", source, errbuf); } static void *************** *** 304,310 **** } static void ! do_subst(const char *string, regex_t *re, const char *replace, regmatch_t *pm) { int error; int flags = 0; --- 306,313 ---- } static void ! do_subst(const char *string, regex_t *re, const char *source, ! const char *replace, regmatch_t *pm) { int error; int flags = 0; *************** *** 339,350 **** string += pm[0].rm_eo; } if (error != REG_NOMATCH) ! exit_regerror(error, re); pbstr(string); } static void ! do_regexp(const char *string, regex_t *re, const char *replace, regmatch_t *pm) { int error; --- 342,354 ---- string += pm[0].rm_eo; } if (error != REG_NOMATCH) ! exit_regerror(error, re, source); pbstr(string); } static void ! do_regexp(const char *string, regex_t *re, const char *source, ! const char *replace, regmatch_t *pm) { int error; *************** *** 356,367 **** case REG_NOMATCH: break; default: ! exit_regerror(error, re); } } static void ! do_regexpindex(const char *string, regex_t *re, regmatch_t *pm) { int error; --- 360,372 ---- case REG_NOMATCH: break; default: ! exit_regerror(error, re, source); } } static void ! do_regexpindex(const char *string, regex_t *re, const char *source, ! regmatch_t *pm) { int error; *************** *** 373,379 **** pbnum(-1); break; default: ! exit_regerror(error, re); } } --- 378,384 ---- pbnum(-1); break; default: ! exit_regerror(error, re, source); } } *************** *** 457,462 **** --- 462,468 ---- regex_t re; regmatch_t *pmatch; int mode = REG_EXTENDED; + const char *source; size_t l = strlen(argv[3]); if (!mimic_gnu || *************** *** 464,477 **** (l > 0 && argv[3][l-1] == '$')) mode |= REG_NEWLINE; ! error = regcomp(&re, mimic_gnu ? twiddle(argv[3]) : argv[3], ! mode); if (error != 0) ! exit_regerror(error, &re); pmatch = xreallocarray(NULL, re.re_nsub+1, sizeof(regmatch_t), NULL); ! do_subst(argv[2], &re, argc > 4 && argv[4] != NULL ? argv[4] : "", pmatch); free(pmatch); regfree(&re); --- 470,483 ---- (l > 0 && argv[3][l-1] == '$')) mode |= REG_NEWLINE; ! source = mimic_gnu ? twiddle(argv[3]) : argv[3]; ! error = regcomp(&re, source, mode); if (error != 0) ! exit_regerror(error, &re, source); pmatch = xreallocarray(NULL, re.re_nsub+1, sizeof(regmatch_t), NULL); ! do_subst(argv[2], &re, source, argc > 4 && argv[4] != NULL ? argv[4] : "", pmatch); free(pmatch); regfree(&re); *************** *** 485,490 **** --- 491,497 ---- int error; regex_t re; regmatch_t *pmatch; + const char *source; if (argc <= 3) { warnx("Too few arguments to regexp"); *************** *** 497,512 **** else pbstr(argv[4]); } ! error = regcomp(&re, mimic_gnu ? twiddle(argv[3]) : argv[3], ! REG_EXTENDED|REG_NEWLINE); if (error != 0) ! exit_regerror(error, &re); pmatch = xreallocarray(NULL, re.re_nsub+1, sizeof(regmatch_t), NULL); if (argc == 4 || argv[4] == NULL) ! do_regexpindex(argv[2], &re, pmatch); else ! do_regexp(argv[2], &re, argv[4], pmatch); free(pmatch); regfree(&re); } --- 504,519 ---- else pbstr(argv[4]); } ! source = mimic_gnu ? twiddle(argv[3]) : argv[3]; ! error = regcomp(&re, source, REG_EXTENDED|REG_NEWLINE); if (error != 0) ! exit_regerror(error, &re, source); pmatch = xreallocarray(NULL, re.re_nsub+1, sizeof(regmatch_t), NULL); if (argc == 4 || argv[4] == NULL) ! do_regexpindex(argv[2], &re, source, pmatch); else ! do_regexp(argv[2], &re, source, argv[4], pmatch); free(pmatch); regfree(&re); }