148116Sbostic /*-
2*62205Sbostic * Copyright (c) 1980, 1993
3*62205Sbostic * The Regents of the University of California. All rights reserved.
448116Sbostic *
548116Sbostic * %sccs.include.redist.c%
622162Sdist */
7751Speter
815228Sthien #ifndef lint
9*62205Sbostic static char sccsid[] = "@(#)error.c 8.1 (Berkeley) 06/06/93";
1048116Sbostic #endif /* not lint */
11751Speter
12751Speter #include "whoami.h"
13751Speter #include "0.h"
14751Speter #ifndef PI1
1515228Sthien #include "tree_ty.h" /* must be included for yy.h */
16751Speter #include "yy.h"
17751Speter #endif
18751Speter
19751Speter char errpfx = 'E';
20751Speter extern int yyline;
21751Speter /*
22751Speter * Panic is called when impossible
23751Speter * (supposedly, anyways) situations
24751Speter * are encountered.
25751Speter * Panic messages should be short
26751Speter * as they do not go to the message
27751Speter * file.
28751Speter */
panic(s)29751Speter panic(s)
30751Speter char *s;
31751Speter {
32751Speter
33751Speter #ifdef DEBUG
34751Speter #ifdef PI1
35751Speter printf("Snark (%s) line=%d\n", s, line);
36751Speter abort();
37751Speter #else
38751Speter printf("Snark (%s) line=%d, yyline=%d\n", s, line, yyline);
39751Speter abort () ; /* die horribly */
40751Speter #endif
41751Speter #endif
42751Speter #ifdef PI1
43751Speter Perror( "Snark in pi1", s);
44751Speter #else
45751Speter Perror( "Snark in pi", s);
46751Speter #endif
47751Speter pexit(DIED);
48751Speter }
49751Speter
50751Speter /*
51751Speter * Error is called for
52751Speter * semantic errors and
53751Speter * prints the error and
54751Speter * a line number.
55751Speter */
56751Speter
5715228Sthien /*VARARGS1*/
58751Speter
error(a1,a2,a3,a4,a5)593298Smckusic error(a1, a2, a3, a4, a5)
60751Speter register char *a1;
61751Speter {
62751Speter char errbuf[256]; /* was extern. why? ...pbk */
63751Speter register int i;
64751Speter
65751Speter if (errpfx == 'w' && opt('w') != 0) {
66751Speter errpfx = 'E';
67751Speter return;
68751Speter }
6915228Sthien Enocascade = FALSE;
7015228Sthien geterr((int) a1, errbuf);
71751Speter a1 = errbuf;
72751Speter if (line < 0)
73751Speter line = -line;
74751Speter #ifndef PI1
75751Speter if (opt('l'))
76751Speter yyoutline();
77751Speter #endif
78751Speter yysetfile(filename);
79751Speter if (errpfx == ' ') {
80751Speter printf(" ");
81751Speter for (i = line; i >= 10; i /= 10)
82751Speter pchr( ' ' );
83751Speter printf("... ");
84751Speter } else if (Enoline)
85751Speter printf(" %c - ", errpfx);
86751Speter else
87751Speter printf("%c %d - ", errpfx, line);
883298Smckusic printf(a1, a2, a3, a4, a5);
89751Speter if (errpfx == 'E')
90751Speter #ifndef PI0
913073Smckusic eflg = TRUE, codeoff();
92751Speter #else
933073Smckusic eflg = TRUE;
94751Speter #endif
95751Speter errpfx = 'E';
96751Speter if (Eholdnl)
9715228Sthien Eholdnl = FALSE;
98751Speter else
99751Speter pchr( '\n' );
100751Speter }
101751Speter
10215228Sthien /*VARARGS1*/
103751Speter
cerror(a1,a2,a3,a4,a5)1043298Smckusic cerror(a1, a2, a3, a4, a5)
10515228Sthien char *a1;
106751Speter {
107751Speter
108751Speter if (Enocascade)
109751Speter return;
110751Speter setpfx(' ');
1113298Smckusic error(a1, a2, a3, a4, a5);
112751Speter }
113751Speter
114751Speter #ifdef PI1
115751Speter
116751Speter /*VARARGS*/
117751Speter
derror(a1,a2,a3,a4,a5)1183298Smckusic derror(a1, a2, a3, a4, a5)
11915228Sthien char *a1, *a2, *a3, *a4, *a5;
120751Speter {
121751Speter
122751Speter if (!holdderr)
1233298Smckusic error(a1, a2, a3, a4, a5);
124751Speter errpfx = 'E';
125751Speter }
126751Speter
127751Speter char *lastname, printed, hadsome;
128751Speter
129751Speter /*
130751Speter * this yysetfile for PI1 only.
131751Speter * the real yysetfile is in yyput.c
132751Speter */
yysetfile(name)133751Speter yysetfile(name)
134751Speter char *name;
135751Speter {
136751Speter
137751Speter if (lastname == name)
138751Speter return;
13932764Sbostic printed |= 1;
140751Speter gettime( name );
141751Speter printf("%s %s:\n" , myctime( &tvec ) , name );
142751Speter lastname = name;
143751Speter }
144751Speter #endif
145