1e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao/*- 2e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * This code is derived from OpenBSD's libc/regex, original license follows: 3e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * 4e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * Copyright (c) 1992, 1993, 1994 Henry Spencer. 5e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * Copyright (c) 1992, 1993, 1994 6e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * The Regents of the University of California. All rights reserved. 7e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * 8e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * This code is derived from software contributed to Berkeley by 9e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * Henry Spencer. 10e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * 11e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * Redistribution and use in source and binary forms, with or without 12e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * modification, are permitted provided that the following conditions 13e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * are met: 14e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * 1. Redistributions of source code must retain the above copyright 15e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * notice, this list of conditions and the following disclaimer. 16e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * 2. Redistributions in binary form must reproduce the above copyright 17e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * notice, this list of conditions and the following disclaimer in the 18e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * documentation and/or other materials provided with the distribution. 19e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * 3. Neither the name of the University nor the names of its contributors 20e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * may be used to endorse or promote products derived from this software 21e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * without specific prior written permission. 22e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * 23e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 24e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 27e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * SUCH DAMAGE. 34e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * 35e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao * @(#)regerror.c 8.4 (Berkeley) 3/20/94 36e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao */ 37e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 38e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include <sys/types.h> 39e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include <stdio.h> 40e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include <string.h> 41e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include <ctype.h> 42e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include <limits.h> 43e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include <stdlib.h> 44e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include "regex_impl.h" 45e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 46e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include "regutils.h" 47e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 48e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#ifdef _MSC_VER 49e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#define snprintf _snprintf 50e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#endif 51e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 52e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaostatic const char *regatoi(const llvm_regex_t *, char *, int); 53e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 54e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaostatic struct rerr { 55e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao int code; 56e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao const char *name; 57e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao const char *explain; 58e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao} rerrs[] = { 59e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao { REG_NOMATCH, "REG_NOMATCH", "llvm_regexec() failed to match" }, 60e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao { REG_BADPAT, "REG_BADPAT", "invalid regular expression" }, 61e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao { REG_ECOLLATE, "REG_ECOLLATE", "invalid collating element" }, 62e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao { REG_ECTYPE, "REG_ECTYPE", "invalid character class" }, 63e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao { REG_EESCAPE, "REG_EESCAPE", "trailing backslash (\\)" }, 64e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao { REG_ESUBREG, "REG_ESUBREG", "invalid backreference number" }, 65e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao { REG_EBRACK, "REG_EBRACK", "brackets ([ ]) not balanced" }, 66e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao { REG_EPAREN, "REG_EPAREN", "parentheses not balanced" }, 67e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao { REG_EBRACE, "REG_EBRACE", "braces not balanced" }, 68e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao { REG_BADBR, "REG_BADBR", "invalid repetition count(s)" }, 69e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao { REG_ERANGE, "REG_ERANGE", "invalid character range" }, 70e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao { REG_ESPACE, "REG_ESPACE", "out of memory" }, 71e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao { REG_BADRPT, "REG_BADRPT", "repetition-operator operand invalid" }, 72e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao { REG_EMPTY, "REG_EMPTY", "empty (sub)expression" }, 73e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao { REG_ASSERT, "REG_ASSERT", "\"can't happen\" -- you found a bug" }, 74e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao { REG_INVARG, "REG_INVARG", "invalid argument to regex routine" }, 75e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao { 0, "", "*** unknown regexp error code ***" } 76e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao}; 77e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 78e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao/* 79e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao - llvm_regerror - the interface to error numbers 80e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao = extern size_t llvm_regerror(int, const llvm_regex_t *, char *, size_t); 81e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao */ 82e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao/* ARGSUSED */ 83e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaosize_t 84e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaollvm_regerror(int errcode, const llvm_regex_t *preg, char *errbuf, size_t errbuf_size) 85e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao{ 86e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao struct rerr *r; 87e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao size_t len; 88e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao int target = errcode &~ REG_ITOA; 89e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao const char *s; 90e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao char convbuf[50]; 91e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 92e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao if (errcode == REG_ATOI) 93e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao s = regatoi(preg, convbuf, sizeof convbuf); 94e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao else { 95e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao for (r = rerrs; r->code != 0; r++) 96e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao if (r->code == target) 97e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao break; 98e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 99e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao if (errcode®_ITOA) { 100e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao if (r->code != 0) { 101e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao assert(strlen(r->name) < sizeof(convbuf)); 102e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao (void) llvm_strlcpy(convbuf, r->name, sizeof convbuf); 103e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao } else 104e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao (void)snprintf(convbuf, sizeof convbuf, 105e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao "REG_0x%x", target); 106e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao s = convbuf; 107e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao } else 108e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao s = r->explain; 109e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao } 110e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 111e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao len = strlen(s) + 1; 112e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao if (errbuf_size > 0) { 113e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao llvm_strlcpy(errbuf, s, errbuf_size); 114e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao } 115e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 116e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao return(len); 117e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao} 118e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 119e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao/* 120e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao - regatoi - internal routine to implement REG_ATOI 121e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao */ 122e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaostatic const char * 123e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaoregatoi(const llvm_regex_t *preg, char *localbuf, int localbufsize) 124e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao{ 125e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao struct rerr *r; 126e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 127e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao for (r = rerrs; r->code != 0; r++) 128e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao if (strcmp(r->name, preg->re_endp) == 0) 129e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao break; 130e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao if (r->code == 0) 131e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao return("0"); 132e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 133e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao (void)snprintf(localbuf, localbufsize, "%d", r->code); 134e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao return(localbuf); 135e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao} 136