xref: /original-bsd/usr.bin/pascal/src/error.c (revision b99f9a68)
1b85afe43Sbostic /*-
2*b99f9a68Sbostic  * Copyright (c) 1980, 1993
3*b99f9a68Sbostic  *	The Regents of the University of California.  All rights reserved.
4b85afe43Sbostic  *
5b85afe43Sbostic  * %sccs.include.redist.c%
6986f48a8Sdist  */
7eab9c3e1Speter 
88df67763Sthien #ifndef lint
9*b99f9a68Sbostic static char sccsid[] = "@(#)error.c	8.1 (Berkeley) 06/06/93";
10b85afe43Sbostic #endif /* not lint */
11eab9c3e1Speter 
12eab9c3e1Speter #include "whoami.h"
13eab9c3e1Speter #include "0.h"
14eab9c3e1Speter #ifndef PI1
158df67763Sthien #include "tree_ty.h"		/* must be included for yy.h */
16eab9c3e1Speter #include "yy.h"
17eab9c3e1Speter #endif
18eab9c3e1Speter 
19eab9c3e1Speter char	errpfx	= 'E';
20eab9c3e1Speter extern	int yyline;
21eab9c3e1Speter /*
22eab9c3e1Speter  * Panic is called when impossible
23eab9c3e1Speter  * (supposedly, anyways) situations
24eab9c3e1Speter  * are encountered.
25eab9c3e1Speter  * Panic messages should be short
26eab9c3e1Speter  * as they do not go to the message
27eab9c3e1Speter  * file.
28eab9c3e1Speter  */
panic(s)29eab9c3e1Speter panic(s)
30eab9c3e1Speter 	char *s;
31eab9c3e1Speter {
32eab9c3e1Speter 
33eab9c3e1Speter #ifdef DEBUG
34eab9c3e1Speter #ifdef PI1
35eab9c3e1Speter 	printf("Snark (%s) line=%d\n", s, line);
36eab9c3e1Speter 	abort();
37eab9c3e1Speter #else
38eab9c3e1Speter 	printf("Snark (%s) line=%d, yyline=%d\n", s, line, yyline);
39eab9c3e1Speter 	abort () ;	/* die horribly */
40eab9c3e1Speter #endif
41eab9c3e1Speter #endif
42eab9c3e1Speter #ifdef PI1
43eab9c3e1Speter 	Perror( "Snark in pi1", s);
44eab9c3e1Speter #else
45eab9c3e1Speter 	Perror( "Snark in pi", s);
46eab9c3e1Speter #endif
47eab9c3e1Speter 	pexit(DIED);
48eab9c3e1Speter }
49eab9c3e1Speter 
50eab9c3e1Speter /*
51eab9c3e1Speter  * Error is called for
52eab9c3e1Speter  * semantic errors and
53eab9c3e1Speter  * prints the error and
54eab9c3e1Speter  * a line number.
55eab9c3e1Speter  */
56eab9c3e1Speter 
578df67763Sthien /*VARARGS1*/
58eab9c3e1Speter 
error(a1,a2,a3,a4,a5)592458b484Smckusic error(a1, a2, a3, a4, a5)
60eab9c3e1Speter 	register char *a1;
61eab9c3e1Speter {
62eab9c3e1Speter 	char errbuf[256]; 		/* was extern. why? ...pbk */
63eab9c3e1Speter 	register int i;
64eab9c3e1Speter 
65eab9c3e1Speter 	if (errpfx == 'w' && opt('w') != 0) {
66eab9c3e1Speter 		errpfx = 'E';
67eab9c3e1Speter 		return;
68eab9c3e1Speter 	}
698df67763Sthien 	Enocascade = FALSE;
708df67763Sthien 	geterr((int) a1, errbuf);
71eab9c3e1Speter 	a1 = errbuf;
72eab9c3e1Speter 	if (line < 0)
73eab9c3e1Speter 		line = -line;
74eab9c3e1Speter #ifndef PI1
75eab9c3e1Speter 	if (opt('l'))
76eab9c3e1Speter 		yyoutline();
77eab9c3e1Speter #endif
78eab9c3e1Speter 	yysetfile(filename);
79eab9c3e1Speter 	if (errpfx == ' ') {
80eab9c3e1Speter 		printf("  ");
81eab9c3e1Speter 		for (i = line; i >= 10; i /= 10)
82eab9c3e1Speter 			pchr( ' ' );
83eab9c3e1Speter 		printf("... ");
84eab9c3e1Speter 	} else if (Enoline)
85eab9c3e1Speter 		printf("  %c - ", errpfx);
86eab9c3e1Speter 	else
87eab9c3e1Speter 		printf("%c %d - ", errpfx, line);
882458b484Smckusic 	printf(a1, a2, a3, a4, a5);
89eab9c3e1Speter 	if (errpfx == 'E')
90eab9c3e1Speter #ifndef PI0
919c5eb5e0Smckusic 		eflg = TRUE, codeoff();
92eab9c3e1Speter #else
939c5eb5e0Smckusic 		eflg = TRUE;
94eab9c3e1Speter #endif
95eab9c3e1Speter 	errpfx = 'E';
96eab9c3e1Speter 	if (Eholdnl)
978df67763Sthien 		Eholdnl = FALSE;
98eab9c3e1Speter 	else
99eab9c3e1Speter 		pchr( '\n' );
100eab9c3e1Speter }
101eab9c3e1Speter 
1028df67763Sthien /*VARARGS1*/
103eab9c3e1Speter 
cerror(a1,a2,a3,a4,a5)1042458b484Smckusic cerror(a1, a2, a3, a4, a5)
1058df67763Sthien     char *a1;
106eab9c3e1Speter {
107eab9c3e1Speter 
108eab9c3e1Speter 	if (Enocascade)
109eab9c3e1Speter 		return;
110eab9c3e1Speter 	setpfx(' ');
1112458b484Smckusic 	error(a1, a2, a3, a4, a5);
112eab9c3e1Speter }
113eab9c3e1Speter 
114eab9c3e1Speter #ifdef PI1
115eab9c3e1Speter 
116eab9c3e1Speter /*VARARGS*/
117eab9c3e1Speter 
derror(a1,a2,a3,a4,a5)1182458b484Smckusic derror(a1, a2, a3, a4, a5)
1198df67763Sthien     char *a1, *a2, *a3, *a4, *a5;
120eab9c3e1Speter {
121eab9c3e1Speter 
122eab9c3e1Speter 	if (!holdderr)
1232458b484Smckusic 		error(a1, a2, a3, a4, a5);
124eab9c3e1Speter 	errpfx = 'E';
125eab9c3e1Speter }
126eab9c3e1Speter 
127eab9c3e1Speter char	*lastname, printed, hadsome;
128eab9c3e1Speter 
129eab9c3e1Speter     /*
130eab9c3e1Speter      *	this yysetfile for PI1 only.
131eab9c3e1Speter      *	the real yysetfile is in yyput.c
132eab9c3e1Speter      */
yysetfile(name)133eab9c3e1Speter yysetfile(name)
134eab9c3e1Speter 	char *name;
135eab9c3e1Speter {
136eab9c3e1Speter 
137eab9c3e1Speter 	if (lastname == name)
138eab9c3e1Speter 		return;
139982f73c3Sbostic 	printed |= 1;
140eab9c3e1Speter 	gettime( name );
141eab9c3e1Speter 	printf("%s  %s:\n" , myctime( &tvec ) , name );
142eab9c3e1Speter 	lastname = name;
143eab9c3e1Speter }
144eab9c3e1Speter #endif
145