From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17754 invoked from network); 1 Dec 1996 16:05:18 -0000 Received: from euclid.skiles.gatech.edu (list@130.207.146.50) by coral.primenet.com.au with SMTP; 1 Dec 1996 16:05:18 -0000 Received: (from list@localhost) by euclid.skiles.gatech.edu (8.7.3/8.7.3) id KAA06234; Sun, 1 Dec 1996 10:46:07 -0500 (EST) Resent-Date: Sun, 1 Dec 1996 10:46:07 -0500 (EST) From: Zefram Message-Id: <13442.199612011546@stone.dcs.warwick.ac.uk> Subject: more metafied options To: zsh-workers@math.gatech.edu (Z Shell workers mailing list) Date: Sun, 1 Dec 1996 15:46:36 +0000 (GMT) X-Patch: 139 X-Loop: zefram@dcs.warwick.ac.uk X-Stardate: [-31]8508.28 X-US-Congress: Moronic fuckers Content-Type: text Resent-Message-ID: <"ou3Cv1.0.HX1.wWQeo"@euclid> Resent-From: zsh-workers@math.gatech.edu X-Mailing-List: archive/latest/2508 X-Loop: zsh-workers@math.gatech.edu Precedence: list Resent-Sender: zsh-workers-request@math.gatech.edu -----BEGIN PGP SIGNED MESSAGE----- Grr. set, setopt, ulimit, compctl and getopts all have their own option processing code, all of which need fixing to handle metafied options. In the case of getopts, slightly more extensive modification is necessary in order to make it fully 8-bit clean. This patch also regularises the "bad option" error messages, which were previously evenly divided between "-%c" and "%c" for reporting the option letter. -zefram Index: Src/builtin.c =================================================================== RCS file: /home/zefram/usr/cvsroot/zsh/Src/builtin.c,v retrieving revision 1.37 diff -c -r1.37 builtin.c *** Src/builtin.c 1996/11/29 15:18:27 1.37 --- Src/builtin.c 1996/11/30 23:30:47 *************** *** 112,118 **** if (*arg) { if(*arg == Meta) *++arg ^= 32; ! zerr("bad option: %c", NULL, *arg); zsfree(xarg); return 1; } --- 112,118 ---- if (*arg) { if(*arg == Meta) *++arg ^= 32; ! zerr("bad option: -%c", NULL, *arg); zsfree(xarg); return 1; } *************** *** 289,294 **** --- 289,296 ---- if(!args[0][1]) *args = "--"; while (*++*args) { + if(**args == Meta) + *++*args ^= 32; if(**args != '-' || action) hadopt = 1; /* The pseudo-option `--' signifies the end of options. */ *************** *** 394,399 **** --- 396,403 ---- if(!args[0][1]) *args = "--"; while (*++*args) { + if(**args == Meta) + *++*args ^= 32; /* The pseudo-option `--' signifies the end of options. */ if (**args == '-') { args++; *************** *** 1542,1548 **** for (; !ready && argv[0] && argv[0][0] == '-' && (argv[0][1] || !first);) { if (!argv[0][1]) *argv = "-+"; ! while (!ready && *++(*argv)) switch (**argv) { case 'f': cct.mask |= CC_FILES; --- 1546,1554 ---- for (; !ready && argv[0] && argv[0][0] == '-' && (argv[0][1] || !first);) { if (!argv[0][1]) *argv = "-+"; ! while (!ready && *++(*argv)) { ! if(**argv == Meta) ! *++*argv ^= 32; switch (**argv) { case 'f': cct.mask |= CC_FILES; *************** *** 1813,1822 **** if (!first && (**argv == '-' || **argv == '+')) (*argv)--, argv--, ready = 1; else { ! zwarnnam(name, "bad option: %c", NULL, **argv); return 1; } } if (*++argv && (!ready || ready == 2) && **argv == '+' && !argv[0][1]) { --- 1819,1829 ---- if (!first && (**argv == '-' || **argv == '+')) (*argv)--, argv--, ready = 1; else { ! zwarnnam(name, "bad option: -%c", NULL, **argv); return 1; } } + } if (*++argv && (!ready || ready == 2) && **argv == '+' && !argv[0][1]) { *************** *** 3893,3898 **** --- 3900,3907 ---- if (options && *options == '-') { argv++; while (*++options) { + if(*options == Meta) + *++options ^= 32; res = -1; switch (*options) { case 'H': *************** *** 3952,3958 **** # endif /* RLIMIT_VMEM */ default: /* unrecognised limit */ ! zwarnnam(name, "bad option: %c", NULL, *options); return 1; } if (options[1]) { --- 3961,3967 ---- # endif /* RLIMIT_VMEM */ default: /* unrecognised limit */ ! zwarnnam(name, "bad option: -%c", NULL, *options); return 1; } if (options[1]) { *************** *** 4516,4525 **** int bin_getopts(char *name, char **argv, char *ops, int func) { ! char *optstr = *argv++, *var = *argv++; char **args = (*argv) ? argv : pparams; static int optcind = 1, quiet; ! char *str, optbuf[3], *opch = optbuf + 1; /* zoptind keeps count of the current argument number */ if (zoptind < 1) --- 4525,4535 ---- int bin_getopts(char *name, char **argv, char *ops, int func) { ! int lenstr, lenoptstr, i; ! char *optstr = unmetafy(*argv++, &lenoptstr), *var = *argv++; char **args = (*argv) ? argv : pparams; static int optcind = 1, quiet; ! char *str, optbuf[2], *opch = optbuf + 1; /* zoptind keeps count of the current argument number */ if (zoptind < 1) *************** *** 4528,4534 **** if (zoptind == 1) quiet = 0; optbuf[0] = '+'; - optbuf[1] = optbuf[2] = '\0'; zsfree(zoptarg); zoptarg = ztrdup(""); setsparam(var, ztrdup("")); --- 4538,4543 ---- *************** *** 4538,4546 **** } if (zoptind > arrlen(args)) return 1; ! str = args[zoptind - 1]; ! if ((*str != '+' && *str != '-') || optcind >= (int)strlen(str) || ! !strcmp("--", str)) { /* current argument doesn't contain options, or optcind is impossibly large */ if (*str == '+' || *str == '-') --- 4547,4555 ---- } if (zoptind > arrlen(args)) return 1; ! str = unmetafy(args[zoptind - 1], &lenstr); ! if ((*str != '+' && *str != '-') || optcind >= lenstr || ! (lenstr == 2 && str[0] == '-' && str[1] == '-')) { /* current argument doesn't contain options, or optcind is impossibly large */ if (*str == '+' || *str == '-') *************** *** 4553,4598 **** if (!optcind) optcind = 1; *opch = str[optcind++]; ! if (!args[zoptind - 1][optcind]) { ! zoptind++; optcind = 0; } /* look for option in the provided optstr */ ! for (; *optstr; optstr++) ! if (*opch == *optstr) break; ! if (!*optstr) { /* not a valid option */ setsparam(var, ztrdup("?")); if (quiet) { zsfree(zoptarg); ! zoptarg = ztrdup(opch); return 0; } ! zerr("bad option: %c", NULL, *opch); errflag = 0; return 0; } /* copy option into specified parameter, with + if required */ ! setsparam(var, ztrdup(opch - (*str == '+'))); /* handle case of an expected extra argument */ if (optstr[1] == ':') { if (!args[zoptind - 1]) { /* no extra argument was provided */ if (quiet) { zsfree(zoptarg); ! zoptarg = ztrdup(opch); setsparam(var, ztrdup(":")); return 0; } setsparam(var, ztrdup("?")); ! zerr("argument expected after %c option", NULL, *opch); errflag = 0; return 0; } /* skip over the extra argument */ zsfree(zoptarg); ! zoptarg = ztrdup(args[zoptind - 1] + optcind); zoptind++; optcind = 0; } --- 4562,4608 ---- if (!optcind) optcind = 1; *opch = str[optcind++]; ! if (optcind == lenstr) { ! if(args[zoptind++]) ! str = unmetafy(args[zoptind - 1], &lenstr); optcind = 0; } /* look for option in the provided optstr */ ! for (i = 0; i != lenoptstr; i++) ! if (*opch == optstr[i]) break; ! if (i == lenoptstr) { /* not a valid option */ setsparam(var, ztrdup("?")); if (quiet) { zsfree(zoptarg); ! zoptarg = metafy(opch, 1, META_DUP); return 0; } ! zerr("bad option: -%c", NULL, *opch); errflag = 0; return 0; } /* copy option into specified parameter, with + if required */ ! setsparam(var, metafy(opch - (*str == '+'), 1 + (*str == '+'), META_DUP)); /* handle case of an expected extra argument */ if (optstr[1] == ':') { if (!args[zoptind - 1]) { /* no extra argument was provided */ if (quiet) { zsfree(zoptarg); ! zoptarg = metafy(opch, 1, META_DUP); setsparam(var, ztrdup(":")); return 0; } setsparam(var, ztrdup("?")); ! zerr("argument expected after -%c option", NULL, *opch); errflag = 0; return 0; } /* skip over the extra argument */ zsfree(zoptarg); ! zoptarg = metafy(str + optcind, lenstr - optcind, META_DUP); zoptind++; optcind = 0; } -----BEGIN PGP SIGNATURE----- Version: 2.6.2 iQCVAwUBMqDEc3D/+HJTpU/hAQGLpQP7BV7tKjdTykU6Fk7HH6lXamn+mP7s1gde Ny8c4fTH3+ZGRo+xbPC6+2rnfXFPadrECqaOsPHXJduNh6IH4JG5j0s5RKG7Dpmw t2KJ4wDadHZDJqMqV1nsn9JUADuuVbIzjbdsEEF0bORVVk2psAlIyLlmWYacU8Hv ZzdeSzXtRMg= =J8JO -----END PGP SIGNATURE-----