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:
tg
2015-04-29 20:07:35 +00:00
parent 3eb806b72b
commit 609b311919
10 changed files with 90 additions and 74 deletions

20
shf.c
View File

@ -25,7 +25,7 @@
#include "sh.h"
__RCSID("$MirOS: src/bin/mksh/shf.c,v 1.64 2015/02/06 10:09:07 tg Exp $");
__RCSID("$MirOS: src/bin/mksh/shf.c,v 1.65 2015/04/29 20:07:35 tg Exp $");
/* flags to shf_emptybuf() */
#define EB_READSW 0x01 /* about to switch to reading */
@ -847,11 +847,11 @@ shf_vfprintf(struct shf *shf, const char *fmt, va_list args)
if (ksh_isdigit(c)) {
bool overflowed = false;
tmp = c - '0';
tmp = ksh_numdig(c);
while (c = *fmt++, ksh_isdigit(c)) {
if (notok2mul(2147483647, tmp, 10))
overflowed = true;
tmp = tmp * 10 + c - '0';
tmp = tmp * 10 + ksh_numdig(c);
}
--fmt;
if (overflowed)
@ -872,7 +872,7 @@ shf_vfprintf(struct shf *shf, const char *fmt, va_list args)
/* nasty format */
break;
if (c >= 'A' && c <= 'Z') {
if (ksh_isupper(c)) {
flags |= FL_UPPER;
c = ksh_tolower(c);
}
@ -917,7 +917,7 @@ shf_vfprintf(struct shf *shf, const char *fmt, va_list args)
/* FALLTHROUGH */
case 'u':
do {
*--cp = lnum % 10 + '0';
*--cp = digits_lc[lnum % 10];
lnum /= 10;
} while (lnum);
@ -933,7 +933,7 @@ shf_vfprintf(struct shf *shf, const char *fmt, va_list args)
case 'o':
do {
*--cp = (lnum & 0x7) + '0';
*--cp = digits_lc[lnum & 0x7];
lnum >>= 3;
} while (lnum);
@ -945,7 +945,7 @@ shf_vfprintf(struct shf *shf, const char *fmt, va_list args)
const char *digits = (flags & FL_UPPER) ?
digits_uc : digits_lc;
do {
*--cp = digits[lnum & 0xf];
*--cp = digits[lnum & 0xF];
lnum >>= 4;
} while (lnum);
@ -1013,7 +1013,7 @@ shf_vfprintf(struct shf *shf, const char *fmt, va_list args)
s++;
nwritten++;
if (--precision > 0 &&
(*s | 0x20) == 'x') {
ksh_eq(*s, 'X', 'x')) {
shf_putc(*s, shf);
s++;
precision--;
@ -1025,8 +1025,10 @@ shf_vfprintf(struct shf *shf, const char *fmt, va_list args)
c = flags & FL_ZERO ? '0' : ' ';
if (field < 0) {
nwritten += -field;
for ( ; field < 0 ; field++)
while (field < 0) {
shf_putc(c, shf);
++field;
}
}
} else
c = ' ';