regerror.c
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:3k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * regerror - error-code expansion
  3.  *
  4.  * Copyright (c) 1998, 1999 Henry Spencer.  All rights reserved.
  5.  * 
  6.  * Development of this software was funded, in part, by Cray Research Inc.,
  7.  * UUNET Communications Services Inc., Sun Microsystems Inc., and Scriptics
  8.  * Corporation, none of whom are responsible for the results.  The author
  9.  * thanks all of them. 
  10.  * 
  11.  * Redistribution and use in source and binary forms -- with or without
  12.  * modification -- are permitted for any purpose, provided that
  13.  * redistributions in source form retain this entire copyright notice and
  14.  * indicate the origin and nature of any modifications.
  15.  * 
  16.  * I'd appreciate being given credit for this package in the documentation
  17.  * of software which uses it, but that is not a requirement.
  18.  * 
  19.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
  20.  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  21.  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
  22.  * HENRY SPENCER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  23.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  24.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
  25.  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  26.  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
  27.  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
  28.  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  29.  *
  30.  */
  31. #include "regguts.h"
  32. /* unknown-error explanation */
  33. static char unk[] = "*** unknown regex error code 0x%x ***";
  34. /* struct to map among codes, code names, and explanations */
  35. static struct rerr {
  36. int code;
  37. char *name;
  38. char *explain;
  39. } rerrs[] = {
  40. /* the actual table is built from regex.h */
  41. # include "regerrs.h"
  42. { -1, "", "oops" }, /* explanation special-cased in code */
  43. };
  44. /*
  45.  - regerror - the interface to error numbers
  46.  */
  47. /* ARGSUSED */
  48. size_t /* actual space needed (including NUL) */
  49. regerror(code, preg, errbuf, errbuf_size)
  50. int code; /* error code, or REG_ATOI or REG_ITOA */
  51. CONST regex_t *preg; /* associated regex_t (unused at present) */
  52. char *errbuf; /* result buffer (unless errbuf_size==0) */
  53. size_t errbuf_size; /* available space in errbuf, can be 0 */
  54. {
  55. struct rerr *r;
  56. char *msg;
  57. char convbuf[sizeof(unk)+50]; /* 50 = plenty for int */
  58. size_t len;
  59. int icode;
  60. switch (code) {
  61. case REG_ATOI: /* convert name to number */
  62. for (r = rerrs; r->code >= 0; r++)
  63. if (strcmp(r->name, errbuf) == 0)
  64. break;
  65. sprintf(convbuf, "%d", r->code); /* -1 for unknown */
  66. msg = convbuf;
  67. break;
  68. case REG_ITOA: /* convert number to name */
  69. icode = atoi(errbuf); /* not our problem if this fails */
  70. for (r = rerrs; r->code >= 0; r++)
  71. if (r->code == icode)
  72. break;
  73. if (r->code >= 0)
  74. msg = r->name;
  75. else { /* unknown; tell him the number */
  76. sprintf(convbuf, "REG_%u", (unsigned)icode);
  77. msg = convbuf;
  78. }
  79. break;
  80. default: /* a real, normal error code */
  81. for (r = rerrs; r->code >= 0; r++)
  82. if (r->code == code)
  83. break;
  84. if (r->code >= 0)
  85. msg = r->explain;
  86. else { /* unknown; say so */
  87. sprintf(convbuf, unk, code);
  88. msg = convbuf;
  89. }
  90. break;
  91. }
  92. len = strlen(msg) + 1; /* space needed, including NUL */
  93. if (errbuf_size > 0) {
  94. if (errbuf_size > len)
  95. strcpy(errbuf, msg);
  96. else { /* truncate to fit */
  97. strncpy(errbuf, msg, errbuf_size-1);
  98. errbuf[errbuf_size-1] = '';
  99. }
  100. }
  101. return len;
  102. }