|
@@ -6070,26 +6070,6 @@ static struct ifsregion *ifslastp;
|
|
|
/* holds expanded arg list */
|
|
|
static struct arglist exparg;
|
|
|
|
|
|
-/*
|
|
|
- * Our own itoa().
|
|
|
- * cvtnum() is used even if math support is off (to prepare $? values and such).
|
|
|
- */
|
|
|
-static int
|
|
|
-cvtnum(arith_t num)
|
|
|
-{
|
|
|
- int len;
|
|
|
-
|
|
|
- /* 32-bit and wider ints require buffer size of bytes*3 (or less) */
|
|
|
- len = sizeof(arith_t) * 3;
|
|
|
- /* If narrower: worst case, 1-byte ints: need 5 bytes: "-127<NUL>" */
|
|
|
- if (sizeof(arith_t) < 4) len += 2;
|
|
|
-
|
|
|
- expdest = makestrspace(len, expdest);
|
|
|
- len = fmtstr(expdest, len, ARITH_FMT, num);
|
|
|
- STADJUST(len, expdest);
|
|
|
- return len;
|
|
|
-}
|
|
|
-
|
|
|
/*
|
|
|
* Break the argument string into pieces based upon IFS and add the
|
|
|
* strings to the argument list. The regions of the string to be
|
|
@@ -6347,16 +6327,18 @@ preglob(const char *pattern, int flag)
|
|
|
/*
|
|
|
* Put a string on the stack.
|
|
|
*/
|
|
|
-static void
|
|
|
+static size_t
|
|
|
memtodest(const char *p, size_t len, int flags)
|
|
|
{
|
|
|
int syntax = flags & EXP_QUOTED ? DQSYNTAX : BASESYNTAX;
|
|
|
char *q;
|
|
|
+ char *s;
|
|
|
|
|
|
if (!len)
|
|
|
- return;
|
|
|
+ return 0;
|
|
|
|
|
|
q = makestrspace(len * 2, expdest);
|
|
|
+ s = q;
|
|
|
|
|
|
do {
|
|
|
unsigned char c = *p++;
|
|
@@ -6375,6 +6357,7 @@ memtodest(const char *p, size_t len, int flags)
|
|
|
} while (--len);
|
|
|
|
|
|
expdest = q;
|
|
|
+ return q - s;
|
|
|
}
|
|
|
|
|
|
static size_t
|
|
@@ -6385,6 +6368,22 @@ strtodest(const char *p, int flags)
|
|
|
return len;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Our own itoa().
|
|
|
+ * cvtnum() is used even if math support is off (to prepare $? values and such).
|
|
|
+ */
|
|
|
+static int
|
|
|
+cvtnum(arith_t num, int flags)
|
|
|
+{
|
|
|
+ /* 32-bit and wider ints require buffer size of bytes*3 (or less) */
|
|
|
+ /* If narrower: worst case, 1-byte ints: need 5 bytes: "-127<NUL>" */
|
|
|
+ int len = (sizeof(arith_t) >= 4) ? sizeof(arith_t) * 3 : sizeof(arith_t) * 3 + 2;
|
|
|
+ char buf[len];
|
|
|
+
|
|
|
+ len = fmtstr(buf, len, ARITH_FMT, num);
|
|
|
+ return memtodest(buf, len, flags);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Record the fact that we have to scan this region of the
|
|
|
* string for IFS characters.
|
|
@@ -6683,7 +6682,7 @@ expari(int flag)
|
|
|
if (flag & QUOTES_ESC)
|
|
|
rmescapes(p + 1, 0, NULL);
|
|
|
|
|
|
- len = cvtnum(ash_arith(p + 1));
|
|
|
+ len = cvtnum(ash_arith(p + 1), flag);
|
|
|
|
|
|
if (!(flag & EXP_QUOTED))
|
|
|
recordregion(begoff, begoff + len, 0);
|
|
@@ -7328,7 +7327,7 @@ varvalue(char *name, int varflags, int flags, int quoted)
|
|
|
if (num == 0)
|
|
|
return -1;
|
|
|
numvar:
|
|
|
- len = cvtnum(num);
|
|
|
+ len = cvtnum(num, flags);
|
|
|
goto check_1char_name;
|
|
|
case '-':
|
|
|
expdest = makestrspace(NOPTS, expdest);
|
|
@@ -7494,7 +7493,7 @@ evalvar(char *p, int flag)
|
|
|
varunset(p, var, 0, 0);
|
|
|
|
|
|
if (subtype == VSLENGTH) {
|
|
|
- cvtnum(varlen > 0 ? varlen : 0);
|
|
|
+ cvtnum(varlen > 0 ? varlen : 0, flag);
|
|
|
goto record;
|
|
|
}
|
|
|
|