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/getoptl.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/getoptl.c')
-rw-r--r-- | usr/src/lib/libast/common/comp/getoptl.c | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/usr/src/lib/libast/common/comp/getoptl.c b/usr/src/lib/libast/common/comp/getoptl.c new file mode 100644 index 0000000000..4aec979ffa --- /dev/null +++ b/usr/src/lib/libast/common/comp/getoptl.c @@ -0,0 +1,150 @@ +/*********************************************************************** +* * +* 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 + +#include <ast.h> + +#undef _BLD_ast /* enable ast imports since we're user static */ + +#include <error.h> +#include <option.h> +#include <getopt.h> +#include <ctype.h> + +static const char* lastoptstring; +static const struct option* lastlongopts; +static char* usage; +static Sfio_t* up; + +static int lastoptind; + +static int +golly(int argc, char* const* argv, const char* optstring, const struct option* longopts, int* longindex, int flags) +{ + register char* s; + register const struct option* o; + register int c; + char* t; + + if (!up || optstring != lastoptstring || longopts != lastlongopts) + { + if (!up && !(up = sfstropen())) + return -1; + sfprintf(up, "[-1p%d]", flags); + t = strdup(optstring); + for (o = longopts; o->name; o++) + { + if (o->flag || o->val <= 0 || o->val > UCHAR_MAX || !isalnum(o->val)) + sfprintf(up, "\n[%d:%s]", UCHAR_MAX + 1 + (o - longopts), o->name); + else + { + sfprintf(up, "\n[%c:%s]", o->val, o->name); + if (s = strchr(t, o->val)) + { + *s++ = ' '; + if (*s == ':') + { + *s++ = ' '; + if (*s == ':') + *s = ' '; + } + } + } + if (o->has_arg) + { + sfputc(up, ':'); + if (o->has_arg == optional_argument) + sfputc(up, '?'); + sfprintf(up, "[string]"); + } + } + s = t; + while (c = *s++) + if (c != ' ') + { + sfprintf(up, "\n[%c]", c); + if (*s == ':') + { + sfputc(up, *s); + if (*++s == ':') + { + sfputc(up, '?'); + s++; + } + sfputc(up, '['); + sfputc(up, ']'); + } + } + sfputc(up, '\n'); + if (!(usage = sfstruse(up))) + return -1; + lastoptstring = optstring; + lastlongopts = longopts; + } + opt_info.index = (optind > 1 || optind == lastoptind) ? optind : 0; + if (opt_info.index >= argc || !(c = optget((char**)argv, usage))) + { + sfstrclose(up); + up = 0; + c = -1; + } + else + { + if (c == ':' || c == '?') + { + if (opterr && (!optstring || *optstring != ':')) + { + if (!error_info.id) + error_info.id = argv[0]; + errormsg(NiL, c == '?' ? (ERROR_USAGE|4) : 2, "%s", opt_info.arg); + } + optopt = opt_info.option[1]; + c = '?'; + } + optarg = opt_info.arg; + if (c < 0) + { + o = longopts - c - UCHAR_MAX - 1; + if (o->flag) + { + *o->flag = o->val; + c = 0; + } + else + c = o->val; + } + } + lastoptind = optind = opt_info.index; + return c; +} + +extern int +getopt_long(int argc, char* const* argv, const char* optstring, const struct option* longopts, int* longindex) +{ + return golly(argc, argv, optstring, longopts, longindex, 2); +} + +extern int +getopt_long_only(int argc, char* const* argv, const char* optstring, const struct option* longopts, int* longindex) +{ + return golly(argc, argv, optstring, longopts, longindex, 1); +} |