1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License, Version 1.0 only
   6  * (the "License").  You may not use this file except in compliance
   7  * with the License.
   8  *
   9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  10  * or http://www.opensolaris.org/os/licensing.
  11  * See the License for the specific language governing permissions
  12  * and limitations under the License.
  13  *
  14  * When distributing Covered Code, include this CDDL HEADER in each
  15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  16  * If applicable, add the following below this CDDL HEADER, with the
  17  * fields enclosed by brackets "[]" replaced with your own identifying
  18  * information: Portions Copyright [yyyy] [name of copyright owner]
  19  *
  20  * CDDL HEADER END
  21  */
  22 /*
  23  * Copyright 2014 Garrett D'Amore <garrett@damore.org>
  24  *
  25  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
  26  * Use is subject to license terms.
  27  */
  28 
  29 /*
  30  * Copyright 1989, 1994 by Mortice Kern Systems Inc.
  31  * All rights reserved.
  32  */
  33 /*
  34  * Copyright 2010 Nexenta Systems, Inc.  All rights reserved.
  35  * Use is subject to license terms.
  36  */
  37 
  38 #ifndef _REGEX_H
  39 #define _REGEX_H
  40 
  41 #include <sys/feature_tests.h>
  42 #include <sys/types.h>
  43 
  44 #ifdef  __cplusplus
  45 extern "C" {
  46 #endif
  47 
  48 
  49 /*
  50  * wchar_t is a built-in type in standard C++ and as such is not
  51  * defined here when using standard C++. However, the GNU compiler
  52  * fixincludes utility nonetheless creates its own version of this
  53  * header for use by gcc and g++. In that version it adds a redundant
  54  * guard for __cplusplus. To avoid the creation of a gcc/g++ specific
  55  * header we need to include the following magic comment:
  56  *
  57  * we must use the C++ compiler's type
  58  *
  59  * The above comment should not be removed or changed until GNU
  60  * gcc/fixinc/inclhack.def is updated to bypass this header.
  61  */
  62 #if !defined(__cplusplus) || (__cplusplus < 199711L && !defined(__GNUG__))
  63 #ifndef _WCHAR_T
  64 #define _WCHAR_T
  65 #if defined(_LP64)
  66 typedef int     wchar_t;
  67 #else
  68 typedef long    wchar_t;
  69 #endif
  70 #endif  /* !_WCHAR_T */
  71 #endif  /* !defined(__cplusplus) ... */
  72 
  73 typedef ssize_t regoff_t;
  74 
  75 /* regcomp flags */
  76 #define REG_BASIC       0x00
  77 #define REG_EXTENDED    0x01            /* Use Extended Regular Expressions */
  78 #define REG_NEWLINE     0x08            /* Treat \n as regular character */
  79 #define REG_ICASE       0x04            /* Ignore case in match */
  80 #define REG_NOSUB       0x02            /* Don't set subexpression */
  81 #define REG_EGREP       0x1000          /* running as egrep(1) */
  82 
  83 /* non-standard flags - note that most of these are not supported */
  84 #define REG_DELIM       0x10            /* string[0] is delimiter */
  85 #define REG_DEBUG       0x20            /* Debug recomp and regexec */
  86 #define REG_ANCHOR      0x40            /* Implicit ^ and $ */
  87 #define REG_WORDS       0x80            /* \< and \> match word boundries */
  88 
  89 /* FreeBSD additions */
  90 #define REG_DUMP        0x2000
  91 #define REG_PEND        0x4000
  92 #define REG_NOSPEC      0x8000
  93 #define REG_STARTEND    0x10000
  94 
  95 /* internal flags */
  96 #define REG_MUST        0x100           /* check for regmust substring */
  97 
  98 /* regexec flags */
  99 #define REG_NOTBOL      0x200           /* string is not BOL */
 100 #define REG_NOTEOL      0x400           /* string has no EOL */
 101 #define REG_NOOPT       0x800           /* don't do regmust optimization */
 102 
 103 /* regcomp and regexec return codes */
 104 #define REG_OK          0               /* success (non-standard) */
 105 #define REG_NOMATCH     1               /* regexec failed to match */
 106 #define REG_ECOLLATE    2               /* invalid collation element ref. */
 107 #define REG_EESCAPE     3               /* trailing \ in pattern */
 108 #define REG_ENEWLINE    4               /* \n found before end of pattern */
 109 #define REG_ENSUB       5               /* more than 9 \( \) pairs (OBS) */
 110 #define REG_ESUBREG     6               /* number in \[0-9] invalid */
 111 #define REG_EBRACK      7               /* [ ] imbalance */
 112 #define REG_EPAREN      8               /* ( ) imbalance */
 113 #define REG_EBRACE      9               /* \{ \} imbalance */
 114 #define REG_ERANGE      10              /* invalid endpoint in range */
 115 #define REG_ESPACE      11              /* no memory for compiled pattern */
 116 #define REG_BADRPT      12              /* invalid repetition */
 117 #define REG_ECTYPE      13              /* invalid char-class type */
 118 #define REG_BADPAT      14              /* syntax error */
 119 #define REG_BADBR       15              /* \{ \} contents bad */
 120 #define REG_EFATAL      16              /* internal error, not POSIX.2 */
 121 #define REG_ECHAR       17              /* invalid mulitbyte character */
 122 #define REG_STACK       18              /* backtrack stack overflow */
 123 #define REG_ENOSYS      19              /* function not supported (XPG4) */
 124 #define REG__LAST       20              /* first unused code */
 125 #define REG_EBOL        21              /* ^ anchor and not BOL */
 126 #define REG_EEOL        22              /* $ anchor and not EOL */
 127 #define _REG_BACKREF_MAX 9              /* Max # of subexp. backreference */
 128 
 129 typedef struct {                /* regcomp() data saved for regexec() */
 130         size_t  re_nsub;        /* # of subexpressions in RE pattern */
 131 
 132         /*
 133          * Internal use only.  Note that any changes to this structure
 134          * have to preserve sizing, as it is baked into applications.
 135          */
 136         struct re_guts *re_g;
 137         int re_magic;
 138         const char *re_endp;
 139 
 140         /* here for compat */
 141         size_t  re_len;         /* # wchar_t chars in compiled pattern */
 142         struct _regex_ext_t *re_sc;     /* for binary compatibility */
 143 } regex_t;
 144 
 145 /* subexpression positions */
 146 typedef struct {
 147         const char      *rm_sp, *rm_ep; /* Start pointer, end pointer */
 148         regoff_t        rm_so, rm_eo;   /* Start offset, end offset */
 149         int             rm_ss, rm_es;   /* Used internally */
 150 } regmatch_t;
 151 
 152 
 153 /*
 154  * Additional API and structs to support regular expression manipulations
 155  * on wide characters.
 156  */
 157 
 158 extern int regcomp(regex_t *_RESTRICT_KYWD, const char *_RESTRICT_KYWD, int);
 159 extern int regexec(const regex_t *_RESTRICT_KYWD, const char *_RESTRICT_KYWD,
 160         size_t, regmatch_t *_RESTRICT_KYWD, int);
 161 extern size_t regerror(int, const regex_t *_RESTRICT_KYWD,
 162         char *_RESTRICT_KYWD, size_t);
 163 extern void regfree(regex_t *);
 164 
 165 #ifdef  __cplusplus
 166 }
 167 #endif
 168 
 169 #endif  /* _REGEX_H */