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:
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>
|
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.
|
||||||
|
|
||||||
|
|
|
@ -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))")
|
||||||
|
|
|
@ -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
|
||||||
|
|
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_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 :
|
||||||
|
|
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,
|
* 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.
|
||||||
|
|
Loading…
Reference in a new issue