From b8988d667378f4b58a77292e9367dc5c42ce9aa5 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Sun, 21 Oct 2007 21:32:23 +0000 Subject: [PATCH] Implemented sorting of -ls by node name, implemented leaf name search patterns --- test/xorriso.1 | 2 +- test/xorriso.c | 26 ++++++++---- test/xorriso_private.h | 3 ++ test/xorriso_timestamp.h | 2 +- test/xorrisoburn.c | 88 +++++++++++++++++++++++++++++----------- 5 files changed, 87 insertions(+), 34 deletions(-) diff --git a/test/xorriso.1 b/test/xorriso.1 index 9e6c48b6..c044c7f9 100644 --- a/test/xorriso.1 +++ b/test/xorriso.1 @@ -536,7 +536,7 @@ Tell the current working directory in the ISO image. \fB\-pwdx\fR Tell the current working directory on local filesystem. .TP -> \fB\-ls\fR pattern +\fB\-ls\fR pattern List files from the current working directory in the ISO image which match a shell pattern. (I.e. wildcards '*' '?') .TP diff --git a/test/xorriso.c b/test/xorriso.c index 4f7dcf9c..902ba23b 100644 --- a/test/xorriso.c +++ b/test/xorriso.c @@ -2477,7 +2477,7 @@ next_adr_part:; } else { is_constant= 0; - if(strcmp(adr,"*")==0) { + if(strcmp(adr,"*")==0 || adr[0]==0) { is_constant= 1; } else if(xorriso->search_mode==3 || xorriso->search_mode==4) { ret= Xorriso__bourne_to_reg(adr,xorriso->reg_expr,0); @@ -3975,11 +3975,20 @@ int Xorriso_option_lsi(struct XorrisO *xorriso, char *pattern, int flag) { int ret; +/* if(strcmp(pattern,"*")!=0 && pattern[0]) fprintf(stderr, ">>> XORRISO : TODO : filter by pattern %s\n", pattern); +*/ - /* >>> prepare regex */ - + xorriso->search_mode= 4; + xorriso->structured_search= 0; + ret= Xorriso_prepare_regex(xorriso, pattern, 0); + if(ret<=0) { + sprintf(xorriso->info_text, + "Cannot compile pattern to regular expression: %s", pattern); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0); + return(0); + } ret= Xorriso_ls(xorriso, flag&1); return(ret); } @@ -4768,14 +4777,15 @@ next_command:; ret= Xorriso_option_j_capital(xorriso, 0); } else if(strcmp(cmd,"-ls")==0 || strcmp(cmd,"-lsi")==0 || - strcmp(cmd,"-ls_l")==0 || strcmp(cmd,"-ls_li")==0) { + strcmp(cmd,"-ls_l")==0 || strcmp(cmd,"-ls_li")==0 || + strcmp(cmd,"-ls-l")==0 || strcmp(cmd,"-ls-li")==0) { (*idx)++; - ret= Xorriso_option_lsi(xorriso, arg1, - (strcmp(cmd,"-ls_l")==0 || strcmp(cmd,"-ls_li")==0)); + ret= Xorriso_option_lsi(xorriso, arg1, strlen(cmd)>4); - } else if(strcmp(cmd,"-lsx")==0 || strcmp(cmd,"-ls_ls")==0) { + } else if(strcmp(cmd,"-lsx")==0 || strcmp(cmd,"-ls_lx")==0 + || strcmp(cmd,"-ls-lx")==0) { (*idx)++; - ret= Xorriso_option_lsx(xorriso, arg1,strcmp(cmd,"-ls_lx")==0); + ret= Xorriso_option_lsx(xorriso, arg1,strlen(cmd)>4); } else if(strcmp(cmd,"-logfile")==0) { (*idx)+= 2; diff --git a/test/xorriso_private.h b/test/xorriso_private.h index 872b1ed2..7f19717b 100644 --- a/test/xorriso_private.h +++ b/test/xorriso_private.h @@ -183,6 +183,9 @@ int Xorriso_prescan_args(struct XorrisO *xorriso, int argc, char **argv, int Xorriso_execute_option(struct XorrisO *xorriso, char *line, int flag); +int Xorriso_regexec(struct XorrisO *xorriso, char *to_match, int *failed_at, + int flag); + int Sfile_str(char target[SfileadrL], char *source, int flag); double Sfile_microtime(int flag); diff --git a/test/xorriso_timestamp.h b/test/xorriso_timestamp.h index 965a4a31..10fe5c0b 100644 --- a/test/xorriso_timestamp.h +++ b/test/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2007.10.21.185248" +#define Xorriso_timestamP "2007.10.21.213303" diff --git a/test/xorrisoburn.c b/test/xorrisoburn.c index f01b102f..16df1be3 100644 --- a/test/xorrisoburn.c +++ b/test/xorrisoburn.c @@ -1209,14 +1209,24 @@ int Xorriso_rmi(struct XorrisO *xorriso, char *path, int flag) } +int Xorriso__node_name_cmp(const void *node1, const void *node2) +{ + char *name1, *name2; + + name1= (char *) iso_tree_node_get_name(*((struct iso_tree_node **) node1)); + name2= (char *) iso_tree_node_get_name(*((struct iso_tree_node **) node2)); + return(strcmp(name1,name2)); +} + + /* @param flag bit0= long format , bit1= only check for directory existence */ int Xorriso_ls(struct XorrisO *xorriso, int flag) { - int ret, is_dir= 0; - struct iso_tree_node *node; + int ret, is_dir= 0, i, filec, failed_at; + struct iso_tree_node *node, **node_array= NULL; struct iso_tree_node_dir *dir_node; struct iso_volume *volume; - struct iso_tree_iter *iter; + struct iso_tree_iter *iter= NULL; char sfe[4*SfileadrL], *npt, *rpt, perms[10]; mode_t st_mode; @@ -1236,33 +1246,61 @@ wdi_is_not_a_dir:; sprintf(xorriso->info_text, "Working directory path does not lead to a directory in ISO image"); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0); - return(0); + ret= 0; goto ex; } if(flag&2) - return(1); + {ret= 1; goto ex;} dir_node= (struct iso_tree_node_dir *) node; iter= iso_tree_node_children(dir_node); Xorriso_process_msg_queues(xorriso,0); - /* ??? >>> is the iteration sorted by name ? */ - /* if not: >>> copy to char * array */ - - while((node= iso_tree_iter_next(iter)) != NULL ) { + for(i= 0; (node= iso_tree_iter_next(iter)) != NULL && ire!=NULL) { - /* >>> test with regex */; - } -#endif /* Xorriso_with_regeX */ + ret= Xorriso_regexec(xorriso, npt, &failed_at, 0); + if(ret) + continue; /* no match */ + filec++; + } + iso_tree_iter_free(iter); + iter= NULL; + Xorriso_process_msg_queues(xorriso,0); + node_array= calloc(sizeof(struct iso_tree *), filec+1); + if(node_array==NULL) { + sprintf(xorriso->info_text, + "Cannot allocate memory for %d directory entries", filec); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0); + ret= -1; goto ex; + } + + iter= iso_tree_node_children(dir_node); + Xorriso_process_msg_queues(xorriso,0); + for(i= 0; (node= iso_tree_iter_next(iter)) != NULL && i>> prepend attribute info */; - + if(flag&1) { /* >>> prepend attribute info */; if(is_dir) strcat(rpt, "d"); else if(LIBISO_ISREG(node)) @@ -1289,9 +1327,9 @@ wdi_is_not_a_dir:; /* >>> ??? How to obtain RR harlink number for other types ? */ strcat(rpt," 1 "); - sprintf(rpt+strlen(rpt), "%7lu ", + sprintf(rpt+strlen(rpt), "%-7lu ", (unsigned long) iso_tree_node_get_uid(node)); - sprintf(rpt+strlen(rpt), "%7lu ", + sprintf(rpt+strlen(rpt), "%-7lu ", (unsigned long) iso_tree_node_get_gid(node)); /* >>> obtain size */ @@ -1305,11 +1343,13 @@ wdi_is_not_a_dir:; Xorriso_result(xorriso, 0); } - /* ??? >>> sort */ - - /* ??? >>> output loop */ - + ret= 1; +ex:; + if(iter!=NULL) + iso_tree_iter_free(iter); Xorriso_process_msg_queues(xorriso,0); + if(node_array!=NULL) + free((char *) node_array); return(1); }