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