New API calls Xorriso_parse_line() and Xorriso__dispose_words()

This commit is contained in:
2012-09-08 17:38:36 +00:00
parent e0201c478f
commit 9b1b770c1b
6 changed files with 180 additions and 30 deletions

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) {