mirror of
https://github.com/tesseract-ocr/tesseract.git
synced 2024-12-11 23:19:04 +08:00
425d593ebe
git-svn-id: https://tesseract-ocr.googlecode.com/svn/trunk/trunk@2 d0cd1f9f-072b-0410-8dd7-cf729c803f20
114 lines
3.6 KiB
C++
114 lines
3.6 KiB
C++
/**********************************************************************
|
|
* 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"
|
|
#include <signal.h>
|
|
#include "errcode.h"
|
|
#include "tprintf.h"
|
|
|
|
INT16 global_loc_code = LOC_INIT;//location code
|
|
INT16 global_subloc_code = SUBLOC_NORM;
|
|
//pass2 subloc code
|
|
INT16 global_subsubloc_code = SUBSUBLOC_OTHER;
|
|
//location code
|
|
INT16 global_abort_code = NO_ABORT_CODE;
|
|
//Prog abort code
|
|
|
|
void signal_exit( //
|
|
int signal_code //Signal which
|
|
) {
|
|
int exit_status;
|
|
|
|
if ((global_loc_code == LOC_PASS2) || (global_loc_code == LOC_FUZZY_SPACE))
|
|
global_loc_code += global_subloc_code + global_subsubloc_code;
|
|
|
|
if (signal_code < 0) {
|
|
exit_status = global_loc_code * 8 + global_abort_code * 2 + 1;
|
|
tprintf ("Signal_exit %d ABORT. LocCode: %d AbortCode: %d\n",
|
|
exit_status, global_loc_code, global_abort_code);
|
|
}
|
|
else {
|
|
exit_status = global_loc_code * 8 + signal_code * 2;
|
|
tprintf ("Signal_exit %d SIGNAL ABORT. LocCode: %d SignalCode: %d\n",
|
|
exit_status, global_loc_code, signal_code);
|
|
}
|
|
|
|
exit(exit_status);
|
|
}
|
|
|
|
|
|
/*************************************************************************
|
|
* err_exit()
|
|
* All program exits should go through this point. It allows a meaningful status
|
|
* code to be generated for the real exit() call. The status code is made up
|
|
* as follows:
|
|
* Bit 0 : 1 = Program Abort 0 = System Abort
|
|
* Bits 1,2 : IF bit 0 = 1 THEN ERRCODE::abort_code
|
|
* ELSE 0 = Bus Err or Seg Vi
|
|
* 1 = Floating point exception
|
|
* 2 = TimeOut (Signal 15 from command timer)
|
|
* 3 = Any other signal
|
|
* Bits 3..7 : Location code NEVER 0 !
|
|
*************************************************************************/
|
|
|
|
//extern "C" {
|
|
|
|
void err_exit() {
|
|
signal_exit (-1);
|
|
}
|
|
|
|
|
|
void signal_termination_handler( //The real signal
|
|
int sig) {
|
|
tprintf ("Signal_termination_handler called with signal %d\n", sig);
|
|
switch (sig) {
|
|
case SIGABRT:
|
|
signal_exit (-1); //use abort code
|
|
// case SIGBUS:
|
|
case SIGSEGV:
|
|
signal_exit (0);
|
|
case SIGFPE:
|
|
signal_exit (1); //floating point
|
|
case SIGTERM:
|
|
signal_exit (2); //timeout by cmdtimer
|
|
default:
|
|
signal_exit (3); //Anything else
|
|
}
|
|
}
|
|
|
|
|
|
//}; //end extern "C"
|
|
|
|
void set_global_loc_code(int loc_code) {
|
|
global_loc_code = loc_code;
|
|
|
|
}
|
|
|
|
|
|
void set_global_subloc_code(int loc_code) {
|
|
global_subloc_code = loc_code;
|
|
|
|
}
|
|
|
|
|
|
void set_global_subsubloc_code(int loc_code) {
|
|
global_subsubloc_code = loc_code;
|
|
|
|
}
|