more low-hanging fruits for EBCDIC; notes:
• ord() new, From: Daniel Richard G. <skunk@iSKUNK.ORG> ‣ used in some places • (c - '0') → ksh_numdig(c) # may take *x++ argument • (c - 'A') → ksh_numuc(c) # may NOT take *x+= argument ‣ idem for ksh_numlc(c) and 'a' ‣ these need changing for EBCDIC ‣ add testsuite for this • use macros more, they exist already often • use digits_lc[foo] instead of ('0' + foo), especially for letters • caught another ksh_eq case… • also caught a maybe-UB overflow check, but we don’t have TIME_T_MAX ☹
This commit is contained in:
34
main.c
34
main.c
@ -34,7 +34,7 @@
|
||||
#include <locale.h>
|
||||
#endif
|
||||
|
||||
__RCSID("$MirOS: src/bin/mksh/main.c,v 1.292 2015/04/19 18:50:37 tg Exp $");
|
||||
__RCSID("$MirOS: src/bin/mksh/main.c,v 1.293 2015/04/29 20:07:33 tg Exp $");
|
||||
|
||||
extern char **environ;
|
||||
|
||||
@ -1459,7 +1459,7 @@ check_fd(const char *name, int mode, const char **emsgp)
|
||||
if (name[0] == 'p' && !name[1])
|
||||
return (coproc_getfd(mode, emsgp));
|
||||
while (ksh_isdigit(*name)) {
|
||||
fd = (fd * 10) + *name - '0';
|
||||
fd = fd * 10 + ksh_numdig(*name);
|
||||
if (fd >= FDBASE) {
|
||||
if (emsgp)
|
||||
*emsgp = "file descriptor too large";
|
||||
@ -1613,28 +1613,20 @@ maketemp(Area *ap, Temp_type type, struct temp **tlist)
|
||||
memcpy(cp, "/shXXXXXX.tmp", 14);
|
||||
/* point to the first of six Xes */
|
||||
cp += 3;
|
||||
/* generate random part of filename */
|
||||
len = -1;
|
||||
do {
|
||||
i = rndget() % 36;
|
||||
cp[++len] = i < 26 ? 'a' + i : '0' + i - 26;
|
||||
} while (len < 5);
|
||||
|
||||
/* cyclically attempt to open a temporary file */
|
||||
while ((i = open(tp->tffn, O_CREAT | O_EXCL | O_RDWR | O_BINARY,
|
||||
0600)) < 0) {
|
||||
if (errno != EEXIST)
|
||||
do {
|
||||
/* generate random part of filename */
|
||||
len = 0;
|
||||
do {
|
||||
cp[len++] = digits_lc[rndget() % 36];
|
||||
} while (len < 6);
|
||||
|
||||
/* check if this one works */
|
||||
if ((i = open(tp->tffn, O_CREAT | O_EXCL | O_RDWR | O_BINARY,
|
||||
0600)) < 0 && errno != EEXIST)
|
||||
goto maketemp_out;
|
||||
/* count down from z to a then from 9 to 0 */
|
||||
while (cp[len] == '0')
|
||||
if (!len--)
|
||||
goto maketemp_out;
|
||||
if (cp[len] == 'a')
|
||||
cp[len] = '9';
|
||||
else
|
||||
--cp[len];
|
||||
/* do another cycle */
|
||||
}
|
||||
} while (i < 0);
|
||||
|
||||
if (type == TT_FUNSUB) {
|
||||
/* map us high and mark as close-on-exec */
|
||||
|
Reference in New Issue
Block a user