coan 4.2.4
|
00001 #ifndef REPORT_H 00002 #define REPORT_H 00003 00004 /*************************************************************************** 00005 * Copyright (C) 2004, 2006 Symbian Software Ltd. * 00006 * All rights reserved. * 00007 * Copyright (C) 2007-2011 Mike Kinghan, imk@strudl.org * 00008 * All rights reserved. * 00009 * * 00010 * Contributed originally by Mike Kinghan, imk@strudl.org * 00011 * * 00012 * Redistribution and use in source and binary forms, with or without * 00013 * modification, are permitted provided that the following conditions * 00014 * are met: * 00015 * * 00016 * Redistributions of source code must retain the above copyright * 00017 * notice, this list of conditions and the following disclaimer. * 00018 * * 00019 * Redistributions in binary form must reproduce the above copyright * 00020 * notice, this list of conditions and the following disclaimer in the * 00021 * documentation and/or other materials provided with the distribution. * 00022 * * 00023 * Neither the name of Symbian Software Ltd. nor the names of its * 00024 * contributors may be used to endorse or promote products derived from * 00025 * this software without specific prior written permission. * 00026 * * 00027 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * 00028 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * 00029 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * 00030 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * 00031 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * 00032 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * 00033 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * 00034 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * 00035 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,* 00036 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF * 00037 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * 00038 * DAMAGE. * 00039 * * 00040 **************************************************************************/ 00041 00042 #include "state_utils.h" 00043 #include "hash_include.h" 00044 #include "directives_tally.h" 00045 #include "memory.h" 00046 #include <stdarg.h> 00047 00055 00066 typedef enum { 00069 MSGCLASS_SHIFT = 11, 00071 ISSUE_MASK = (1 << MSGCLASS_SHIFT) - 1, 00073 MSGCLASS_NONE = 0 << MSGCLASS_SHIFT, 00075 MSGCLASS_PROGRESS = 1 << MSGCLASS_SHIFT, 00077 MSGCLASS_INFO = 2 << MSGCLASS_SHIFT, 00079 MSGCLASS_WARNING = 4 << MSGCLASS_SHIFT, 00081 MSGCLASS_ERROR = 8 << MSGCLASS_SHIFT, 00083 MSGCLASS_ABEND = 16 << MSGCLASS_SHIFT, 00085 MSGCLASS_SUMMARY = 32 << MSGCLASS_SHIFT, 00086 00088 MSGCLASS_MASK = 255 << MSGCLASS_SHIFT, 00091 MSGSEVERITY_MASK = MSGCLASS_MASK & ~MSGCLASS_SUMMARY, 00095 MSGEVENT_MASK = MSGSEVERITY_MASK & ~MSGCLASS_PROGRESS, 00096 00098 EVENT_SUMMARY_MIN = 1, 00100 EVENT_SUMMARY_DROPPED_LINES = 1 | MSGCLASS_INFO | MSGCLASS_SUMMARY, 00102 EVENT_SUMMARY_CHANGED_LINES = 2 | MSGCLASS_INFO | MSGCLASS_SUMMARY, 00104 EVENT_SUMMARY_ERRORED_LINES = 4 | MSGCLASS_WARNING | MSGCLASS_SUMMARY, 00106 EVENT_SUMMARY_ERROR_OUTPUT = 8 | MSGCLASS_WARNING | MSGCLASS_SUMMARY, 00108 EVENT_SUMMARY_MAX = 16, 00110 EVENT_SUMMARY_MASK = EVENT_SUMMARY_MAX - 1, 00112 PROGRESS_SHIFT = 4, 00114 PROGRESS_PROCESSING_FILE = (45 << PROGRESS_SHIFT) | MSGCLASS_PROGRESS, 00116 PROGRESS_ENTERING_DIR = (46 << PROGRESS_SHIFT) | MSGCLASS_PROGRESS, 00118 PROGRESS_LEAVING_DIR = (47 << PROGRESS_SHIFT) | MSGCLASS_PROGRESS, 00120 PROGRESS_BUILDING_TREE = (49 << PROGRESS_SHIFT) | MSGCLASS_PROGRESS, 00122 PROGRESS_SEARCHING_DIR = (50 << PROGRESS_SHIFT) | MSGCLASS_PROGRESS, 00124 PROGRESS_ADDED_FILE = (51 << PROGRESS_SHIFT) | MSGCLASS_PROGRESS, 00126 PROGRESS_ADDED_DIR = (52 << PROGRESS_SHIFT) | MSGCLASS_PROGRESS, 00128 PROGRESS_FILE_TALLY = (53 << PROGRESS_SHIFT) | MSGCLASS_PROGRESS, 00130 PROGRESS_GOT_OPTIONS = (54 << PROGRESS_SHIFT) | MSGCLASS_PROGRESS, 00131 00132 00134 PROGRESS_SUMMARY_SHIFT = 4, 00136 PROGRESS_SUMMARY_FILES_REACHED = 00137 (55 << PROGRESS_SUMMARY_SHIFT) | MSGCLASS_INFO | MSGCLASS_SUMMARY, 00139 PROGRESS_SUMMARY_FILES_DROPPED = 00140 (56 << PROGRESS_SUMMARY_SHIFT) | MSGCLASS_INFO | MSGCLASS_SUMMARY, 00141 PROGRESS_SUMMARY_ALL_DONE = 00142 (57 << PROGRESS_SUMMARY_SHIFT) | MSGCLASS_PROGRESS | MSGCLASS_SUMMARY, 00143 00145 GRIPE_SHIFT = 4, 00149 GRIPE_DUPLICATE_MASK = (27 << GRIPE_SHIFT) | MSGCLASS_INFO, 00152 GRIPE_SYMLINK = (48 << GRIPE_SHIFT) | MSGCLASS_INFO, 00154 GRIPE_STRAIGHTENED_LINE = (12 << GRIPE_SHIFT) | MSGCLASS_INFO, 00157 GRIPE_REDUNDANT_OPTION = (49 << GRIPE_SHIFT) | MSGCLASS_WARNING, 00161 GRIPE_DUPLICATE_ARGS = (1 << GRIPE_SHIFT) | MSGCLASS_WARNING, 00166 GRIPE_DELETED_CONTRADICTION = (2 << GRIPE_SHIFT) | MSGCLASS_WARNING, 00171 GRIPE_COMMENTED_CONTRADICTION = (3 << GRIPE_SHIFT) | MSGCLASS_WARNING, 00176 GRIPE_ERRORED_CONTRADICTION = (4 << GRIPE_SHIFT) | MSGCLASS_WARNING, 00179 GRIPE_DIFFERING_REDEF = (76 << GRIPE_SHIFT) | MSGCLASS_WARNING, 00180 00184 GRIPE_UNDEFING_DEFINED = (77 << GRIPE_SHIFT) | MSGCLASS_WARNING, 00185 00189 GRIPE_UNCONDITIONAL_ERROR_INPUT = (5 << GRIPE_SHIFT) | MSGCLASS_WARNING, 00193 GRIPE_UNCONDITIONAL_ERROR_OUTPUT = (6 << GRIPE_SHIFT) | MSGCLASS_WARNING, 00196 GRIPE_GARBAGE_AFTER_DIRECTIVE = (7 << GRIPE_SHIFT) | MSGCLASS_WARNING, 00198 GRIPE_MISSING_EOF_NEWLINE = (18 << GRIPE_SHIFT) | MSGCLASS_WARNING, 00201 GRIPE_CIRCULAR_SYM_DEF = (28 << GRIPE_SHIFT) | MSGCLASS_WARNING, 00203 GRIPE_VERBOSE_ONLY = (29 << GRIPE_SHIFT) | MSGCLASS_WARNING, 00205 GRIPE_ZERO_DIVIDE = (38 << GRIPE_SHIFT) | MSGCLASS_WARNING, 00208 GRIPE_DIR_IGNORED = (41 << GRIPE_SHIFT) | MSGCLASS_WARNING, 00209 00212 GRIPE_EMPTY_SYMBOL = (58 << GRIPE_SHIFT) | MSGCLASS_WARNING, 00214 GRIPE_UNKNOWN_DIRECTIVE = (60 << GRIPE_SHIFT) | MSGCLASS_WARNING, 00216 GRIPE_INVALID_INCLUDE = (61 << GRIPE_SHIFT) | MSGCLASS_WARNING, 00218 GRIPE_STRAY_ESCAPE = (62 << GRIPE_SHIFT) | MSGCLASS_WARNING, 00220 GRIPE_FUNCTION_LIKE_MACRO_EXPANSION = (63 << GRIPE_SHIFT) | MSGCLASS_WARNING, 00222 GRIPE_INT_OVERFLOW = (64 << GRIPE_SHIFT | MSGCLASS_WARNING), 00224 GRIPE_UNCLOSED_QUOTE = (65 << GRIPE_SHIFT) | MSGCLASS_WARNING, 00226 GRIPE_NEGATIVE_SHIFT = (66 << GRIPE_SHIFT) | MSGCLASS_WARNING, 00228 GRIPE_FORCED_UNSIGNED = (67 << GRIPE_SHIFT) | MSGCLASS_WARNING, 00230 GRIPE_SIGN_CHANGED = (68 << GRIPE_SHIFT) | MSGCLASS_WARNING, 00232 GRIPE_SHIFT_OVERFLOW = (69 << GRIPE_SHIFT) | MSGCLASS_WARNING, 00234 GRIPE_CHAR_CONSTANT_TOO_LONG = (70 << GRIPE_SHIFT) | MSGCLASS_WARNING, 00236 GRIPE_MULITBYTE_CHAR_CONSTANT = (71 << GRIPE_SHIFT) | MSGCLASS_WARNING, 00239 GRIPE_TRANSIENT_SYMBOL_ADDED = (73 << GRIPE_SHIFT) | MSGCLASS_WARNING, 00241 GRIPE_INSOURCE_FUNCTION_LIKE_MACRO_DEFINITION = (74 << GRIPE_SHIFT) | MSGCLASS_WARNING, 00243 GRIPE_NO_SYMS = (75 << GRIPE_SHIFT) | MSGCLASS_WARNING, 00245 GRIPE_BROKEN_SYMLINK = (79 << GRIPE_SHIFT) | MSGCLASS_WARNING, 00246 /* MAX REASON = 80. When you add a new gripe, you must give it 00247 it the MAX REASON gripe number, increment MAX REASON in this 00248 comment and move this comment adjacent to your new gripe */ 00249 GRIPE_ORPHAN_ELIF = (8 << GRIPE_SHIFT) | MSGCLASS_ERROR, 00251 GRIPE_ORPHAN_ELSE = (9 << GRIPE_SHIFT) | MSGCLASS_ERROR, 00253 GRIPE_ORPHAN_ENDIF = (10 << GRIPE_SHIFT) | MSGCLASS_ERROR, 00255 GRIPE_EOF_TOO_SOON = (11 << GRIPE_SHIFT) | MSGCLASS_ERROR, 00257 GRIPE_EOF_IN_COMMENT = (13 << GRIPE_SHIFT) | MSGCLASS_ERROR, 00259 GRIPE_EOF_IN_QUOTE = (14 << GRIPE_SHIFT) | MSGCLASS_ERROR, 00261 GRIPE_NOTHING_TO_DO = (15 << GRIPE_SHIFT) | MSGCLASS_ERROR, 00265 GRIPE_ONE_FILE_ONLY = (16 << GRIPE_SHIFT) | MSGCLASS_ERROR, 00267 GRIPE_NEWLINE_IN_QUOTE = (17 << GRIPE_SHIFT) | MSGCLASS_ERROR, 00269 GRIPE_INVALID_ARGS = (19 << GRIPE_SHIFT) | MSGCLASS_ERROR, 00271 GRIPE_USAGE_ERROR = (20 << GRIPE_SHIFT) | MSGCLASS_ERROR, 00273 GRIPE_TOO_DEEP = (21 << GRIPE_SHIFT) | MSGCLASS_ERROR, 00275 GRIPE_MULTIPLE_ARGFILES = (31 << GRIPE_SHIFT) | MSGCLASS_ERROR, 00279 GRIPE_GARBAGE_ARG = (32 << GRIPE_SHIFT) | MSGCLASS_ERROR, 00281 GRIPE_NOT_IDENTIFIER = (33 << GRIPE_SHIFT) | MSGCLASS_ERROR, 00283 GRIPE_UNBALANCED_PAREN = (59 << GRIPE_SHIFT) | MSGCLASS_ERROR, 00285 GRIPE_GLOBAL_FUNCTION_LIKE_MACRO_DEFINITION = (72 << GRIPE_SHIFT) | MSGCLASS_ERROR, 00287 GRIPE_IF_WITHOUT_COND = (78 << GRIPE_SHIFT) | MSGCLASS_ERROR, 00289 GRIPE_CANT_OPEN_INPUT = (22 << GRIPE_SHIFT) | MSGCLASS_ABEND, 00291 GRIPE_OUT_OF_MEMORY = (23 << GRIPE_SHIFT) | MSGCLASS_ABEND, 00293 GRIPE_FILENAME_TOO_LONG = (24 << GRIPE_SHIFT) | MSGCLASS_ABEND, 00296 GRIPE_EOF_IN_FILENAME = (25 << GRIPE_SHIFT) | MSGCLASS_ABEND, 00298 GRIPE_CONFUSED = (26 << GRIPE_SHIFT) | MSGCLASS_ABEND, 00300 GRIPE_CANT_READ_INPUT = (30 << GRIPE_SHIFT) | MSGCLASS_ABEND, 00302 GRIPE_CANT_WRITE_FILE = (39 << GRIPE_SHIFT) | MSGCLASS_ABEND, 00304 GRIPE_NO_FILE = (40 << GRIPE_SHIFT) | MSGCLASS_ABEND, 00306 GRIPE_ILLEGAL_FILENAME = (34 << GRIPE_SHIFT) | MSGCLASS_ABEND, 00308 GRIPE_CANT_DELETE_FILE = (35 << GRIPE_SHIFT) | MSGCLASS_ABEND, 00310 GRIPE_CANT_RENAME_FILE = (36 << GRIPE_SHIFT) | MSGCLASS_ABEND, 00312 GRIPE_NO_TEMPFILE = (37 << GRIPE_SHIFT) | MSGCLASS_ABEND, 00314 GRIPE_CANT_OPEN_DIR = (42 << GRIPE_SHIFT) | MSGCLASS_ABEND, 00316 GRIPE_CANT_READ_DIR = (43 << GRIPE_SHIFT) | MSGCLASS_ABEND 00317 00318 } reason_code_t; 00319 00321 typedef enum { 00322 DBG_1 = 1, 00323 DBG_2, 00324 DBG_3, 00325 DBG_4, 00326 DBG_5, 00327 DBG_6, 00328 DBG_8, 00329 DBG_7, 00330 DBG_9, 00331 DBG_10, 00332 DBG_11, 00333 DBG_12, 00334 DBG_13, 00335 DBG_14, 00336 DBG_15, 00337 DBG_16, 00338 DBG_17, 00339 DBG_18, 00340 DBG_19, 00341 DBG_20, 00342 DBG_21, 00343 DBG_22 00344 } dbg_code_t; 00345 00351 extern void 00352 set_exit_flags(int bits, bool set); 00353 00359 extern int 00360 get_exit_flags(int bits); 00361 00389 extern int exitcode(void); 00390 00395 extern size_t 00396 line_len(char const *str); 00397 00402 extern void 00403 flatten_line(char * line); 00404 00405 00459 extern void 00460 report(reason_code_t reason, heap_str *buf, const char *format,...); 00461 00467 extern void 00468 parse_error(int reason, const char *format,...); 00469 00470 00475 extern void 00476 give_up_confused(void); 00477 00487 extern void 00488 vbail(int reason, const char *msg, va_list argp); 00489 00490 00497 extern void 00498 bail(int retcode, const char *format,...); 00499 00503 extern void 00504 debugging(bool on); 00505 00510 extern void 00511 debug(dbg_code_t how,...); 00512 00517 extern void 00518 exit_diagnostics(void); 00519 00521 extern void 00522 orphan_elif(void); 00523 00525 extern void 00526 orphan_else(void); 00527 00529 extern void 00530 orphan_endif(void); 00531 00533 extern void 00534 early_eof(void); 00535 00537 extern void 00538 processing_file(char const *filename); 00539 00541 extern void 00542 entering_dir(char const *dirname); 00543 00545 extern void 00546 leaving_dir(char const *dirname); 00547 00548 00582 extern size_t 00583 format_output(void *dest, int *buflen, int *startoff, char const *format,...); 00584 00596 extern heap_str 00597 concatenate(size_t count, char *strs[], int punctch); 00598 00629 extern void 00630 report_symbol(symbol_h sym); 00631 00655 extern void 00656 report_include(hash_include_const_h inc_arg); 00657 00672 extern void 00673 report_directive(canonical_string_const_h cl, directive_type_t directive_type); 00674 00681 extern char * 00682 format_int(int_spec_t const *int_spec); 00683 00684 00689 IMPORT_INITOR(report); 00690 IMPORT_FINITOR(report); 00693 #endif /* EOF*/