diff options
author | chin <none@none> | 2007-08-17 12:01:52 -0700 |
---|---|---|
committer | chin <none@none> | 2007-08-17 12:01:52 -0700 |
commit | da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968 (patch) | |
tree | 5280d3b78e289fe9551371ab6e7f15ef9944ea14 /usr/src/lib/libast/common/comp/regexp.c | |
parent | 073dbf9103ef2a2b05d8a16e2d26db04e0374b0e (diff) | |
download | illumos-gate-da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968.tar.gz |
6437624 RFE: Add ksh93 (as /usr/bin/ksh93) and libshell.so to OS/Net
6505835 AST tools and library (libpp) required for creating l10n messages for ksh93
PSARC/2006/550 Korn Shell 93 Integration
PSARC/2006/587 /etc/ksh.kshrc for ksh93
PSARC/2007/035 ksh93 Amendments
Contributed by Roland Mainz <roland.mainz@nrubsig.org>
--HG--
rename : usr/src/lib/libcmd/common/mapfile-vers => deleted_files/usr/src/lib/libcmd/common/mapfile-vers
rename : usr/src/lib/libcmd/common/placeholder.c => deleted_files/usr/src/lib/libcmd/common/placeholder.c
Diffstat (limited to 'usr/src/lib/libast/common/comp/regexp.c')
-rw-r--r-- | usr/src/lib/libast/common/comp/regexp.c | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/usr/src/lib/libast/common/comp/regexp.c b/usr/src/lib/libast/common/comp/regexp.c new file mode 100644 index 0000000000..10d67fa30d --- /dev/null +++ b/usr/src/lib/libast/common/comp/regexp.c @@ -0,0 +1,123 @@ +/*********************************************************************** +* * +* This software is part of the ast package * +* Copyright (c) 1985-2007 AT&T Knowledge Ventures * +* and is licensed under the * +* Common Public License, Version 1.0 * +* by AT&T Knowledge Ventures * +* * +* A copy of the License is available at * +* http://www.opensource.org/licenses/cpl1.0.txt * +* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * +* * +* Information and Software Systems Research * +* AT&T Research * +* Florham Park NJ * +* * +* Glenn Fowler <gsf@research.att.com> * +* David Korn <dgk@research.att.com> * +* Phong Vo <kpv@research.att.com> * +* * +***********************************************************************/ +#pragma prototyped +/* + * <regexp.h> library support + */ + +#define _REGEXP_DECLARE + +#include <ast.h> +#include <regexp.h> +#include <regex.h> +#include <align.h> + +typedef struct +{ + regex_t re; + char* buf; + char* cur; + unsigned int size; +} Env_t; + +static void* +block(void* handle, void* data, size_t size) +{ + register Env_t* env = (Env_t*)handle; + + if (data || (size = roundof(size, ALIGN_BOUND2)) > (env->buf + env->size - env->cur)) + return 0; + data = (void*)env->cur; + env->cur += size; + return data; +} + +int +_re_comp(regexp_t* re, const char* pattern, char* handle, unsigned int size) +{ + register Env_t* env = (Env_t*)handle; + register int n; + + if (size <= sizeof(Env_t)) + return 50; + env->buf = env->cur = (char*)env + sizeof(Env_t); + env->size = size - sizeof(Env_t); + regalloc(env, block, REG_NOFREE); + n = regcomp(&env->re, pattern, REG_LENIENT|REG_NULL); + switch (n) + { + case 0: + break; + case REG_ERANGE: + n = 11; + break; + case REG_BADBR: + n = 16; + break; + case REG_ESUBREG: + n = 25; + break; + case REG_EPAREN: + n = 42; + break; + case REG_EBRACK: + n = 49; + break; + default: + n = 50; + break; + } + re->re_nbra = env->re.re_nsub; + return n; +} + +int +_re_exec(regexp_t* re, const char* subject, const char* handle, int anchor) +{ + register Env_t* env = (Env_t*)handle; + register int n; + regmatch_t match[elementsof(re->re_braslist)+1]; + + if (regexec(&env->re, subject, elementsof(match), match, 0) || anchor && match[0].rm_so) + return 0; + re->re_loc1 = (char*)subject + match[0].rm_so; + re->re_loc2 = (char*)subject + match[0].rm_eo; + for (n = 1; n <= env->re.re_nsub; n++) + { + re->re_braslist[n-1] = (char*)subject + match[n].rm_so; + re->re_braelist[n-1] = (char*)subject + match[n].rm_eo; + } + return 1; +} + +char* +_re_putc(int c) +{ + static Sfio_t* sp; + + if (!sp && !(sp = sfstropen())) + return 0; + if (!c) + return sfstruse(sp); + sfputc(sp, c); + return 0; +} |