summaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorMarc Espie <espie@cvs.openbsd.org>2000-01-12 17:49:54 +0000
committerMarc Espie <espie@cvs.openbsd.org>2000-01-12 17:49:54 +0000
commit879f2aaab636d223a7060f424fdfa03a44f9ae6d (patch)
tree1d109be599a82716b19e67db7064d53b33e4f8ea /usr.bin
parent73f042400ef46e49cd6ab2644cb38f107a970a6a (diff)
Use a proper abstract interface for file accesses, so that we can record
the file name and line number. This yields more meaningful error messages, and the possibility for yet more.
Diffstat (limited to 'usr.bin')
-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);
+}