diff options
author | Andy Fiddaman <omnios@citrus-it.co.uk> | 2020-12-27 17:47:37 +0000 |
---|---|---|
committer | Andy Fiddaman <omnios@citrus-it.co.uk> | 2021-01-30 17:13:33 +0000 |
commit | b30d193948be5a7794d7ae3ba0ed9c2f72c88e0f (patch) | |
tree | 6a37e590faffb9bb9af66887de645c546445036c /usr/src/lib/libshell/common/bltins/enum.c | |
parent | df36e06d12cbf655ddf22339ef8c39fa2b83ebf8 (diff) | |
download | illumos-joyent-b30d193948be5a7794d7ae3ba0ed9c2f72c88e0f.tar.gz |
13405 ksh93 update to 2012-08-01
13434 sh: mishandles backslash as last character of a block of input
11750 ksh mkdir builtin doesn't honor special file permissions
9199 ksh93 builtin *grep -v mishandles blank lines, blows up libgcrypt-config
6756 sh (and ksh) have issues with ${1+"$@"}
6520 ksh: sleep could wait forever
4860 ksh93: core in printf
3791 /bin/sh's builtin 'rm' busted: 'rm -f' without arguments returns error
1047 ksh overwrites child core files
880 ksh93 coredumps on 'unset'
499 "interrupted system call" when using "tee" builtin in ksh
Reviewed by: Robert Mustacchi <rm@fingolfin.org>
Reviewed by: Hans Rosenfeld <rosenfeld@grumpf.hope-2000.org>
Reviewed by: Dominik Hassler <hadfl@omnios.org>
Approved by: Rich Lowe <richlowe@richlowe.net>
Diffstat (limited to 'usr/src/lib/libshell/common/bltins/enum.c')
-rw-r--r-- | usr/src/lib/libshell/common/bltins/enum.c | 283 |
1 files changed, 0 insertions, 283 deletions
diff --git a/usr/src/lib/libshell/common/bltins/enum.c b/usr/src/lib/libshell/common/bltins/enum.c deleted file mode 100644 index 74c991b0ed..0000000000 --- a/usr/src/lib/libshell/common/bltins/enum.c +++ /dev/null @@ -1,283 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1982-2010 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* 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 * -* * -* David Korn <dgk@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -#include <shell.h> - -static const char enum_usage[] = -"[-?@(#)$Id: enum (AT&T Research) 2008-01-08 $\n]" -USAGE_LICENSE -"[+NAME?enum - create an enumeration type]" -"[+DESCRIPTION?\benum\b is a declaration command that creates an enumeration " - "type \atypename\a that can only store any one of the values in the indexed " - "array variable \atypename\a.]" -"[+?If the list of \avalue\as is omitted, then \atypename\a must name an " - "indexed array variable with at least two elements.]" -"[i:ignorecase?The values are case insensitive.]" -"\n" -"\n\atypename\a[\b=(\b \avalue\a ... \b)\b]\n" -"\n" -"[+EXIT STATUS]" - "{" - "[+0?Successful completion.]" - "[+>0?An error occurred.]" - "}" -"[+SEE ALSO?\bksh\b(1), \btypeset\b(1).]" -; - -static const char enum_type[] = -"[-1c?\n@(#)$Id: type (AT&T Labs Research) 2008-01-08 $\n]" -USAGE_LICENSE -"[+NAME?\f?\f - create an instance of type \b\f?\f\b]" -"[+DESCRIPTION?\b\f?\f\b creates a variable for each \aname\a with " - "enumeration type \b\f?\f\b where \b\f?\f\b is a type that has been " - "created with the \benum\b(1) command.]" -"[+?The variable can have one of the following values\fvalues\f. " - "The the values are \fcase\fcase sensitive.]" -"[+?If \b=\b\avalue\a is omitted, the default is \fdefault\f.]" -"[+?If no \aname\as are specified then the names and values of all " - "variables of this type are written to standard output.]" -"[+?\b\f?\f\b is built-in to the shell as a declaration command so that " - "field splitting and pathname expansion are not performed on " - "the arguments. Tilde expansion occurs on \avalue\a.]" -"[r?Enables readonly. Once enabled, the value cannot be changed or unset.]" -"[a?index array. Each \aname\a will converted to an index " - "array of type \b\f?\f\b. If a variable already exists, the current " - "value will become index \b0\b.]" -"[A?Associative array. Each \aname\a will converted to an associate " - "array of type \b\f?\f\b. If a variable already exists, the current " - "value will become subscript \b0\b.]" -"[h]:[string?Used within a type definition to provide a help string " - "for variable \aname\a. Otherwise, it is ignored.]" -"[S?Used with a type definition to indicate that the variable is shared by " - "each instance of the type. When used inside a function defined " - "with the \bfunction\b reserved word, the specified variables " - "will have function static scope. Otherwise, the variable is " - "unset prior to processing the assignment list.]" -#if 0 -"[p?Causes the output to be in a form of \b\f?\f\b commands that can be " - "used as input to the shell to recreate the current type of " - "these variables.]" -#endif -"\n" -"\n[name[=value]...]\n" -"\n" -"[+EXIT STATUS?]{" - "[+0?Successful completion.]" - "[+>0?An error occurred.]" -"}" - -"[+SEE ALSO?\benum\b(1), \btypeset\b(1)]" -; - -struct Enum -{ - Namfun_t hdr; - short nelem; - short iflag; - const char *values[1]; -}; - -static int enuminfo(Opt_t* op, Sfio_t *out, const char *str, Optdisc_t *fp) -{ - Namval_t *np; - struct Enum *ep; - int n=0; - const char *v; - np = *(Namval_t**)(fp+1); - ep = (struct Enum*)np->nvfun; - if(strcmp(str,"default")==0) -#if 0 - sfprintf(out,"\b%s\b%c",ep->values[0],0); -#else - sfprintf(out,"\b%s\b",ep->values[0]); -#endif - else if(strcmp(str,"case")==0) - { - if(ep->iflag) - sfprintf(out,"not "); - } - else while(v=ep->values[n++]) - { - sfprintf(out,", \b%s\b",v); - } - return(0); -} - -static Namfun_t *clone_enum(Namval_t* np, Namval_t *mp, int flags, Namfun_t *fp) -{ - struct Enum *ep, *pp=(struct Enum*)fp; - ep = newof(0,struct Enum,1,pp->nelem*sizeof(char*)); - memcpy((void*)ep,(void*)pp,sizeof(struct Enum)+pp->nelem*sizeof(char*)); - return(&ep->hdr); -} - -static void put_enum(Namval_t* np,const char *val,int flags,Namfun_t *fp) -{ - struct Enum *ep = (struct Enum*)fp; - register const char *v; - unsigned short i=0, n; - if(!val) - { - nv_disc(np,&ep->hdr,NV_POP); - if(!ep->hdr.nofree) - free((void*)ep); - nv_putv(np, val, flags,fp); - return; - } - if(flags&NV_INTEGER) - { - nv_putv(np,val,flags,fp); - return; - } - while(v=ep->values[i]) - { - if(ep->iflag) - n = strcasecmp(v,val); - else - n = strcmp(v,val); - if(n==0) - { - nv_putv(np, (char*)&i, NV_UINT16, fp); - return; - } - i++; - } - error(ERROR_exit(1), "%s: invalid value %s",nv_name(np),val); -} - -static char* get_enum(register Namval_t* np, Namfun_t *fp) -{ - static char buff[6]; - struct Enum *ep = (struct Enum*)fp; - long n = nv_getn(np,fp); - if(n < ep->nelem) - return((char*)ep->values[n]); - sfsprintf(buff,sizeof(buff),"%u%c",n,0); - return(buff); -} - -static Sfdouble_t get_nenum(register Namval_t* np, Namfun_t *fp) -{ - return(nv_getn(np,fp)); -} - -const Namdisc_t ENUM_disc = { 0, put_enum, get_enum, get_nenum, 0,0,clone_enum }; - -#ifdef STANDALONE -static int enum_create(int argc, char** argv, void* context) -#else -int b_enum(int argc, char** argv, void* context) -#endif -{ - int sz,i,n,iflag = 0; - Namval_t *np, *tp; - Namarr_t *ap; - char *cp,*sp; - struct Enum *ep; - Shell_t *shp = ((Shbltin_t*)context)->shp; - struct { - Optdisc_t opt; - Namval_t *np; - } optdisc; - - cmdinit(argc, argv, context, ERROR_CATALOG, ERROR_NOTIFY); - for (;;) - { - switch (optget(argv, enum_usage)) - { - case 'i': - iflag = 'i'; - continue; - case '?': - error(ERROR_USAGE|4, "%s", opt_info.arg); - break; - case ':': - error(2, "%s", opt_info.arg); - break; - } - break; - } - argv += opt_info.index; - if (error_info.errors || !*argv || *(argv + 1)) - { - error(ERROR_USAGE|2, "%s", optusage(NiL)); - return 1; - } - while(cp = *argv++) - { - if(!(np = nv_open(cp, (void*)0, NV_VARNAME|NV_NOADD)) || !(ap=nv_arrayptr(np)) || ap->fun || (sz=ap->nelem&(((1L<<ARRAY_BITS)-1))) < 2) - error(ERROR_exit(1), "%s must name an array containing at least two elements",cp); - n = staktell(); - sfprintf(stkstd,"%s.%s%c",NV_CLASS,np->nvname,0); - tp = nv_open(stakptr(n), shp->var_tree, NV_VARNAME); - stakseek(n); - n = sz; - i = 0; - nv_onattr(tp, NV_UINT16); - nv_putval(tp, (char*)&i, NV_INTEGER); - nv_putsub(np, (char*)0, ARRAY_SCAN); - do - { - sz += strlen(nv_getval(np)); - } - while(nv_nextsub(np)); - sz += n*sizeof(char*); - if(!(ep = newof(0,struct Enum,1,sz))) - error(ERROR_system(1), "out of space"); - ep->iflag = iflag; - ep->nelem = n; - cp = (char*)&ep->values[n+1]; - nv_putsub(np, (char*)0, ARRAY_SCAN); - ep->values[n] = 0; - i = 0; - do - { - ep->values[i++] = cp; - sp = nv_getval(np); - n = strlen(sp); - memcpy(cp,sp,n+1); - cp += n+1; - } - while(nv_nextsub(np)); - ep->hdr.dsize = sizeof(struct Enum)+sz; - ep->hdr.disc = &ENUM_disc; - ep->hdr.type = tp; - nv_onattr(tp, NV_RDONLY); - nv_disc(tp, &ep->hdr,NV_FIRST); - memset(&optdisc,0,sizeof(optdisc)); - optdisc.opt.infof = enuminfo; - optdisc.np = tp; - nv_addtype(tp, enum_type, &optdisc.opt, sizeof(optdisc)); - } - return error_info.errors != 0; -} - -#ifdef STANDALONE -void lib_init(int flag, void* context) -{ - Shell_t *shp = ((Shbltin_t*)context)->shp; - Namval_t *mp,*bp; - if(flag) - return; - bp = sh_addbuiltin("Enum", enum_create, (void*)0); - mp = nv_search("typeset",shp->bltin_tree,0); - nv_onattr(bp,nv_isattr(mp,NV_PUBLIC)); -} -#endif |