| /********************************************************************** |
| * File: errcode.c (Formerly error.c) |
| * Description: Generic error handler function |
| * Author: Ray Smith |
| * Created: Tue May 1 16:28:39 BST 1990 |
| * |
| * (C) Copyright 1989, Hewlett-Packard Ltd. |
| ** Licensed under the Apache License, Version 2.0 (the "License"); |
| ** you may not use this file except in compliance with the License. |
| ** You may obtain a copy of the License at |
| ** http://www.apache.org/licenses/LICENSE-2.0 |
| ** Unless required by applicable law or agreed to in writing, software |
| ** distributed under the License is distributed on an "AS IS" BASIS, |
| ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| ** See the License for the specific language governing permissions and |
| ** limitations under the License. |
| * |
| **********************************************************************/ |
| |
| #include "mfcpch.h" //precompiled headers |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <stdarg.h> |
| #include <string.h> |
| #ifdef __UNIX__ |
| #include <signal.h> |
| #endif |
| #include "tprintf.h" |
| //#include "ipeerr.h" |
| #include "errcode.h" |
| |
| const ERRCODE BADERRACTION = "Illegal error action"; |
| #define MAX_MSG 1024 |
| |
| /********************************************************************** |
| * error |
| * |
| * Print an error message and continue, exit or abort according to action. |
| * Makes use of error messages and numbers in a common place. |
| * |
| **********************************************************************/ |
| void |
| ERRCODE::error ( //handle error |
| const char *caller, //name of caller |
| inT8 action, //action to take |
| const char *format, ... //special message |
| ) const |
| { |
| va_list args; //variable args |
| char msg[MAX_MSG]; |
| char *msgptr = msg; |
| |
| if (caller != NULL) |
| //name of caller |
| msgptr += sprintf (msgptr, "%s:", caller); |
| //actual message |
| msgptr += sprintf (msgptr, "Error:%s", message); |
| if (format != NULL) { |
| msgptr += sprintf (msgptr, ":"); |
| va_start(args, format); //variable list |
| #ifdef __MSW32__ |
| //print remainder |
| msgptr += _vsnprintf (msgptr, MAX_MSG - 2 - (msgptr - msg), format, args); |
| msg[MAX_MSG - 2] = '\0'; //ensure termination |
| strcat (msg, "\n"); |
| #else |
| //print remainder |
| msgptr += vsprintf (msgptr, format, args); |
| //no specific |
| msgptr += sprintf (msgptr, "\n"); |
| #endif |
| va_end(args); |
| } |
| else |
| //no specific |
| msgptr += sprintf (msgptr, "\n"); |
| |
| fprintf(stderr, msg); |
| /*if ((strstr (message, "File") != NULL) || |
| (strstr (message, "file") != NULL)) |
| else if ((strstr (message, "List") != NULL) || |
| (strstr (message, "list") != NULL)) |
| else if ((strstr (message, "Memory") != NULL) || |
| (strstr (message, "memory") != NULL)) |
| global_abort_code = MEMORY_ABORT; |
| else |
| global_abort_code = NO_ABORT_CODE; |
| */ |
| |
| int* p = NULL; |
| switch (action) { |
| case DBG: |
| case TESSLOG: |
| return; //report only |
| case EXIT: |
| //err_exit(); |
| case ABORT: |
| // Create a deliberate segv as the stack trace is more useful that way. |
| if (!*p) |
| abort(); |
| default: |
| BADERRACTION.error ("error", ABORT, NULL); |
| } |
| } |