On 03/10/11 16:28, Stuart Henderson wrote: > good find. > > after reading posix 2008 on this it isn't clear to me what is > specified, but GNU m4 is clear in the documentation that _they_ > apply it non-recursively. > > http://pubs.opengroup.org/onlinepubs/9699919799/utilities/m4.html > http://www.gnu.org/software/m4/manual/html_node/Translit.html > > so imo we definitely want this for -g mode and need to consider > carefully whether to do it always (in which case the comment above > the start of map(), which explains why this is done, would also > need adjusting). > > the following from MirOS may also be of interest: > > http://junkpile.org/14.patch "fix trace lineno output for 'macro\n'" > http://junkpile.org/15.patch "let 'errprint' in 'm4 -g' mode behave like GNU" > http://junkpile.org/16.patch "fix another line number problem" > > i'll try and have a play with this and hopefully Marc will > have some time to look at it soon. > >
I had a look a MirOS m4, I tried using their version from cvs for a comparison. This test case goes into infinate loop. translit(`abcdef', `aabdef', `bcged') I had a look through the patches from MirOS, tried running the MirOS m4 vs GNU m4 found the issue with trace lineno output are still there. Attached includes previous fix, and also fixes lineno / filename issues. Tried www/libmicrohttpd port with autoconf v2.64, v2.65, v2.67, v2.68 all worked. Autoconf regression test failures have been reduced. Regards Nigel Taylor
Index: usr.bin/m4/eval.c =================================================================== RCS file: /home/cvs/src/usr.bin/m4/eval.c,v retrieving revision 1.68 diff -u -p -r1.68 eval.c --- usr.bin/m4/eval.c 7 Sep 2010 19:58:09 -0000 1.68 +++ usr.bin/m4/eval.c 15 Mar 2011 13:44:47 -0000 @@ -63,13 +63,13 @@ static int doincl(const char *); static int dopaste(const char *); static void dochq(const char *[], int); static void dochc(const char *[], int); -static void dom4wrap(const char *); +static void dom4wrap(const char *, unsigned long, const char *); static void dodiv(int); static void doundiv(const char *[], int); static void dosub(const char *[], int); static void map(char *, const char *, const char *, const char *); static const char *handledash(char *, char *, const char *); -static void expand_builtin(const char *[], int, int); +static void expand_builtin(const char *[], int, int, unsigned long, const char *); static void expand_macro(const char *[], int); static void dump_one_def(const char *, struct macro_definition *); @@ -95,7 +95,7 @@ unsigned long expansion_id; * argc is 3 for macro-or-builtin() and 2 for macro-or-builtin */ void -eval(const char *argv[], int argc, int td, int is_traced) +eval(const char *argv[], int argc, int td, int is_traced, unsigned long trlineno, const char *curfname) { size_t mark = SIZE_MAX; @@ -103,11 +103,11 @@ eval(const char *argv[], int argc, int t if (td & RECDEF) m4errx(1, "expanding recursive definition for %s.", argv[1]); if (is_traced) - mark = trace(argv, argc, infile+ilevel); + mark = trace(argv, argc, infile+ilevel, trlineno, curfname); if (td == MACRTYPE) expand_macro(argv, argc); else - expand_builtin(argv, argc, td); + expand_builtin(argv, argc, td, trlineno, curfname); if (mark != SIZE_MAX) finish_trace(mark); } @@ -116,7 +116,7 @@ eval(const char *argv[], int argc, int t * expand_builtin - evaluate built-in macros. */ void -expand_builtin(const char *argv[], int argc, int td) +expand_builtin(const char *argv[], int argc, int td, unsigned long trlineno, const char *curfname) { int c, n; int ac; @@ -424,8 +424,8 @@ expand_builtin(const char *argv[], int a */ if (argc > 2) { for (n = 2; n < argc; n++) - fprintf(stderr, "%s ", argv[n]); - fprintf(stderr, "\n"); + fprintf(stderr, "%s%s", argv[n], mimic_gnu && (n+1 >= argc) ? "" : " "); + if (! mimic_gnu) fprintf(stderr, "\n"); } break; @@ -444,7 +444,7 @@ expand_builtin(const char *argv[], int a * wrap-up/wind-down activity */ if (argc > 2) - dom4wrap(argv[2]); + dom4wrap(argv[2], trlineno, curfname); break; case EXITTYPE: @@ -463,12 +463,12 @@ expand_builtin(const char *argv[], int a case INDIRTYPE: /* Indirect call */ if (argc > 2) - doindir(argv, argc); + doindir(argv, argc, trlineno, curfname); break; case BUILTINTYPE: /* Builtins only */ if (argc > 2) - dobuiltin(argv, argc); + dobuiltin(argv, argc, trlineno, curfname); break; case PATSTYPE: @@ -480,10 +480,10 @@ expand_builtin(const char *argv[], int a doregexp(argv, argc); break; case LINETYPE: - doprintlineno(infile+ilevel); + doprintlineno(infile+ilevel, trlineno); break; case FILENAMETYPE: - doprintfilename(infile+ilevel); + doprintfilename(infile+ilevel, curfname); break; case SELFTYPE: pbstr(rquote); @@ -776,7 +776,7 @@ dochc(const char *argv[], int argc) * dom4wrap - expand text at EOF */ static void -dom4wrap(const char *text) +dom4wrap(const char *text, unsigned long trlineno, const char *curfname) { if (wrapindex >= maxwraps) { if (maxwraps == 0) @@ -786,7 +786,9 @@ dom4wrap(const char *text) m4wraps = xrealloc(m4wraps, maxwraps * sizeof(*m4wraps), "too many m4wraps"); } - m4wraps[wrapindex++] = xstrdup(text); + m4wraps[wrapindex].name = xstrdup(curfname); + m4wraps[wrapindex].lineno = trlineno; + m4wraps[wrapindex++].text = xstrdup(text); } /* @@ -884,21 +886,11 @@ dosub(const char *argv[], int argc) * language. Within mapvec, we replace every character of "from" with * the corresponding character in "to". If "to" is shorter than "from", * than the corresponding entries are null, which means that those - * characters dissapear altogether. Furthermore, imagine - * map(dest, "sourcestring", "srtin", "rn..*") type call. In this case, - * `s' maps to `r', `r' maps to `n' and `n' maps to `*'. Thus, `s' - * ultimately maps to `*'. In order to achieve this effect in an efficient - * manner (i.e. without multiple passes over the destination string), we - * loop over mapvec, starting with the initial source character. if the - * character value (dch) in this location is different than the source - * character (sch), sch becomes dch, once again to index into mapvec, until - * the character value stabilizes (i.e. sch = dch, in other words - * mapvec[n] == n). Even if the entry in the mapvec is null for an ordinary - * character, it will stabilize, since mapvec[0] == 0 at all times. At the - * end, we restore mapvec* back to normal where mapvec[n] == n for - * 0 <= n <= 127. This strategy, along with the restoration of mapvec, is - * about 5 times faster than any algorithm that makes multiple passes over - * destination string. + * characters dissapear altogether. + * The recursion has been removed to match gnu m4 implementation and + * matches the m4 info details. + * At the end, we restore mapvec* back to normal where mapvec[n] == n for + * 0 <= n <= 255. */ static void map(char *dest, const char *src, const char *from, const char *to) @@ -958,10 +950,6 @@ map(char *dest, const char *src, const c while (*src) { sch = (unsigned char)(*src++); dch = mapvec[sch]; - while (dch != sch) { - sch = dch; - dch = mapvec[sch]; - } if ((*dest = (char)dch)) dest++; } @@ -993,7 +981,7 @@ handledash(char *buffer, char *end, cons unsigned char i; if ((unsigned char)src[0] <= (unsigned char)src[2]) { for (i = (unsigned char)src[0]; - i <= (unsigned char)src[2]; i++) { + i < (unsigned char)src[2]; i++) { *p++ = i; if (p == end) { *p = '\0'; @@ -1002,7 +990,7 @@ handledash(char *buffer, char *end, cons } } else { for (i = (unsigned char)src[0]; - i >= (unsigned char)src[2]; i--) { + i > (unsigned char)src[2]; i--) { *p++ = i; if (p == end) { *p = '\0'; @@ -1010,7 +998,37 @@ handledash(char *buffer, char *end, cons } } } - src += 3; + src += 2; +/* check for back to back range */ + if (src[1] == '-' && src[2]) { + if ((unsigned char)src[0] <= (unsigned char)src[2]) { + for (i = (unsigned char)src[0]; + i <= (unsigned char)src[2]; i++) { + *p++ = i; + if (p == end) { + *p = '\0'; + return buffer; + } + } + } else { + for (i = (unsigned char)src[0]; + i >= (unsigned char)src[2]; i--) { + *p++ = i; + if (p == end) { + *p = '\0'; + return buffer; + } + } + } + src += 3; + } + else { + *p++ = *src++; + if (p == end) { + *p = '\0'; + return buffer; + } + } } else *p++ = *src++; if (p == end) Index: usr.bin/m4/extern.h =================================================================== RCS file: /home/cvs/src/usr.bin/m4/extern.h,v retrieving revision 1.50 diff -u -p -r1.50 extern.h --- usr.bin/m4/extern.h 7 Sep 2010 19:58:09 -0000 1.50 +++ usr.bin/m4/extern.h 15 Mar 2011 13:57:07 -0000 @@ -36,7 +36,7 @@ */ /* eval.c */ -extern void eval(const char *[], int, int, int); +extern void eval(const char *[], int, int, int, unsigned long, const char *); extern void dodefine(const char *, const char *); extern unsigned long expansion_id; @@ -46,13 +46,13 @@ extern int expr(const char *); /* gnum4.c */ extern void addtoincludepath(const char *); extern struct input_file *fopen_trypath(struct input_file *, const char *); -extern void doindir(const char *[], int); -extern void dobuiltin(const char *[], int); +extern void doindir(const char *[], int, unsigned long, const char *); +extern void dobuiltin(const char *[], int, unsigned long, const char *); extern void dopatsubst(const char *[], int); extern void doregexp(const char *[], int); -extern void doprintlineno(struct input_file *); -extern void doprintfilename(struct input_file *); +extern void doprintlineno(struct input_file *, unsigned long); +extern void doprintfilename(struct input_file *, const char *); extern void doesyscmd(const char *); extern void getdivfile(const char *); @@ -139,7 +139,7 @@ extern char *endest; extern unsigned int trace_flags; #define TRACE_ALL 512 extern void trace_file(const char *); -extern size_t trace(const char **, int, struct input_file *); +extern size_t trace(const char **, int, struct input_file *, unsigned long, const char *); extern void finish_trace(size_t); extern void set_trace_flags(const char *); extern FILE *traceout; @@ -162,7 +162,7 @@ extern unsigned char *bbase[]; /* buffer extern char ecommt[MAXCCHARS+1];/* end character for comment */ extern char *ep; /* first free char in strspace */ extern char lquote[MAXCCHARS+1];/* left quote character (`) */ -extern char **m4wraps; /* m4wrap string default. */ +extern struct wrap *m4wraps; /* m4wrap string default. */ extern int maxwraps; /* size of m4wraps array */ extern int wrapindex; /* current index in m4wraps */ Index: usr.bin/m4/gnum4.c =================================================================== RCS file: /home/cvs/src/usr.bin/m4/gnum4.c,v retrieving revision 1.41 diff -u -p -r1.41 gnum4.c --- usr.bin/m4/gnum4.c 7 Sep 2010 19:58:09 -0000 1.41 +++ usr.bin/m4/gnum4.c 13 Mar 2011 15:04:30 -0000 @@ -157,7 +157,7 @@ fopen_trypath(struct input_file *i, cons } void -doindir(const char *argv[], int argc) +doindir(const char *argv[], int argc, unsigned long trlineno, const char* curfname) { ndptr n; struct macro_definition *p; @@ -167,18 +167,18 @@ doindir(const char *argv[], int argc) m4errx(1, "indir: undefined macro %s.", argv[2]); argv[1] = p->defn; - eval(argv+1, argc-1, p->type, is_traced(n)); + eval(argv+1, argc-1, p->type, is_traced(n), trlineno, curfname); } void -dobuiltin(const char *argv[], int argc) +dobuiltin(const char *argv[], int argc, unsigned long trlineno, const char* curfname) { ndptr p; argv[1] = NULL; p = macro_getbuiltin(argv[2]); if (p != NULL) - eval(argv+1, argc-1, macro_builtin_type(p), is_traced(p)); + eval(argv+1, argc-1, macro_builtin_type(p), is_traced(p), trlineno, curfname); else m4errx(1, "unknown builtin %s.", argv[2]); } Index: usr.bin/m4/m4.1 =================================================================== RCS file: /home/cvs/src/usr.bin/m4/m4.1,v retrieving revision 1.59 diff -u -p -r1.59 m4.1 --- usr.bin/m4/m4.1 21 Oct 2010 13:20:51 -0000 1.59 +++ usr.bin/m4/m4.1 14 Mar 2011 23:20:49 -0000 @@ -136,7 +136,7 @@ By default, trace is set to .It Fl g Activate GNU-m4 compatibility mode. In this mode, translit handles simple character -ranges (e.g., a-z), regular expressions mimic emacs behavior, +ranges (e.g., a-z), back to back ranges (e.g., a-c-a), regular expressions mimic emacs behavior, multiple m4wrap calls are handled as a stack, the number of diversions is unlimited, empty names for macro definitions are allowed, @@ -418,7 +418,11 @@ Disables tracing of macro expansions for macros if no argument is given. .It Fn translit string mapfrom mapto Transliterate the characters in the first argument from the set -given by the second argument to the set given by the third. +given by the second argument to the set given by the third, +characters in the second argument which don't have an entry in +the third argument are deleted. The replacement is performed once only, for example +.Ic Fn translit `abcba' `ab' `bc' +result is bcccb, not ccccc. You cannot use .Xr tr 1 style abbreviations. Index: usr.bin/m4/main.c =================================================================== RCS file: /home/cvs/src/usr.bin/m4/main.c,v retrieving revision 1.79 diff -u -p -r1.79 main.c --- usr.bin/m4/main.c 7 Sep 2010 19:58:09 -0000 1.79 +++ usr.bin/m4/main.c 15 Mar 2011 13:57:27 -0000 @@ -69,7 +69,7 @@ FILE *active; /* active output file po int ilevel = 0; /* input file stack pointer */ int oindex = 0; /* diversion index.. */ char *null = ""; /* as it says.. just a null.. */ -char **m4wraps = NULL; /* m4wraps array. */ +struct wrap *m4wraps = NULL; /* m4wraps array. */ int maxwraps = 0; /* size of m4wraps array */ int wrapindex = 0; /* current offset in m4wraps */ char lquote[MAXCCHARS+1] = {LQUOTE}; /* left quote character (`) */ @@ -261,14 +261,18 @@ main(int argc, char *argv[]) bufbase = bp = buf; /* use the entire buffer */ if (mimic_gnu) { while (wrapindex != 0) { - for (i = 0; i < wrapindex; i++) - pbstr(m4wraps[i]); + for (i = 0; i < wrapindex; i++) { + if (m4wraps[i].name != NULL) + infile[0].name = m4wraps[i].name; + infile[0].lineno = m4wraps[i].lineno; + pbstr(m4wraps[i].text); + } wrapindex =0; macro(); } } else { for (i = 0; i < wrapindex; i++) { - pbstr(m4wraps[i]); + pbstr(m4wraps[i].text); macro(); } } @@ -327,6 +331,11 @@ macro(void) int t, l; ndptr p; int nlpar; + unsigned long trlineno; + char *trfname = NULL; + + trlineno = infile[ilevel].lineno; + trfname = infile[ilevel].name; cycle { t = gpbc(); @@ -378,6 +387,10 @@ macro(void) reallyputchar(t); } } else if (t == '_' || isalpha(t)) { + if (bufbase >= bp) { + trlineno = infile[ilevel].lineno; + trfname = infile[ilevel].name; + } p = inspect(t, token); if (p != NULL) pushback(l = gpbc()); @@ -391,6 +404,9 @@ macro(void) pushf(fp); /* previous call frm */ pushf(macro_getdef(p)->type); /* type of the call */ pushf(is_traced(p)); + pushu(trlineno); + if (trfname == NULL) trfname = infile[ilevel].name; + pushs1(trfname); pushf(0); /* parenthesis level */ fp = sp; /* new frame pointer */ /* @@ -407,7 +423,7 @@ macro(void) if (sp == STACKMAX) errx(1, "internal stack overflow"); eval((const char **) mstack+fp+1, 2, - CALTYP, TRACESTATUS); + CALTYP, TRACESTATUS, TRACELINENO, TRACEFNAME); ep = PREVEP; /* flush strspace */ sp = PREVSP; /* previous sp.. */ @@ -452,7 +468,9 @@ macro(void) errx(1, "internal stack overflow"); eval((const char **) mstack+fp+1, sp-fp, - CALTYP, TRACESTATUS); + CALTYP, TRACESTATUS, TRACELINENO, TRACEFNAME); + trlineno = TRACELINENO; + trfname = TRACEFNAME; ep = PREVEP; /* flush strspace */ sp = PREVSP; /* previous sp.. */ Index: usr.bin/m4/mdef.h =================================================================== RCS file: /home/cvs/src/usr.bin/m4/mdef.h,v retrieving revision 1.30 diff -u -p -r1.30 mdef.h --- usr.bin/m4/mdef.h 7 Sep 2010 19:58:09 -0000 1.30 +++ usr.bin/m4/mdef.h 15 Mar 2011 13:09:54 -0000 @@ -154,6 +154,7 @@ struct ndblock { /* hashtable structur typedef union { /* stack structure */ int sfra; /* frame entry */ char *sstr; /* string entry */ + unsigned long u; /* unsigned long entry */ } stae; struct input_file { @@ -164,6 +165,12 @@ struct input_file { int c; }; +struct wrap { + char *text; /* wrap text */ + char *name; /* filename for tracing */ + unsigned long lineno; /* lineno for tracing */ +}; + #define CURRENT_NAME (infile[ilevel].name) #define CURRENT_LINE (infile[ilevel].lineno) /* @@ -182,6 +189,14 @@ struct input_file { sstack[sp] = 0; \ } while (0) +#define pushu(x) \ + do { \ + if (++sp == STACKMAX) \ + enlarge_stack();\ + mstack[sp].u = (x); \ + sstack[sp] = 0; \ + } while (0) + #define pushs(x) \ do { \ if (++sp == STACKMAX) \ @@ -222,8 +237,10 @@ struct input_file { * */ #define PARLEV (mstack[fp].sfra) -#define CALTYP (mstack[fp-2].sfra) -#define TRACESTATUS (mstack[fp-1].sfra) +#define CALTYP (mstack[fp-4].sfra) +#define TRACESTATUS (mstack[fp-3].sfra) +#define TRACELINENO (mstack[fp-2].u) +#define TRACEFNAME (mstack[fp-1].sstr) #define PREVEP (mstack[fp+3].sstr) -#define PREVSP (fp-4) -#define PREVFP (mstack[fp-3].sfra) +#define PREVSP (fp-6) +#define PREVFP (mstack[fp-5].sfra) Index: usr.bin/m4/misc.c =================================================================== RCS file: /home/cvs/src/usr.bin/m4/misc.c,v retrieving revision 1.42 diff -u -p -r1.42 misc.c --- usr.bin/m4/misc.c 7 Sep 2010 19:58:09 -0000 1.42 +++ usr.bin/m4/misc.c 14 Mar 2011 14:01:42 -0000 @@ -391,16 +391,16 @@ release_input(struct input_file *f) } void -doprintlineno(struct input_file *f) +doprintlineno(struct input_file *f, unsigned long trlineno) { - pbunsigned(f->lineno); + pbunsigned(mimic_gnu ? trlineno : f->lineno); } void -doprintfilename(struct input_file *f) +doprintfilename(struct input_file *f, const char *curfname) { pbstr(rquote); - pbstr(f->name); + pbstr(mimic_gnu ? curfname : f->name); pbstr(lquote); } Index: usr.bin/m4/trace.c =================================================================== RCS file: /home/cvs/src/usr.bin/m4/trace.c,v retrieving revision 1.16 diff -u -p -r1.16 trace.c --- usr.bin/m4/trace.c 7 Sep 2010 19:58:09 -0000 1.16 +++ usr.bin/m4/trace.c 14 Mar 2011 13:59:37 -0000 @@ -46,7 +46,7 @@ FILE *traceout; #define TRACE_INPUT 256 /* not implemented yet */ static unsigned int letter_to_flag(int); -static void print_header(struct input_file *); +static void print_header(struct input_file *, unsigned long, const char *); static int frame_level(void); @@ -124,33 +124,33 @@ frame_level() int framep; for (framep = fp, level = 0; framep != 0; - level++,framep = mstack[framep-3].sfra) + level++,framep = mstack[framep-5].sfra) ; return level; } static void -print_header(struct input_file *inp) +print_header(struct input_file *inp, unsigned long trlineno, const char* curfname) { fprintf(traceout, "m4trace:"); if (trace_flags & TRACE_FILENAME) - fprintf(traceout, "%s:", inp->name); + fprintf(traceout, "%s:", mimic_gnu ? curfname : inp->name); if (trace_flags & TRACE_LINENO) - fprintf(traceout, "%lu:", inp->lineno); + fprintf(traceout, "%lu:", mimic_gnu ? trlineno : inp->lineno); fprintf(traceout, " -%d- ", frame_level()); if (trace_flags & TRACE_ID) fprintf(traceout, "id %lu: ", expansion_id); } size_t -trace(const char *argv[], int argc, struct input_file *inp) +trace(const char *argv[], int argc, struct input_file *inp, unsigned long trlineno, const char* curfname) { if (!traceout) traceout = stderr; - print_header(inp); + print_header(inp, trlineno, curfname); if (trace_flags & TRACE_CONT) { fprintf(traceout, "%s ...\n", argv[1]); - print_header(inp); + print_header(inp, trlineno, curfname); } fprintf(traceout, "%s", argv[1]); if ((trace_flags & TRACE_ARGS) && argc > 2) { @@ -172,7 +172,7 @@ trace(const char *argv[], int argc, stru } if (trace_flags & TRACE_CONT) { fprintf(traceout, " -> ???\n"); - print_header(inp); + print_header(inp, trlineno, curfname); fprintf(traceout, argc > 2 ? "%s(...)" : "%s", argv[1]); } if (trace_flags & TRACE_EXPANSION) Index: regress/usr.bin/m4/Makefile =================================================================== RCS file: /home/cvs/src/regress/usr.bin/m4/Makefile,v retrieving revision 1.28 diff -u -p -r1.28 Makefile --- regress/usr.bin/m4/Makefile 23 Mar 2010 20:11:52 -0000 1.28 +++ regress/usr.bin/m4/Makefile 10 Mar 2011 14:22:45 -0000 @@ -12,7 +12,7 @@ REGRESS_TARGETS= test-ff_after_dnl test- test-weird test-args test-args2 test-esyscmd test-eval test-gnupatterns \ test-gnupatterns2 test-comments test-synch1 test-synch1bis \ test-gnuformat test-includes test-dumpdef test-gnuprefix \ - test-translit + test-translit test-gnutranslit test-ff_after_dnl: ff_after_dnl.m4 ${M4} ff_after_dnl.m4 | diff - ${.CURDIR}/ff_after_dnl.out @@ -102,6 +102,9 @@ test-dumpdef: test-gnuprefix: ${M4} -P ${.CURDIR}/gnuprefix.m4 2>&1 | \ diff -u - ${.CURDIR}/gnuprefix.out + +test-gnutranslit: + ${M4} -g ${.CURDIR}/gnutranslit.m4 | diff -u - ${.CURDIR}/gnutranslit.out .PHONY: ${REGRESS_TARGETS} Index: regress/usr.bin/m4/gnutranslit.m4 =================================================================== RCS file: regress/usr.bin/m4/gnutranslit.m4 diff -N regress/usr.bin/m4/gnutranslit.m4 --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ regress/usr.bin/m4/gnutranslit.m4 10 Mar 2011 20:31:20 -0000 @@ -0,0 +1,13 @@ +translit(`[HAVE_abc/def.h +]', ` +/.', `/ ') +translit(`[HAVE_abc/def.h=]', `=/.', `/~~') +translit(`0123456789', `0123456789', `ABCDEFGHIJ') +translit(`0123456789', `[0-9]', `[A-J]') +translit(`abc-0980-zyx', `abcdefghijklmnopqrstuvwxyz', `ABCDEFGHIJKLMNOPQRSTUVWXYZ') +translit(`abc-0980-zyx', `[a-z]', `[A-Z]') +translit(`GNUs not Unix', `A-Z') +translit(`GNUs not Unix', `a-z', `A-Z') +translit(`GNUs not Unix', `A-Z', `z-a') +translit(`+,-12345', `+--1-5', `<;>a-c-a') +translit(`abcdef', `aabdef', `bcged') Index: regress/usr.bin/m4/gnutranslit.out =================================================================== RCS file: regress/usr.bin/m4/gnutranslit.out diff -N regress/usr.bin/m4/gnutranslit.out --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ regress/usr.bin/m4/gnutranslit.out 10 Mar 2011 20:31:28 -0000 @@ -0,0 +1,11 @@ +[HAVE_abc def h/] +[HAVE_abc~def~h/] +ABCDEFGHIJ +ABCDEFGHIJ +ABC-0980-ZYX +ABC-0980-ZYX +s not nix +GNUS NOT UNIX +tmfs not fnix +<;>abcba +bgced