/* $Id: error.c,v 1.2 2006/01/29 22:33:22 mcmahill Exp $ */ /* * COPYRIGHT * * PCB, interactive printed circuit board design * Copyright (C) 1994,1995,1996, 2005 Thomas Nau * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * Contact addresses for paper mail and Email: * Thomas Nau, Schlehenweg 15, 88471 Baustetten, Germany * Thomas.Nau@rz.uni-ulm.de * */ /* error and debug funtions * getpid() needs a cast to (int) to get rid of compiler warnings * on several architectures */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_UNISTD_H #include #endif #include #include "global.h" #include "data.h" #include "error.h" #include "file.h" #include "misc.h" RCSID("$Id: error.c,v 1.2 2006/01/29 22:33:22 mcmahill Exp $"); #define utf8_dup_string(a,b) *(a) = strdup(b) /* ---------------------------------------------------------------------- * some external identifiers */ #if !defined(HAVE_STRERROR) extern int sys_nerr; /* number of messages available from array */ #define USE_SYS_ERRLIST #endif /* the list is already defined for some OS */ #if !defined(__NetBSD__) && !defined(__FreeBSD__) && !defined(__linux__) && !defined(__DragonFly__) #ifdef USE_SYS_ERRLIST extern char *sys_errlist[]; /* array of error messages */ #endif #endif /* --------------------------------------------------------------------------- * output of message in a dialog window or log window */ void Message (char *Format, ...) { va_list args; va_start (args, Format); gui->logv(Format, args); va_end (args); } /* --------------------------------------------------------------------------- * print standard 'open error' */ void OpenErrorMessage (char *Filename) { char *utf8 = NULL; utf8_dup_string(&utf8, Filename); #ifdef USE_SYS_ERRLIST Message (_("Can't open file\n" " '%s'\nfopen() returned: '%s'\n"), utf8, errno <= sys_nerr ? sys_errlist[errno] : "???"); #else Message (_("Can't open file\n" " '%s'\nfopen() returned: '%s'\n"), utf8, strerror (errno)); #endif free(utf8); } /* --------------------------------------------------------------------------- * print standard 'popen error' */ void PopenErrorMessage (char *Filename) { char *utf8 = NULL; utf8_dup_string(&utf8, Filename); #ifdef USE_SYS_ERRLIST Message (_("Can't execute command\n" " '%s'\npopen() returned: '%s'\n"), utf8, errno <= sys_nerr ? sys_errlist[errno] : "???"); #else Message (_("Can't execute command\n" " '%s'\npopen() returned: '%s'\n"), utf8, strerror (errno)); #endif free(utf8); } /* --------------------------------------------------------------------------- * print standard 'opendir' */ void OpendirErrorMessage (char *DirName) { char *utf8 = NULL; utf8_dup_string(&utf8, DirName); #ifdef USE_SYS_ERRLIST Message (_("Can't scan directory\n" " '%s'\nopendir() returned: '%s'\n"), utf8, errno <= sys_nerr ? sys_errlist[errno] : "???"); #else Message (_("Can't scan directory\n" " '%s'\nopendir() returned: '%s'\n"), utf8, strerror (errno)); #endif free(utf8); } /* --------------------------------------------------------------------------- * print standard 'chdir error' */ void ChdirErrorMessage (char *DirName) { char *utf8 = NULL; utf8_dup_string(&utf8, DirName); #ifdef USE_SYS_ERRLIST Message (_("Can't change working directory to\n" " '%s'\nchdir() returned: '%s'\n"), utf8, errno <= sys_nerr ? sys_errlist[errno] : "???"); #else Message (_("Can't change working directory to\n" " '%s'\nchdir() returned: '%s'\n"), utf8, strerror (errno)); #endif free(utf8); } /* --------------------------------------------------------------------------- * output of fatal error message */ void MyFatal (char *Format, ...) { va_list args; va_start (args, Format); /* try to save the layout and do some cleanup */ EmergencySave (); fprintf (stderr, "%s (%i): fatal, ", Progname, (int) getpid ()); vfprintf (stderr, Format, args); fflush (stderr); va_end (args); exit (1); } /* --------------------------------------------------------------------------- * catches signals which abort the program */ void CatchSignal (int Signal) { char *s; switch (Signal) { case SIGHUP: s = "SIGHUP"; break; case SIGINT: s = "SIGINT"; break; case SIGQUIT: s = "SIGQUIT"; break; case SIGABRT: s = "SIGABRT"; break; case SIGTERM: s = "SIGTERM"; break; case SIGSEGV: s = "SIGSEGV"; break; default: s = "unknown"; break; } MyFatal ("aborted by %s signal\n", s); }