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