|
|
1.1 root 1: static char *sccsid = "@(#)errorsubr.c 1.5 (Berkeley) 7/1/83";
2: #include <stdio.h>
3: #include <ctype.h>
4: #include "error.h"
5: /*
6: * Arrayify a list of rules
7: */
8: arrayify(e_length, e_array, header)
9: int *e_length;
10: Eptr **e_array;
11: Eptr header;
12: {
13: reg Eptr errorp;
14: reg Eptr *array;
15: reg int listlength;
16: reg int listindex;
17:
18: for (errorp = header, listlength = 0;
19: errorp; errorp = errorp->error_next, listlength++)
20: continue;
21: array = (Eptr*)Calloc(listlength+1, sizeof (Eptr));
22: for(listindex = 0, errorp = header;
23: listindex < listlength;
24: listindex++, errorp = errorp->error_next){
25: array[listindex] = errorp;
26: errorp->error_position = listindex;
27: }
28: array[listindex] = (Eptr)0;
29: *e_length = listlength;
30: *e_array = array;
31: }
32:
33: /*VARARGS1*/
34: error(msg, a1, a2, a3)
35: char *msg;
36: {
37: fprintf(stderr, "Error: ");
38: fprintf(stderr, msg, a1, a2, a3);
39: fprintf(stderr, "\n");
40: fflush(stdout);
41: fflush(stderr);
42: exit(6);
43: }
44: /*ARGSUSED*/
45: char *Calloc(nelements, size)
46: int nelements;
47: int size;
48: {
49: char *back;
50: if ( (back = (char *)calloc(nelements, size)) == (char *)NULL){
51: error("Ran out of memory.\n");
52: exit(1);
53: }
54: return(back);
55: }
56:
57: char *strsave(instring)
58: char *instring;
59: {
60: char *outstring;
61: (void)strcpy(outstring = (char *)Calloc(1, strlen(instring) + 1),
62: instring);
63: return(outstring);
64: }
65: /*
66: * find the position of a given character in a string
67: * (one based)
68: */
69: int position(string, ch)
70: reg char *string;
71: reg char ch;
72: {
73: reg int i;
74: if (string)
75: for (i=1; *string; string++, i++){
76: if (*string == ch)
77: return(i);
78: }
79: return(-1);
80: }
81: /*
82: * clobber the first occurance of ch in string by the new character
83: */
84: char *substitute(string, chold, chnew)
85: char *string;
86: char chold, chnew;
87: {
88: reg char *cp = string;
89:
90: if (cp)
91: while (*cp){
92: if (*cp == chold){
93: *cp = chnew;
94: break;
95: }
96: cp++;
97: }
98: return(string);
99: }
100:
101: char lastchar(string)
102: char *string;
103: {
104: int length;
105: if (string == 0) return('\0');
106: length = strlen(string);
107: if (length >= 1)
108: return(string[length-1]);
109: else
110: return('\0');
111: }
112:
113: char firstchar(string)
114: char *string;
115: {
116: if (string)
117: return(string[0]);
118: else
119: return('\0');
120: }
121:
122: char next_lastchar(string)
123: char *string;
124: {
125: int length;
126: if (string == 0) return('\0');
127: length = strlen(string);
128: if (length >= 2)
129: return(string[length - 2]);
130: else
131: return('\0');
132: }
133:
134: clob_last(string, newstuff)
135: char *string, newstuff;
136: {
137: int length = 0;
138: if (string)
139: length = strlen(string);
140: if (length >= 1)
141: string[length - 1] = newstuff;
142: }
143:
144: /*
145: * parse a string that is the result of a format %s(%d)
146: * return TRUE if this is of the proper format
147: */
148: boolean persperdexplode(string, r_perd, r_pers)
149: char *string;
150: char **r_perd, **r_pers;
151: {
152: reg char *cp;
153: int length = 0;
154:
155: if (string)
156: length = strlen(string);
157: if ( (length >= 4)
158: && (string[length - 1] == ')' ) ){
159: for (cp = &string[length - 2];
160: (isdigit(*cp)) && (*cp != '(');
161: --cp)
162: continue;
163: if (*cp == '('){
164: string[length - 1] = '\0'; /* clobber the ) */
165: *r_perd = strsave(cp+1);
166: string[length - 1] = ')';
167: *cp = '\0'; /* clobber the ( */
168: *r_pers = strsave(string);
169: *cp = '(';
170: return(TRUE);
171: }
172: }
173: return(FALSE);
174: }
175: /*
176: * parse a quoted string that is the result of a format \"%s\"(%d)
177: * return TRUE if this is of the proper format
178: */
179: boolean qpersperdexplode(string, r_perd, r_pers)
180: char *string;
181: char **r_perd, **r_pers;
182: {
183: reg char *cp;
184: int length = 0;
185:
186: if (string)
187: length = strlen(string);
188: if ( (length >= 4)
189: && (string[length - 1] == ')' ) ){
190: for (cp = &string[length - 2];
191: (isdigit(*cp)) && (*cp != '(');
192: --cp)
193: continue;
194: if (*cp == '(' && *(cp - 1) == '"'){
195: string[length - 1] = '\0';
196: *r_perd = strsave(cp+1);
197: string[length - 1] = ')';
198: *(cp - 1) = '\0'; /* clobber the " */
199: *r_pers = strsave(string + 1);
200: *(cp - 1) = '"';
201: return(TRUE);
202: }
203: }
204: return(FALSE);
205: }
206:
207: static char cincomment[] = CINCOMMENT;
208: static char coutcomment[] = COUTCOMMENT;
209: static char fincomment[] = FINCOMMENT;
210: static char foutcomment[] = FOUTCOMMENT;
211: static char newline[] = NEWLINE;
212: static char piincomment[] = PIINCOMMENT;
213: static char pioutcomment[] = PIOUTCOMMENT;
214: static char lispincomment[] = LISPINCOMMENT;
215: static char riincomment[] = RIINCOMMENT;
216: static char rioutcomment[] = RIOUTCOMMENT;
217: static char troffincomment[] = TROFFINCOMMENT;
218: static char troffoutcomment[] = TROFFOUTCOMMENT;
219:
220: struct lang_desc lang_table[] = {
221: /*INUNKNOWN 0*/ "unknown", cincomment, coutcomment,
222: /*INCPP 1*/ "cpp", cincomment, coutcomment,
223: /*INCC 2*/ "cc", cincomment, coutcomment,
224: /*INAS 3*/ "as", ASINCOMMENT, newline,
225: /*INLD 4*/ "ld", cincomment, coutcomment,
226: /*INLINT 5*/ "lint", cincomment, coutcomment,
227: /*INF77 6*/ "f77", fincomment, foutcomment,
228: /*INPI 7*/ "pi", piincomment, pioutcomment,
229: /*INPC 8*/ "pc", piincomment, pioutcomment,
230: /*INFRANZ 9*/ "franz",lispincomment, newline,
231: /*INLISP 10*/ "lisp", lispincomment, newline,
232: /*INVAXIMA 11*/ "vaxima",lispincomment,newline,
233: /*INRATFOR 12*/ "ratfor",fincomment, foutcomment,
234: /*INLEX 13*/ "lex", cincomment, coutcomment,
235: /*INYACC 14*/ "yacc", cincomment, coutcomment,
236: /*INAPL 15*/ "apl", ".lm", newline,
237: /*INMAKE 16*/ "make", ASINCOMMENT, newline,
238: /*INRI 17*/ "ri", riincomment, rioutcomment,
239: /*INTROFF 18*/ "troff",troffincomment,troffoutcomment,
240: 0, 0, 0
241: };
242:
243: printerrors(look_at_subclass, errorc, errorv)
244: boolean look_at_subclass;
245: int errorc;
246: Eptr errorv[];
247: {
248: reg int i;
249: reg Eptr errorp;
250:
251: for (errorp = errorv[i = 0]; i < errorc; errorp = errorv[++i]){
252: if (errorp->error_e_class == C_IGNORE)
253: continue;
254: if (look_at_subclass && errorp->error_s_class == C_DUPL)
255: continue;
256: printf("Error %d, (%s error) [%s], text = \"",
257: i,
258: class_table[errorp->error_e_class],
259: lang_table[errorp->error_language].lang_name);
260: wordvprint(stdout,errorp->error_lgtext,errorp->error_text);
261: printf("\"\n");
262: }
263: }
264:
265: wordvprint(fyle, wordc, wordv)
266: FILE *fyle;
267: int wordc;
268: char *wordv[];
269: {
270: int i;
271: char *sep = "";
272:
273: for(i = 0; i < wordc; i++)
274: if (wordv[i]) {
275: fprintf(fyle, "%s%s",sep,wordv[i]);
276: sep = " ";
277: }
278: }
279:
280: /*
281: * Given a string, parse it into a number of words, and build
282: * a wordc wordv combination pointing into it.
283: */
284: wordvbuild(string, r_wordc, r_wordv)
285: char *string;
286: int *r_wordc;
287: char ***r_wordv;
288: {
289: reg char *cp;
290: char *saltedbuffer;
291: char **wordv;
292: int wordcount;
293: int wordindex;
294:
295: saltedbuffer = strsave(string);
296: for (wordcount = 0, cp = saltedbuffer; *cp; wordcount++){
297: while (*cp && isspace(*cp))
298: cp++;
299: if (*cp == 0)
300: break;
301: while (!isspace(*cp))
302: cp++;
303: }
304: wordv = (char **)Calloc(wordcount + 1, sizeof (char *));
305: for (cp=saltedbuffer,wordindex=0; wordcount; wordindex++,--wordcount){
306: while (*cp && isspace(*cp))
307: cp++;
308: if (*cp == 0)
309: break;
310: wordv[wordindex] = cp;
311: while(!isspace(*cp))
312: cp++;
313: *cp++ = '\0';
314: }
315: if (wordcount != 0)
316: error("Initial miscount of the number of words in a line\n");
317: wordv[wordindex] = (char *)0;
318: #ifdef FULLDEBUG
319: for (wordcount = 0; wordcount < wordindex; wordcount++)
320: printf("Word %d = \"%s\"\n", wordcount, wordv[wordcount]);
321: printf("\n");
322: #endif
323: *r_wordc = wordindex;
324: *r_wordv = wordv;
325: }
326: /*
327: * Compare two 0 based wordvectors
328: */
329: int wordvcmp(wordv1, wordc, wordv2)
330: char **wordv1;
331: int wordc;
332: char **wordv2;
333: {
334: reg int i;
335: int back;
336: for (i = 0; i < wordc; i++){
337: if (wordv1[i] == 0 || wordv2[i] == 0)
338: return(-1);
339: if (back = strcmp(wordv1[i], wordv2[i])){
340: return(back);
341: }
342: }
343: return(0); /* they are equal */
344: }
345:
346: /*
347: * splice a 0 basedword vector onto the tail of a
348: * new wordv, allowing the first emptyhead slots to be empty
349: */
350: char **wordvsplice(emptyhead, wordc, wordv)
351: int emptyhead;
352: int wordc;
353: char **wordv;
354: {
355: reg char **nwordv;
356: int nwordc = emptyhead + wordc;
357: reg int i;
358:
359: nwordv = (char **)Calloc(nwordc, sizeof (char *));
360: for (i = 0; i < emptyhead; i++)
361: nwordv[i] = 0;
362: for(i = emptyhead; i < nwordc; i++){
363: nwordv[i] = wordv[i-emptyhead];
364: }
365: return(nwordv);
366: }
367: /*
368: * plural'ize and verb forms
369: */
370: static char *S = "s";
371: static char *N = "";
372: char *plural(n)
373: int n;
374: {
375: return( n > 1 ? S : N);
376: }
377: char *verbform(n)
378: int n;
379: {
380: return( n > 1 ? N : S);
381: }
382:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.