diff options
author | Marcus Brinkmann <[email protected]> | 2003-05-15 18:52:35 +0000 |
---|---|---|
committer | Marcus Brinkmann <[email protected]> | 2003-05-15 18:52:35 +0000 |
commit | 40488ccd933a06da0faac9aa057e3dab6ca2dbec (patch) | |
tree | 39496d8766d0151c741319bca54bf8a26c7fb6c4 /src | |
parent | New repository initialized by cvs2svn. (diff) | |
download | libgpg-error-40488ccd933a06da0faac9aa057e3dab6ca2dbec.tar.gz libgpg-error-40488ccd933a06da0faac9aa057e3dab6ca2dbec.zip |
2003-05-15 Marcus Brinkmann <[email protected]>
* Initial check-in.
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 40 | ||||
-rw-r--r-- | src/err-codes.h.in | 166 | ||||
-rw-r--r-- | src/err-sources.h.in | 35 | ||||
-rw-r--r-- | src/gettext.h | 69 | ||||
-rw-r--r-- | src/gpg/error.h | 287 | ||||
-rw-r--r-- | src/mkstrtable.awk | 127 | ||||
-rw-r--r-- | src/strerror.c | 36 | ||||
-rw-r--r-- | src/strsource.c | 36 |
8 files changed, 796 insertions, 0 deletions
diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..2972be5 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,40 @@ +# Makefile.am for libgpg-error. +# Copyright (C) 2003 g10 Code GmbH +# +# This file is part of libgpg-error. +# +# libgpg-error 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. +# +# libgpg-error 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + +EXTRA_DIST = mkstrtable.awk err-sources.h.in err-codes.h.in +BUILT_SOURCES = err-sources.h err-codes.h +CLEANFILES = err-sources.h err-codes.h + +nobase_include_HEADERS = gpg/error.h + +lib_LTLIBRARIES = libgpg-error.la + +libgpg_error_la_LDFLAGS = -version-info \ + @LIBGPG_ERROR_LT_CURRENT@:@LIBGPG_ERROR_LT_REVISION@:@LIBGPG_ERROR_LT_AGE@ + +libgpg_error_la_SOURCES = gpg/error.h gettext.h \ + err-sources.h strsource.c err-codes.h strerror.c + +libgpg_error_la_LIBADD = @LTLIBINTL@ + +err-sources.h: Makefile mkstrtable.awk err-sources.h.in + $(AWK) -f $(srcdir)/mkstrtable.awk $(srcdir)/err-sources.h.in >$@ + +err-codes.h: Makefile mkstrtable.awk err-codes.h.in + $(AWK) -f $(srcdir)/mkstrtable.awk $(srcdir)/err-codes.h.in >$@ diff --git a/src/err-codes.h.in b/src/err-codes.h.in new file mode 100644 index 0000000..708a82e --- /dev/null +++ b/src/err-codes.h.in @@ -0,0 +1,166 @@ +# List of error codes and their description. +# Copyright (C) 2003 g10 Code GmbH +# +# This file is part of libgpg-error. +# +# libgpg-error 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. +# +# libgpg-error 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + +# Empty lines are ignored. Other lines must have an error code +# number, followed by exactly one <tab>, followed by the error +# message. Trailing whitespace is removed. The error codes should be +# sorted. The last line should not have a number, but only a <tab>, +# followed by a description for error codes that are not in the list. + +0 Success +1 General error +2 Unknown packet +3 Unknown version in packet +4 Invalid public key algorithm +5 Invalid digest algorithm +6 Bad public key +7 Bad secret key +8 Bad signature +9 No public key +10 Checksum error +11 Bad passphrase +12 Invalid cipher algorithm +13 Keyring open +14 Invalid packet +15 Invalid armor +16 No user ID +17 No secret key +18 Wrong secret key used +19 Bad session key +20 Unknown compression algorithm +21 Reading file failed +22 Writing file failed +23 Opening file failed +24 Creating file failed +25 Closing file failed +26 Renaming file failed +27 Deleting file failed +28 File exists +29 File error +30 Bad MPI value +31 Invalid passphrase +32 Invalid signature class +33 Resources exhausted +34 Invalid keyring +35 Trust DB error +36 Bad certificate +37 Invalid user ID +38 Unexpected error +39 Time conflict +40 Keyserver error +41 Wrong public key algorithm +42 I/O error +43 Weak encryption key +44 Invalid key length +45 Invalid argument +46 Syntax error in URI +47 Invalid URI +48 Network error +49 Unknown host +50 Selftest failed +51 Data not encrypted +52 Data not processed +53 Unusable public key +54 Unusable secret key +55 Invalid value +56 Bad certificate chain +57 Missing certificate +58 No data +59 Bug +60 Not supported +61 Invalid operation code +62 Out of core +63 Internal error +64 EOF (gcrypt) +65 Invalid object +66 Provided object is too short +67 Provided object is too large +68 Missing item in object +69 Not implemented +70 Conflicting use +71 Invalid cipher mode +72 Invalid flag +73 Read error +74 Write error +75 Incomplete line +76 Invalid response +77 No agent running +78 agent error +79 Invalid data +80 Assuan server fault +81 Assuan error +82 Invalid session key +83 Invalid S-expression +84 Unsupported algorithm +85 No pinentry +86 pinentry error +87 Bad PIN +88 Invalid name +89 Bad data +90 Invalid parameter +91 Tribute to D. A. +92 No dirmngr +93 dirmngr error +94 Certificate revoced +95 No CRL known +96 CRL too old +97 Line too long +98 Not trusted +99 Operation cancelled +100 Bad CA certificate +101 Certificate expired +102 Certificate too young +103 Unsupported certificate +104 Unknown S-expression +105 Unsupported protection +106 Corrupted protection +107 Ambiguous name +108 Card error +109 Card reset +110 Card removed +111 Invalid card +112 Card not present +113 No PKCS15 application +114 Not confirmed +115 Configuration error +116 No policy match +117 Invalid index +118 Invalid ID +119 No SmartCard daemon +120 SmartCard daemon error +121 Unsupported protocol +122 Bad PIN method +123 Card not initialized +124 Unsupported operation +125 Wrong key usage +201 Invalid length specifier in S-expression +202 String too long in S-expression +203 Unmatched parentheses in S-expression +204 S-expression not canonical +205 Bad character in S-expression +206 Bad quotation in S-expression +207 Zero prefix in S-expression +208 Nested display hints in S-expression +209 Unmatched display hints +210 Unexpected reserved punctuation in S-expression +211 Bad hexadecimal character in S-expression +212 Odd hexadecimal numbers in S-expression +213 Bad octadecimal character in S-expression +16383 End of file + Unknown error code diff --git a/src/err-sources.h.in b/src/err-sources.h.in new file mode 100644 index 0000000..62d2437 --- /dev/null +++ b/src/err-sources.h.in @@ -0,0 +1,35 @@ +# List of error sources and their description. +# Copyright (C) 2003 g10 Code GmbH +# +# This file is part of libgpg-error. +# +# libgpg-error 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. +# +# libgpg-error 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + +# Empty lines are ignored. Other lines must have an error code +# number, followed by exactly one <tab>, followed by the error +# message. Trailing whitespace is removed. The error sources should +# be sorted. The last line should not have a number, but only a +# <tab>, followed by a description for error sources that are not in +# the list. + +0 Unspecified source +1 gcrypt +2 GnuPG +3 GpgSM +4 GPG Agent +5 Pinentry +6 SCD +7 GPGME + Unknown source diff --git a/src/gettext.h b/src/gettext.h new file mode 100644 index 0000000..8b262f4 --- /dev/null +++ b/src/gettext.h @@ -0,0 +1,69 @@ +/* Convenience header for conditional use of GNU <libintl.h>. + Copyright (C) 1995-1998, 2000-2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifndef _LIBGETTEXT_H +#define _LIBGETTEXT_H 1 + +/* NLS can be disabled through the configure --disable-nls option. */ +#if ENABLE_NLS + +/* Get declarations of GNU message catalog functions. */ +# include <libintl.h> + +#else + +/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which + chokes if dcgettext is defined as a macro. So include it now, to make + later inclusions of <locale.h> a NOP. We don't include <libintl.h> + as well because people using "gettext.h" will not include <libintl.h>, + and also including <libintl.h> would fail on SunOS 4, whereas <locale.h> + is OK. */ +#if defined(__sun) +# include <locale.h> +#endif + +/* Disabled NLS. + The casts to 'const char *' serve the purpose of producing warnings + for invalid uses of the value returned from these functions. + On pre-ANSI systems without 'const', the config.h file is supposed to + contain "#define const". */ +# define gettext(Msgid) ((const char *) (Msgid)) +# define dgettext(Domainname, Msgid) ((const char *) (Msgid)) +# define dcgettext(Domainname, Msgid, Category) ((const char *) (Msgid)) +# define ngettext(Msgid1, Msgid2, N) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define dngettext(Domainname, Msgid1, Msgid2, N) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define textdomain(Domainname) ((const char *) (Domainname)) +# define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname)) +# define bind_textdomain_codeset(Domainname, Codeset) ((const char *) (Codeset)) + +#endif + +/* A pseudo function call that serves as a marker for the automated + extraction of messages, but does not call gettext(). The run-time + translation is done at a different place in the code. + The argument, String, should be a literal string. Concatenated strings + and other string expressions won't work. + The macro's expansion is not parenthesized, so that it is suitable as + initializer for static 'char[]' or 'const char[]' variables. */ +#define gettext_noop(String) String + +#endif /* _LIBGETTEXT_H */ diff --git a/src/gpg/error.h b/src/gpg/error.h new file mode 100644 index 0000000..9ddf09b --- /dev/null +++ b/src/gpg/error.h @@ -0,0 +1,287 @@ +/* gpg/error.h - Public interface to libgpg-error. + Copyright (C) 2003 g10 Code GmbH + + This file is part of libgpg-error. + + libgpg-error 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. + + libgpg-error 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 GPGME; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef GPG_ERROR_H +#define GPG_ERROR_H 1 + +/* The GnuPG project consists of many components. Error codes are + exchanged between all components. The common error codes and their + user-presentable descriptions are kept into a shared library to + allow adding new error codes and components without recompiling any + of the other components. The interface will not change in a + backward incompatible way. + + An error code together with an error source build up an error + value. As the error value is been passed from one component to + another, it preserver the information about the source and nature + of the error. + + A component of the GnuPG project can define the following macro to + tune the behaviour of the library: + + GPG_ERR_SOURCE_DEFAULT: Define to an error source of type + gpg_err_source_t to make that source the default for gpg_error(). + Otherwise GPG_ERR_SOURCE_UNKNOWN is used as default. */ + + +/* The error source type gpg_err_source_t. */ + +/* Only add to the end of the list, never change or reorder the + existing entries. */ +typedef enum + { + GPG_ERR_SOURCE_UNKNOWN = 0, + GPG_ERR_SOURCE_GCRYPT = 1, + GPG_ERR_SOURCE_GPG = 2, + GPG_ERR_SOURCE_GPGSM = 3, + GPG_ERR_SOURCE_GPGAGENT = 4, + GPG_ERR_SOURCE_PINENTRY = 5, + GPG_ERR_SOURCE_SCD = 6, + GPG_ERR_SOURCE_GPGME = 7, + + /* This is one more than the largest allowed entry. */ + GPG_ERR_SOURCE_DIM = 256 + } gpg_err_source_t; + + +/* The error code type gpg_err_code_t. */ + +/* Only add to the end of the list, never change or reorder the + existing entries. */ +typedef enum + { + GPG_ERR_NO_ERROR = 0, /* An error that is not an error. */ + GPG_ERR_GENERAL = 1, + GPG_ERR_UNKNOWN_PACKET = 2, + GPG_ERR_UNKNOWN_VERSION = 3, /* Unknown version (in packet). */ + GPG_ERR_PUBKEY_ALGO = 4, /* Invalid public key algorithm. */ + GPG_ERR_DIGEST_ALGO = 5, /* Invalid digest algorithm. */ + GPG_ERR_BAD_PUBKEY = 6, /* Bad public key. */ + GPG_ERR_BAD_SECKEY = 7, /* Bad secret key. */ + GPG_ERR_BAD_SIGNATURE = 8, /* Bad signature. */ + GPG_ERR_NO_PUBKEY = 9, /* Public key not found. */ + GPG_ERR_CHECKSUM = 10, /* Checksum error. */ + GPG_ERR_BAD_PASSPHRASE = 11, /* Bad passphrase. */ + GPG_ERR_CIPHER_ALGO = 12, /* Invalid cipher algorithm. */ + GPG_ERR_KEYRING_OPEN = 13, + GPG_ERR_INV_PACKET = 14, + GPG_ERR_INV_ARMOR = 15, + GPG_ERR_NO_USER_ID = 16, + GPG_ERR_NO_SECKEY = 17, /* Secret key not available. */ + GPG_ERR_WRONG_SECKEY = 18, /* Wrong secret key used. */ + GPG_ERR_BAD_KEY = 19, /* Bad (session) key. */ + GPG_ERR_COMPR_ALGO = 20, /* Unknown compress algorithm. */ + GPG_ERR_FILE_READ = 21, + GPG_ERR_FILE_WRITE = 22, + GPG_ERR_FILE_OPEN = 23, + GPG_ERR_FILE_CREATE = 24, + GPG_ERR_FILE_CLOSE = 25, + GPG_ERR_FILE_RENAME = 26, + GPG_ERR_FILE_DELETE = 27, + GPG_ERR_FILE_EXISTS = 28, + GPG_ERR_FILE = 29, + GPG_ERR_BAD_MPI = 30, /* Problem with an MPI's value. */ + GPG_ERR_INV_PASSPHRASE = 31, /* Invalid passphrase. */ + GPG_ERR_SIG_CLASS = 32, + GPG_ERR_RESOURCE_LIMIT = 33, + GPG_ERR_INV_KEYRING = 34, + GPG_ERR_TRUSTDB = 35, /* A problem with the trustdb. */ + GPG_ERR_BAD_CERT = 36, /* Bad certicate. */ + GPG_ERR_INV_USER_ID = 37, + GPG_ERR_UNEXPECTED = 38, + GPG_ERR_TIME_CONFLICT = 39, + GPG_ERR_KEYSERVER = 40, + GPG_ERR_WRONG_PUBKEY_ALGO = 41, /* Wrong public key algorithm. */ + GPG_ERR_IO = 42, /* I/O error. */ + GPG_ERR_WEAK_KEY = 43, /* Weak encryption key. */ + GPG_ERR_INV_KEYLEN = 44, /* Invalid length of a key. */ + GPG_ERR_INV_ARG = 45, /* Invalid argument. */ + GPG_ERR_BAD_URI = 46, /* Syntax error in URI. */ + GPG_ERR_INV_URI = 47, /* Unsupported scheme and similar. */ + GPG_ERR_NETWORK = 48, /* General network error. */ + GPG_ERR_UNKNOWN_HOST = 49, + GPG_ERR_SELFTEST_FAILED = 50, /* Selftest failed. */ + GPG_ERR_NOT_ENCRYPTED = 51, + GPG_ERR_NOT_PROCESSED = 52, + GPG_ERR_UNUSABLE_PUBKEY = 53, + GPG_ERR_UNUSABLE_SECKEY = 54, + GPG_ERR_INV_VALUE = 55, /* Invalid value. */ + GPG_ERR_BAD_CERT_CHAIN = 56, + GPG_ERR_MISSING_CERT = 57, + GPG_ERR_NO_DATA = 58, + GPG_ERR_BUG = 59, + GPG_ERR_NOT_SUPPORTED = 60, + GPG_ERR_INV_OP = 61, /* Invalid operation code. */ + GPG_ERR_OUT_OF_CORE = 62, /* Out of core ("Keine Kerne"). */ + GPG_ERR_INTERNAL = 63, /* Internal error. */ + GPG_ERR_EOF_GCRYPT = 64, /* Compatibility for gcrypt. */ + GPG_ERR_INV_OBJ = 65, /* An object is not valid. */ + GPG_ERR_TOO_SHORT = 66, /* Provided object is too short. */ + GPG_ERR_TOO_LARGE = 67, /* Provided object is too large. */ + GPG_ERR_NO_OBJ = 68, /* Missing item in an object. */ + GPG_ERR_NOT_IMPLEMENTED = 69, /* Not implemented. */ + GPG_ERR_CONFLICT = 70, /* Conflicting use. */ + GPG_ERR_INV_CIPHER_MODE = 71, /* Invalid cipher mode. */ + GPG_ERR_INV_FLAG = 72, /* Invalid flag. */ + GPG_ERR_READ_ERROR = 73, + GPG_ERR_WRITE_ERROR = 74, + GPG_ERR_INCOMPLETE_LINE = 75, + GPG_ERR_INVALID_RESPONSE = 76, + GPG_ERR_NO_AGENT = 77, + GPG_ERR_AGENT_ERROR = 78, + GPG_ERR_INV_DATA = 79, + GPG_ERR_ASSUAN_SERVER_FAULT = 80, + GPG_ERR_ASSUAN_ERROR = 81, /* Catch all assuan error. */ + GPG_ERR_INV_SESSION_KEY = 82, + GPG_ERR_INV_SEXP = 83, + GPG_ERR_UNSUPPORTED_ALGORITHM = 84, + GPG_ERR_NO_PIN_ENTRY = 85, + GPG_ERR_PIN_ENTRY_ERROR = 86, + GPG_ERR_BAD_PIN = 87, + GPG_ERR_INV_NAME = 88, + GPG_ERR_BAD_DATA = 89, + GPG_ERR_INV_PARAMETER = 90, + GPG_ERR_TRIBUTE_TO_D_A = 91, + GPG_ERR_NO_DIRMNGR = 92, + GPG_ERR_DIRMNGR_ERROR = 93, + GPG_ERR_CERT_REVOKED = 94, + GPG_ERR_NO_CRL_KNOWN = 95, + GPG_ERR_CRL_TOO_OLD = 96, + GPG_ERR_LINE_TOO_LONG = 97, + GPG_ERR_NOT_TRUSTED = 98, + GPG_ERR_CANCELED = 109, + GPG_ERR_BAD_CA_CERT = 100, + GPG_ERR_CERT_EXPIRED = 101, + GPG_ERR_CERT_TOO_YOUNG = 102, + GPG_ERR_UNSUPPORTED_CERT = 103, + GPG_ERR_UNKNOWN_SEXP = 104, + GPG_ERR_UNSUPPORTED_PROTECTION = 105, + GPG_ERR_CORRUPTED_PROTECTION = 106, + GPG_ERR_AMBIGUOUS_NAME = 107, + GPG_ERR_CARD_ERROR = 108, + GPG_ERR_CARD_RESET = 109, + GPG_ERR_CARD_REMOVED = 110, + GPG_ERR_INVALID_CARD = 111, + GPG_ERR_CARD_NOT_PRESENT = 112, + GPG_ERR_NO_PKCS15_APP = 113, + GPG_ERR_NOT_CONFIRMED = 114, + GPG_ERR_CONFIGURATION_ERROR = 115, + GPG_ERR_NO_POLICY_MATCH = 116, + GPG_ERR_INVALID_INDEX = 117, + GPG_ERR_INVALID_ID = 118, + GPG_ERR_NO_SCDAEMON = 119, + GPG_ERR_SCDAEMON_ERROR = 120, + GPG_ERR_UNSUPPORTED_PROTOCOL = 121, + GPG_ERR_BAD_PIN_METHOD = 122, + GPG_ERR_CARD_NOT_INITIALIZED = 123, + GPG_ERR_UNSUPPORTED_OPERATION = 124, + GPG_ERR_WRONG_KEY_USAGE = 125, + + /* Error codes pertaining to S-expressions. */ + GPG_ERR_SEXP_INV_LEN_SPEC = 201, + GPG_ERR_SEXP_STRING_TOO_LONG = 202, + GPG_ERR_SEXP_UNMATCHED_PAREN = 203, + GPG_ERR_SEXP_NOT_CANONICAL = 204, + GPG_ERR_SEXP_BAD_CHARACTER = 205, + GPG_ERR_SEXP_BAD_QUOTATION = 206, /* Or invalid hex or octal value. */ + GPG_ERR_SEXP_ZERO_PREFIX = 207, /* First character of length is 0. */ + GPG_ERR_SEXP_NESTED_DH = 208, /* Nested display hints. */ + GPG_ERR_SEXP_UNMATCHED_DH = 209, /* Unmatched display hint. */ + GPG_ERR_SEXP_UNEXPECTED_PUNC = 210, /* Unexpected reserved punctuation. */ + GPG_ERR_SEXP_BAD_HEX_CHAR = 211, + GPG_ERR_SEXP_ODD_HEX_NUMBERS = 212, + GPG_ERR_SEXP_BAD_OCT_CHAR = 213, + + GPG_ERR_EOF = 16383, /* This was once a -1. Pity. */ + + /* This is one more than the largest allowed entry. */ + GPG_ERR_CODE_DIM = 16384 + } gpg_err_code_t; + + +/* The error value type gpg_error_t. */ + +/* We would really like to use bit-fields in a struct, but using + structs as return values can cause binary compatibility issues, in + particular if you want to do it effeciently (also see + -freg-struct-return option to GCC). */ +typedef unsigned long gpg_error_t; + +/* We use the lowest 16 bits of gpg_error_t for error codes. */ +#define GPG_ERR_CODE_MASK (GPG_ERR_CODE_DIM - 1) + +/* Bits 17 to 24 are reserved. */ + +/* We use the upper 8 bits of gpg_error_t for error sources. */ +#define GPG_ERR_SOURCE_MASK (GPG_ERR_SOURCE_DIM - 1) +#define GPG_ERR_SOURCE_SHIFT 24 + + +/* Constructor and accessor functions. */ + +/* Construct an error value from an error code and source. Within a + subsystem, use gpg_error. */ +static __inline__ gpg_error_t +gpg_make_error (gpg_err_source_t source, gpg_err_code_t code) +{ + return ((source & GPG_ERR_SOURCE_MASK) << GPG_ERR_SOURCE_SHIFT) + | (code & GPG_ERR_CODE_MASK); +} + + +/* The user should define GPG_ERR_SOURCE_DEFAULT before including this + file to specify a default source for gpg_error. */ +#ifndef GPG_ERR_SOURCE_DEFAULT +#define GPG_ERR_SOURCE_DEFAULT GPG_ERR_SOURCE_UNKNOWN +#endif + +static __inline__ gpg_error_t +gpg_error (gpg_err_code_t code) +{ + return gpg_make_error (GPG_ERR_SOURCE_DEFAULT, code); +} + + +/* Retrieve the error code from an error value. */ +static __inline__ gpg_err_code_t +gpg_err_code (gpg_error_t err) +{ + return err & GPG_ERR_CODE_MASK; +} + + +/* Retrieve the error source from an error value. */ +static __inline__ gpg_err_source_t +gpg_err_source (gpg_error_t err) +{ + return (err >> GPG_ERR_SOURCE_SHIFT) & GPG_ERR_SOURCE_MASK; +} + + +/* String functions. */ + +/* Return a pointer to a string containing a description of the error + code in the error value ERR. */ +const char *gpg_strerror (gpg_error_t err); + +/* Return a pointer to a string containing a description of the error + source in the error value ERR. */ +const char *gpg_strsource (gpg_error_t err); + +#endif /* GPG_ERROR_H */ diff --git a/src/mkstrtable.awk b/src/mkstrtable.awk new file mode 100644 index 0000000..a42bc07 --- /dev/null +++ b/src/mkstrtable.awk @@ -0,0 +1,127 @@ +# Copyright (C) 2003 g10 Code GmbH +# This file is part of libgpg-error. + +# libgpg-error is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. + +# libgpg-error 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 +# Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public +# License along with the GNU C Library; if not, write to the Free +# Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +# 02111-1307 USA. + +# This script outputs a source file that does define the following +# symbols: +# +# static const char msgstr[]; +# A string containing all messages in the list. +# +# static const int msgidx[]; +# A list of index numbers, one for each message, that points to the +# beginning of the string in msgstr. +# +# msgidxof (code); +# A macro that maps code numbers to idx numbers. If a DEFAULT MESSAGE +# is provided (see below), its index will be returned for unknown codes. +# Otherwise -1 is returned for codes that do not appear in the list. +# You can lookup the message with code CODE with: +# msgstr + msgidx[msgidxof (code)]. +# +# The input file has the following format: +# CODE1 MESSAGE1 (Code number, <tab>, message string) +# CODE2 MESSAGE2 (Code number, <tab>, message string) +# ... +# CODEn MESSAGEn (Code number, <tab>, message string) +# DEFAULT MESSAGE (<tab>, fall-back message string) +# +# Comments (starting with # and ending at the end of the line) are removed, +# as is trailing whitespace. The last line is optional; if no DEFAULT +# MESSAGE is given, msgidxof will return the number -1 for unknown +# index numbers. + +BEGIN { + FS = "\t"; +# cpos holds the current position in the message string. + cpos = 0; +# msg holds the number of messages. + msg = 0; + print "/* Output of mkstrtable.awk. DO NOT EDIT. */"; + print ""; + print "/* The purpose of this complex string table is to produce"; + print " optimal code with a minimum of relocations. */"; + print ""; + print "static const char msgstr[] = "; +} + +{ + sub (/\#.+/, ""); + sub (/[ ]+$/, ""); # Strip trailing space and tab characters. + if (/^$/) + next; + +# Print the string msgstr line by line. We delay output by one line to be able +# to treat the last line differently (see END). + if (last_msgstr) + print " gettext_noop (\"" last_msgstr "\") \"\\0\""; + last_msgstr = $2; + +# Remember the error code and msgidx of each error message. + code[msg] = $1; + pos[msg] = cpos; + cpos += length ($2) + 1; + msg++; + + if ($1 == "") + { + has_default = 1; + exit; + } +} +END { + if (has_default) + coded_msgs = msg - 1; + else + coded_msgs = msg; + + print " gettext_noop (\"" last_msgstr "\");"; + print ""; + print "static const int msgidx[] ="; + print " {"; + for (i = 0; i < coded_msgs; i++) + print " " pos[i] ","; + print " " pos[coded_msgs]; + print " };"; + print ""; + print "#define msgidxof(code) (0 ? -1 \\"; + +# Gather the ranges. + skip = code[0]; + start = code[0]; + stop = code[0]; + for (i = 1; i < coded_msgs; i++) + { + if (code[i] == stop + 1) + stop++; + else + { + print " : ((code >= " start ") && (code <= " stop ")) ? (code - " \ + skip ") \\"; + skip += code[i] - stop - 1; + start = code[i]; + stop = code[i]; + } + } + print " : ((code >= " start ") && (code <= " stop ")) ? (code - " \ + skip ") \\"; + if (has_default) + print " : " stop + 1 " - " skip ")"; + else + print " : -1)"; + + } diff --git a/src/strerror.c b/src/strerror.c new file mode 100644 index 0000000..8c41c38 --- /dev/null +++ b/src/strerror.c @@ -0,0 +1,36 @@ +/* strerror.c - Describing an error code. + Copyright (C) 2003 g10 Code GmbH + + This file is part of libgpg-error. + + libgpg-error 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. + + libgpg-error 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 GPGME; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#if HAVE_CONFIG_H +#include <config.h> +#endif + +#include <gpg/error.h> + +#include "gettext.h" +#include "err-codes.h" + +/* Return a pointer to a string containing a description of the error + code in the error value ERR. */ +const char * +gpg_strerror (gpg_error_t err) +{ + gpg_err_code_t code = gpg_err_code (err); + return dgettext (PACKAGE, msgstr + msgidx[msgidxof (code)]); +} diff --git a/src/strsource.c b/src/strsource.c new file mode 100644 index 0000000..c0c4c8f --- /dev/null +++ b/src/strsource.c @@ -0,0 +1,36 @@ +/* strsource.c - Describing an error source. + Copyright (C) 2003 g10 Code GmbH + + This file is part of libgpg-error. + + libgpg-error 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. + + libgpg-error 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 GPGME; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#if HAVE_CONFIG_H +#include <config.h> +#endif + +#include <gpg/error.h> + +#include "gettext.h" +#include "err-sources.h" + +/* Return a pointer to a string containing a description of the error + source in the error value ERR. */ +const char * +gpg_strsource (gpg_error_t err) +{ + gpg_err_source_t source = gpg_err_source (err); + return dgettext (PACKAGE, msgstr + msgidx[msgidxof (source)]); +} |