mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-10-31 18:10:56 +01:00 
			
		
		
		
	32412 / 32415: New giga- and terabyte units for glob qualifiers
This commit is contained in:
		
							parent
							
								
									f798f13b0e
								
							
						
					
					
						commit
						973e5dc37d
					
				
					 5 changed files with 62 additions and 13 deletions
				
			
		|  | @ -1,3 +1,9 @@ | |||
| 2014-03-01  Peter Stephenson  <p.w.stephenson@ntlworld.com> | ||||
| 
 | ||||
| 	* Manuel Presnitz: 32412 modified c.f. 32415: | ||||
| 	Completion/Zsh/Type/_globquals, Doc/Zsh/expn.yo, Src/glob.c, | ||||
| 	Src/zsh.h: gigabyte and terabyte units for glob qualifiers. | ||||
| 
 | ||||
| 2014-02-28  Peter Stephenson  <p.stephenson@samsung.com> | ||||
| 
 | ||||
| 	* users/18531 plus doc etc.: Doc/Zsh/contrib.yo, | ||||
|  | @ -6,7 +12,7 @@ | |||
| 
 | ||||
| 2014-02-26  Peter Stephenson  <p.w.stephenson@ntlworld.com> | ||||
| 
 | ||||
| 	* Jun T: Completion/Base/Core/_description, | ||||
| 	* Jun T: 32435: Completion/Base/Core/_description, | ||||
| 	Completion/Unix/Command/_rm: improved quoting for ignore-line | ||||
| 	style. | ||||
| 
 | ||||
|  |  | |||
|  | @ -132,13 +132,13 @@ while [[ -n $PREFIX ]]; do | |||
| 
 | ||||
|     (L) | ||||
|     # complete/skip file size | ||||
|     if ! compset -P '([kKmMpP]|)([-+]|)<->'; then | ||||
|     if ! compset -P '([kKmMgGtTpP]|)([-+]|)<->'; then | ||||
|       # complete/skip size spec | ||||
|       alts=() | ||||
|       if ! compset -P '[kKmMpP]' && [[ -z $PREFIX ]]; then | ||||
|       if ! compset -P '[kKmMgGtTpP]' && [[ -z $PREFIX ]]; then | ||||
|         alts+=( | ||||
|           "size-specifiers:size specifier:\ | ||||
| ((k\:kb m\:mb p\:512-byte\ blocks))") | ||||
| ((k\:kb m\:mb g\:gb t\:tb p\:512-byte\ blocks))") | ||||
|       fi | ||||
|       if ! compset -P '[-+]' && [[ -z $PREFIX ]]; then | ||||
|         alts+=("senses:sense:((-\:less\ than +\:more\ than))") | ||||
|  |  | |||
|  | @ -2521,10 +2521,12 @@ item(tt(L)[tt(PLUS())|tt(-)]var(n))( | |||
| files less than var(n) bytes (tt(-)), more than var(n) bytes (tt(PLUS())), or | ||||
| exactly var(n) bytes in length. | ||||
| 
 | ||||
| If this flag is directly followed by a `tt(k)' (`tt(K)'), `tt(m)' | ||||
| (`tt(M)'), or `tt(p)' (`tt(P)') (e.g. `tt(Lk-50)') the check is performed | ||||
| with kilobytes, megabytes, or blocks (of 512 bytes) instead.  In this | ||||
| case a file is regarded as "exactly" the size if the file size rounded up | ||||
| If this flag is directly followed by a em(size specifier) `tt(k)' (`tt(K)'), | ||||
| `tt(m)' (`tt(M)'), or `tt(p)' (`tt(P)') (e.g. `tt(Lk-50)') the check is | ||||
| performed with kilobytes, megabytes, or blocks (of 512 bytes) instead. | ||||
| (On some systems additional specifiers are available for gigabytes, | ||||
| `tt(g)' or `tt(G)', and terabytes, `tt(t)' or `tt(T)'.) If a size specifier | ||||
| is used a file is regarded as "exactly" the size if the file size rounded up | ||||
| to the next unit is equal to the test size.  Hence `tt(*LPAR()Lm1+RPAR())' | ||||
| matches files from 1 byte up to 1 Megabyte inclusive.  Note also that | ||||
| the set of files "less than" the test size only includes files that would | ||||
|  |  | |||
							
								
								
									
										22
									
								
								Src/glob.c
									
										
									
									
									
								
							
							
						
						
									
										22
									
								
								Src/glob.c
									
										
									
									
									
								
							|  | @ -120,6 +120,8 @@ typedef struct stat *Statptr;	 /* This makes the Ultrix compiler happy.  Go figu | |||
| #define TT_POSIX_BLOCKS 1 | ||||
| #define TT_KILOBYTES 2 | ||||
| #define TT_MEGABYTES 3 | ||||
| #define TT_GIGABYTES 4 | ||||
| #define TT_TERABYTES 5 | ||||
| 
 | ||||
| 
 | ||||
| typedef int (*TestMatchFunc) _((char *, struct stat *, off_t, char *)); | ||||
|  | @ -1486,6 +1488,12 @@ zglob(LinkList list, LinkNode np, int nountok) | |||
| 			g_units = TT_KILOBYTES, ++s; | ||||
| 		    else if (*s == 'm' || *s == 'M') | ||||
| 			g_units = TT_MEGABYTES, ++s; | ||||
| #if defined(ZSH_64_BIT_TYPE) || defined(LONG_IS_64_BIT) | ||||
|                     else if (*s == 'g' || *s == 'G') | ||||
|                         g_units = TT_GIGABYTES, ++s; | ||||
|                     else if (*s == 't' || *s == 'T') | ||||
|                         g_units = TT_TERABYTES, ++s; | ||||
| #endif | ||||
| 		  getrange: | ||||
| 		    /* Get time multiplier */ | ||||
| 		    if (g_amc >= 0) { | ||||
|  | @ -3538,9 +3546,9 @@ qualiscom(UNUSED(char *name), struct stat *buf, UNUSED(off_t mod), UNUSED(char * | |||
| static int | ||||
| qualsize(UNUSED(char *name), struct stat *buf, off_t size, UNUSED(char *dummy)) | ||||
| { | ||||
| #if defined(LONG_IS_64_BIT) || defined(OFF_T_IS_64_BIT) | ||||
| #if defined(ZSH_64_BIT_TYPE) || defined(LONG_IS_64_BIT) | ||||
| # define QS_CAST_SIZE() | ||||
|     off_t scaled = buf->st_size; | ||||
|     zlong scaled = buf->st_size; | ||||
| #else | ||||
| # define QS_CAST_SIZE() (unsigned long) | ||||
|     unsigned long scaled = (unsigned long)buf->st_size; | ||||
|  | @ -3559,6 +3567,16 @@ qualsize(UNUSED(char *name), struct stat *buf, off_t size, UNUSED(char *dummy)) | |||
| 	scaled += 1048575l; | ||||
| 	scaled /= 1048576l; | ||||
| 	break; | ||||
| #if defined(ZSH_64_BIT_TYPE) || defined(LONG_IS_64_BIT) | ||||
|     case TT_GIGABYTES: | ||||
|         scaled += ZLONG_CONST(1073741823); | ||||
|         scaled /= ZLONG_CONST(1073741824); | ||||
|         break; | ||||
|     case TT_TERABYTES: | ||||
|         scaled += ZLONG_CONST(1099511627775); | ||||
|         scaled /= ZLONG_CONST(1099511627776); | ||||
|         break; | ||||
| #endif | ||||
|     } | ||||
| 
 | ||||
|     return (g_range < 0 ? scaled < QS_CAST_SIZE() size : | ||||
|  |  | |||
							
								
								
									
										29
									
								
								Src/zsh.h
									
										
									
									
									
								
							
							
						
						
									
										29
									
								
								Src/zsh.h
									
										
									
									
									
								
							|  | @ -33,9 +33,6 @@ | |||
| /*
 | ||||
|  * Our longest integer type:  will be a 64 bit either if long already is, | ||||
|  * or if we found some alternative such as long long. | ||||
|  * Currently we only define this to be longer than a long if | ||||
|  * --enable-largefile * was given.  That enables internal use of 64-bit | ||||
|  * types even if no actual large file support is present. | ||||
|  */ | ||||
| #ifdef ZSH_64_BIT_TYPE | ||||
| typedef ZSH_64_BIT_TYPE zlong; | ||||
|  | @ -49,6 +46,32 @@ typedef long zlong; | |||
| typedef unsigned long zulong; | ||||
| #endif | ||||
| 
 | ||||
| /*
 | ||||
|  * Work out how to define large integer constants that will fit | ||||
|  * in a zlong. | ||||
|  */ | ||||
| #if defined(ZSH_64_BIT_TYPE) || defined(LONG_IS_64_BIT) | ||||
| /* We have some 64-bit type */ | ||||
| #ifdef LONG_IS_64_BIT | ||||
| /* It's long */ | ||||
| #define ZLONG_CONST(x)  x ## l | ||||
| #else | ||||
| /* It's long long */ | ||||
| #ifdef ZLONG_IS_LONG_LONG | ||||
| #define ZLONG_CONST(x)  x ## ll | ||||
| #else | ||||
| /*
 | ||||
|  * There's some 64-bit type, but we don't know what it is. | ||||
|  * We'll just cast it and hope the compiler does the right thing. | ||||
|  */ | ||||
| #define ZLONG_CONST(x) ((zlong)x) | ||||
| #endif | ||||
| #endif | ||||
| #else | ||||
| /* We're stuck with long */ | ||||
| #define ZLONG_CONST(x) (x ## l) | ||||
| #endif | ||||
| 
 | ||||
| /*
 | ||||
|  * Double float support requires 64-bit alignment, so if longs and | ||||
|  * pointers are less we need to pad out. | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue