xref: /csrg-svn/usr.bin/pascal/src/error.c (revision 15228)
1751Speter /* Copyright (c) 1979 Regents of the University of California */
2751Speter 
3*15228Sthien #ifndef lint
4*15228Sthien static char sccsid[] = "@(#)error.c 1.5 10/14/83";
5*15228Sthien #endif
6751Speter 
7751Speter #include "whoami.h"
8751Speter #include "0.h"
9751Speter #ifndef PI1
10*15228Sthien #include "tree_ty.h"		/* must be included for yy.h */
11751Speter #include "yy.h"
12751Speter #endif
13751Speter 
14751Speter char	errpfx	= 'E';
15751Speter extern	int yyline;
16751Speter /*
17751Speter  * Panic is called when impossible
18751Speter  * (supposedly, anyways) situations
19751Speter  * are encountered.
20751Speter  * Panic messages should be short
21751Speter  * as they do not go to the message
22751Speter  * file.
23751Speter  */
24751Speter panic(s)
25751Speter 	char *s;
26751Speter {
27751Speter 
28751Speter #ifdef DEBUG
29751Speter #ifdef PI1
30751Speter 	printf("Snark (%s) line=%d\n", s, line);
31751Speter 	abort();
32751Speter #else
33751Speter 	printf("Snark (%s) line=%d, yyline=%d\n", s, line, yyline);
34751Speter 	abort () ;	/* die horribly */
35751Speter #endif
36751Speter #endif
37751Speter #ifdef PI1
38751Speter 	Perror( "Snark in pi1", s);
39751Speter #else
40751Speter 	Perror( "Snark in pi", s);
41751Speter #endif
42751Speter 	pexit(DIED);
43751Speter }
44751Speter 
45751Speter /*
46751Speter  * Error is called for
47751Speter  * semantic errors and
48751Speter  * prints the error and
49751Speter  * a line number.
50751Speter  */
51751Speter 
52*15228Sthien /*VARARGS1*/
53751Speter 
543298Smckusic error(a1, a2, a3, a4, a5)
55751Speter 	register char *a1;
56751Speter {
57751Speter 	char errbuf[256]; 		/* was extern. why? ...pbk */
58751Speter 	register int i;
59751Speter 
60751Speter 	if (errpfx == 'w' && opt('w') != 0) {
61751Speter 		errpfx = 'E';
62751Speter 		return;
63751Speter 	}
64*15228Sthien 	Enocascade = FALSE;
65*15228Sthien 	geterr((int) a1, errbuf);
66751Speter 	a1 = errbuf;
67751Speter 	if (line < 0)
68751Speter 		line = -line;
69751Speter #ifndef PI1
70751Speter 	if (opt('l'))
71751Speter 		yyoutline();
72751Speter #endif
73751Speter 	yysetfile(filename);
74751Speter 	if (errpfx == ' ') {
75751Speter 		printf("  ");
76751Speter 		for (i = line; i >= 10; i /= 10)
77751Speter 			pchr( ' ' );
78751Speter 		printf("... ");
79751Speter 	} else if (Enoline)
80751Speter 		printf("  %c - ", errpfx);
81751Speter 	else
82751Speter 		printf("%c %d - ", errpfx, line);
833298Smckusic 	printf(a1, a2, a3, a4, a5);
84751Speter 	if (errpfx == 'E')
85751Speter #ifndef PI0
863073Smckusic 		eflg = TRUE, codeoff();
87751Speter #else
883073Smckusic 		eflg = TRUE;
89751Speter #endif
90751Speter 	errpfx = 'E';
91751Speter 	if (Eholdnl)
92*15228Sthien 		Eholdnl = FALSE;
93751Speter 	else
94751Speter 		pchr( '\n' );
95751Speter }
96751Speter 
97*15228Sthien /*VARARGS1*/
98751Speter 
993298Smckusic cerror(a1, a2, a3, a4, a5)
100*15228Sthien     char *a1;
101751Speter {
102751Speter 
103751Speter 	if (Enocascade)
104751Speter 		return;
105751Speter 	setpfx(' ');
1063298Smckusic 	error(a1, a2, a3, a4, a5);
107751Speter }
108751Speter 
109751Speter #ifdef PI1
110751Speter 
111751Speter /*VARARGS*/
112751Speter 
1133298Smckusic derror(a1, a2, a3, a4, a5)
114*15228Sthien     char *a1, *a2, *a3, *a4, *a5;
115751Speter {
116751Speter 
117751Speter 	if (!holdderr)
1183298Smckusic 		error(a1, a2, a3, a4, a5);
119751Speter 	errpfx = 'E';
120751Speter }
121751Speter 
122751Speter char	*lastname, printed, hadsome;
123751Speter 
124751Speter     /*
125751Speter      *	this yysetfile for PI1 only.
126751Speter      *	the real yysetfile is in yyput.c
127751Speter      */
128751Speter yysetfile(name)
129751Speter 	char *name;
130751Speter {
131751Speter 
132751Speter 	if (lastname == name)
133751Speter 		return;
134751Speter 	printed =| 1;
135751Speter 	gettime( name );
136751Speter 	printf("%s  %s:\n" , myctime( &tvec ) , name );
137751Speter 	lastname = name;
138751Speter }
139751Speter #endif
140