diff --git a/libisoburn/libisoburn.ver b/libisoburn/libisoburn.ver index 8cc210f0..50b1f071 100644 --- a/libisoburn/libisoburn.ver +++ b/libisoburn/libisoburn.ver @@ -114,15 +114,18 @@ isoburn_toc_session_get_tracks; isoburn_toc_track_get_emul; isoburn_toc_track_get_entry; isoburn_version; +Xorriso__dispose_words; +Xorriso__get_patch_level_text; +Xorriso__is_compatible; +Xorriso__version; +Xorriso__preset_signal_behavior; Xorriso_change_is_pending; Xorriso_destroy; Xorriso_dialog; Xorriso_eval_problem_status; Xorriso_execute_option; -Xorriso__get_patch_level_text; Xorriso_get_problem_status; Xorriso_interpreter; -Xorriso__is_compatible; Xorriso_lst_destroy_all; Xorriso_lst_get_next; Xorriso_lst_get_prev; @@ -287,8 +290,8 @@ Xorriso_option_volume_date; Xorriso_option_write_type; Xorriso_option_xattr; Xorriso_option_zisofs; +Xorriso_parse_line; Xorriso_prescan_args; -Xorriso__preset_signal_behavior; Xorriso_process_errfile; Xorriso_process_msg_queues; Xorriso_program_arg_bsl; @@ -297,7 +300,6 @@ Xorriso_push_outlists; Xorriso_read_rc; Xorriso_set_problem_status; Xorriso_startup_libraries; -Xorriso__version; local: *; }; diff --git a/xorriso/parse_exec.c b/xorriso/parse_exec.c index daa50ab9..708fe24c 100644 --- a/xorriso/parse_exec.c +++ b/xorriso/parse_exec.c @@ -1682,6 +1682,32 @@ next_command:; } else if(strcmp(cmd,"test")==0) { /* This option does not exist. */ /* install temporary test code here */; +{ + int pargc, pflag, max_words; + char **pargv= NULL, *pline, *prefix, *separators; + + (*idx)+= 5; + pline= arg1; + prefix= arg2; + if(*idx - 3 < argc) + separators= argv[*idx - 3]; + max_words= 0; + if(*idx - 2 < argc) + sscanf(argv[*idx - 2], "%d", &max_words); + pflag= 0; + if(*idx - 1 < argc) + sscanf(argv[*idx - 1], "%d", &pflag); + ret= Xorriso_parse_line(xorriso, pline, prefix, separators, max_words, + &pargc, &pargv, pflag); + fprintf(stderr, + "xorriso_test: Xorriso_parse_line: ret= %d , argc= %d , argv= 0x%lX\n", + ret, pargc, (unsigned long) pargv); + if(ret == 1) + for(i= 0; i < pargc; i++) + fprintf(stderr, "xorriso_test: argv[%d]= '%s'\n", i, pargv[i]); + Xorriso__dispose_words(&pargc, &pargv); +} + } else if(strcmp(cmd,"toc")==0) { Xorriso_option_toc(xorriso, 0); @@ -1776,6 +1802,53 @@ ex:; } +int Xorriso_parse_line(struct XorrisO *xorriso, char *line, + char *prefix, char *separators, int max_words, + int *argc, char ***argv, int flag) +{ + int ret; + char *to_parse; + + *argc= 0; + *argv= NULL; + + to_parse= line; + if(prefix[0]) { + if(strncmp(line, prefix, strlen(prefix)) == 0) { + to_parse= line + strlen(prefix); + } else { + ret= 2; goto ex; + } + } + + ret= Sfile_sep_make_argv(xorriso->progname, to_parse, separators, + max_words, argc, argv, + (!(flag & 32)) | 4 | ((xorriso->bsl_interpretation & 3) << 5)); + if(ret < 0) { + Xorriso_msgs_submit(xorriso, 0, + "Severe lack of resources during command line parsing", 0, "FATAL", 0); + goto ex; + } + if(ret == 0) { + sprintf(xorriso->info_text, "Incomplete quotation in %s line: %s", + (flag & 32) ? "command" : "parsed", to_parse); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); + goto ex; + } + ret= 1; +ex:; + if(ret <= 0) + Sfile_sep_make_argv("", "", "", 0, argc, argv, 2); /* release memory */ + return(ret); +} + + +void Xorriso__dispose_words(int *argc, char ***argv) +{ + Sfile_make_argv("", "", argc, argv, 2); /* release memory */ +} + + int Xorriso_execute_option(struct XorrisO *xorriso, char *line, int flag) /* bit0-bit15 are forwarded to Xorriso_interpreter @@ -1795,20 +1868,10 @@ int Xorriso_execute_option(struct XorrisO *xorriso, char *line, int flag) xorriso->idle_time= 0.0; tdiff= tv.tv_sec+(1.e-6*(double) tv.tv_usec); - /* parse line into args */ - ret= Sfile_make_argv(xorriso->progname, line, &argc, &argv, - 4 | ((xorriso->bsl_interpretation & 3) << 5)); - if(ret < 0) { - Xorriso_msgs_submit(xorriso, 0, - "Severe lack of resources during command line parsing", 0, "FATAL", 0); + ret= Xorriso_parse_line(xorriso, line, "", "", 0, &argc, &argv, 32 | 64); + if(ret <= 0) goto ex; - } - if(ret == 0) { - sprintf(xorriso->info_text, "Incomplete quotation in command line: %s", - line); - Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); - goto ex; - } + if(argc<2) {ret= 1; goto ex;} if(argv[1][0]=='#') @@ -1931,7 +1994,7 @@ int Xorriso_prescan_args(struct XorrisO *xorriso, int argc, char **argv, arg1= argv[i+1]; arg2= ""; if(i+21) xorriso->did_something_useful= 1; if(i==1 && argc==2) { diff --git a/xorriso/sfile.c b/xorriso/sfile.c index e7697ab0..6ec3f984 100644 --- a/xorriso/sfile.c +++ b/xorriso/sfile.c @@ -1,7 +1,7 @@ /* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images. - Copyright 2007-2010 Thomas Schmitt, + Copyright 2007-2012 Thomas Schmitt, Provided under GPL version 2 or later. @@ -638,8 +638,8 @@ int Sfile_destroy_argv(int *argc, char ***argv, int flag) } -int Sfile_make_argv(char *progname, char *line, int *argc, char ***argv, - int flag) +int Sfile_sep_make_argv(char *progname, char *line, char *separators, + int max_words, int *argc, char ***argv, int flag) /* bit0= read progname as first argument from line bit1= just release argument list argv and return @@ -682,12 +682,26 @@ int Sfile_make_argv(char *progname, char *line, int *argc, char ***argv, if(pass==0) maxl= 0; } while(*(++cpt)!=0){ - if(isspace(*cpt)) continue; + if(*separators) { + if(strchr(separators, *cpt) != NULL) + continue; + } else if(isspace(*cpt)) + continue; start= cpt; buf[0]= 0; cpt--; + + if(max_words > 0 && argzaehl >= max_words && *cpt != 0) { + /* take uninterpreted up to the end */ + cpt+= strlen(cpt) - 1; + } + while(*(++cpt)!=0) { - if(isspace(*cpt)) break; + if(*separators) { + if(strchr(separators, *cpt) != NULL) + break; + } else if(isspace(*cpt)) + break; if(*cpt=='"'){ l= cpt-start; bufl= strlen(buf); if(l>0) { @@ -794,6 +808,13 @@ ex: } +int Sfile_make_argv(char *progname, char *line, int *argc, char ***argv, + int flag) +{ + return Sfile_sep_make_argv(progname, line, "", 0, argc, argv, flag); +} + + /* @param flag bit0= append */ int Sfile_str(char target[SfileadrL], char *source, int flag) { diff --git a/xorriso/sfile.h b/xorriso/sfile.h index 74cdb309..d09c0148 100644 --- a/xorriso/sfile.h +++ b/xorriso/sfile.h @@ -1,7 +1,7 @@ /* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images. - Copyright 2007-2010 Thomas Schmitt, + Copyright 2007-2012 Thomas Schmitt, Provided under GPL version 2 or later. @@ -93,6 +93,8 @@ int Sfile_argv_bsl(int argc, char ***argv, int flag); */ int Sfile_make_argv(char *progname, char *line, int *argc, char ***argv, int flag); +int Sfile_sep_make_argv(char *progname, char *line, char *separators, + int max_argc, int *argc, char ***argv, int flag); /* YYMMDD[.hhmm[ss]] */ int Sfile_decode_datestr(struct tm *reply, char *text, int flag); diff --git a/xorriso/xorriso.h b/xorriso/xorriso.h index 3e3f49eb..bedabf77 100644 --- a/xorriso/xorriso.h +++ b/xorriso/xorriso.h @@ -287,10 +287,7 @@ int Xorriso_read_rc(struct XorrisO *xorriso, int flag); (*argv)[1] to (*argv)[argc-1] contain commands and parameters If argv after the call differs from argv before the call, then one should dispose it later by: - for(i= 0; i < argc; i++) - if(argv[i] != NULL) - free(argv[i]); - free(argv); + Xorriso__dispose_words(argc, argv); @param flag unused yet, submit 0 @return <= 0 error , > 0 success */ @@ -305,7 +302,7 @@ int Xorriso_program_arg_bsl(struct XorrisO *xorriso, int argc, char ***argv, parameters. All parameters must be given in the same call as their command. @since 1.2.2: Commands may get arranged in a sequence that is most likely to make sense. - E.g. image loading settings before drive aquiration, then commands fori + E.g. image loading settings before drive aquiration, then commands for adding files, then settings for writing, then writing. This feature may be enabled by command "-x" in Xorriso_prescan_args() or by parameter flag of this call. @@ -357,6 +354,71 @@ int Xorriso_interpreter(struct XorrisO *xorriso, int Xorriso_execute_option(struct XorrisO *xorriso, char *line, int flag); +/* Parse a text line into words. This parsing obeys the same rules as + command line parsing but allows to skip a prefix, to use a user provided + set of separator characters, and to restrict the number of parsed words. + @since 1.2.6 + @param xorriso The context object which provides settings for parsing + @param line A text of one or more words according to man xorriso + paragraph "Command processing" up to and including + "Backslash Interpretation". + @param prefix If not empty then the line will only be parsed if it + begins by the prefix text. Parsing will then begin after + the end of the prefix. + If the prefix does not match, then 0 will be returned + in *argc, argv will be NULL, and the return value will + be 2. + @param separators If not empty this overrides the default list of word + separating characters. Default set is the one of + isspace(3). + @param max_words If not 0: Maximum number of words to parse. If there + remains line text after the last parsed word and its + following separators, then this remainder is copied + unparsed into a final result word. In this case *argc + will be larger than max_words by one. Note that trailing + separators are considered to be followed by an empty + word. + @param argc Will return the number of allocated and filled word + strings. + @param argv Will return the array of word strings. + Do not forget to dispose the allocated memory by a + call to Xorriso__dispose_words(). + @param flag Bitfield for control purposes + bit0= Override setting of -backslash_codes + bit1-4= With bit1: backslash behavior + 0= off + 1= in_double_quotes + 2= in_quotes + 3= with_quoted_input resp. on + bit5= Prepend the program name as (*argv)[0], so that + *argv is suitable for Xorriso_interpreter() + and other calls which expect this. + bit6= Issue failure message in case of return 0 + @return <=0 means error and invalidity of *argv: + 0 = Input format error. E.g. bad quotation mark. + -1 = Lack of resources. E.g. memory. + >0 means success but not necessarily a valid result: + 1 = Result in argc and argv is valid (but may + be empty by argc == 0, argv == NULL). + 2 = Line did not match prefix. Result is invalid + and empty. +*/ +int Xorriso_parse_line(struct XorrisO *xorriso, char *line, + char *prefix, char *separators, int max_words, + int *argc, char ***argv, int flag); + + +/* Dispose a list of strings as allocated by Xorriso_parse_line() or + Xorriso_program_arg_bsl(). + @since 1.2.6 + @param argc A pointer to the number of allocated and filled word + strings. *argc will be set to 0 by this call. + @param argv A pointer to the array of word strings. + *argv will be set to NULL by this call. +*/ +void Xorriso__dispose_words(int *argc, char ***argv); + + /* Enter xorriso command line dialog mode, using libreadline if configured at build time and not disabled at run time. This call returns immediately if not option -dialog "on" was performed diff --git a/xorriso/xorriso_timestamp.h b/xorriso/xorriso_timestamp.h index 8ff12548..ff4ec268 100644 --- a/xorriso/xorriso_timestamp.h +++ b/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2012.09.08.082759" +#define Xorriso_timestamP "2012.09.08.173754"