summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr.bin/m4/eval.c31
-rw-r--r--usr.bin/m4/extern.h11
-rw-r--r--usr.bin/m4/gnum4.c32
-rw-r--r--usr.bin/m4/main.c20
-rw-r--r--usr.bin/m4/mdef.h13
-rw-r--r--usr.bin/m4/misc.c35
6 files changed, 99 insertions, 43 deletions
diff --git a/usr.bin/m4/eval.c b/usr.bin/m4/eval.c
index fa509dfd648..0d4e85ee6b8 100644
--- a/usr.bin/m4/eval.c
+++ b/usr.bin/m4/eval.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: eval.c,v 1.23 2000/01/05 16:06:14 espie Exp $ */
+/* $OpenBSD: eval.c,v 1.24 2000/01/12 17:49:53 espie Exp $ */
/* $NetBSD: eval.c,v 1.7 1996/11/10 21:21:29 pk Exp $ */
/*
@@ -41,7 +41,7 @@
#if 0
static char sccsid[] = "@(#)eval.c 8.2 (Berkeley) 4/27/95";
#else
-static char rcsid[] = "$OpenBSD: eval.c,v 1.23 2000/01/05 16:06:14 espie Exp $";
+static char rcsid[] = "$OpenBSD: eval.c,v 1.24 2000/01/12 17:49:53 espie Exp $";
#endif
#endif /* not lint */
@@ -112,7 +112,8 @@ eval(argv, argc, td)
#endif
if (td & RECDEF)
- errx(1, "expanding recursive definition for %s", argv[1]);
+ errx(1, "%s at line %lu: expanding recursive definition for %s",
+ CURRENT_NAME, CURRENT_LINE, argv[1]);
/*
* if argc == 3 and argv[2] is null, then we
* have macro-or-builtin() type call. We adjust
@@ -211,7 +212,8 @@ eval(argv, argc, td)
case INCLTYPE:
if (argc > 2)
if (!doincl(argv[2]))
- err(1, "%s", argv[2]);
+ err(1, "%s at line %lu: include(%s)",
+ CURRENT_NAME, CURRENT_LINE, argv[2]);
break;
case SINCTYPE:
@@ -222,7 +224,8 @@ eval(argv, argc, td)
case PASTTYPE:
if (argc > 2)
if (!dopaste(argv[2]))
- err(1, "%s", argv[2]);
+ err(1, "%s at line %lu: paste(%s)",
+ CURRENT_NAME, CURRENT_LINE, argv[2]);
break;
case SPASTYPE:
@@ -320,7 +323,9 @@ eval(argv, argc, td)
fd = mkstemp(temp);
if (fd == -1)
- err(1, "couldn't make temp file %s", argv[2]);
+ err(1,
+ "%s at line %lu: couldn't make temp file %s",
+ CURRENT_NAME, CURRENT_LINE, argv[2]);
close(fd);
pbstr(temp);
free(temp);
@@ -403,7 +408,8 @@ eval(argv, argc, td)
pbstr(lquote);
break;
default:
- errx(1, "eval: major botch.");
+ errx(1, "%s at line %lu: eval: major botch.",
+ CURRENT_NAME, CURRENT_LINE);
break;
}
}
@@ -492,7 +498,8 @@ dodefine(name, defn)
ndptr p;
if (!*name)
- errx(1, "null definition.");
+ errx(1, "%s at line %lu: null definition.", CURRENT_NAME,
+ CURRENT_LINE);
if ((p = lookup(name)) == nil)
p = addent(name);
else if (p->defn != null)
@@ -538,7 +545,8 @@ dopushdef(name, defn)
ndptr p;
if (!*name)
- errx(1, "null definition");
+ errx(1, "%s at line %lu: null definition", CURRENT_NAME,
+ CURRENT_LINE);
p = addent(name);
if (!*defn)
p->defn = null;
@@ -605,8 +613,9 @@ doincl(ifile)
const char *ifile;
{
if (ilevel + 1 == MAXINP)
- errx(1, "too many include files.");
- if ((infile[ilevel + 1] = fopen_trypath(ifile)) != NULL) {
+ errx(1, "%s at line %lu: too many include files.",
+ CURRENT_NAME, CURRENT_LINE);
+ if (fopen_trypath(infile+ilevel+1, ifile) != NULL) {
ilevel++;
bbase[ilevel] = bufbase = bp;
return (1);
diff --git a/usr.bin/m4/extern.h b/usr.bin/m4/extern.h
index 5d44b105031..e593793d265 100644
--- a/usr.bin/m4/extern.h
+++ b/usr.bin/m4/extern.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: extern.h,v 1.14 2000/01/11 14:06:11 espie Exp $ */
+/* $OpenBSD: extern.h,v 1.15 2000/01/12 17:49:53 espie Exp $ */
/* $NetBSD: extern.h,v 1.3 1996/01/13 23:25:24 pk Exp $ */
/*-
@@ -49,7 +49,7 @@ extern int expr __P((const char *));
/* gnum4.c */
extern void addtoincludepath __P((const char *dirname));
-extern FILE *fopen_trypath __P((const char *filename));
+extern struct input_file *fopen_trypath __P((struct input_file *, const char *filename));
/* look.c */
extern ndptr addent __P((const char *));
@@ -75,10 +75,15 @@ extern char *xalloc __P((size_t));
extern char *xstrdup __P((const char *));
extern void usage __P((void));
+extern int obtain_char __P((struct input_file *));
+extern void set_input __P((struct input_file *, FILE *, const char *));
+extern void release_input __P((struct input_file *));
+
+
extern ndptr hashtab[]; /* hash table for macros etc. */
extern stae mstack[]; /* stack of m4 machine */
extern FILE *active; /* active output file pointer */
-extern FILE *infile[]; /* input file stack (0=stdin) */
+extern struct input_file infile[];/* input file stack (0=stdin) */
extern FILE *outfile[]; /* diversion array(0=bitbucket) */
extern int fp; /* m4 call frame pointer */
extern int ilevel; /* input file stack pointer */
diff --git a/usr.bin/m4/gnum4.c b/usr.bin/m4/gnum4.c
index aa4215a8abc..938548cc680 100644
--- a/usr.bin/m4/gnum4.c
+++ b/usr.bin/m4/gnum4.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: gnum4.c,v 1.3 1999/11/17 15:34:13 espie Exp $ */
+/* $OpenBSD: gnum4.c,v 1.4 2000/01/12 17:49:53 espie Exp $ */
/*
* Copyright (c) 1999 Marc Espie
@@ -54,7 +54,7 @@ struct path_entry {
static struct path_entry *new_path_entry __P((const char *));
static void ensure_m4path __P((void));
-static FILE *dopath __P((const char *));
+static struct input_file *dopath __P((struct input_file *, const char *));
static struct path_entry *
new_path_entry(dirname)
@@ -113,38 +113,42 @@ ensure_m4path()
}
static
-FILE *
-dopath(filename)
+struct input_file *
+dopath(i, filename)
+ struct input_file *i;
const char *filename;
{
char path[MAXPATHLEN];
struct path_entry *pe;
- FILE *file;
+ FILE *f;
for (pe = first; pe; pe = pe->next) {
snprintf(path, sizeof(path), "%s/%s", pe->name, filename);
- if ((file = fopen(path, "r")) != 0)
- return file;
+ if ((f = fopen(path, "r")) != 0) {
+ set_input(i, f, path);
+ return i;
+ }
}
return NULL;
}
-FILE *
-fopen_trypath(filename)
+struct input_file *
+fopen_trypath(i, filename)
+ struct input_file *i;
const char *filename;
{
FILE *f;
f = fopen(filename, "r");
- if (f)
- return f;
+ if (f != NULL) {
+ set_input(i, f, filename);
+ return i;
+ }
if (filename[0] == '/')
return NULL;
ensure_m4path();
- return dopath(filename);
+ return dopath(i, filename);
}
-
-
diff --git a/usr.bin/m4/main.c b/usr.bin/m4/main.c
index 4c52a6e49d0..45fb7292918 100644
--- a/usr.bin/m4/main.c
+++ b/usr.bin/m4/main.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: main.c,v 1.25 2000/01/11 14:10:01 espie Exp $ */
+/* $OpenBSD: main.c,v 1.26 2000/01/12 17:49:53 espie Exp $ */
/* $NetBSD: main.c,v 1.12 1997/02/08 23:54:49 cgd Exp $ */
/*-
@@ -47,7 +47,7 @@ static char copyright[] =
#if 0
static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 6/6/93";
#else
-static char rcsid[] = "$OpenBSD: main.c,v 1.25 2000/01/11 14:10:01 espie Exp $";
+static char rcsid[] = "$OpenBSD: main.c,v 1.26 2000/01/12 17:49:53 espie Exp $";
#endif
#endif /* not lint */
@@ -76,7 +76,7 @@ ndptr hashtab[HASHSIZE]; /* hash table for macros etc. */
stae mstack[STACKMAX+1]; /* stack of m4 machine */
int sp; /* current m4 stack pointer */
int fp; /* m4 call frame pointer */
-FILE *infile[MAXINP]; /* input file stack (0=stdin) */
+struct input_file infile[MAXINP];/* input file stack (0=stdin) */
FILE *outfile[MAXOUT]; /* diversion array(0=bitbucket)*/
FILE *active; /* active output file pointer */
int ilevel = 0; /* input file stack pointer */
@@ -192,21 +192,20 @@ main(argc,argv)
if (!argc) {
sp = -1; /* stack pointer initialized */
fp = 0; /* frame pointer initialized */
- infile[0] = stdin; /* default input (naturally) */
+ set_input(infile+0, stdin, "stdin");
+ /* default input (naturally) */
macro();
} else
for (; argc--; ++argv) {
p = *argv;
if (p[0] == '-' && p[1] == EOS)
- ifp = stdin;
- else if ((ifp = fopen_trypath(p)) == NULL)
+ set_input(infile, stdin, "stdin");
+ else if (fopen_trypath(infile, p) == NULL)
err(1, "%s", p);
sp = -1;
fp = 0;
- infile[0] = ifp;
macro();
- if (ifp != stdin)
- (void)fclose(ifp);
+ release_input(infile);
}
if (*m4wraps) { /* anything for rundown ?? */
@@ -309,8 +308,7 @@ macro()
errx(1, "unexpected end of input");
if (ilevel <= 0)
break; /* all done thanks.. */
- --ilevel;
- (void) fclose(infile[ilevel+1]);
+ release_input(infile+ilevel--);
bufbase = bbase[ilevel];
continue;
}
diff --git a/usr.bin/m4/mdef.h b/usr.bin/m4/mdef.h
index 77bbaa3ab28..b88fa5ad0ff 100644
--- a/usr.bin/m4/mdef.h
+++ b/usr.bin/m4/mdef.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: mdef.h,v 1.11 2000/01/11 14:06:12 espie Exp $ */
+/* $OpenBSD: mdef.h,v 1.12 2000/01/12 17:49:53 espie Exp $ */
/* $NetBSD: mdef.h,v 1.7 1996/01/13 23:25:27 pk Exp $ */
/*
@@ -147,6 +147,15 @@ typedef union { /* stack structure */
typedef short pbent; /* pushback entry; needs to hold chars + EOF */
+struct input_file {
+ FILE *file;
+ char *name;
+ unsigned long lineno;
+ int c;
+};
+
+#define CURRENT_NAME (infile[ilevel].name)
+#define CURRENT_LINE (infile[ilevel].lineno)
/*
* macros for readibility and/or speed
*
@@ -154,7 +163,7 @@ typedef short pbent; /* pushback entry; needs to hold chars + EOF */
* pushf() - push a call frame entry onto stack
* pushs() - push a string pointer onto stack
*/
-#define gpbc() (bp > bufbase) ? *--bp : getc(infile[ilevel])
+#define gpbc() (bp > bufbase) ? *--bp : obtain_char(infile+ilevel)
#define pushf(x) if (sp < STACKMAX) mstack[++sp].sfra = (x)
#define pushs(x) if (sp < STACKMAX) mstack[++sp].sstr = (x)
diff --git a/usr.bin/m4/misc.c b/usr.bin/m4/misc.c
index a7d2e3c8bf0..49adc800bef 100644
--- a/usr.bin/m4/misc.c
+++ b/usr.bin/m4/misc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: misc.c,v 1.14 1999/11/17 15:34:13 espie Exp $ */
+/* $OpenBSD: misc.c,v 1.15 2000/01/12 17:49:53 espie Exp $ */
/* $NetBSD: misc.c,v 1.6 1995/09/28 05:37:41 tls Exp $ */
/*
@@ -41,7 +41,7 @@
#if 0
static char sccsid[] = "@(#)misc.c 8.1 (Berkeley) 6/6/93";
#else
-static char rcsid[] = "$OpenBSD: misc.c,v 1.14 1999/11/17 15:34:13 espie Exp $";
+static char rcsid[] = "$OpenBSD: misc.c,v 1.15 2000/01/12 17:49:53 espie Exp $";
#endif
#endif /* not lint */
@@ -295,3 +295,34 @@ usage()
exit(1);
}
+int
+obtain_char(f)
+ struct input_file *f;
+{
+ if (f->c == '\n')
+ f->lineno++;
+
+ f->c = fgetc(f->file);
+ return f->c;
+}
+
+void
+set_input(f, real, name)
+ struct input_file *f;
+ FILE *real;
+ const char *name;
+{
+ f->file = real;
+ f->lineno = 1;
+ f->c = 0;
+ f->name = xstrdup(name);
+}
+
+void
+release_input(f)
+ struct input_file *f;
+{
+ if (f->file != stdin)
+ fclose(f->file);
+ free(f->name);
+}