|
|
1.1 root 1: /* messages.c - error reporter -
2: Copyright (C) 1987 Free Software Foundation, Inc.
3:
4: This file is part of GAS, the GNU Assembler.
5:
6: GAS is free software; you can redistribute it and/or modify
7: it under the terms of the GNU General Public License as published by
8: the Free Software Foundation; either version 1, or (at your option)
9: any later version.
10:
11: GAS is distributed in the hope that it will be useful,
12: but WITHOUT ANY WARRANTY; without even the implied warranty of
13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14: GNU General Public License for more details.
15:
16: You should have received a copy of the GNU General Public License
17: along with GAS; see the file COPYING. If not, write to
18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19:
20: #include <stdio.h>
21: #include <stdarg.h>
22: #include <streams/streams.h>
23: #include "make.h"
24: #include <stdlib.h>
25: #include <string.h>
26: #include <mach/mach_init.h>
27: #include <servers/netname.h>
28: #include "as.h"
29: #include "input-scrub.h"
30: #include "messages.h"
31:
32: /*
33: ERRORS
34:
35: We print the error message 1st, beginning in column 1.
36: All ancillary info starts in column 2 on lines after the
37: key error text.
38: We try to print a location in logical and physical file
39: just after the main error text.
40: Caller then prints any appendices after that, begining all
41: lines with at least 1 space.
42:
43: Optionally, we may die.
44: There is no need for a trailing '\n' in your error text format
45: because we supply one.
46:
47: as_warn(fmt,args) Like fprintf(stderr,fmt,args) but also call errwhere().
48:
49: as_fatal(fmt,args) Like as_warn() but exit with a fatal status.
50:
51: */
52:
53:
54: /*
55: * Nonzero if we've hit a 'bad error', and should not write an obj file,
56: * and exit with a nonzero error code.
57: */
58: int bad_error = 0;
59:
60: /*
61: * If set to non-zero in main() -arch_multiple as been specified so if any
62: * error messages are printed print a single line first to start which errors
63: * the architectures are for.
64: */
65: int arch_multiple = 0;
66:
67: /*
68: * This is for the ProjectBuilder (formally MakeApp) interface.
69: */
70: static int talking_to_ProjectBuilder = 0;
71: static NXStream *ProjectBuilder_stream = NULL;
72: static port_t ProjectBuilder_port;
73:
74: /*
75: * check_for_ProjectBuilder() is called once before any error messages are
76: * generated and sets up what is needed to send error messages to project
77: * builder.
78: */
79: void
80: check_for_ProjectBuilder(void)
81: {
82: char *portName, *hostName;
83:
84: portName = getenv("MAKEPORT");
85: hostName = getenv("MAKEHOST");
86: if(portName == NULL)
87: return;
88: if(hostName == NULL)
89: hostName = "";
90: if(netname_look_up(name_server_port, hostName, portName,
91: &ProjectBuilder_port) != KERN_SUCCESS)
92: return;
93: if(ProjectBuilder_port == PORT_NULL)
94: return;
95: if((ProjectBuilder_stream = NXOpenMemory(NULL, 0, NX_WRITEONLY)) ==
96: NULL)
97: return;
98: talking_to_ProjectBuilder = 1;
99: }
100:
101: /*
102: * tell_ProjectBuilder() takes the message in the stream and sends it to project
103: * builder. It then resets the stream for the next message.
104: */
105: static
106: void
107: tell_ProjectBuilder(
108: int eventType) /* 0 error, 1 warning, -1 doing */
109: {
110: char *fileName, *directory, *message;
111: int line, len, maxlen;
112:
113: as_where_ProjectBuilder(&fileName, &directory, &line);
114: if(fileName == NULL)
115: fileName = "";
116: if(directory == NULL)
117: directory = "";
118: NXGetMemoryBuffer(ProjectBuilder_stream, &message, &len, &maxlen);
119: make_alert(ProjectBuilder_port,
120: eventType,
121: NULL, 0, /* functionName, not used by ProjectBuilder */
122: fileName, strlen(fileName)+1 > 1024 ? 1024 : strlen(fileName)+1,
123: directory, strlen(directory)+1 > 1024 ? 1024 : strlen(directory)+1,
124: line,
125: message, len+1 > 1024 ? 1024 : len+1);
126: NXSeek(ProjectBuilder_stream, 0, NX_FROMSTART);
127: }
128:
129: /*
130: * architecture_banner() returns the string to say what target we are assembling
131: * for.
132: */
133: static
134: const char *
135: architecture_banner(void)
136: {
137: #ifdef M68K
138: return("as: for architecture m68k\n");
139: #endif
140: #ifdef M88K
141: return("as: for architecture m88k\n");
142: #endif
143: #ifdef M98K
144: return("as: for architecture m98k\n");
145: #endif
146: #ifdef I860
147: return("as: for architecture i860\n");
148: #endif
149: #ifdef I386
150: return("as: for architecture i386\n");
151: #endif
152: #ifdef HPPA
153: return("as: for architecture hppa\n");
154: #endif
155: #ifdef SPARC
156: return("as: for architecture sparc\n");
157: #endif
158: }
159:
160: /*
161: * print_architecture_banner() prints what architecture we are assembling for
162: * if it has not previously been printed.
163: */
164: static
165: void
166: print_architecture_banner(void)
167: {
168: static int printed = 0;
169:
170: if(arch_multiple && !printed){
171: printf(architecture_banner());
172: if(talking_to_ProjectBuilder)
173: NXPrintf(ProjectBuilder_stream, architecture_banner());
174: printed = 1;
175: }
176: }
177:
178: /*
179: * a s _ w a r n ( )
180: *
181: * Send to stderr a string as a warning, and locate warning in input file(s).
182: * Please only use this for when we have some recovery action.
183: * Please explain in string (which may have '\n's) what recovery was done.
184: */
185: void
186: as_warn(
187: const char *format,
188: ...)
189: {
190: va_list ap;
191:
192: if(!flagseen['W']){
193: print_architecture_banner();
194: bad_error = 1;
195: as_where();
196: va_start(ap, format);
197: vfprintf(stderr, format, ap);
198: fprintf(stderr, "\n");
199: if(talking_to_ProjectBuilder){
200: NXVPrintf(ProjectBuilder_stream, format, ap);
201: NXPrintf(ProjectBuilder_stream, "\n");
202: tell_ProjectBuilder(1 /* warning */);
203: }
204: va_end(ap);
205: }
206: }
207:
208: /*
209: * a s _ b a d ( )
210: *
211: * Send to stderr a string as a warning, * and locate warning in input file(s).
212: * Please us when there is no recovery, but we want to continue processing
213: * but not produce an object file.
214: * Please explain in string (which may have '\n's) what recovery was done.
215: */
216: void
217: as_bad(
218: const char *format,
219: ...)
220: {
221: va_list ap;
222:
223: print_architecture_banner();
224: bad_error = 1;
225: as_where();
226: va_start(ap, format);
227: vfprintf(stderr, format, ap);
228: fprintf(stderr, "\n");
229: if(talking_to_ProjectBuilder){
230: NXVPrintf(ProjectBuilder_stream, format, ap);
231: NXPrintf(ProjectBuilder_stream, "\n");
232: tell_ProjectBuilder(0 /* error */);
233: }
234: va_end(ap);
235: }
236:
237: /*
238: * a s _ f a t a l ( )
239: *
240: * Send to stderr a string (with bell) (JF: Bell is obnoxious!) as a fatal
241: * message, and locate stdsource in input file(s).
242: * Please only use this for when we DON'T have some recovery action.
243: * It exit()s with a warning status.
244: */
245: void
246: as_fatal(
247: const char *format,
248: ...)
249: {
250: va_list ap;
251:
252: print_architecture_banner();
253: bad_error = 1;
254: as_where();
255: va_start(ap, format);
256: fprintf (stderr, "FATAL:");
257: vfprintf(stderr, format, ap);
258: fprintf(stderr, "\n");
259: if(talking_to_ProjectBuilder){
260: NXPrintf(ProjectBuilder_stream, "FATAL:");
261: NXVPrintf(ProjectBuilder_stream, format, ap);
262: NXPrintf(ProjectBuilder_stream, "\n");
263: tell_ProjectBuilder(0 /* error */);
264: }
265: va_end(ap);
266: exit(1);
267: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.