zsh-workers
 help / color / mirror / code / Atom feed
* Re: zsh-2.6-beta9 released
       [not found] <9505310625.AA05359@redwood.skiles.gatech.edu>
@ 1995-05-31 15:23 ` Mark Borges
  0 siblings, 0 replies; only message in thread
From: Mark Borges @ 1995-05-31 15:23 UTC (permalink / raw)
  To: ZSH mailing list

For those who want to try this release out, but want to avoid the
strtol lossage (which has broken numeric range and brace expansion
since beta7) the following patch will make beta9 use the old way
(i.e., zstrtol).

Note this is a temporary fix until Richard decides the right thing to
do (use zstrtol or somehow work around the (broken?) system supplied
strtol) and adjusts configure accordingly. I did nothing w.r.t. the
configure script, i.e., if configure detects you have strtol, you will
have to manually edit config.h and undef the HAVE_STRTOL line:

/* Define if you have the strtol function.  */
/* #define HAVE_STRTOL 1 */

  -mb-

-------------------------------- cut here --------------------------------
diff -c Src.orig/builtin.c Src/builtin.c
*** Src.orig/builtin.c	Tue May 30 22:10:07 1995
--- Src/builtin.c	Wed May 31 06:58:22 1995
***************
*** 1249,1255 ****
  	doprintdir++;
  	if (argv[0][1] && argv[0][0] == (isset(PUSHDMINUS) ? '-' : '+')) {
  	    /* popping directory, specified with + */
! 	    dd = strtol(argv[0] + 1, &end, 10) - 1;
  	    if (dd >= 0 && *end == '\0') {
  		for (n = firstnode(dirstack); n && dd; dd--, incnode(n));
  		if (!n) {
--- 1249,1255 ----
  	doprintdir++;
  	if (argv[0][1] && argv[0][0] == (isset(PUSHDMINUS) ? '-' : '+')) {
  	    /* popping directory, specified with + */
! 	    dd = zstrtol(argv[0] + 1, &end, 10) - 1;
  	    if (dd >= 0 && *end == '\0') {
  		for (n = firstnode(dirstack); n && dd; dd--, incnode(n));
  		if (!n) {
***************
*** 1260,1266 ****
  	    }
  	} else if (argv[0][1] && argv[0][0] == (isset(PUSHDMINUS) ? '+' : '-')) {
  	    /* popping directory, specified with - */
! 	    dd = strtol(argv[0] + 1, &end, 10);
  	    if (*end == '\0') {
  		for (n = lastnode(dirstack); n != (Lknode) dirstack && dd;
  		     dd--, n = prevnode(n));
--- 1260,1266 ----
  	    }
  	} else if (argv[0][1] && argv[0][0] == (isset(PUSHDMINUS) ? '+' : '-')) {
  	    /* popping directory, specified with - */
! 	    dd = zstrtol(argv[0] + 1, &end, 10);
  	    if (*end == '\0') {
  		for (n = lastnode(dirstack); n != (Lknode) dirstack && dd;
  		     dd--, n = prevnode(n));
***************
*** 4071,4084 ****
  	    hours with the `m' and `h' modifiers, and `:' may be used to add
  	    together more than one of these.  It's easier to understand from
  	    the code: */
! 	    val = strtol(s, &s, 10);
  	    if (*s)
  		if ((*s == 'h' || *s == 'H') && !s[1])
  		    val *= 3600L;
  		else if ((*s == 'm' || *s == 'M') && !s[1])
  		    val *= 60L;
  		else if (*s == ':')
! 		    val = val * 60 + strtol(s + 1, &s, 10);
  		else {
  		    zwarnnam("limit", "unknown scaling factor: %s", s, 0);
  		    return 1;
--- 4071,4084 ----
  	    hours with the `m' and `h' modifiers, and `:' may be used to add
  	    together more than one of these.  It's easier to understand from
  	    the code: */
! 	    val = zstrtol(s, &s, 10);
  	    if (*s)
  		if ((*s == 'h' || *s == 'H') && !s[1])
  		    val *= 3600L;
  		else if ((*s == 'm' || *s == 'M') && !s[1])
  		    val *= 60L;
  		else if (*s == ':')
! 		    val = val * 60 + zstrtol(s + 1, &s, 10);
  		else {
  		    zwarnnam("limit", "unknown scaling factor: %s", s, 0);
  		    return 1;
***************
*** 4088,4105 ****
  	else if (lim == RLIMIT_NPROC)
  	    /* pure numeric resource -- only a straight decimal number is
  	    permitted. */
! 	    val = strtol(s, &s, 10);
  # endif /* RLIMIT_NPROC */
  # ifdef RLIMIT_NOFILE
  	else if (lim == RLIMIT_NOFILE)
  	    /* pure numeric resource -- only a straight decimal number is
  	    permitted. */
! 	    val = strtol(s, &s, 10);
  # endif /* RLIMIT_NOFILE */
  	else {
  	    /* memory-type resource -- `k' and `M' modifiers are permitted,
  	    meaning (respectively) 2^10 and 2^20. */
! 	    val = strtol(s, &s, 10);
  	    if (!*s || ((*s == 'k' || *s == 'K') && !s[1]))
  		val *= 1024L;
  	    else if ((*s == 'M' || *s == 'm') && !s[1])
--- 4088,4105 ----
  	else if (lim == RLIMIT_NPROC)
  	    /* pure numeric resource -- only a straight decimal number is
  	    permitted. */
! 	    val = zstrtol(s, &s, 10);
  # endif /* RLIMIT_NPROC */
  # ifdef RLIMIT_NOFILE
  	else if (lim == RLIMIT_NOFILE)
  	    /* pure numeric resource -- only a straight decimal number is
  	    permitted. */
! 	    val = zstrtol(s, &s, 10);
  # endif /* RLIMIT_NOFILE */
  	else {
  	    /* memory-type resource -- `k' and `M' modifiers are permitted,
  	    meaning (respectively) 2^10 and 2^20. */
! 	    val = zstrtol(s, &s, 10);
  	    if (!*s || ((*s == 'k' || *s == 'K') && !s[1]))
  		val *= 1024L;
  	    else if ((*s == 'M' || *s == 'm') && !s[1])
***************
*** 5466,5477 ****
  	hour:minute offset from the current time.  Once the hour and minute
  	numbers have been extracted, and the format verified, the resulting
  	offset is simply added to the current time. */
! 	h = strtol(s + 1, &s, 10);
  	if (*s != ':') {
  	    zwarnnam("sched", "bad time specifier", NULL, 0);
  	    return 1;
  	}
! 	m = strtol(s + 1, &s, 10);
  	if (*s) {
  	    zwarnnam("sched", "bad time specifier", NULL, 0);
  	    return 1;
--- 5466,5477 ----
  	hour:minute offset from the current time.  Once the hour and minute
  	numbers have been extracted, and the format verified, the resulting
  	offset is simply added to the current time. */
! 	h = zstrtol(s + 1, &s, 10);
  	if (*s != ':') {
  	    zwarnnam("sched", "bad time specifier", NULL, 0);
  	    return 1;
  	}
! 	m = zstrtol(s + 1, &s, 10);
  	if (*s) {
  	    zwarnnam("sched", "bad time specifier", NULL, 0);
  	    return 1;
***************
*** 5482,5493 ****
  	This is in hour:minute format, optionally followed by a string starting
  	with `a' or `p' (for a.m. or p.m.).  Characters after the `a' or `p'
  	are ignored. */
! 	h = strtol(s, &s, 10);
  	if (*s != ':') {
  	    zwarnnam("sched", "bad time specifier", NULL, 0);
  	    return 1;
  	}
! 	m = strtol(s + 1, &s, 10);
  	if (*s && *s != 'a' && *s != 'A' && *s != 'p' && *s != 'P') {
  	    zwarnnam("sched", "bad time specifier", NULL, 0);
  	    return 1;
--- 5482,5493 ----
  	This is in hour:minute format, optionally followed by a string starting
  	with `a' or `p' (for a.m. or p.m.).  Characters after the `a' or `p'
  	are ignored. */
! 	h = zstrtol(s, &s, 10);
  	if (*s != ':') {
  	    zwarnnam("sched", "bad time specifier", NULL, 0);
  	    return 1;
  	}
! 	m = zstrtol(s + 1, &s, 10);
  	if (*s && *s != 'a' && *s != 'A' && *s != 'p' && *s != 'P') {
  	    zwarnnam("sched", "bad time specifier", NULL, 0);
  	    return 1;
***************
*** 5722,5728 ****
  
      if (idigit(*s)) {
  	/* Simple digital umask. */
! 	um = strtol(s, &s, 8);
  	if (*s) {
  	    zwarnnam(nam, "bad umask", NULL, 0);
  	    return 1;
--- 5722,5728 ----
  
      if (idigit(*s)) {
  	/* Simple digital umask. */
! 	um = zstrtol(s, &s, 8);
  	if (*s) {
  	    zwarnnam(nam, "bad umask", NULL, 0);
  	    return 1;
diff -c Src.orig/compat.c Src/compat.c
*** Src.orig/compat.c	Tue May 30 22:10:08 1995
--- Src/compat.c	Wed May 31 06:57:24 1995
***************
*** 35,41 ****
  
  #ifndef HAVE_STRTOL
  long
! strtol(char *s, char **t, int base)
  {
      long ret = 0;
  
--- 35,41 ----
  
  #ifndef HAVE_STRTOL
  long
! zstrtol(char *s, char **t, int base)
  {
      long ret = 0;
  
diff -c Src.orig/glob.c Src/glob.c
*** Src.orig/glob.c	Tue May 30 22:10:15 1995
--- Src/glob.c	Wed May 31 06:59:07 1995
***************
*** 815,821 ****
  	char *dots, *p;
  	Lknode olast = last;
  	/* Get the first number of the range */
! 	int rstart = strtol(str+1,&dots,10), rend = 0, err = 0, rev = 0;
  	int wid1 = (dots - str) - 1, wid2 = (str2 - dots) - 2;
  	int strp = str - str3;
        
--- 815,821 ----
  	char *dots, *p;
  	Lknode olast = last;
  	/* Get the first number of the range */
! 	int rstart = zstrtol(str+1,&dots,10), rend = 0, err = 0, rev = 0;
  	int wid1 = (dots - str) - 1, wid2 = (str2 - dots) - 2;
  	int strp = str - str3;
        
***************
*** 823,829 ****
  	    err++;
  	else {
  	    /* Get the last number of the range */
! 	    rend = strtol(dots+2,&p,10);
  	    if (p == dots+2 || p != str2)
  		err++;
  	}
--- 823,829 ----
  	    err++;
  	else {
  	    /* Get the last number of the range */
! 	    rend = zstrtol(dots+2,&p,10);
  	    if (p == dots+2 || p != str2)
  		err++;
  	}
***************
*** 1454,1460 ****
  	    if (*++pat == Outang || 
  		(*pat == '-' && pat[1] == Outang && ++pat)) {
  		/* <> or <->:  any number matches */
! 		(void)strtol(pptr, &ptr, 10);
  		if (ptr == pptr)
  		    break;
  		pptr = ptr;
--- 1454,1460 ----
  	    if (*++pat == Outang || 
  		(*pat == '-' && pat[1] == Outang && ++pat)) {
  		/* <> or <->:  any number matches */
! 		(void)zstrtol(pptr, &ptr, 10);
  		if (ptr == pptr)
  		    break;
  		pptr = ptr;
***************
*** 1467,1483 ****
  		 * t1 = number supplied:  must be positive, so use
  		 * unsigned arithmetic.
  		 */
! 		t1 = (unsigned long)strtol(pptr, &ptr, 10);
  		if (ptr == pptr)
  		    break;
  		pptr = ptr;
  		/* t2 = lower limit */
! 		t2 = (unsigned long)strtol(pat, &ptr, 10);
  		if (*ptr != '-' || (not3 = (ptr[1] == Outang)))
  				/* exact match or no upper limit */
  		    t3 = t2, pat = ptr + not3;
  		else		/* t3 = upper limit */
! 		    t3 = (unsigned long)strtol(ptr + 1, &pat, 10);
  		if (*pat++ != Outang)
  		    exit(21);
  		if (t1 < t2 || (!not3 && t1 > t3))
--- 1467,1483 ----
  		 * t1 = number supplied:  must be positive, so use
  		 * unsigned arithmetic.
  		 */
! 		t1 = (unsigned long)zstrtol(pptr, &ptr, 10);
  		if (ptr == pptr)
  		    break;
  		pptr = ptr;
  		/* t2 = lower limit */
! 		t2 = (unsigned long)zstrtol(pat, &ptr, 10);
  		if (*ptr != '-' || (not3 = (ptr[1] == Outang)))
  				/* exact match or no upper limit */
  		    t3 = t2, pat = ptr + not3;
  		else		/* t3 = upper limit */
! 		    t3 = (unsigned long)zstrtol(ptr + 1, &pat, 10);
  		if (*pat++ != Outang)
  		    exit(21);
  		if (t1 < t2 || (!not3 && t1 > t3))
diff -c Src.orig/math.c Src/math.c
*** Src.orig/math.c	Tue May 30 22:10:26 1995
--- Src/math.c	Wed May 31 06:59:23 1995
***************
*** 309,319 ****
  	case '[':
  	    unary = 0;
  	    {
! 		int base = strtol(ptr, &ptr, 10);
  
  		if (*ptr == ']')
  		    ptr++;
! 		yyval = strtol(ptr, &ptr, lastbase = base);
  		return NUM;
  	    }
  	case ' ':
--- 309,319 ----
  	case '[':
  	    unary = 0;
  	    {
! 		int base = zstrtol(ptr, &ptr, 10);
  
  		if (*ptr == ']')
  		    ptr++;
! 		yyval = zstrtol(ptr, &ptr, lastbase = base);
  		return NUM;
  	    }
  	case ' ':
***************
*** 331,341 ****
  	default:
  	    if (idigit(*--ptr)) {
  		unary = 0;
! 		yyval = strtol(ptr, &ptr, 0);
  
  		if (*ptr == '#') {
  		    ptr++;
! 		    yyval = strtol(ptr, &ptr, lastbase = yyval);
  		}
  		return NUM;
  	    }
--- 331,341 ----
  	default:
  	    if (idigit(*--ptr)) {
  		unary = 0;
! 		yyval = zstrtol(ptr, &ptr, 0);
  
  		if (*ptr == '#') {
  		    ptr++;
! 		    yyval = zstrtol(ptr, &ptr, lastbase = yyval);
  		}
  		return NUM;
  	    }
***************
*** 943,948 ****
       * This is only used when reading from strings outside the formula,
       * e.g. in parameter substitutions, so does not set lastbase.
       */
!     long num1 = strtol(s, &s, 10);
!     return (*s == '#' || *s == Pound) ? strtol(s+1, &s, num1) : num1;
  }
--- 943,948 ----
       * This is only used when reading from strings outside the formula,
       * e.g. in parameter substitutions, so does not set lastbase.
       */
!     long num1 = zstrtol(s, &s, 10);
!     return (*s == '#' || *s == Pound) ? zstrtol(s+1, &s, num1) : num1;
  }
diff -c Src.orig/prototypes.h Src/prototypes.h
*** Src.orig/prototypes.h	Tue May 30 22:09:46 1995
--- Src/prototypes.h	Wed May 31 06:57:36 1995
***************
*** 122,128 ****
  /**************************************************/
  /*** prototypes for functions built in compat.c ***/
  #ifndef HAVE_STRTOL
! extern long strtol _((char *s, char **t, int base));
  #endif
  
  #ifndef HAVE_STRSTR
--- 122,128 ----
  /**************************************************/
  /*** prototypes for functions built in compat.c ***/
  #ifndef HAVE_STRTOL
! extern long zstrtol _((char *s, char **t, int base));
  #endif
  
  #ifndef HAVE_STRSTR
diff -c Src.orig/subst.c Src/subst.c
*** Src.orig/subst.c	Tue May 30 22:10:38 1995
--- Src/subst.c	Wed May 31 06:59:34 1995
***************
*** 263,269 ****
  	    val = -1;
  	    ptr = str + 2;
  	} else if (idigit(str[1]))
! 	    val = strtol(str + 1, &ptr, 10);	/* =# */
  	else
  	/* =foo */
  	{
--- 263,269 ----
  	    val = -1;
  	    ptr = str + 2;
  	} else if (idigit(str[1]))
! 	    val = zstrtol(str + 1, &ptr, 10);	/* =# */
  	else
  	/* =foo */
  	{
diff -c Src.orig/zle_main.c Src/zle_main.c
*** Src.orig/zle_main.c	Tue May 30 22:10:52 1995
--- Src/zle_main.c	Wed May 31 06:59:43 1995
***************
*** 754,760 ****
  			s[3] = '\0';
  			u = s;
  		    }
! 		    *t++ = strtol(s + (*s == 'x'), &s,
  				   (*s == 'x') ? 16 : 8);
  		    if (svchar) {
  			u[3] = svchar;
--- 754,760 ----
  			s[3] = '\0';
  			u = s;
  		    }
! 		    *t++ = zstrtol(s + (*s == 'x'), &s,
  				   (*s == 'x') ? 16 : 8);
  		    if (svchar) {
  			u[3] = svchar;
diff -c Src.orig/zle_misc.c Src/zle_misc.c
*** Src.orig/zle_misc.c	Tue May 30 22:10:54 1995
--- Src/zle_misc.c	Wed May 31 06:59:55 1995
***************
*** 818,830 ****
  	arg = 0;
  	if (*fm == '%') {
  	    if (idigit(*++fm)) {
! 		arg = strtol(fm, &fm, 10);
  	    }
  	    if (*fm == '(') {
  		int tc;
  
  		if (idigit(*++fm)) {
! 		    arg = strtol(fm, &fm, 10);
  		}
  		test = 0;
  		ss = pwd;
--- 818,830 ----
  	arg = 0;
  	if (*fm == '%') {
  	    if (idigit(*++fm)) {
! 		arg = zstrtol(fm, &fm, 10);
  	    }
  	    if (*fm == '(') {
  		int tc;
  
  		if (idigit(*++fm)) {
! 		    arg = zstrtol(fm, &fm, 10);
  		}
  		test = 0;
  		ss = pwd;
***************
*** 1015,1021 ****
  		break;
  	    case '[':
                  if (idigit(*++fm))
!                     trunclen = strtol(fm, &fm, 10);
                  else
                      trunclen = arg;
                  ss = bp;
--- 1015,1021 ----
  		break;
  	    case '[':
                  if (idigit(*++fm))
!                     trunclen = zstrtol(fm, &fm, 10);
                  else
                      trunclen = arg;
                  ss = bp;



^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~1995-05-31 15:26 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <9505310625.AA05359@redwood.skiles.gatech.edu>
1995-05-31 15:23 ` zsh-2.6-beta9 released Mark Borges

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).