From e550c98d69a270a9c6623fe1fd602b5081f4b46c Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Tue, 11 Sep 2012 16:02:41 +0000 Subject: 30647, 30649: allow underscores in numeric constants --- Src/utils.c | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) (limited to 'Src/utils.c') diff --git a/Src/utils.c b/Src/utils.c index d35ca1dfd..cadb06f61 100644 --- a/Src/utils.c +++ b/Src/utils.c @@ -2030,13 +2030,20 @@ skipparens(char inpar, char outpar, char **s) return level; } +/**/ +mod_export zlong +zstrtol(const char *s, char **t, int base) +{ + return zstrtol_underscore(s, t, base, 0); +} + /* Convert string to zlong (see zsh.h). This function (without the z) * * is contained in the ANSI standard C library, but a lot of them seem * * to be broken. */ /**/ mod_export zlong -zstrtol(const char *s, char **t, int base) +zstrtol_underscore(const char *s, char **t, int base, int underscore) { const char *inp, *trunc = NULL; zulong calc = 0, newcalc = 0; @@ -2062,22 +2069,24 @@ zstrtol(const char *s, char **t, int base) if (base < 2 || base > 36) { zerr("invalid base (must be 2 to 36 inclusive): %d", base); return (zlong)0; - } else if (base <= 10) - for (; *s >= '0' && *s < ('0' + base); s++) { - if (trunc) + } else if (base <= 10) { + for (; (*s >= '0' && *s < ('0' + base)) || + (underscore && *s == '_'); s++) { + if (trunc || *s == '_') continue; newcalc = calc * base + *s - '0'; if (newcalc < calc) { - trunc = s; - continue; + trunc = s; + continue; } calc = newcalc; } - else + } else { for (; idigit(*s) || (*s >= 'a' && *s < ('a' + base - 10)) - || (*s >= 'A' && *s < ('A' + base - 10)); s++) { - if (trunc) + || (*s >= 'A' && *s < ('A' + base - 10)) + || (underscore && *s == '_'); s++) { + if (trunc || *s == '_') continue; newcalc = calc*base + (idigit(*s) ? (*s - '0') : (*s & 0x1f) + 9); if (newcalc < calc) @@ -2087,6 +2096,7 @@ zstrtol(const char *s, char **t, int base) } calc = newcalc; } + } /* * Special case: check for a number that was just too long for -- cgit v1.2.3 From f73d92f5dc6ed8062f04b03757f6895b6a74e4e8 Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Sun, 16 Dec 2012 18:43:24 +0000 Subject: add missing mod_export --- ChangeLog | 4 +++- Src/utils.c | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) (limited to 'Src/utils.c') diff --git a/ChangeLog b/ChangeLog index a318c777c..37cd7ca3c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,8 @@ * unposted: README, Config/version.mk, Etc/FAQ.yo for 5.0.0-test-1. + * unposted: Src/utils.c: missing mod_export. + 2012-12-13 Peter Stephenson * 30876: Src/exec.c, Test/A06assign.ztst, Test/C03traps.ztst: @@ -379,5 +381,5 @@ ***************************************************** * This is used by the shell to define $ZSH_PATCHLEVEL -* $Revision: 1.5769 $ +* $Revision: 1.5770 $ ***************************************************** diff --git a/Src/utils.c b/Src/utils.c index cadb06f61..26e2a5c2c 100644 --- a/Src/utils.c +++ b/Src/utils.c @@ -2887,7 +2887,7 @@ zjoin(char **arr, int delim, int heap) * of items into an array of strings. */ /**/ -char ** +mod_export char ** colonsplit(char *s, int uniq) { int ct; -- cgit v1.2.3