|
|
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 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: /* Whether or not we should try to be quiet for errors and warnings; this is ! 34: used to avoid being too talkative about problems with tentative choices ! 35: when we're computing the conversion costs for a method call. */ ! 36: int cp_silent = 0; ! 37: ! 38: typedef void errorfn (); /* deliberately vague */ ! 39: ! 40: extern char* cp_file_of PROTO((tree)); ! 41: extern int cp_line_of PROTO((tree)); ! 42: ! 43: #define STRDUP(f) (ap = (char *) alloca (strlen (f) +1), strcpy (ap, (f)), ap) ! 44: ! 45: #define NARGS 3 ! 46: #define arglist a1, a2, a3 ! 47: #define arglist_dcl HOST_WIDE_INT a1, a2, a3; ! 48: #define ARGSINIT args[0] = a1; args[1] = a2; args[2] = a3; ! 49: #define ARGSLIST args[0], args[1], args[2] ! 50: ! 51: static void ! 52: cp_thing (errfn, atarg1, format, arglist) ! 53: errorfn *errfn; ! 54: int atarg1; ! 55: char *format; ! 56: arglist_dcl ! 57: { ! 58: char *fmt; ! 59: char *f; ! 60: char *ap; ! 61: int arg; ! 62: HOST_WIDE_INT atarg = atarg1 ? a1 : 0; ! 63: HOST_WIDE_INT args[NARGS]; ! 64: ARGSINIT ! 65: ! 66: fmt = STRDUP(format); ! 67: ! 68: for (f = fmt, arg = 0; *f; ++f) ! 69: { ! 70: cp_printer * function; ! 71: int alternate; ! 72: int maybe_here; ! 73: ! 74: /* ignore text */ ! 75: if (*f != '%') continue; ! 76: ! 77: ++f; ! 78: ! 79: alternate = 0; ! 80: maybe_here = 0; ! 81: ! 82: /* ignore most flags */ ! 83: while (*f == ' ' || *f == '-' || *f == '+' || *f == '#') ! 84: { ! 85: if (*f == '+') ! 86: maybe_here = 1; ! 87: else if (*f == '#') ! 88: alternate = 1; ! 89: ++f; ! 90: } ! 91: ! 92: /* ignore field width */ ! 93: if (*f == '*') ! 94: { ! 95: ++f; ! 96: ++arg; ! 97: } ! 98: else ! 99: while (isdigit (*f)) ! 100: ++f; ! 101: ! 102: /* ignore precision */ ! 103: if (*f == '.') ! 104: { ! 105: ++f; ! 106: if (*f == '*') ! 107: { ! 108: ++f; ! 109: ++arg; ! 110: } ! 111: else ! 112: while (isdigit (*f)) ! 113: ++f; ! 114: } ! 115: ! 116: /* ignore "long" */ ! 117: if (*f == 'l') ! 118: ++f; ! 119: ! 120: function = cp_printers[(int)*f]; ! 121: ! 122: if (function) ! 123: { ! 124: char *p; ! 125: ! 126: if (arg >= NARGS) abort (); ! 127: ! 128: if (maybe_here && atarg1) ! 129: atarg = args[arg]; ! 130: ! 131: /* Must use a temporary to avoid calling *function twice */ ! 132: p = (*function) (args[arg], alternate); ! 133: args[arg] = (HOST_WIDE_INT) STRDUP(p); ! 134: *f = 's'; ! 135: } ! 136: ! 137: ++arg; /* Assume valid format string */ ! 138: ! 139: } ! 140: ! 141: if (atarg) ! 142: { ! 143: char *file = cp_file_of ((tree) atarg); ! 144: int line = cp_line_of ((tree) atarg); ! 145: (*errfn) (file, line, fmt, ARGSLIST); ! 146: } ! 147: else ! 148: (*errfn) (fmt, ARGSLIST); ! 149: ! 150: } ! 151: ! 152: void ! 153: cp_error (format, arglist) ! 154: char *format; ! 155: arglist_dcl ! 156: { ! 157: extern errorfn error; ! 158: if (! cp_silent) ! 159: cp_thing (error, 0, format, arglist); ! 160: } ! 161: ! 162: void ! 163: cp_warning (format, arglist) ! 164: char *format; ! 165: arglist_dcl ! 166: { ! 167: extern errorfn warning; ! 168: if (! cp_silent) ! 169: cp_thing (warning, 0, format, arglist); ! 170: } ! 171: ! 172: void ! 173: cp_pedwarn (format, arglist) ! 174: char *format; ! 175: arglist_dcl ! 176: { ! 177: extern errorfn pedwarn; ! 178: if (! cp_silent) ! 179: cp_thing (pedwarn, 0, format, arglist); ! 180: } ! 181: ! 182: void ! 183: cp_compiler_error (format, arglist) ! 184: char *format; ! 185: arglist_dcl ! 186: { ! 187: extern errorfn compiler_error; ! 188: if (! cp_silent) ! 189: cp_thing (compiler_error, 0, format, arglist); ! 190: } ! 191: ! 192: void ! 193: cp_sprintf (format, arglist) ! 194: char *format; ! 195: arglist_dcl ! 196: { ! 197: extern errorfn sprintf; ! 198: cp_thing (sprintf, 0, format, arglist); ! 199: } ! 200: ! 201: void ! 202: cp_error_at (format, arglist) ! 203: char *format; ! 204: arglist_dcl ! 205: { ! 206: extern errorfn error_with_file_and_line; ! 207: if (! cp_silent) ! 208: cp_thing (error_with_file_and_line, 1, format, arglist); ! 209: } ! 210: ! 211: void ! 212: cp_warning_at (format, arglist) ! 213: char *format; ! 214: arglist_dcl ! 215: { ! 216: extern errorfn warning_with_file_and_line; ! 217: if (! cp_silent) ! 218: cp_thing (warning_with_file_and_line, 1, format, arglist); ! 219: } ! 220: ! 221: void ! 222: cp_pedwarn_at (format, arglist) ! 223: char *format; ! 224: arglist_dcl ! 225: { ! 226: extern errorfn pedwarn_with_file_and_line; ! 227: if (! cp_silent) ! 228: cp_thing (pedwarn_with_file_and_line, 1, format, arglist); ! 229: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.