New API calls Xorriso_parse_line() and Xorriso__dispose_words()

This commit is contained in:
Thomas Schmitt 2012-09-08 17:38:36 +00:00
parent f34bb71269
commit fe095e322b
6 changed files with 180 additions and 30 deletions

View File

@ -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: *;
};

View File

@ -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+2<argc)
arg2= argv[2+1];
arg2= argv[i+2];
if(i>1)
xorriso->did_something_useful= 1;
if(i==1 && argc==2) {

View File

@ -1,7 +1,7 @@
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
Copyright 2007-2012 Thomas Schmitt, <scdbackup@gmx.net>
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)
{

View File

@ -1,7 +1,7 @@
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>
Copyright 2007-2012 Thomas Schmitt, <scdbackup@gmx.net>
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);

View File

@ -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

View File

@ -1 +1 @@
#define Xorriso_timestamP "2012.09.08.082759"
#define Xorriso_timestamP "2012.09.08.173754"