|
|
1.1 ! root 1: /* Provide a call-back mechanism for handling error output. ! 2: Copyright (C) 1993 Free Software Foundation, Inc. ! 3: Contributed by Jason Merrill ([email protected]) ! 4: ! 5: This file is part of GNU CC. ! 6: ! 7: GNU CC is free software; you can redistribute it and/or modify ! 8: it under the terms of the GNU General Public License as published by ! 9: the Free Software Foundation; either version 2, or (at your option) ! 10: any later version. ! 11: ! 12: GNU CC is distributed in the hope that it will be useful, ! 13: but WITHOUT ANY WARRANTY; without even the implied warranty of ! 14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 15: GNU General Public License for more details. ! 16: ! 17: You should have received a copy of the GNU General Public License ! 18: along with GNU CC; see the file COPYING. If not, write to ! 19: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ! 20: ! 21: #include "config.h" ! 22: #include "tree.h" ! 23: #include <ctype.h> ! 24: ! 25: /* cp_printer is the type of a function which converts an argument into ! 26: a string for digestion by printf. The cp_printer function should deal ! 27: with all memory management; the functions in this file will not free ! 28: the char*s returned. See cp-error.c for an example use of this code. */ ! 29: ! 30: typedef char* cp_printer PROTO((HOST_WIDE_INT, int)); ! 31: extern cp_printer * cp_printers[256]; ! 32: ! 33: typedef void errorfn (); /* deliberately vague */ ! 34: ! 35: extern char* cp_file_of PROTO((tree)); ! 36: extern int cp_line_of PROTO((tree)); ! 37: ! 38: #define STRDUP(f) (ap = (char *) alloca (strlen (f) +1), strcpy (ap, (f)), ap) ! 39: ! 40: #define NARGS 3 ! 41: #define arglist a1, a2, a3 ! 42: #define arglist_dcl HOST_WIDE_INT a1, a2, a3; ! 43: #define ARGSINIT args[0] = a1; args[1] = a2; args[2] = a3; ! 44: #define ARGSLIST args[0], args[1], args[2] ! 45: ! 46: static void ! 47: cp_thing (errfn, atarg1, format, arglist) ! 48: errorfn *errfn; ! 49: int atarg1; ! 50: char *format; ! 51: arglist_dcl ! 52: { ! 53: char *fmt; ! 54: char *f; ! 55: char *ap; ! 56: int arg; ! 57: HOST_WIDE_INT atarg = atarg1 ? a1 : 0; ! 58: HOST_WIDE_INT args[NARGS]; ! 59: ARGSINIT ! 60: ! 61: fmt = STRDUP(format); ! 62: ! 63: for (f = fmt, arg = 0; *f; ++f) ! 64: { ! 65: cp_printer * function; ! 66: int alternate; ! 67: int maybe_here; ! 68: ! 69: /* ignore text */ ! 70: if (*f != '%') continue; ! 71: ! 72: ++f; ! 73: ! 74: alternate = 0; ! 75: maybe_here = 0; ! 76: ! 77: /* ignore most flags */ ! 78: while (*f == ' ' || *f == '-' || *f == '+' || *f == '#') ! 79: { ! 80: if (*f == '+') ! 81: maybe_here = 1; ! 82: else if (*f == '#') ! 83: alternate = 1; ! 84: ++f; ! 85: } ! 86: ! 87: /* ignore field width */ ! 88: if (*f == '*') ! 89: { ! 90: ++f; ! 91: ++arg; ! 92: } ! 93: else ! 94: while (isdigit (*f)) ! 95: ++f; ! 96: ! 97: /* ignore precision */ ! 98: if (*f == '.') ! 99: { ! 100: ++f; ! 101: if (*f == '*') ! 102: { ! 103: ++f; ! 104: ++arg; ! 105: } ! 106: else ! 107: while (isdigit (*f)) ! 108: ++f; ! 109: } ! 110: ! 111: /* ignore "long" */ ! 112: if (*f == 'l') ! 113: ++f; ! 114: ! 115: function = cp_printers[*f]; ! 116: ! 117: if (function) ! 118: { ! 119: char *p; ! 120: ! 121: if (arg >= NARGS) abort (); ! 122: ! 123: if (maybe_here && atarg) ! 124: atarg = args[arg]; ! 125: ! 126: /* Must use a temporary to avoid calling *function twice */ ! 127: p = (*function) (args[arg], alternate); ! 128: args[arg] = (HOST_WIDE_INT) STRDUP(p); ! 129: *f = 's'; ! 130: } ! 131: ! 132: ++f; ! 133: ++arg; /* Assume valid format string */ ! 134: ! 135: } ! 136: ! 137: if (atarg) ! 138: { ! 139: char *file = cp_file_of ((tree) atarg); ! 140: int line = cp_line_of ((tree) atarg); ! 141: (*errfn) (file, line, fmt, ARGSLIST); ! 142: } ! 143: else ! 144: (*errfn) (fmt, ARGSLIST); ! 145: ! 146: } ! 147: ! 148: void ! 149: cp_error (format, arglist) ! 150: char *format; ! 151: arglist_dcl ! 152: { ! 153: extern errorfn error; ! 154: cp_thing (error, 0, format, arglist); ! 155: } ! 156: ! 157: void ! 158: cp_warning (format, arglist) ! 159: char *format; ! 160: arglist_dcl ! 161: { ! 162: extern errorfn warning; ! 163: cp_thing (warning, 0, format, arglist); ! 164: } ! 165: ! 166: void ! 167: cp_pedwarn (format, arglist) ! 168: char *format; ! 169: arglist_dcl ! 170: { ! 171: extern errorfn pedwarn; ! 172: cp_thing (pedwarn, 0, format, arglist); ! 173: } ! 174: ! 175: void ! 176: cp_compiler_error (format, arglist) ! 177: char *format; ! 178: arglist_dcl ! 179: { ! 180: extern errorfn compiler_error; ! 181: cp_thing (compiler_error, 0, format, arglist); ! 182: } ! 183: ! 184: void ! 185: cp_sprintf (format, arglist) ! 186: char *format; ! 187: arglist_dcl ! 188: { ! 189: extern errorfn sprintf; ! 190: cp_thing (sprintf, 0, format, arglist); ! 191: } ! 192: ! 193: void ! 194: cp_error_at (format, arglist) ! 195: char *format; ! 196: arglist_dcl ! 197: { ! 198: extern errorfn error_with_file_and_line; ! 199: cp_thing (error_with_file_and_line, 1, format, arglist); ! 200: } ! 201: ! 202: void ! 203: cp_warning_at (format, arglist) ! 204: char *format; ! 205: arglist_dcl ! 206: { ! 207: extern errorfn warning_with_file_and_line; ! 208: cp_thing (warning_with_file_and_line, 1, format, arglist); ! 209: } ! 210: ! 211: void ! 212: cp_pedwarn_at (format, arglist) ! 213: char *format; ! 214: arglist_dcl ! 215: { ! 216: extern errorfn pedwarn_with_file_and_line; ! 217: cp_thing (pedwarn_with_file_and_line, 1, format, arglist); ! 218: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.