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