New options -quoted_path_list, -quoted_not_list. Multiline for -options_from_file

This commit is contained in:
2008-10-15 18:26:48 +00:00
parent 97d81a1a4c
commit d0b53ac018
5 changed files with 212 additions and 87 deletions

View File

@ -135,9 +135,9 @@ or
#ifndef Xorriso_sfile_externaL
char *Sfile_fgets(char *line, int maxl, FILE *fp)
/* @param flag bit0= do not clip of carriage return at line end
*/
char *Sfile_fgets_n(char *line, int maxl, FILE *fp, int flag)
{
int l;
char *ret;
@ -146,9 +146,9 @@ char *Sfile_fgets(char *line, int maxl, FILE *fp)
if(ret==NULL)
return(NULL);
l= strlen(line);
if(l>0) if(line[l-1]=='\r') line[--l]= 0;
if(l>0) if(line[l-1]=='\n') line[--l]= 0;
if(l>0) if(line[l-1]=='\r') line[--l]= 0;
if(l > 0 && !(flag & 1)) if(line[l-1] == '\r') line[--l]= 0;
if(l > 0) if(line[l-1] == '\n') line[--l]= 0;
if(l > 0 && !(flag & 1)) if(line[l-1] == '\r') line[--l]= 0;
return(ret);
}
@ -3581,7 +3581,8 @@ get_single:;
if(xorriso->use_stdin || xorriso->dev_fd_1>=0) {
if(flag&2)
{ret= 1; goto ex;}
if(Sfile_fgets(linept,linesize - base_length - 1,stdin) == NULL) {
if(Sfile_fgets_n(linept,linesize - base_length - 1, stdin,
(xorriso->dialog == 2)) == NULL) {
/* need a very dramatic end */
kill(getpid(),SIGHUP);
{ret= -1; goto ex;}
@ -3608,11 +3609,14 @@ get_single:;
strcpy(linept, cpt);
}
process_single:;
#else /* Xorriso_with_readlinE */
if(flag&2)
{ret= 1; goto ex;}
if(Sfile_fgets(linept, linesize - base_length - 1, stdin) == NULL) {
if(Sfile_fgets_n(linept, linesize - base_length - 1, stdin,
(xorriso->dialog == 2)) == NULL) {
/* need a very dramatic end */
kill(getpid(),SIGHUP);
{ret= -1; goto ex;}
@ -3620,7 +3624,6 @@ get_single:;
#endif /* ! Xorriso_with_readlinE */
process_single:;
if(xorriso->dialog == 2) {
append_line= 0;
if(linept != line && strcmp(linept, "@@@") == 0) {
@ -3636,18 +3639,11 @@ new_empty:;
Xorriso_info(xorriso,0);
goto get_single;
}
l= strlen(line);
ret= Sfile_make_argv("", line, &argc, &argv, 16);
if(ret < 0)
goto ex;
l= strlen(line);
if(l > 0)
if(line[l - 1] == '\\') {
line[l - 1]= 0;
append_line= 1;
why_append= "Trailing backslash ";
}
if(ret == 0 && strlen(line) < linesize - 1 && !append_line) {
if(ret == 0 && !append_line) {
/* append a newline character */
if(l >= linesize - 1) {
sprintf(xorriso->info_text,"Input line too long !");
@ -3659,6 +3655,12 @@ new_empty:;
append_line= 1;
why_append= "Quoted newline char";
}
if(l > 0 && !append_line)
if(line[l - 1] == '\\') {
line[l - 1]= 0;
append_line= 1;
why_append= "Trailing backslash ";
}
if(append_line) {
base_length= strlen(line);
linept= line + base_length;
@ -3831,6 +3833,101 @@ klammer_affe:;
}
/* @param flag bit0= quoted multiline mode
bit1= release allocated memory and return 1
bit2= with bit0: warn of empty text arguments
bit3= deliver as single quoted text including all whitespace
@return -1=out of memory , 0=line format error , 1=ok, go on , 2=done
*/
int Xorriso_read_lines(struct XorrisO *xorriso, FILE *fp, int *linecount,
int *argc, char ***argv, int flag)
{
char line[5 * SfileadrL + 2], *linept, *fgot;
int l, base_length, append_line, ret, mem_linecount, i;
Sfile_make_argv("", line, argc, argv, 2);
if(flag & 2)
return(1);
mem_linecount= *linecount;
linept= line;
base_length= 0;
while(1) {
fgot= Sfile_fgets_n(linept, SfileadrL - base_length + 1, fp,
!!(flag & (1 | 8)));
if(fgot == NULL) {
if(ferror(fp))
return(0);
if(linept != line) {
sprintf(xorriso->info_text,"Open quotation mark at end of input");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
return(0);
}
return(2);
}
l= strlen(line);
(*linecount)++;
append_line= 0;
if(flag & 1) { /* check whether the line is incomplete yet */
ret= Sfile_make_argv("", line, argc, argv, 16);
if(ret < 0)
return(ret);
if(ret == 0 && !append_line) {
line[l]= '\n';
line[l + 1]= 0;
append_line= 1;
}
if(l > 0 && !append_line)
if(line[l - 1] == '\\') {
line[l - 1]= 0;
append_line= 1;
}
}
if(l >= SfileadrL) {
sprintf(xorriso->info_text,"Input line too long !");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
return(0);
}
if(!append_line)
break;
base_length= strlen(line);
linept= line + base_length;
}
if((flag & 1) && !(flag & 8)) {
ret= Sfile_make_argv("", line, argc, argv, 1);
if(ret < 0)
return(ret);
if(flag & 4)
for(i= 0; i < *argc; i++) {
if((*argv)[i][0] == 0) {
sprintf(xorriso->info_text, "Empty text as quoted argument in ");
} else if(strlen((*argv)[i]) >= SfileadrL) {
(*argv)[i][SfileadrL - 1]= 0;
sprintf(xorriso->info_text,
"Input text too long and now truncated in");
} else
continue;
if(mem_linecount + 1 < *linecount)
sprintf(xorriso->info_text + strlen(xorriso->info_text),
"lines %d to %d", mem_linecount + 1, *linecount);
else
sprintf(xorriso->info_text + strlen(xorriso->info_text),
"line %d", mem_linecount + 1);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "WARNING", 0);
}
} else {
(*argv)= Smem_malloC(sizeof(char *));
if(argv == NULL)
return(-1);
(*argv)[0]= strdup(line);
if((*argv)[0] == NULL)
return(-1);
*argc= 1;
}
return(1);
}
int Xorriso_predict_linecount(struct XorrisO *xorriso, char *line,
int *linecount, int flag)
{
@ -9612,18 +9709,8 @@ int Xorriso_toc_to_string(struct XorrisO *xorriso, char **toc_text, int flag)
ret= Xorriso_pull_outlists(xorriso, stack_handle, &results, &infos, 0);
if(ret <= 0)
goto ex;
#ifdef NIX
/* <<< info is no longer redirected */
for(lpt= infos; lpt != NULL; lpt= Xorriso_lst_get_next(lpt, 0)) {
strcpy(xorriso->info_text, Xorriso_lst_get_text(lpt, 0));
Xorriso_info(xorriso, 0);
}
#endif
if(toc_ret <= 0)
{ret= toc_ret; goto ex;}
l= 0;
for(lpt= results; lpt != NULL; lpt= Xorriso_lst_get_next(lpt, 0))
l+= strlen(Xorriso_lst_get_text(lpt, 0));
@ -11794,6 +11881,8 @@ int Xorriso_option_help(struct XorrisO *xorriso, int flag)
" Whether to add lonely arguments as pathspec resp. disk_path.",
" -path_list disk_path",
" Like -add but read the pathspecs from file disk_path.",
" -quoted_path_list disk_path",
" Like -path_list but with line rules as -dialog \"on\".",
"",
" -map disk_path iso_rr_path",
" Insert disk file object at the given iso_rr_path.",
@ -11867,6 +11956,8 @@ int Xorriso_option_help(struct XorrisO *xorriso, int flag)
" -not_list disk_path",
" Read lines from disk_path and use as -not_paths (with \"/\")",
" or as -not_leaf (without \"/\").",
" -quoted_not_list disk_path",
" Like -not_list but with line rules as -dialog \"on\".",
" -not_mgt \"reset\"|\"on\"|\"off\"|\"param_on\"|\"subtree_on\"|\"ignore_on\"",
" Control effect of exclusion lists.",
" -follow \"on\"|\"pattern:param:link:mount:limit=#\"|\"default\"|\"off\"",
@ -12785,16 +12876,18 @@ cannot_add:;
}
/* Option -not_list */
/* Option -not_list , -quoted_not_list */
/* @param flag bit0= -quoted_not_list */
int Xorriso_option_not_list(struct XorrisO *xorriso, char *adr, int flag)
{
int ret, linecount= 0, insertcount= 0, null= 0;
int ret, linecount= 0, insertcount= 0, null= 0, argc= 0, i;
FILE *fp= NULL;
char *argpt, sfe[5*SfileadrL], line[SfileadrL];
char sfe[5*SfileadrL], **argv= NULL;
Xorriso_pacifier_reset(xorriso, 0);
if(adr[0]==0) {
sprintf(xorriso->info_text,"Empty file name given with -not_list");
sprintf(xorriso->info_text, "Empty file name given with %s",
(flag & 1) ? "-quoted_not_list" : "-not_list");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
return(0);
}
@ -12802,32 +12895,30 @@ int Xorriso_option_not_list(struct XorrisO *xorriso, char *adr, int flag)
if(ret <= 0)
return(0);
while(1) {
if(Sfile_fgets(line,sizeof(line),fp)==NULL) {
ret= 1;
if(ferror(fp)) {
Xorriso_msgs_submit(xorriso, 0, "Error on reading text line",
errno, "FAILURE", 0);
ret= 0;
}
ret= Xorriso_read_lines(xorriso, fp, &linecount, &argc, &argv,
4 | (flag & 1) );
if(ret <= 0)
goto ex;
if(ret == 2)
break;
for(i= 0; i < argc; i++) {
if(argv[i][0] == 0)
continue;
if(strchr(argv[i], '/')!=NULL) {
null= 0;
ret= Xorriso_option_not_paths(xorriso, 1, argv + i, &null, 0);
} else
ret= Xorriso_option_not_leaf(xorriso, argv[i], 0);
if(ret<=0)
goto ex;
insertcount++;
}
linecount++;
if(line[0]==0)
continue;
if(strchr(line, '/')!=NULL) {
argpt= line;
null= 0;
ret= Xorriso_option_not_paths(xorriso, 1, &argpt, &null, 0);
} else
ret= Xorriso_option_not_leaf(xorriso, line, 0);
if(ret<=0)
goto ex;
insertcount++;
}
ret= 1;
ex:;
if(fp!=NULL)
fclose(fp);
Xorriso_read_lines(xorriso, fp, &linecount, &argc, &argv, 2);
if(ret<=0) {
sprintf(xorriso->info_text, "Aborted reading of file %s in line number %d",
Text_shellsafe(adr, sfe, 0), linecount);
@ -12957,7 +13048,7 @@ ex:;
}
/* Option -options_from_file*/
/* Option -options_from_file */
int Xorriso_option_options_from_file(struct XorrisO *xorriso, char *adr,
int flag)
/*
@ -12971,8 +13062,10 @@ return:
{
int ret,linecount= 0, argc, was_failure= 0, fret;
FILE *fp= NULL;
char line[5*SfileadrL], shellsafe[5*SfileadrL];
char shellsafe[5*SfileadrL];
char **argv= NULL;
int linec= 0;
char *line= NULL, **linev= NULL;
if(adr[0]==0) {
sprintf(xorriso->info_text,"Empty file name given with -options_from_file");
@ -12989,13 +13082,12 @@ return:
if(ret <= 0)
return(0);
while(1) {
if(Sfile_fgets(line,sizeof(line),fp)==NULL) {
ret= 1;
if(ferror(fp))
ret= 0;
ret= Xorriso_read_lines(xorriso, fp, &linecount, &linec, &linev, 1 | 8);
if(ret <= 0)
goto ex; /* no problem_handler because there is no sense in going on */
if(ret == 2)
break;
}
linecount++;
line= linev[0];
if(line[0]==0 || line[0]=='#')
continue;
@ -13029,7 +13121,9 @@ problem_handler:;
continue;
goto ex;
}
ret= 1;
ex:;
Xorriso_read_lines(xorriso, fp, &linecount, &linec, &linev, 2);
Xorriso_reset_counters(xorriso,0);
if(fp!=NULL)
fclose(fp);
@ -13197,17 +13291,19 @@ int Xorriso_option_paste_in(struct XorrisO *xorriso, char *iso_rr_path,
}
/* Option -path-list */
/* Option -path_list , -quoted_path_list */
/* @param flag bit0= -quoted_path_list */
int Xorriso_option_path_list(struct XorrisO *xorriso, char *adr, int flag)
{
int ret,linecount= 0, insertcount= 0, null= 0, was_failure= 0, fret= 0;
int was_ferror= 0;
int was_ferror= 0, argc= 0, i;
FILE *fp= NULL;
char *argpt, sfe[5*SfileadrL],line[SfileadrL];
char sfe[5*SfileadrL], **argv= NULL;
Xorriso_pacifier_reset(xorriso, 0);
if(adr[0]==0) {
sprintf(xorriso->info_text,"Empty file name given with -path-list");
sprintf(xorriso->info_text,"Empty file name given with %s",
flag & 1 ? "-quoted_path_list" : "-path_list");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "WARNING", 0);
return(0);
}
@ -13215,21 +13311,21 @@ int Xorriso_option_path_list(struct XorrisO *xorriso, char *adr, int flag)
if(ret <= 0)
return(0);
while(1) {
if(Sfile_fgets(line,sizeof(line),fp)==NULL) {
ret= 1;
if(ferror(fp))
was_ferror= 1;
ret= Xorriso_read_lines(xorriso, fp, &linecount, &argc, &argv,
4 | (flag & 1) );
if(ret <= 0)
goto ex;
if(ret == 2)
break;
for(i= 0; i < argc; i++) {
if(argv[i][0] == 0)
continue;
null= 0;
ret= Xorriso_option_add(xorriso, 1, argv + i, &null, 1|2);
if(ret<=0 || xorriso->request_to_abort)
goto problem_handler;
insertcount++;
}
linecount++;
if(line[0]==0)
continue;
argpt= line;
null= 0;
ret= Xorriso_option_add(xorriso, 1, &argpt, &null, 1|2);
if(ret<=0 || xorriso->request_to_abort)
goto problem_handler;
insertcount++;
continue; /* regular bottom of loop */
problem_handler:;
@ -13241,6 +13337,9 @@ problem_handler:;
}
ret= 1;
ex:;
if(flag & 1)
Xorriso_read_lines(xorriso, fp, &linecount, &argc, &argv, 2);
if(fp!=NULL)
fclose(fp);
Xorriso_pacifier_callback(xorriso, "files added", xorriso->pacifier_count,
@ -13250,8 +13349,8 @@ ex:;
Text_shellsafe(adr, sfe, 0), linecount);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0,
(fret==-2 ? "NOTE" : "FAILURE"), 0);
}
ret= !was_ferror;
} else
ret= !was_ferror;
sprintf(xorriso->info_text, "Added %d items from file %s\n",
insertcount, Text_shellsafe(adr, sfe, 0));
Xorriso_info(xorriso,0);
@ -14104,7 +14203,8 @@ int Xorriso_count_args(struct XorrisO *xorriso, int argc, char **argv,
"history","indev","joliet","list_delimiter","mark","not_leaf",
"not_list","not_mgt","options_from_file","osirrox","outdev","overwrite",
"pacifier","padding","path_list","pathspecs","pkt_output","print","prompt",
"prog","prog_help","publisher","reassure","report_about","rom_toc_scan",
"prog","prog_help","publisher","quoted_not_list","quoted_path_list",
"reassure","report_about","rom_toc_scan",
"session_log","speed","split_size","status","status_history_max",
"stream_recording","temp_mem_limit","uid","volid","use_readline",
""
@ -14635,6 +14735,14 @@ next_command:;
} else if(strcmp(cmd,"pwdx")==0) {
Xorriso_option_pwdx(xorriso, 0);
} else if(strcmp(cmd,"quoted_not_list")==0) {
(*idx)++;
ret= Xorriso_option_not_list(xorriso, arg1, 1);
} else if(strcmp(cmd,"quoted_path_list")==0) {
(*idx)++;
ret= Xorriso_option_path_list(xorriso, arg1, 1);
} else if(strcmp(cmd,"reassure")==0) {
(*idx)++;
ret= Xorriso_option_reassure(xorriso, arg1, 0);