From fbcece66109a1397ce354ae681eaec6633e74d4d Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Fri, 5 Sep 2008 09:54:38 +0000 Subject: [PATCH] New option -list_delimiter --- libisoburn/trunk/xorriso/xorriso.1 | 28 ++-- libisoburn/trunk/xorriso/xorriso.c | 142 ++++++++++++++----- libisoburn/trunk/xorriso/xorriso.h | 4 + libisoburn/trunk/xorriso/xorriso_private.h | 2 + libisoburn/trunk/xorriso/xorriso_timestamp.h | 2 +- libisoburn/trunk/xorriso/xorrisoburn.c | 2 +- 6 files changed, 137 insertions(+), 43 deletions(-) diff --git a/libisoburn/trunk/xorriso/xorriso.1 b/libisoburn/trunk/xorriso/xorriso.1 index 7d9f25b7..979dd5e8 100644 --- a/libisoburn/trunk/xorriso/xorriso.1 +++ b/libisoburn/trunk/xorriso/xorriso.1 @@ -2,7 +2,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 "Sep 02, 2008" +.TH XORRISO 1 "Sep 05, 2008" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -346,10 +346,19 @@ characters. Rock Ridge fulfills this demand. Commands are either actions or settings. They consist of a command word, followed by zero or more parameter words. If the list of parameter words is of variable length (indicated by "[...]" or "[***]") then it has to be -terminated by either the word "--" or the end of argument list or an end of -an input line. -It is not an error if "--" appears after the parameters of a command -with a fixed list length. +terminated by either the list delimiter, or the end of argument list, or an +end of an input line. +.PP +At program start the \fBlist delimiter\fR is the word "--". This may be changed +by option -list_delimiter in order to allow "--" as argument in a list of +variable length. It is advised to reset the delimiter to "--" immediately +afterwards. +.br +For brevity the list delimiter is referred as "--" throughout this text. +.br +The list delimiter is silently tolerated if it appears after the parameters of +a command with a fixed list length. It is handled as normal text if it +appears among the arguments of such a command. .PP .B Pattern expansion is a property of some particular commands and not a general @@ -966,10 +975,6 @@ other file causes a FAILURE event. \fB\-rmdir\fR iso_rr_path [***] Delete empty directories. .TP -\fB\-\-\fR -.br -Mark end of particular action argument list. -.TP \fB\-rollback\fR Discard the manipulated ISO image and reload it from -indev. .TP @@ -2090,6 +2095,11 @@ if its start matches the filter text. No wildcards. \fB\-status_history_max\fR number Set maximum number of history lines to be reported with -status "long_history". .TP +\fB\-list_delimiter\fR word +Set the list delimiter to be used instead of "--". It has to be a single word, +must not be empty, not longer than 80 characters, and must not contain +quotation marks. +.TP \fB\-temp_mem_limit\fR number["k"|"m"] Set the maximum size of temporary memory to be used for image dependent buffering. Currently this applies to pattern expansion only. diff --git a/libisoburn/trunk/xorriso/xorriso.c b/libisoburn/trunk/xorriso/xorriso.c index a9418051..5d5cf243 100644 --- a/libisoburn/trunk/xorriso/xorriso.c +++ b/libisoburn/trunk/xorriso/xorriso.c @@ -3322,6 +3322,7 @@ int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag) m->did_something_useful= 0; m->add_plainly= 0; m->split_size= 0; + strcpy(m->list_delimiter, "--"); m->do_joliet= 0; m->do_follow_pattern= 1; m->do_follow_param= 0; @@ -4759,6 +4760,7 @@ int Xorriso_check_media_list_job(struct XorrisO *xorriso, char *report, int flag) { int all, ret; + char default_report[161]; struct CheckmediajoB *dflt= NULL; all= !(flag&1); @@ -4825,9 +4827,11 @@ int Xorriso_check_media_list_job(struct XorrisO *xorriso, {ret= 0; goto ex;} ret= 1; ex:; - strcat(report, " --"); + strcat(report, xorriso->list_delimiter); Checkmediajob_destroy(&dflt, 0); - if(ret > 0 && strcmp(report, "-check_media_defaults reset=now --") == 0) + sprintf(default_report, "-check_media_defaults reset=now %s", + xorriso->list_delimiter); + if(ret > 0 && strcmp(report, default_report) == 0) return(2); return(ret); } @@ -4857,6 +4861,12 @@ int Xorriso_status(struct XorrisO *xorriso, char *filter, FILE *fp, int flag) sprintf(line,"-no_rc\n"); Xorriso_status_result(xorriso,filter,fp,flag&2); } + + is_default= strcmp(xorriso->list_delimiter, "--") == 0; + sprintf(line,"-list_delimiter %s\n", xorriso->list_delimiter); + if(!(is_default && no_defaults)) + Xorriso_status_result(xorriso,filter,fp,flag&2); + is_default= 0; if(xorriso->dialog) sprintf(line,"-dialog on\n"); @@ -4900,7 +4910,8 @@ int Xorriso_status(struct XorrisO *xorriso, char *filter, FILE *fp, int flag) if(xorriso->check_media_default == NULL) { is_default= 1; - sprintf(line, "-check_media_defaults --\n"); + sprintf(line, "-check_media_defaults reset=now %s\n", + xorriso->list_delimiter); } else { ret= Xorriso_check_media_list_job(xorriso, xorriso->check_media_default, line, no_defaults); @@ -5006,7 +5017,8 @@ int Xorriso_status(struct XorrisO *xorriso, char *filter, FILE *fp, int flag) ret= Exclusions_get_descrs(xorriso->disk_exclusions, &paths, &leafs, 0); if(ret>0) { for(; paths!=NULL; paths= paths->next) { - sprintf(line,"-not_paths %s --\n", Text_shellsafe(paths->text, sfe, 0)); + sprintf(line, "-not_paths %s %s\n", + Text_shellsafe(paths->text, sfe, 0), xorriso->list_delimiter); Xorriso_status_result(xorriso,filter,fp,flag&2); } for(; leafs!=NULL; leafs= leafs->next) { @@ -5018,10 +5030,10 @@ int Xorriso_status(struct XorrisO *xorriso, char *filter, FILE *fp, int flag) is_default= (xorriso->file_size_limit == Xorriso_default_file_size_limiT); if(xorriso->file_size_limit <= 0) - sprintf(line, "-file_size_limit off --\n"); + sprintf(line, "-file_size_limit off %s\n", xorriso->list_delimiter); else - sprintf(line, "-file_size_limit %.f --\n", - (double) xorriso->file_size_limit); + sprintf(line, "-file_size_limit %.f %s\n", + (double) xorriso->file_size_limit, xorriso->list_delimiter); if(!(is_default && no_defaults)) Xorriso_status_result(xorriso,filter,fp,flag&2); @@ -6254,7 +6266,7 @@ int Xorriso_end_idx(struct XorrisO *xorriso, int i, warned= 0; for(i= idx; ilist_delimiter)==0) break; if(!((flag&1) || warned)) warned= Xorriso_warn_of_wildcards(xorriso, argv[i], flag&2); @@ -6271,8 +6283,8 @@ int Xorriso_end_idx(struct XorrisO *xorriso, same value as with the call which might have allocated memory. @param xorriso The environment object @param argc Length of argv - @param argv The vector with arguments, eventual "--" and then eventual - unrelated words + @param argv The vector with arguments, eventual list_delimiter ("--") + and then eventual unrelated words @param idx Start index in argv of the argument list @param optc Length of the effective possibly expanded option vector @param optv The option vector. Maybe a pointer into argv or maybe @@ -9595,11 +9607,12 @@ int Xorriso_option_as(struct XorrisO *xorriso, int argc, char **argv, if(end_idx<=0 || (*idx)>=argc) { if(idx_count<1) sprintf(xorriso->info_text, - "-as : Not enough arguments given. Needed: whom do_what --"); + "-as : Not enough arguments given. Needed: whom do_what %s", + xorriso->list_delimiter); else sprintf(xorriso->info_text, - "-as %s : Not enough arguments given. Needed: do_what --", - argv[*idx]); + "-as %s : Not enough arguments given. Needed: do_what %s", + argv[*idx], xorriso->list_delimiter); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); ret= 0; goto ex; } @@ -11417,14 +11430,21 @@ int Xorriso_option_help(struct XorrisO *xorriso, int flag) " -tell_media_space", " Print foreseeable available space on output media", "", +"Options with variable length path list [...] need the list delimiter text", +"as end mark if they are followed by another option. By default this delimiter", +"is \"--\". In dialog and with options read from files, the line end serves", +"as such a mark. With program arguments this mark can be omitted only with", +"the last option in the list of arguments.", +"For brevity the list delimiter is referred as \"--\" throughout this text.", +"", +" -list_delimiter text Set the list delimiter to be used instead of \"--\"", +" It has to be a single word, must not be empty, not longer", +" than 80 characters, may mot contain quotation marks.", +"", "Manipulation options:", "disk_path is a path to an object in the local filesystem tree.", "iso_rr_path is the Rock Ridge name of a file object in the ISO image.", "pathspec is either a disk_path or (if allowed) a pair: iso_rr_path=disk_path", -"Options with variable length path list [...] need \"--\" as end mark", -"if they are followed by another option. In dialog and with options read from", -"files, the line end serves as such a mark. With program arguments this mark", -"can be omitted only with the last option in the list of arguments.", "Options marked by [***] have variable argument length and perform pattern", "expansion if enabled by -iso_rr_pattern resp. -disk_pattern.", "", @@ -11501,7 +11521,8 @@ int Xorriso_option_help(struct XorrisO *xorriso, int flag) " Create empty directories if they do not exist yet.", " -rmdir iso_rr_path [***]", " Delete empty directories.", -" -- Mark end of particular action argument list.", +" -- Default list delimiter marking the end of action argument", +" list. It may be changed by option -list_delimiter.", "", " -not_paths disk_path [***]", " Add the given paths to the list of excluded absolute paths.", @@ -11647,7 +11668,7 @@ int Xorriso_option_help(struct XorrisO *xorriso, int flag) " -check_media_defaults [options] --", " Preset options for runs of -check_media and -extract_cut.", "", -"Compatibility emulation (argument list may be ended by --):", +"Compatibility emulation (argument list may be ended by list delimiter --):", " -as mkisofs [-help|-version|-o|-R|-J|-V|-P|-f|-m|-exclude-list|-no-pad|", " -M|-C|-graft-points|-path-list|pathspecs]", " Perform some mkisofs gestures, understand pathspecs as mkisofs", @@ -11815,6 +11836,47 @@ int Xorriso_option_joliet(struct XorrisO *xorriso, char *mode, int flag) } +/* Option -list_delimiter */ +int Xorriso_option_list_delimiter(struct XorrisO *xorriso, char *text, + int flag) +{ + int ret, argc; + char **argv= NULL; + + if(text[0] == 0) { + sprintf(xorriso->info_text, + "-list_delimiter: New delimiter text is empty"); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); + return(0); + } + if(strlen(text) > 80) { + sprintf(xorriso->info_text, + "-list_delimiter: New delimiter text is too long"); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); + return(0); + } + ret= Sfile_make_argv(xorriso->progname, text, &argc, &argv, 4); + if(ret > 0) { + if(argc > 2) { + sprintf(xorriso->info_text, + "-list_delimiter: New delimiter text contains more than one word"); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); + } + Sfile_make_argv(xorriso->progname, text, &argc, &argv, 2); + if(argc > 2) + return(0); + } + if(strchr(text, '"') != NULL || strchr(text, '\'') != NULL) { + sprintf(xorriso->info_text, + "-list_delimiter: New delimiter text contains quotation marks"); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); + return(0); + } + strcpy(xorriso->list_delimiter, text); + return(1); +} + + /* Option -list_formats */ int Xorriso_option_list_formats(struct XorrisO *xorriso, int flag) { @@ -12537,8 +12599,9 @@ no_memory:; ret= Exclusions_add_not_paths(xorriso->disk_exclusions, num_descr, descr, optc, optv, 0); if(ret<=0) { - sprintf(xorriso->info_text,"Cannot add path list: -not_paths %s%s --", - Text_shellsafe(argv[*idx], sfe, 0), (num_descr>1 ? " ..." : "")); + sprintf(xorriso->info_text,"Cannot add path list: -not_paths %s%s %s", + Text_shellsafe(argv[*idx], sfe, 0), (num_descr>1 ? " ..." : ""), + xorriso->list_delimiter); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); } ex:; @@ -13647,7 +13710,7 @@ int Xorriso_normalize_command(struct XorrisO *xorriso, char *original_cmd, } strcpy(cmd_data, original_cmd); *cmd= cmd_data; - if(strcmp(*cmd, "--")==0) + if(strcmp(*cmd, xorriso->list_delimiter)==0) return(1); while((*cmd)[0]=='-') { if((*cmd)[1]==0) @@ -13674,14 +13737,14 @@ int Xorriso_count_args(struct XorrisO *xorriso, int argc, char **argv, static char arg0_commands[][40]= { "ban_stdio_write","commit","commit_eject","devices","end","help", "list_formats","no_rc","print_size","pwd","pwdi","pwdx", - "rollback","rollback_end","tell_media_space","toc","version","--", + "rollback","rollback_end","tell_media_space","toc","version", "" }; static char arg1_commands[][40]= { "abort_on","add_plainly","blank","cd","cdi","cdx","close","dev", "dummy","dialog","disk_pattern","eject","iso_rr_pattern","follow", "format","fs","gid","grow_blindly", - "history","indev","joliet","mark","not_leaf", + "history","indev","joliet","list_delimiter","mark","not_leaf", "not_list","not_mgt","options_from_file","osirrox","outdev","overwrite", "padding","path_list","pathspecs","pkt_output","print","prompt", "prog","publisher","reassure","report_about","rom_toc_scan", @@ -13722,8 +13785,8 @@ int Xorriso_count_args(struct XorrisO *xorriso, int argc, char **argv, if(ret<0) return(ret); was_dashed= (ret>0); - if(cmd[0]=='#' || cmd[0]==0) { - /* ignore comment line and empty option */; + if(cmd[0]=='#' || cmd[0]==0 || strcmp(cmd, xorriso->list_delimiter) == 0) { + /* ignore: comment line , empty option , orphaned list delimiter */ return(1); } for(i=0; arg0_commands[i][0]!=0; i++) @@ -14060,6 +14123,10 @@ next_command:; (*idx)++; ret= Xorriso_option_joliet(xorriso, arg1, 0); + } else if(strcmp(cmd, "list_delimiter") == 0) { + (*idx)++; + ret= Xorriso_option_list_delimiter(xorriso, arg1, 0); + } else if(strcmp(cmd,"list_formats")==0) { ret= Xorriso_option_list_formats(xorriso, 0); @@ -14318,7 +14385,7 @@ next_command:; (*idx)++; ret= Xorriso_option_volid(xorriso,arg1,0); - } else if(strcmp(cmd,"--")==0){ + } else if(strcmp(cmd, xorriso->list_delimiter)==0){ /* tis ok */; } else if(was_dashed) { @@ -14481,7 +14548,9 @@ int Xorriso_prescan_args(struct XorrisO *xorriso, int argc, char **argv, int i, ret, was_dashed, num2, arg_count; int was_report_about= 0, was_abort_on= 0, was_return_with= 0; char *cmd, *original_cmd, cmd_data[5*SfileadrL], *arg1, *arg2; + char mem_list_delimiter[81]; + strcpy(mem_list_delimiter, xorriso->list_delimiter); for(i=1+(flag&1);idid_something_useful= 1; - return(0); + {ret= 0; goto ex;} } else if(strcmp(cmd,"help")==0) { Xorriso_option_help(xorriso,0); xorriso->did_something_useful= 1; - return(0); + {ret= 0; goto ex;} } } else if(i==1 && strcmp(cmd,"no_rc")==0) { ret= Xorriso_option_no_rc(xorriso, 0); if(ret<=0) - return(ret); + goto ex; } else if((strcmp(cmd,"dev")==0 || strcmp(cmd,"outdev")==0 || strcmp(cmd,"indev")==0) && @@ -14559,13 +14628,22 @@ protect_stdout:; strcmp(arg1, "genisofs")==0 || strcmp(arg1, "xorrisofs")==0) goto protect_stdout; + } else if(strcmp(cmd, "list_delimiter") == 0) { + i++; + ret= Xorriso_option_list_delimiter(xorriso, arg1, 0); + if(ret <= 0) + goto ex; + } else { ret= Xorriso_count_args(xorriso, argc-i, argv+i, &arg_count, 1); if(ret==1) i+= arg_count; } } - return(1); + ret= 1; +ex:; + strcpy(xorriso->list_delimiter, mem_list_delimiter); + return(ret); } diff --git a/libisoburn/trunk/xorriso/xorriso.h b/libisoburn/trunk/xorriso/xorriso.h index 5467607a..5f9663f2 100644 --- a/libisoburn/trunk/xorriso/xorriso.h +++ b/libisoburn/trunk/xorriso/xorriso.h @@ -451,6 +451,10 @@ int Xorriso_option_iso_rr_pattern(struct XorrisO *xorriso, char *mode, /* Option -joliet "on"|"off" */ int Xorriso_option_joliet(struct XorrisO *xorriso, char *mode, int flag); +/* Option -list_delimiter */ +int Xorriso_option_list_delimiter(struct XorrisO *xorriso, char *text, + int flag); + /* Option -list_formats */ int Xorriso_option_list_formats(struct XorrisO *xorriso, int flag); diff --git a/libisoburn/trunk/xorriso/xorriso_private.h b/libisoburn/trunk/xorriso/xorriso_private.h index a7969597..85a4c57d 100644 --- a/libisoburn/trunk/xorriso/xorriso_private.h +++ b/libisoburn/trunk/xorriso/xorriso_private.h @@ -98,6 +98,8 @@ struct XorrisO { /* the global context of xorriso */ int add_plainly; off_t split_size; + char list_delimiter[81]; + /* >>> put libisofs aspects here <<< */ int do_joliet; diff --git a/libisoburn/trunk/xorriso/xorriso_timestamp.h b/libisoburn/trunk/xorriso/xorriso_timestamp.h index 94b024ce..d60a2df7 100644 --- a/libisoburn/trunk/xorriso/xorriso_timestamp.h +++ b/libisoburn/trunk/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2008.09.04.100158" +#define Xorriso_timestamP "2008.09.05.095344" diff --git a/libisoburn/trunk/xorriso/xorrisoburn.c b/libisoburn/trunk/xorriso/xorrisoburn.c index 1efdce02..bf341db6 100644 --- a/libisoburn/trunk/xorriso/xorrisoburn.c +++ b/libisoburn/trunk/xorriso/xorrisoburn.c @@ -6699,7 +6699,7 @@ int Xorriso_burn_track(struct XorrisO *xorriso, off_t write_start_address, "Closed media with data detected. Need blank or appendable media."); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); if(burn_disc_erasable(drive)) { - sprintf(xorriso->info_text, "Try --blank_fast\n"); + sprintf(xorriso->info_text, "Try -blank as_needed\n"); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "HINT", 0); } } else if(disc_state == BURN_DISC_EMPTY) {