mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-10-31 06:00:54 +01:00 
			
		
		
		
	42332: Special case unsigned printf formats.
For constants we can avoid a conversion to signed by examining the expression before passing to math eval.
This commit is contained in:
		
							parent
							
								
									f62af4a7ef
								
							
						
					
					
						commit
						2cbf6b6a19
					
				
					 3 changed files with 71 additions and 1 deletions
				
			
		|  | @ -1,3 +1,9 @@ | ||||||
|  | 2018-01-31  Peter Stephenson  <p.stephenson@samsung.com> | ||||||
|  | 
 | ||||||
|  | 	* 42332: Src/builtin.c, Src/utils.c: special case printf for | ||||||
|  | 	unsigned integers by looking for constansts, avoiding conversion | ||||||
|  | 	to unsigned. | ||||||
|  | 
 | ||||||
| 2018-01-24  Daniel Hahler  <zsh@thequod.de> | 2018-01-24  Daniel Hahler  <zsh@thequod.de> | ||||||
| 
 | 
 | ||||||
| 	* 42323: Completion/Unix/Command/_git: _git: move "local" statement | 	* 42323: Completion/Unix/Command/_git: _git: move "local" statement | ||||||
|  |  | ||||||
|  | @ -5243,7 +5243,10 @@ bin_print(char *name, char **args, Options ops, int func) | ||||||
|  		    	*d++ = 'l'; |  		    	*d++ = 'l'; | ||||||
| #endif | #endif | ||||||
| 		    	*d++ = 'l', *d++ = *c, *d = '\0'; | 		    	*d++ = 'l', *d++ = *c, *d = '\0'; | ||||||
| 			zulongval = (curarg) ? mathevali(curarg) : 0; | 			if (!curarg) | ||||||
|  | 			    zulongval = (zulong)0; | ||||||
|  | 			else if (!zstrtoul_underscore(curarg, &zulongval)) | ||||||
|  | 			    zulongval = mathevali(curarg); | ||||||
| 			if (errflag) { | 			if (errflag) { | ||||||
| 			    zulongval = 0; | 			    zulongval = 0; | ||||||
| 			    errflag &= ~ERRFLAG_ERROR; | 			    errflag &= ~ERRFLAG_ERROR; | ||||||
|  |  | ||||||
							
								
								
									
										61
									
								
								Src/utils.c
									
										
									
									
									
								
							
							
						
						
									
										61
									
								
								Src/utils.c
									
										
									
									
									
								
							|  | @ -2455,6 +2455,67 @@ zstrtol_underscore(const char *s, char **t, int base, int underscore) | ||||||
|     return neg ? -(zlong)calc : (zlong)calc; |     return neg ? -(zlong)calc : (zlong)calc; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /*
 | ||||||
|  |  * If s represents a complete unsigned integer (and nothing else) | ||||||
|  |  * return 1 and set retval to the value.  Otherwise return 0. | ||||||
|  |  * | ||||||
|  |  * Underscores are always allowed. | ||||||
|  |  * | ||||||
|  |  * Sensitive to OCTAL_ZEROES. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | /**/ | ||||||
|  | mod_export int | ||||||
|  | zstrtoul_underscore(const char *s, zulong *retval) | ||||||
|  | { | ||||||
|  |     zulong calc = 0, newcalc = 0, base; | ||||||
|  | 
 | ||||||
|  |     if (*s == '+') | ||||||
|  | 	s++; | ||||||
|  | 
 | ||||||
|  |     if (*s != '0') | ||||||
|  | 	base = 10; | ||||||
|  |     else if (*++s == 'x' || *s == 'X') | ||||||
|  | 	base = 16, s++; | ||||||
|  |     else if (*s == 'b' || *s == 'B') | ||||||
|  | 	base = 2, s++; | ||||||
|  |     else | ||||||
|  | 	base = isset(OCTALZEROES) ? 8 : 10; | ||||||
|  |     if (base < 2 || base > 36) { | ||||||
|  | 	return 0; | ||||||
|  |     } else if (base <= 10) { | ||||||
|  | 	for (; (*s >= '0' && *s < ('0' + base)) || | ||||||
|  | 		 *s == '_'; s++) { | ||||||
|  | 	    if (*s == '_') | ||||||
|  | 		continue; | ||||||
|  | 	    newcalc = calc * base + *s - '0'; | ||||||
|  | 	    if (newcalc < calc) | ||||||
|  | 	    { | ||||||
|  | 		return 0; | ||||||
|  | 	    } | ||||||
|  | 	    calc = newcalc; | ||||||
|  | 	} | ||||||
|  |     } else { | ||||||
|  | 	for (; idigit(*s) || (*s >= 'a' && *s < ('a' + base - 10)) | ||||||
|  | 	     || (*s >= 'A' && *s < ('A' + base - 10)) | ||||||
|  | 	     || *s == '_'; s++) { | ||||||
|  | 	    if (*s == '_') | ||||||
|  | 		continue; | ||||||
|  | 	    newcalc = calc*base + (idigit(*s) ? (*s - '0') : (*s & 0x1f) + 9); | ||||||
|  | 	    if (newcalc < calc) | ||||||
|  | 	    { | ||||||
|  | 		return 0; | ||||||
|  | 	    } | ||||||
|  | 	    calc = newcalc; | ||||||
|  | 	} | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (*s) | ||||||
|  | 	return 0; | ||||||
|  |     *retval = calc; | ||||||
|  |     return 1; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /**/ | /**/ | ||||||
| mod_export int | mod_export int | ||||||
| setblock_fd(int turnonblocking, int fd, long *modep) | setblock_fd(int turnonblocking, int fd, long *modep) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue