diff options
author | Tavian Barnes <tavianator@tavianator.com> | 2016-12-20 21:23:02 -0500 |
---|---|---|
committer | Tavian Barnes <tavianator@tavianator.com> | 2016-12-20 21:23:02 -0500 |
commit | 0609e6f29719a7e88b8233d6bd5b75509a2d59f5 (patch) | |
tree | d47936c46a7cf9a4db81ae61aa725c73e5d7f3d3 | |
parent | 96ca12560f5c4007891985f98fba94fd9c0dc241 (diff) | |
download | bfs-0609e6f29719a7e88b8233d6bd5b75509a2d59f5.tar.xz |
Implement -sparse from FreeBSD find
-rw-r--r-- | bfs.h | 1 | ||||
-rw-r--r-- | eval.c | 13 | ||||
-rw-r--r-- | parse.c | 8 |
3 files changed, 22 insertions, 0 deletions
@@ -292,6 +292,7 @@ bool eval_inum(const struct expr *expr, struct eval_state *state); bool eval_links(const struct expr *expr, struct eval_state *state); bool eval_samefile(const struct expr *expr, struct eval_state *state); bool eval_size(const struct expr *expr, struct eval_state *state); +bool eval_sparse(const struct expr *expr, struct eval_state *state); bool eval_type(const struct expr *expr, struct eval_state *state); bool eval_xtype(const struct expr *expr, struct eval_state *state); @@ -818,6 +818,19 @@ bool eval_size(const struct expr *expr, struct eval_state *state) { } /** + * -sparse test. + */ +bool eval_sparse(const struct expr *expr, struct eval_state *state) { + const struct stat *statbuf = fill_statbuf(state); + if (!statbuf) { + return false; + } + + blkcnt_t expected = (statbuf->st_size + 511)/512; + return statbuf->st_blocks < expected; +} + +/** * -type test. */ bool eval_type(const struct expr *expr, struct eval_state *state) { @@ -1662,6 +1662,13 @@ fail: } /** + * Parse -sparse. + */ +static struct expr *parse_sparse(struct parser_state *state, int arg1, int arg2) { + return parse_nullary_test(state, eval_sparse); +} + +/** * Parse -x?type [bcdpfls]. */ static struct expr *parse_type(struct parser_state *state, int x, int arg2) { @@ -1837,6 +1844,7 @@ static const struct table_entry parse_table[] = { {"regextype", false, parse_regextype}, {"samefile", false, parse_samefile}, {"size", false, parse_size}, + {"sparse", false, parse_sparse}, {"true", false, parse_const, true}, {"type", false, parse_type, false}, {"uid", false, parse_user}, |