From 7371115b25d604d77c431bbf4e11d6e330113caf Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Sat, 19 Nov 2016 18:23:10 +0100 Subject: [PATCH] New -find tests -maxdepth and -mindepth --- xorriso/disk_ops.c | 4 ++ xorriso/findjob.c | 1 + xorriso/findjob.h | 5 +++ xorriso/iso_manip.c | 17 +++++++- xorriso/opts_d_h.c | 19 +++++++- xorriso/xorriso.1 | 10 ++++- xorriso/xorriso.info | 86 ++++++++++++++++++++----------------- xorriso/xorriso.texi | 10 ++++- xorriso/xorriso_timestamp.h | 2 +- 9 files changed, 110 insertions(+), 44 deletions(-) diff --git a/xorriso/disk_ops.c b/xorriso/disk_ops.c index f92ce484..46afd598 100644 --- a/xorriso/disk_ops.c +++ b/xorriso/disk_ops.c @@ -1275,6 +1275,8 @@ int Xorriso_findx(struct XorrisO *xorriso, struct FindjoB *job, char *name= NULL, *path= NULL, *sfe= NULL; char *abs_dir_path_data= NULL, *abs_path= NULL; + job->depth= depth; + if(xorriso->request_to_abort) {ret= 0; goto ex;} @@ -1342,6 +1344,7 @@ int Xorriso_findx(struct XorrisO *xorriso, struct FindjoB *job, if(ret==0) {ret= 2; goto ex;} + job->depth++; while(!xorriso->request_to_abort) { Linkitem_reset_stack(&own_link_stack, link_stack, 0); ret= Dirseq_next_adr(dirseq,name,0); @@ -1403,6 +1406,7 @@ int Xorriso_findx(struct XorrisO *xorriso, struct FindjoB *job, ret= 1; ex:; + job->depth= depth; Xorriso_free_meM(sfe); Xorriso_free_meM(name); Xorriso_free_meM(path); diff --git a/xorriso/findjob.c b/xorriso/findjob.c index e508da18..da0b8a3e 100644 --- a/xorriso/findjob.c +++ b/xorriso/findjob.c @@ -384,6 +384,7 @@ int Findjob_new(struct FindjoB **o, char *start_path, int flag) m->errmsg[0]= 0; m->errn= 0; m->match_count= 0; + m->depth= 0; ret= Exprnode_new(&(m->test_tree), m, NULL, "-find", (m->use_shortcuts)<<1); if(ret<=0) diff --git a/xorriso/findjob.h b/xorriso/findjob.h index 8dce7c84..1e4355c9 100644 --- a/xorriso/findjob.h +++ b/xorriso/findjob.h @@ -53,6 +53,8 @@ struct ExprtesT { 22= -use_pattern char *arg1 ("on" [or "ls"], "off") 23= -or_use_pattern char *arg1 ("on" [or "ls"], "off") 24= -name_limit_blocker int *arg1 + 25= -maxdepth int *arg1 + 26= -mindepth int *arg1 */ int test_type; @@ -217,6 +219,9 @@ struct FindjoB { /* Counts the test matches */ unsigned long match_count; + /* Current depth of tree walking. Relative to start path. */ + int depth; + }; diff --git a/xorriso/iso_manip.c b/xorriso/iso_manip.c index 95d9e9c0..fd06a131 100644 --- a/xorriso/iso_manip.c +++ b/xorriso/iso_manip.c @@ -2984,7 +2984,12 @@ return: arg2= ftest->arg2; if(node == NULL) { - if(ftest->test_type > 2 && ftest->test_type != 4) { + switch(ftest->test_type) { + case 0: case 1: case 2: case 4: case 11: case 12: case 13: + case 22: case 23: case 25: case 26: + /* Tests which need no node parameter */ + break; + default: value= 0; goto ex; } @@ -3214,6 +3219,12 @@ return: 1 | 4); value= (ret == 0); + break; case 25: /* -maxdepth */ + value= (ftest->boss->depth <= *((int *) arg1)); + + break; case 26: /* -mindepth */ + value= (ftest->boss->depth >= *((int *) arg1)); + break; default: /* >>> complain about unknown test type */; @@ -3296,6 +3307,8 @@ int Xorriso_findi(struct XorrisO *xorriso, struct FindjoB *job, int node_count= 0, node_idx; char *path= NULL, *abs_path= NULL; + job->depth= depth; + if(xorriso->request_to_abort) {ret= 0; goto ex;} @@ -3393,6 +3406,7 @@ int Xorriso_findi(struct XorrisO *xorriso, struct FindjoB *job, &node, hflag); if(ret<=0) goto ex; + job->depth++; while(1) { ret= Xorriso_findi_iter(xorriso, dir_node, &mem, &iter, &node_array, &node_count, &node_idx, &node, 0); @@ -3472,6 +3486,7 @@ int Xorriso_findi(struct XorrisO *xorriso, struct FindjoB *job, ret= 1; ex:; + job->depth= depth; if(path!=NULL) free(path); if(abs_path!=NULL) diff --git a/xorriso/opts_d_h.c b/xorriso/opts_d_h.c index 35c0855e..c7855d77 100644 --- a/xorriso/opts_d_h.c +++ b/xorriso/opts_d_h.c @@ -1032,6 +1032,23 @@ not_enough_arguments:; ret= Findjob_set_num_filter(job, 24, count, 0, 0); if(ret <= 0) goto ex; + } else if(strcmp(argv[i], "-maxdepth") == 0 || + strcmp(argv[i], "-mindepth") == 0) { + if(i + 1 >= end_idx) + goto not_enough_arguments; + i++; + count= -1; + sscanf(argv[i], "%d", &count); + if(count < 0) { + sprintf(xorriso->info_text, + "-findi: wrong length with %s [>= 0]", argv[i - 1]); + goto sorry_ex; + } + ret= Findjob_set_num_filter(job, + 25 + (strcmp(argv[i - 1], "-mindepth") == 0), + count, 0, 0); + if(ret <= 0) + goto ex; } else if(strcmp(argv[i], "-exec")==0) { if(i+1>=end_idx) { not_enough_exec_arguments:; @@ -2030,7 +2047,7 @@ int Xorriso_option_help(struct XorrisO *xorriso, int flag) " -lba_range start count, -damaged, -has_acl, -has_xattr,", " -has_aaip, -has_filter, -has_md5, -has_any_xattr,", " -has_hfs_crtp, -has_hfs_bless, -bad_outname,", -" -name_limit_blocker", +" -name_limit_blocker, -maxdepth, -mindepth,", " -prune, -decision yes|no, -true, -false", " Operators: -not, -or, -and, -sub, (, -subend, ),", " -if, -then, -elseif, -else, -endif", diff --git a/xorriso/xorriso.1 b/xorriso/xorriso.1 index 8bfa3932..33a1f507 100644 --- a/xorriso/xorriso.1 +++ b/xorriso/xorriso.1 @@ -9,7 +9,7 @@ .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) -.TH XORRISO 1 "Version 1.4.7, Nov 13, 2016" +.TH XORRISO 1 "Version 1.4.7, Nov 19, 2016" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -1868,6 +1868,14 @@ and "Xotic" which matches what is not matched by the other types. .br Only the first letter is interpreted. E.g.: \-find / \-type d .br +\fB\-maxdepth\fR number : +Matches only files which are at most at the given depth level relative to +the iso_rr_path where \-find starts. That path itself is at depth 0, its +directory children are at 1, their directory children at 2, and so on. +.br +\fB\-mindepth\fR number : +Matches only files which are at least at the given depth level. +.br \fB\-damaged\fR : Matches files which use data blocks marked as damaged by a previous run of \-check_media. The damage info vanishes when a new ISO image gets diff --git a/xorriso/xorriso.info b/xorriso/xorriso.info index 0598f4b7..f138474b 100644 --- a/xorriso/xorriso.info +++ b/xorriso/xorriso.info @@ -1608,6 +1608,14 @@ File: xorriso.info, Node: CmdFind, Next: Filter, Prev: Manip, Up: Commands "pipe", "file", "link", "socket", "eltorito", and "Xotic" which matches what is not matched by the other types. Only the first letter is interpreted. E.g.: -find / -type d + -maxdepth number : + Matches only files which are at most at the given depth level + relative to the iso_rr_path where -find starts. That path + itself is at depth 0, its directory children are at 1, their + directory children at 2, and so on. + -mindepth number : + Matches only files which are at least at the given depth + level. -damaged : Matches files which use data blocks marked as damaged by a previous run of -check_media. The damage info vanishes when a @@ -5740,44 +5748,44 @@ Node: Insert52745 Node: SetInsert63329 Node: Manip72648 Node: CmdFind82607 -Node: Filter100989 -Node: Writing105611 -Node: SetWrite115767 -Node: Bootable140526 -Node: Jigdo166026 -Node: Charset170285 -Node: Exception173614 -Node: DialogCtl179743 -Node: Inquiry182345 -Node: Navigate191133 -Node: Verify199428 -Node: Restore209306 -Node: Emulation217919 -Node: Scripting228378 -Node: Frontend236161 -Node: Examples245787 -Node: ExDevices246965 -Node: ExCreate247626 -Node: ExDialog248926 -Node: ExGrowing250197 -Node: ExModifying251006 -Node: ExBootable251516 -Node: ExCharset252071 -Node: ExPseudo252967 -Node: ExCdrecord253894 -Node: ExMkisofs254214 -Node: ExGrowisofs255571 -Node: ExException256725 -Node: ExTime257183 -Node: ExIncBackup257641 -Node: ExRestore261667 -Node: ExRecovery262613 -Node: Files263185 -Node: Environ264519 -Node: Seealso265225 -Node: Bugreport265942 -Node: Legal266533 -Node: CommandIdx267545 -Node: ConceptIdx284733 +Node: Filter101379 +Node: Writing106001 +Node: SetWrite116157 +Node: Bootable140916 +Node: Jigdo166416 +Node: Charset170675 +Node: Exception174004 +Node: DialogCtl180133 +Node: Inquiry182735 +Node: Navigate191523 +Node: Verify199818 +Node: Restore209696 +Node: Emulation218309 +Node: Scripting228768 +Node: Frontend236551 +Node: Examples246177 +Node: ExDevices247355 +Node: ExCreate248016 +Node: ExDialog249316 +Node: ExGrowing250587 +Node: ExModifying251396 +Node: ExBootable251906 +Node: ExCharset252461 +Node: ExPseudo253357 +Node: ExCdrecord254284 +Node: ExMkisofs254604 +Node: ExGrowisofs255961 +Node: ExException257115 +Node: ExTime257573 +Node: ExIncBackup258031 +Node: ExRestore262057 +Node: ExRecovery263003 +Node: Files263575 +Node: Environ264909 +Node: Seealso265615 +Node: Bugreport266332 +Node: Legal266923 +Node: CommandIdx267935 +Node: ConceptIdx285123  End Tag Table diff --git a/xorriso/xorriso.texi b/xorriso/xorriso.texi index f319f5dc..4832c77b 100644 --- a/xorriso/xorriso.texi +++ b/xorriso/xorriso.texi @@ -50,7 +50,7 @@ @c man .\" First parameter, NAME, should be all caps @c man .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection @c man .\" other parameters are allowed: see man(7), man(1) -@c man .TH XORRISO 1 "Version 1.4.7, Nov 13, 2016" +@c man .TH XORRISO 1 "Version 1.4.7, Nov 19, 2016" @c man .\" Please adjust this date whenever revising the manpage. @c man .\" @c man .\" Some roff macros, for reference: @@ -2258,6 +2258,14 @@ and "Xotic" which matches what is not matched by the other types. @* Only the first letter is interpreted. E.g.: -find / -type d @* +@item -maxdepth number : +Matches only files which are at most at the given depth level relative to +the iso_rr_path where -find starts. That path itself is at depth 0, its +directory children are at 1, their directory children at 2, and so on. +@* +@item -mindepth number : +Matches only files which are at least at the given depth level. +@* @item -damaged : Matches files which use data blocks marked as damaged by a previous run of -check_media. The damage info vanishes when a new ISO image gets diff --git a/xorriso/xorriso_timestamp.h b/xorriso/xorriso_timestamp.h index 02a931c6..3f6a0ccd 100644 --- a/xorriso/xorriso_timestamp.h +++ b/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2016.11.18.173658" +#define Xorriso_timestamP "2016.11.19.172243"