1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-09-30 19:20:53 +02:00

32412 / 32415: New giga- and terabyte units for glob qualifiers

This commit is contained in:
Manuel Presnitz 2014-02-19 14:12:03 +01:00 committed by Peter Stephenson
parent f798f13b0e
commit 973e5dc37d
5 changed files with 62 additions and 13 deletions

View file

@ -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> 2014-02-28 Peter Stephenson <p.stephenson@samsung.com>
* users/18531 plus doc etc.: Doc/Zsh/contrib.yo, * users/18531 plus doc etc.: Doc/Zsh/contrib.yo,
@ -6,7 +12,7 @@
2014-02-26 Peter Stephenson <p.w.stephenson@ntlworld.com> 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 Completion/Unix/Command/_rm: improved quoting for ignore-line
style. style.

View file

@ -132,13 +132,13 @@ while [[ -n $PREFIX ]]; do
(L) (L)
# complete/skip file size # complete/skip file size
if ! compset -P '([kKmMpP]|)([-+]|)<->'; then if ! compset -P '([kKmMgGtTpP]|)([-+]|)<->'; then
# complete/skip size spec # complete/skip size spec
alts=() alts=()
if ! compset -P '[kKmMpP]' && [[ -z $PREFIX ]]; then if ! compset -P '[kKmMgGtTpP]' && [[ -z $PREFIX ]]; then
alts+=( alts+=(
"size-specifiers:size specifier:\ "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 fi
if ! compset -P '[-+]' && [[ -z $PREFIX ]]; then if ! compset -P '[-+]' && [[ -z $PREFIX ]]; then
alts+=("senses:sense:((-\:less\ than +\:more\ than))") alts+=("senses:sense:((-\:less\ than +\:more\ than))")

View file

@ -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 files less than var(n) bytes (tt(-)), more than var(n) bytes (tt(PLUS())), or
exactly var(n) bytes in length. exactly var(n) bytes in length.
If this flag is directly followed by a `tt(k)' (`tt(K)'), `tt(m)' If this flag is directly followed by a em(size specifier) `tt(k)' (`tt(K)'),
(`tt(M)'), or `tt(p)' (`tt(P)') (e.g. `tt(Lk-50)') the check is performed `tt(m)' (`tt(M)'), or `tt(p)' (`tt(P)') (e.g. `tt(Lk-50)') the check is
with kilobytes, megabytes, or blocks (of 512 bytes) instead. In this performed with kilobytes, megabytes, or blocks (of 512 bytes) instead.
case a file is regarded as "exactly" the size if the file size rounded up (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())' 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 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 the set of files "less than" the test size only includes files that would

View file

@ -120,6 +120,8 @@ typedef struct stat *Statptr; /* This makes the Ultrix compiler happy. Go figu
#define TT_POSIX_BLOCKS 1 #define TT_POSIX_BLOCKS 1
#define TT_KILOBYTES 2 #define TT_KILOBYTES 2
#define TT_MEGABYTES 3 #define TT_MEGABYTES 3
#define TT_GIGABYTES 4
#define TT_TERABYTES 5
typedef int (*TestMatchFunc) _((char *, struct stat *, off_t, char *)); 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; g_units = TT_KILOBYTES, ++s;
else if (*s == 'm' || *s == 'M') else if (*s == 'm' || *s == 'M')
g_units = TT_MEGABYTES, ++s; 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: getrange:
/* Get time multiplier */ /* Get time multiplier */
if (g_amc >= 0) { if (g_amc >= 0) {
@ -3538,9 +3546,9 @@ qualiscom(UNUSED(char *name), struct stat *buf, UNUSED(off_t mod), UNUSED(char *
static int static int
qualsize(UNUSED(char *name), struct stat *buf, off_t size, UNUSED(char *dummy)) 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() # define QS_CAST_SIZE()
off_t scaled = buf->st_size; zlong scaled = buf->st_size;
#else #else
# define QS_CAST_SIZE() (unsigned long) # define QS_CAST_SIZE() (unsigned long)
unsigned long scaled = (unsigned long)buf->st_size; 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 += 1048575l;
scaled /= 1048576l; scaled /= 1048576l;
break; 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 : return (g_range < 0 ? scaled < QS_CAST_SIZE() size :

View file

@ -33,9 +33,6 @@
/* /*
* Our longest integer type: will be a 64 bit either if long already is, * Our longest integer type: will be a 64 bit either if long already is,
* or if we found some alternative such as long long. * 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 #ifdef ZSH_64_BIT_TYPE
typedef ZSH_64_BIT_TYPE zlong; typedef ZSH_64_BIT_TYPE zlong;
@ -49,6 +46,32 @@ typedef long zlong;
typedef unsigned long zulong; typedef unsigned long zulong;
#endif #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 * Double float support requires 64-bit alignment, so if longs and
* pointers are less we need to pad out. * pointers are less we need to pad out.