1da2e3ebdSchin /*********************************************************************** 2da2e3ebdSchin * * 3da2e3ebdSchin * This software is part of the ast package * 4*b30d1939SAndy Fiddaman * Copyright (c) 1985-2012 AT&T Intellectual Property * 5da2e3ebdSchin * and is licensed under the * 6*b30d1939SAndy Fiddaman * Eclipse Public License, Version 1.0 * 77c2fbfb3SApril Chin * by AT&T Intellectual Property * 8da2e3ebdSchin * * 9da2e3ebdSchin * A copy of the License is available at * 10*b30d1939SAndy Fiddaman * http://www.eclipse.org/org/documents/epl-v10.html * 11*b30d1939SAndy Fiddaman * (with md5 checksum b35adb5213ca9657e911e9befb180842) * 12da2e3ebdSchin * * 13da2e3ebdSchin * Information and Software Systems Research * 14da2e3ebdSchin * AT&T Research * 15da2e3ebdSchin * Florham Park NJ * 16da2e3ebdSchin * * 17da2e3ebdSchin * Glenn Fowler <gsf@research.att.com> * 18da2e3ebdSchin * David Korn <dgk@research.att.com> * 19da2e3ebdSchin * Phong Vo <kpv@research.att.com> * 20da2e3ebdSchin * * 21da2e3ebdSchin ***********************************************************************/ 22da2e3ebdSchin #pragma prototyped 23da2e3ebdSchin /* 24da2e3ebdSchin * Glenn Fowler 25da2e3ebdSchin * AT&T Research 26da2e3ebdSchin * 27da2e3ebdSchin * option, error and message formatter external definitions 28da2e3ebdSchin */ 29da2e3ebdSchin 30da2e3ebdSchin #ifndef _ERROR_H 31da2e3ebdSchin #define _ERROR_H 32da2e3ebdSchin 33da2e3ebdSchin #include <ast.h> 34da2e3ebdSchin #include <option.h> 35da2e3ebdSchin #include <errno.h> 36da2e3ebdSchin 37da2e3ebdSchin #define ERROR_VERSION 20070319L 38da2e3ebdSchin 39da2e3ebdSchin #if !defined(errno) && defined(__DYNAMIC__) 40da2e3ebdSchin #define errno __DYNAMIC__(errno) 41da2e3ebdSchin #endif 42da2e3ebdSchin 43da2e3ebdSchin #define ERROR_debug(n) (-(n)) 44da2e3ebdSchin #define ERROR_exit(n) ((n)+ERROR_ERROR) 45da2e3ebdSchin #define ERROR_system(n) (((n)+ERROR_ERROR)|ERROR_SYSTEM) 46da2e3ebdSchin #define ERROR_usage(n) ((((n)?2:0)+ERROR_ERROR)|ERROR_USAGE) 47da2e3ebdSchin #define ERROR_warn(n) (ERROR_WARNING) 48da2e3ebdSchin 49da2e3ebdSchin #ifndef ERROR_catalog 50da2e3ebdSchin #define ERROR_catalog(t) t 51da2e3ebdSchin #endif 52da2e3ebdSchin #ifndef ERROR_dictionary 53da2e3ebdSchin #define ERROR_dictionary(t) t 54da2e3ebdSchin #endif 55da2e3ebdSchin 56da2e3ebdSchin #ifndef ERROR_translate 57da2e3ebdSchin #define ERROR_translating() (error_info.translate&&(ast.locale.set&(1<<AST_LC_MESSAGES))) 583e14f97fSRoger A. Faulkner #define ERROR_translate(l,i,d,m) (ERROR_translating()?errorx((const char*)(l),(const char*)(i),(const char*)(d),(const char*)(m)):(char*)(m)) 59da2e3ebdSchin #endif 60da2e3ebdSchin 61da2e3ebdSchin #define ERROR_INFO 0 /* info message -- no err_id */ 62da2e3ebdSchin #define ERROR_WARNING 1 /* warning message */ 63da2e3ebdSchin #define ERROR_ERROR 2 /* error message -- no err_exit */ 64da2e3ebdSchin #define ERROR_FATAL 3 /* error message with err_exit */ 65da2e3ebdSchin #define ERROR_NOEXEC EXIT_NOEXEC /* shell convention */ 66da2e3ebdSchin #define ERROR_NOENT EXIT_NOTFOUND /* shell convention */ 67da2e3ebdSchin #define ERROR_PANIC ERROR_LEVEL /* panic message with err_exit */ 68da2e3ebdSchin 69da2e3ebdSchin #define ERROR_LEVEL 0x00ff /* level portion of status */ 70da2e3ebdSchin #define ERROR_SYSTEM 0x0100 /* report system errno message */ 71da2e3ebdSchin #define ERROR_OUTPUT 0x0200 /* next arg is error fd */ 72da2e3ebdSchin #define ERROR_SOURCE 0x0400 /* next 2 args are FILE,LINE */ 73da2e3ebdSchin #define ERROR_USAGE 0x0800 /* usage message */ 74da2e3ebdSchin #define ERROR_PROMPT 0x1000 /* omit trailing newline */ 75da2e3ebdSchin #define ERROR_NOID 0x2000 /* omit err_id */ 76da2e3ebdSchin #define ERROR_LIBRARY 0x4000 /* library routine error */ 77da2e3ebdSchin 78da2e3ebdSchin #define ERROR_INTERACTIVE 0x0001 /* context is interactive */ 79da2e3ebdSchin #define ERROR_SILENT 0x0002 /* context is silent */ 80da2e3ebdSchin #define ERROR_NOTIFY 0x0004 /* main(-sig,0,ctx) on signal */ 81da2e3ebdSchin 82da2e3ebdSchin #define ERROR_FREE 0x0010 /* free context on pop */ 83da2e3ebdSchin #define ERROR_POP 0x0020 /* pop context */ 84da2e3ebdSchin #define ERROR_PUSH 0x0040 /* push context */ 85da2e3ebdSchin #define ERROR_SET 0x0080 /* set context */ 86da2e3ebdSchin 87*b30d1939SAndy Fiddaman #ifdef ECONNRESET 88*b30d1939SAndy Fiddaman #define ERROR_PIPE(e) ((e)==EPIPE||(e)==ECONNRESET||(e)==EIO) 89*b30d1939SAndy Fiddaman #else 90*b30d1939SAndy Fiddaman #define ERROR_PIPE(e) ((e)==EPIPE||(e)==EIO) 91*b30d1939SAndy Fiddaman #endif 92*b30d1939SAndy Fiddaman 93da2e3ebdSchin /* 94da2e3ebdSchin * errorpush()/errorpop() are obsolete -- use errorctx() instead 95da2e3ebdSchin */ 96da2e3ebdSchin 97da2e3ebdSchin #ifndef ERROR_CONTEXT_T 98da2e3ebdSchin #define ERROR_CONTEXT_T Error_info_t 99da2e3ebdSchin #endif 100da2e3ebdSchin 101da2e3ebdSchin #define ERROR_CONTEXT_BASE ((Error_context_t*)&error_info.context) 102da2e3ebdSchin 103da2e3ebdSchin #define errorpush(p,f) (*(p)=*ERROR_CONTEXT_BASE,*ERROR_CONTEXT_BASE=error_info.empty,error_info.context=(Error_context_t*)(p),error_info.flags=(f)) 104da2e3ebdSchin #define errorpop(p) (*ERROR_CONTEXT_BASE=*(p)) 105da2e3ebdSchin 106da2e3ebdSchin typedef struct Error_info_s Error_info_t; 107da2e3ebdSchin typedef struct Error_context_s Error_context_t; 108da2e3ebdSchin 109da2e3ebdSchin #define ERROR_CONTEXT \ 110da2e3ebdSchin ERROR_CONTEXT_T* context; /* prev context stack element */ \ 111da2e3ebdSchin int errors; /* >= ERROR_ERROR count */ \ 112da2e3ebdSchin int flags; /* context flags */ \ 113da2e3ebdSchin int line; /* input|output line number */ \ 114da2e3ebdSchin int warnings; /* ERROR_WARNING count */ \ 115da2e3ebdSchin char* file; /* input|output file name */ \ 116da2e3ebdSchin char* id; /* command id */ 117da2e3ebdSchin 118da2e3ebdSchin struct Error_context_s /* context stack element */ 119da2e3ebdSchin { 120da2e3ebdSchin ERROR_CONTEXT 121da2e3ebdSchin }; 122da2e3ebdSchin 123da2e3ebdSchin struct Error_info_s /* error state */ 124da2e3ebdSchin { 125da2e3ebdSchin int fd; /* write(2) fd */ 126da2e3ebdSchin 127da2e3ebdSchin void (*exit)(int); /* error exit */ 128da2e3ebdSchin ssize_t (*write)(int, const void*, size_t); /* error output */ 129da2e3ebdSchin 130da2e3ebdSchin /* the rest are implicitly initialized */ 131da2e3ebdSchin 132da2e3ebdSchin int clear; /* default clear ERROR_* flags */ 133da2e3ebdSchin int core; /* level>=core -> core dump */ 134da2e3ebdSchin int indent; /* debug trace indent level */ 135da2e3ebdSchin int init; /* initialized */ 136da2e3ebdSchin int last_errno; /* last reported errno */ 137da2e3ebdSchin int mask; /* multi level debug trace mask */ 138da2e3ebdSchin int set; /* default set ERROR_* flags */ 139da2e3ebdSchin int trace; /* debug trace level */ 140da2e3ebdSchin 141da2e3ebdSchin char* version; /* ERROR_SOURCE command version */ 142da2e3ebdSchin 143da2e3ebdSchin int (*auxilliary)(Sfio_t*, int, int); /* aux info to append */ 144da2e3ebdSchin 145da2e3ebdSchin ERROR_CONTEXT /* top of context stack */ 146da2e3ebdSchin 147da2e3ebdSchin Error_context_t empty; /* empty context stack element */ 148da2e3ebdSchin 149da2e3ebdSchin unsigned long time; /* debug time trace */ 150da2e3ebdSchin 151da2e3ebdSchin char* (*translate)(const char*, const char*, const char*, const char*); /* format translator */ 152da2e3ebdSchin 153da2e3ebdSchin const char* catalog; /* message catalog */ 154da2e3ebdSchin }; 155da2e3ebdSchin 156da2e3ebdSchin #ifndef errno 157da2e3ebdSchin extern int errno; /* system call error status */ 158da2e3ebdSchin #endif 159da2e3ebdSchin 160da2e3ebdSchin #if _BLD_ast && defined(__EXPORT__) 161da2e3ebdSchin #define extern extern __EXPORT__ 162da2e3ebdSchin #endif 163da2e3ebdSchin #if !_BLD_ast && defined(__IMPORT__) 164da2e3ebdSchin #define extern extern __IMPORT__ 165da2e3ebdSchin #endif 166da2e3ebdSchin 167da2e3ebdSchin extern Error_info_t* _error_infop_; 168da2e3ebdSchin 169da2e3ebdSchin #define error_info (*_error_infop_) 170da2e3ebdSchin 171da2e3ebdSchin #undef extern 172da2e3ebdSchin 173da2e3ebdSchin #if _BLD_ast && defined(__EXPORT__) 174da2e3ebdSchin #define extern __EXPORT__ 175da2e3ebdSchin #endif 176da2e3ebdSchin 177da2e3ebdSchin extern void error(int, ...); 178da2e3ebdSchin extern int errormsg(const char*, int, ...); 179da2e3ebdSchin extern int errorf(void*, void*, int, ...); 180da2e3ebdSchin extern void errorv(const char*, int, va_list); 181da2e3ebdSchin #ifndef errorx 182da2e3ebdSchin extern char* errorx(const char*, const char*, const char*, const char*); 183da2e3ebdSchin #endif 184da2e3ebdSchin extern Error_info_t* errorctx(Error_info_t*, int, int); 185da2e3ebdSchin 186da2e3ebdSchin #undef extern 187da2e3ebdSchin 188da2e3ebdSchin #endif 189