zsh-workers
 help / color / mirror / code / Atom feed
* PATCH: output base selection without outputting prefix
@ 2000-09-02 16:57 Zefram
  0 siblings, 0 replies; only message in thread
From: Zefram @ 2000-09-02 16:57 UTC (permalink / raw)
  To: zsh-workers

This patch modifies the [#base] syntax for selecting an output base
so that if the # is doubled then the resulting value is output in the
selected base but without outputting the base prefix.  E.g.:

% echo $(([#16]65))
16#41
% echo $(([##16]65))
41
%

Along the way I made the [] parsing code a bit more stringent: it now
doesn't allow things such as $(([16 41)) (missing ]) which the old
code allowed.  I note that the supported base range of [2, 36] isn't
enforced anywhere; I haven't changed that yet.

-zefram

Index: Doc/Zsh/arith.yo
===================================================================
RCS file: /cvsroot/zsh/zsh/Doc/Zsh/arith.yo,v
retrieving revision 1.3
diff -c -r1.3 arith.yo
*** Doc/Zsh/arith.yo	2000/05/19 18:22:51	1.3
--- Doc/Zsh/arith.yo	2000/09/02 16:49:53
***************
*** 65,70 ****
--- 65,75 ----
  implicitly typed by the arithmetic evaluation, where it acquires the output
  base 8.
  
+ When an output base is specified using the `tt([#)var(base)tt(])' syntax,
+ an appropriate base prefix will be output if necessary, so that the value
+ output is valid syntax for input.  If the tt(#) is doubled, for example
+ `tt([##16])', then no base prefix is output.
+ 
  Floating point constants are recognized by the presence of a decimal point
  or an exponent.  The decimal point may be the first character of the
  constant, but the exponent character tt(e) or tt(E) may not, as it will be
Index: Src/math.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/math.c,v
retrieving revision 1.5
diff -c -r1.5 math.c
*** Src/math.c	2000/05/19 18:22:51	1.5
--- Src/math.c	2000/09/02 16:49:59
***************
*** 342,362 ****
  	    return EOI;
  	case '[':
  	    {
! 		int base, setradix = 0;
! 		if (*ptr == '#') {
! 		    ptr++;
! 		    setradix = 1;
! 		}
! 		base = zstrtol(ptr, &ptr, 10);
  
! 		if (*ptr == ']')
! 		    ptr++;
! 		if (setradix)
! 		    outputradix = base;
! 		else {
! 		    yyval.u.l = zstrtol(ptr, &ptr, lastbase = base);
  		    return NUM;
  		}
  		break;
  	    }
  	case ' ':
--- 342,375 ----
  	    return EOI;
  	case '[':
  	    {
! 		int n;
  
! 		if (idigit(*ptr)) {
! 		    n = zstrtol(ptr, &ptr, 10);
! 		    if (*ptr != ']' || !idigit(*++ptr)) {
! 			zerr("bad base syntax", NULL, 0);
! 			return EOI;
! 		    }
! 		    yyval.u.l = zstrtol(ptr, &ptr, lastbase = n);
  		    return NUM;
  		}
+ 		if (*ptr == '#') {
+ 		    n = 1;
+ 		    if (*++ptr == '#') {
+ 			n = -1;
+ 			ptr++;
+ 		    }
+ 		    if (!idigit(*ptr))
+ 			goto bofs;
+ 		    outputradix = n * zstrtol(ptr, &ptr, 10);
+ 		} else {
+ 		    bofs:
+ 		    zerr("bad output format specification", NULL, 0);
+ 		    return EOI;
+ 		}
+ 		if(*ptr != ']')
+ 			goto bofs;
+ 		ptr++;
  		break;
  	    }
  	case ' ':
Index: Src/params.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/params.c,v
retrieving revision 1.26
diff -c -r1.26 params.c
*** Src/params.c	2000/08/10 16:19:12	1.26
--- Src/params.c	2000/09/02 16:50:16
***************
*** 3041,3050 ****
  
      if (v < 0)
  	*s++ = '-', v = -v;
!     if (base <= 1)
! 	base = 10;
  
!     if (base != 10) {
  	if (isset(CBASES) && base == 16)
  	    sprintf(s, "0x");
  	else if (isset(CBASES) && base == 8 && isset(OCTALZEROES))
--- 3041,3050 ----
  
      if (v < 0)
  	*s++ = '-', v = -v;
!     if (base >= -1 && base <= 1)
! 	base = -10;
  
!     if (base > 0) {
  	if (isset(CBASES) && base == 16)
  	    sprintf(s, "0x");
  	else if (isset(CBASES) && base == 8 && isset(OCTALZEROES))
***************
*** 3052,3058 ****
  	else
  	    sprintf(s, "%d#", base);
  	s += strlen(s);
!     }
      for (x = v; x; digs++)
  	x /= base;
      if (!digs)
--- 3052,3059 ----
  	else
  	    sprintf(s, "%d#", base);
  	s += strlen(s);
!     } else
! 	base = -base;
      for (x = v; x; digs++)
  	x /= base;
      if (!digs)


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

only message in thread, other threads:[~2000-09-02 17:06 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2000-09-02 16:57 PATCH: output base selection without outputting prefix Zefram

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).