New option -backslash_codes for expressing weird file names
This commit is contained in:
parent
d0b53ac018
commit
2fce109cee
@ -2,7 +2,7 @@
|
|||||||
.\" First parameter, NAME, should be all caps
|
.\" First parameter, NAME, should be all caps
|
||||||
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
|
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
|
||||||
.\" other parameters are allowed: see man(7), man(1)
|
.\" other parameters are allowed: see man(7), man(1)
|
||||||
.TH XORRISO 1 "Oct 15, 2008"
|
.TH XORRISO 1 "Oct 16, 2008"
|
||||||
.\" Please adjust this date whenever revising the manpage.
|
.\" Please adjust this date whenever revising the manpage.
|
||||||
.\"
|
.\"
|
||||||
.\" Some roff macros, for reference:
|
.\" Some roff macros, for reference:
|
||||||
@ -2198,6 +2198,34 @@ quotation marks.
|
|||||||
.br
|
.br
|
||||||
For brevity the list delimiter is referred as "--" throughout this text.
|
For brevity the list delimiter is referred as "--" throughout this text.
|
||||||
.TP
|
.TP
|
||||||
|
\fB\-backslash_codes\fR "on"|"off"|mode[:mode]
|
||||||
|
Enable or disable the interpretation of symbolic representations of special
|
||||||
|
characters with quoted input or with program arguments. If enabled the
|
||||||
|
following translations apply:
|
||||||
|
.br
|
||||||
|
\\a=bell(007) \\b=backspace(008) \\e=Escape(033) \\f=formfeed(014)
|
||||||
|
.br
|
||||||
|
\\n=linefeed(012) \\r=carriage_return(015) \\t=tab(011)
|
||||||
|
.br
|
||||||
|
\\v=vtab(013) \\\\=backslash(134) \\[0-9][0-9][0-9]=octal_code
|
||||||
|
.br
|
||||||
|
\\\\x[0-9a-f][0-9a-f]=hex_code \\cC=control-C
|
||||||
|
.br
|
||||||
|
Translations can occur with quoted input in 3 modes:
|
||||||
|
.br
|
||||||
|
"in_double_quotes" translates only inside " quotation.
|
||||||
|
.br
|
||||||
|
"outside_single_quotes" translates not inside ' quotation.
|
||||||
|
.br
|
||||||
|
"with_quoted_input" translates all input text.
|
||||||
|
.br
|
||||||
|
With the start program arguments there is mode:
|
||||||
|
.br
|
||||||
|
"with_program_arguments" translates all program arguments.
|
||||||
|
.br
|
||||||
|
Mode "off" is default and disables any translation.
|
||||||
|
Mode "on" is the same as "with_quoted_input:with_program_arguments".
|
||||||
|
.TP
|
||||||
\fB\-temp_mem_limit\fR number["k"|"m"]
|
\fB\-temp_mem_limit\fR number["k"|"m"]
|
||||||
Set the maximum size of temporary memory to be used for image dependent
|
Set the maximum size of temporary memory to be used for image dependent
|
||||||
buffering. Currently this applies to pattern expansion only.
|
buffering. Currently this applies to pattern expansion only.
|
||||||
|
@ -513,6 +513,130 @@ int Sfile_destroy_argv(int *argc, char ***argv, int flag)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Converts backslash codes into single characters:
|
||||||
|
\a BEL 7 , \b BS 8 , \e ESC 27 , \f FF 12 , \n LF 10 , \r CR 13 ,
|
||||||
|
\t HT 9 , \v VT 11 , \\ \ 92
|
||||||
|
\[0-9][0-9][0-9] octal code , \x[0-9a-f][0-9a-f] hex code ,
|
||||||
|
\cX control-x (ascii(X)-64)
|
||||||
|
@param upto maximum number of characters to examine for backslash.
|
||||||
|
The scope of a backslash (0 to 3 characters) is not affected.
|
||||||
|
@param eaten returns the difference in length between input and output
|
||||||
|
@param flag bit0= only determine *eaten, do not convert
|
||||||
|
*/
|
||||||
|
int Sfile_bsl_interpreter(char *text, int upto, int *eaten, int flag)
|
||||||
|
{
|
||||||
|
char *rpt, *wpt, num_text[4], wdummy[8];
|
||||||
|
unsigned int num= 0;
|
||||||
|
|
||||||
|
*eaten= 0;
|
||||||
|
wpt= text;
|
||||||
|
for(rpt= text; *rpt != 0 && rpt - text < upto; rpt++) {
|
||||||
|
if(flag & 1)
|
||||||
|
wpt= wdummy;
|
||||||
|
if(*rpt == '\\') {
|
||||||
|
rpt++;
|
||||||
|
(*eaten)++;
|
||||||
|
if(*rpt == 'a') {
|
||||||
|
*(wpt++)= 7;
|
||||||
|
} else if(*rpt == 'b') {
|
||||||
|
*(wpt++)= 8;
|
||||||
|
} else if(*rpt == 'e') {
|
||||||
|
*(wpt++)= 27;
|
||||||
|
} else if(*rpt == 'f') {
|
||||||
|
*(wpt++)= 12;
|
||||||
|
} else if(*rpt == 'n') {
|
||||||
|
*(wpt++)= 10;
|
||||||
|
} else if(*rpt == 'r') {
|
||||||
|
*(wpt++)= 13;
|
||||||
|
} else if(*rpt == 't') {
|
||||||
|
*(wpt++)= 9;
|
||||||
|
} else if(*rpt == 'v') {
|
||||||
|
*(wpt++)= 11;
|
||||||
|
} else if(*rpt == '\\') {
|
||||||
|
*(wpt++)= '\\';
|
||||||
|
} else if(rpt[0] >= '0' && rpt[0] <= '9' &&
|
||||||
|
rpt[1] >= '0' && rpt[1] <= '9' &&
|
||||||
|
rpt[2] >= '0' && rpt[2] <= '9') {
|
||||||
|
num_text[0]= *(rpt + 0);
|
||||||
|
num_text[1]= *(rpt + 1);
|
||||||
|
num_text[2]= *(rpt + 2);
|
||||||
|
num_text[3]= 0;
|
||||||
|
sscanf(num_text, "%o", &num);
|
||||||
|
if(num > 0 && num <= 255) {
|
||||||
|
rpt+= 2;
|
||||||
|
(*eaten)+= 2;
|
||||||
|
*(wpt++)= num;
|
||||||
|
} else
|
||||||
|
goto not_a_code;
|
||||||
|
} else if(rpt[0] == 'x' &&
|
||||||
|
((rpt[1] >= '0' && rpt[1] <= '9') ||
|
||||||
|
(rpt[1] >= 'A' && rpt[1] <= 'F') ||
|
||||||
|
(rpt[1] >= 'a' && rpt[1] <= 'f'))
|
||||||
|
&&
|
||||||
|
((rpt[2] >= '0' && rpt[2] <= '9') ||
|
||||||
|
(rpt[2] >= 'A' && rpt[2] <= 'F') ||
|
||||||
|
(rpt[2] >= 'a' && rpt[2] <= 'f'))
|
||||||
|
) {
|
||||||
|
num_text[0]= *(rpt + 1);
|
||||||
|
num_text[1]= *(rpt + 2);
|
||||||
|
num_text[2]= 0;
|
||||||
|
sscanf(num_text, "%x", &num);
|
||||||
|
if(num > 0 && num <= 255) {
|
||||||
|
rpt+= 2;
|
||||||
|
(*eaten)+= 2;
|
||||||
|
*(wpt++)= num;
|
||||||
|
} else
|
||||||
|
goto not_a_code;
|
||||||
|
} else if(*rpt == 'c') {
|
||||||
|
if(rpt[1] > 64 && rpt[1] < 96) {
|
||||||
|
*(wpt++)= rpt[1] - 64;
|
||||||
|
rpt++;
|
||||||
|
(*eaten)++;
|
||||||
|
} else
|
||||||
|
goto not_a_code;
|
||||||
|
} else {
|
||||||
|
not_a_code:;
|
||||||
|
*(wpt++)= '\\';
|
||||||
|
rpt--;
|
||||||
|
(*eaten)--;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
*(wpt++)= *rpt;
|
||||||
|
}
|
||||||
|
*wpt= *rpt;
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int Sfile_argv_bsl(int argc, char ***argv, int flag)
|
||||||
|
{
|
||||||
|
int i, ret, eaten;
|
||||||
|
char **new_argv= NULL;
|
||||||
|
|
||||||
|
if(argc <= 0)
|
||||||
|
return(0);
|
||||||
|
new_argv= (char **) Smem_malloC(argc * sizeof(char *));
|
||||||
|
if(new_argv == NULL)
|
||||||
|
return(-1);
|
||||||
|
for(i= 0; i < argc; i++) {
|
||||||
|
new_argv[i]= strdup((*argv)[i]);
|
||||||
|
if(new_argv[i] == NULL)
|
||||||
|
{ret= -1; goto ex;}
|
||||||
|
ret= Sfile_bsl_interpreter(new_argv[i], strlen(new_argv[i]), &eaten, 0);
|
||||||
|
if(ret <= 0)
|
||||||
|
goto ex;
|
||||||
|
}
|
||||||
|
ret= 1;
|
||||||
|
ex:;
|
||||||
|
if(ret <= 0) {
|
||||||
|
if(new_argv != NULL)
|
||||||
|
free((char *) new_argv);
|
||||||
|
} else
|
||||||
|
*argv= new_argv;
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int Sfile_make_argv(char *progname, char *line, int *argc, char ***argv,
|
int Sfile_make_argv(char *progname, char *line, int *argc, char ***argv,
|
||||||
int flag)
|
int flag)
|
||||||
/*
|
/*
|
||||||
@ -521,18 +645,29 @@ int Sfile_make_argv(char *progname, char *line, int *argc, char ***argv,
|
|||||||
bit2= abort with return(0) if incomplete quotes are found
|
bit2= abort with return(0) if incomplete quotes are found
|
||||||
bit3= eventually prepend missing '-' to first argument read from line
|
bit3= eventually prepend missing '-' to first argument read from line
|
||||||
bit4= like bit2 but only check quote completeness, do not allocate memory
|
bit4= like bit2 but only check quote completeness, do not allocate memory
|
||||||
|
>>>
|
||||||
|
bit5+6= interpretation of backslashes:
|
||||||
|
0= no interpretation, leave unchanged
|
||||||
|
1= only inside double quotes
|
||||||
|
2= outside single quotes
|
||||||
|
3= everywhere
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
int i,pass,maxl=0,l,argzaehl=0,bufl,line_start_argc;
|
int i,pass,maxl=0,l,argzaehl=0,bufl,line_start_argc, bsl_mode, ret= 0, eaten;
|
||||||
char *cpt,*start;
|
char *cpt,*start;
|
||||||
char buf[SfileadrL];
|
char *buf= NULL;
|
||||||
|
|
||||||
Sfile_destroy_argv(argc,argv,0);
|
Sfile_destroy_argv(argc,argv,0);
|
||||||
if(flag&2) return(1);
|
if(flag&2)
|
||||||
|
{ret= 1; goto ex;}
|
||||||
|
|
||||||
if(flag & 16)
|
if(flag & 16)
|
||||||
flag|= 4;
|
flag|= 4;
|
||||||
|
bsl_mode= (flag >> 5) & 3;
|
||||||
|
|
||||||
|
buf= calloc(strlen(line) + SfileadrL, 1);
|
||||||
|
if(buf == NULL)
|
||||||
|
{ret= -1; goto ex;}
|
||||||
for(pass=0;pass<2;pass++) {
|
for(pass=0;pass<2;pass++) {
|
||||||
cpt= line-1;
|
cpt= line-1;
|
||||||
if(!(flag&1)){
|
if(!(flag&1)){
|
||||||
@ -554,32 +689,68 @@ int Sfile_make_argv(char *progname, char *line, int *argc, char ***argv,
|
|||||||
if(isspace(*cpt)) break;
|
if(isspace(*cpt)) break;
|
||||||
if(*cpt=='"'){
|
if(*cpt=='"'){
|
||||||
l= cpt-start; bufl= strlen(buf);
|
l= cpt-start; bufl= strlen(buf);
|
||||||
if(l>0) {strncat(buf,start,l);buf[bufl+l]= 0;}
|
if(l>0) {
|
||||||
|
strncpy(buf + bufl, start, l); buf[bufl + l]= 0;
|
||||||
|
if(bsl_mode >= 2) {
|
||||||
|
ret= Sfile_bsl_interpreter(buf, l, &eaten, 0);
|
||||||
|
if(ret <= 0)
|
||||||
|
goto ex;
|
||||||
|
}
|
||||||
|
}
|
||||||
l= strlen(buf);
|
l= strlen(buf);
|
||||||
start= cpt+1;
|
start= cpt+1;
|
||||||
while(*(++cpt)!=0) if(*cpt=='"') break;
|
while(*(++cpt)!=0) if(*cpt=='"') break;
|
||||||
if((flag&4) && *cpt==0)
|
if((flag&4) && *cpt==0)
|
||||||
return(0);
|
{ret= 0; goto ex;}
|
||||||
l= cpt-start; bufl= strlen(buf);
|
l= cpt-start; bufl= strlen(buf);
|
||||||
if(l>0) {strncat(buf,start,l);buf[bufl+l]= 0;}
|
if(l>0) {
|
||||||
|
strncpy(buf + bufl, start, l);
|
||||||
|
buf[bufl + l]= 0;
|
||||||
|
if(bsl_mode >= 1) {
|
||||||
|
ret= Sfile_bsl_interpreter(buf + bufl, l, &eaten, 0);
|
||||||
|
if(ret <= 0)
|
||||||
|
goto ex;
|
||||||
|
}
|
||||||
|
}
|
||||||
start= cpt+1;
|
start= cpt+1;
|
||||||
}else if(*cpt=='\''){
|
}else if(*cpt=='\''){
|
||||||
l= cpt-start; bufl= strlen(buf);
|
l= cpt-start; bufl= strlen(buf);
|
||||||
if(l>0) {strncat(buf,start,l);buf[bufl+l]= 0;}
|
if(l>0) {
|
||||||
|
strncpy(buf + bufl, start, l); buf[bufl + l]= 0;
|
||||||
|
if(bsl_mode >= 2) {
|
||||||
|
ret= Sfile_bsl_interpreter(buf, l, &eaten, 0);
|
||||||
|
if(ret <= 0)
|
||||||
|
goto ex;
|
||||||
|
}
|
||||||
|
}
|
||||||
l= strlen(buf);
|
l= strlen(buf);
|
||||||
start= cpt+1;
|
start= cpt+1;
|
||||||
while(*(++cpt)!=0) if(*cpt=='\'') break;
|
while(*(++cpt)!=0) if(*cpt=='\'') break;
|
||||||
if((flag&4) && *cpt==0)
|
if((flag&4) && *cpt==0)
|
||||||
return(0);
|
{ret= 0; goto ex;}
|
||||||
l= cpt-start; bufl= strlen(buf);
|
l= cpt-start; bufl= strlen(buf);
|
||||||
if(l>0) {strncat(buf,start,l);buf[bufl+l]= 0;}
|
if(l>0) {
|
||||||
|
strncat(buf,start,l);buf[bufl+l]= 0;
|
||||||
|
if(bsl_mode >= 3) {
|
||||||
|
ret= Sfile_bsl_interpreter(buf + bufl, l, &eaten, 0);
|
||||||
|
if(ret <= 0)
|
||||||
|
goto ex;
|
||||||
|
}
|
||||||
|
}
|
||||||
start= cpt+1;
|
start= cpt+1;
|
||||||
}
|
}
|
||||||
if(*cpt==0) break;
|
if(*cpt==0) break;
|
||||||
}
|
}
|
||||||
l= cpt-start;
|
l= cpt-start;
|
||||||
bufl= strlen(buf);
|
bufl= strlen(buf);
|
||||||
if(l>0) {strncat(buf,start,l);buf[bufl+l]= 0;}
|
if(l>0) {
|
||||||
|
strncpy(buf + bufl, start, l); buf[bufl + l]= 0;
|
||||||
|
if(bsl_mode >= 2) {
|
||||||
|
ret= Sfile_bsl_interpreter(buf, l, &eaten, 0);
|
||||||
|
if(ret <= 0)
|
||||||
|
goto ex;
|
||||||
|
}
|
||||||
|
}
|
||||||
l= strlen(buf);
|
l= strlen(buf);
|
||||||
if(pass==0){
|
if(pass==0){
|
||||||
if(argzaehl==line_start_argc && (flag&8))
|
if(argzaehl==line_start_argc && (flag&8))
|
||||||
@ -597,21 +768,25 @@ int Sfile_make_argv(char *progname, char *line, int *argc, char ***argv,
|
|||||||
}
|
}
|
||||||
if(pass==0){
|
if(pass==0){
|
||||||
if(flag & 16)
|
if(flag & 16)
|
||||||
return(1);
|
{ret= 1; goto ex;}
|
||||||
*argc= argzaehl;
|
*argc= argzaehl;
|
||||||
if(argzaehl>0) {
|
if(argzaehl>0) {
|
||||||
*argv= (char **) Smem_malloC(argzaehl*sizeof(char *));
|
*argv= (char **) Smem_malloC(argzaehl*sizeof(char *));
|
||||||
if(*argv==NULL)
|
if(*argv==NULL)
|
||||||
return(-1);
|
{ret= -1; goto ex;}
|
||||||
}
|
}
|
||||||
for(i=0;i<*argc;i++) {
|
for(i=0;i<*argc;i++) {
|
||||||
(*argv)[i]= (char *) Smem_malloC((maxl+1));
|
(*argv)[i]= (char *) Smem_malloC((maxl+1));
|
||||||
if((*argv)[i]==NULL)
|
if((*argv)[i]==NULL)
|
||||||
return(-1);
|
{ret= -1; goto ex;}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return(1);
|
ret= 1;
|
||||||
|
ex:
|
||||||
|
if(buf != NULL)
|
||||||
|
free(buf);
|
||||||
|
return(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -3405,6 +3580,7 @@ int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag)
|
|||||||
m->do_concat_split= 1;
|
m->do_concat_split= 1;
|
||||||
m->do_auto_chmod= 0;
|
m->do_auto_chmod= 0;
|
||||||
m->dialog= 0;
|
m->dialog= 0;
|
||||||
|
m->bsl_interpretation= 0;
|
||||||
m->search_mode= 0;
|
m->search_mode= 0;
|
||||||
m->structured_search= 1;
|
m->structured_search= 1;
|
||||||
m->do_iso_rr_pattern= 1;
|
m->do_iso_rr_pattern= 1;
|
||||||
@ -3837,6 +4013,7 @@ klammer_affe:;
|
|||||||
bit1= release allocated memory and return 1
|
bit1= release allocated memory and return 1
|
||||||
bit2= with bit0: warn of empty text arguments
|
bit2= with bit0: warn of empty text arguments
|
||||||
bit3= deliver as single quoted text including all whitespace
|
bit3= deliver as single quoted text including all whitespace
|
||||||
|
and without any backslash interpretation
|
||||||
@return -1=out of memory , 0=line format error , 1=ok, go on , 2=done
|
@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 Xorriso_read_lines(struct XorrisO *xorriso, FILE *fp, int *linecount,
|
||||||
@ -3894,7 +4071,8 @@ int Xorriso_read_lines(struct XorrisO *xorriso, FILE *fp, int *linecount,
|
|||||||
linept= line + base_length;
|
linept= line + base_length;
|
||||||
}
|
}
|
||||||
if((flag & 1) && !(flag & 8)) {
|
if((flag & 1) && !(flag & 8)) {
|
||||||
ret= Sfile_make_argv("", line, argc, argv, 1);
|
ret= Sfile_make_argv("", line, argc, argv,
|
||||||
|
1 | ((xorriso->bsl_interpretation & 3) << 5));
|
||||||
if(ret < 0)
|
if(ret < 0)
|
||||||
return(ret);
|
return(ret);
|
||||||
if(flag & 4)
|
if(flag & 4)
|
||||||
@ -3970,7 +4148,8 @@ int Xorriso_pager(struct XorrisO *xorriso, char *line, int flag)
|
|||||||
int ret,linecount;
|
int ret,linecount;
|
||||||
char info_text[10*SfileadrL];
|
char info_text[10*SfileadrL];
|
||||||
|
|
||||||
if(xorriso->result_page_length<=0 || xorriso->request_not_to_ask)
|
if(xorriso->result_page_length<=0 || xorriso->request_not_to_ask ||
|
||||||
|
xorriso->dialog == 0)
|
||||||
return(1);
|
return(1);
|
||||||
Xorriso_predict_linecount(xorriso,line,&linecount,0);
|
Xorriso_predict_linecount(xorriso,line,&linecount,0);
|
||||||
if(xorriso->result_line_counter+linecount>xorriso->result_page_length) {
|
if(xorriso->result_line_counter+linecount>xorriso->result_page_length) {
|
||||||
@ -5082,6 +5261,29 @@ int Xorriso_status(struct XorrisO *xorriso, char *filter, FILE *fp, int flag)
|
|||||||
if(!(is_default && no_defaults))
|
if(!(is_default && no_defaults))
|
||||||
Xorriso_status_result(xorriso,filter,fp,flag&2);
|
Xorriso_status_result(xorriso,filter,fp,flag&2);
|
||||||
|
|
||||||
|
is_default= (xorriso->bsl_interpretation == 0);
|
||||||
|
strcpy(line, "-backslash_codes ");
|
||||||
|
if(xorriso->bsl_interpretation == 0)
|
||||||
|
strcat(line, "off");
|
||||||
|
else if(xorriso->bsl_interpretation == (3 | 16))
|
||||||
|
strcat(line, "on");
|
||||||
|
else {
|
||||||
|
if((xorriso->bsl_interpretation & 3) == 1)
|
||||||
|
strcat(line, "in_double_quotes");
|
||||||
|
else if((xorriso->bsl_interpretation & 3) == 2)
|
||||||
|
strcat(line, "outside_single_quotes");
|
||||||
|
else if((xorriso->bsl_interpretation & 3) == 3)
|
||||||
|
strcat(line, "with_quoted_input");
|
||||||
|
if(xorriso->bsl_interpretation & 16) {
|
||||||
|
if(strlen(line) > 17)
|
||||||
|
strcat(line, ":");
|
||||||
|
strcat(line, "with_program_arguments");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
strcat(line, "\n");
|
||||||
|
if(!(is_default && no_defaults))
|
||||||
|
Xorriso_status_result(xorriso,filter,fp,flag&2);
|
||||||
|
|
||||||
is_default= !xorriso->packet_output;
|
is_default= !xorriso->packet_output;
|
||||||
sprintf(line,"-pkt_output %s\n",(xorriso->packet_output?"on":"off"));
|
sprintf(line,"-pkt_output %s\n",(xorriso->packet_output?"on":"off"));
|
||||||
if(!(is_default && no_defaults))
|
if(!(is_default && no_defaults))
|
||||||
@ -9987,6 +10189,50 @@ ex:;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Option -backslash_codes */
|
||||||
|
int Xorriso_option_backslash_codes(struct XorrisO *xorriso, char *mode,
|
||||||
|
int flag)
|
||||||
|
{
|
||||||
|
char *npt, *cpt;
|
||||||
|
int l, was;
|
||||||
|
|
||||||
|
was= xorriso->bsl_interpretation;
|
||||||
|
xorriso->bsl_interpretation= 0;
|
||||||
|
npt= cpt= mode;
|
||||||
|
for(; npt!=NULL; cpt= npt+1) {
|
||||||
|
npt= strchr(cpt,':');
|
||||||
|
if(npt==NULL)
|
||||||
|
l= strlen(cpt);
|
||||||
|
else
|
||||||
|
l= npt-cpt;
|
||||||
|
if(l == 0)
|
||||||
|
continue;
|
||||||
|
if(l == 3 && strncmp(cpt, "off", l)==0) {
|
||||||
|
xorriso->bsl_interpretation= 0;
|
||||||
|
} else if(l == 16 && strncmp(cpt, "in_double_quotes", l)==0) {
|
||||||
|
xorriso->bsl_interpretation= (xorriso->bsl_interpretation & ~3) | 1;
|
||||||
|
} else if(l == 21 && strncmp(cpt, "outside_single_quotes", l)==0) {
|
||||||
|
xorriso->bsl_interpretation= (xorriso->bsl_interpretation & ~3) | 2;
|
||||||
|
} else if(l == 17 && strncmp(cpt, "with_quoted_input", l)==0) {
|
||||||
|
xorriso->bsl_interpretation= (xorriso->bsl_interpretation & ~3) | 3;
|
||||||
|
} else if(l == 22 && strncmp(cpt, "with_program_arguments", l)==0) {
|
||||||
|
xorriso->bsl_interpretation= xorriso->bsl_interpretation | 16;
|
||||||
|
} else if(l == 2 && strncmp(cpt, "on", l)==0) {
|
||||||
|
xorriso->bsl_interpretation= 3 | 16;
|
||||||
|
} else {
|
||||||
|
if(l<SfileadrL)
|
||||||
|
sprintf(xorriso->info_text, "-backslash_codes: unknown mode '%s'", cpt);
|
||||||
|
else
|
||||||
|
sprintf(xorriso->info_text,
|
||||||
|
"-backslash_codes: oversized mode parameter (%d)", l);
|
||||||
|
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||||
|
xorriso->bsl_interpretation= was;
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Option -ban_stdio_write */
|
/* Option -ban_stdio_write */
|
||||||
int Xorriso_option_ban_stdio_write(struct XorrisO *xorriso, int flag)
|
int Xorriso_option_ban_stdio_write(struct XorrisO *xorriso, int flag)
|
||||||
@ -12132,6 +12378,11 @@ int Xorriso_option_help(struct XorrisO *xorriso, int flag)
|
|||||||
" -history text Copy text into libreadline history. This command",
|
" -history text Copy text into libreadline history. This command",
|
||||||
" itself is not copied to the history list.",
|
" itself is not copied to the history list.",
|
||||||
#endif /* Xorriso_with_readlinE */
|
#endif /* Xorriso_with_readlinE */
|
||||||
|
" -backslash_codes \"on\"|\"off\"|\"in_double_quotes\"|",
|
||||||
|
" \"outside_single_quotes\"|\"with_quoted_input\"",
|
||||||
|
" [:\"with_program_arguments\"]",
|
||||||
|
" Disable or enable interpretation of \\a \\b \\e \\f \\n \\r \\t \\v",
|
||||||
|
" \\\\ \\NNN \\xNN \\cC in input or program arguments.",
|
||||||
" -pkt_output \"on\"|\"off\" Direct output to stdout and prefix each line",
|
" -pkt_output \"on\"|\"off\" Direct output to stdout and prefix each line",
|
||||||
" by a short header which tells channel id and a mode number.",
|
" by a short header which tells channel id and a mode number.",
|
||||||
" Each such output packet is finalized by a newline.",
|
" Each such output packet is finalized by a newline.",
|
||||||
@ -13060,7 +13311,7 @@ return:
|
|||||||
<=0 error , 1 = success , 3 = end program run
|
<=0 error , 1 = success , 3 = end program run
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
int ret,linecount= 0, argc, was_failure= 0, fret;
|
int ret,linecount= 0, argc= 0, was_failure= 0, fret;
|
||||||
FILE *fp= NULL;
|
FILE *fp= NULL;
|
||||||
char shellsafe[5*SfileadrL];
|
char shellsafe[5*SfileadrL];
|
||||||
char **argv= NULL;
|
char **argv= NULL;
|
||||||
@ -13092,11 +13343,11 @@ return:
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
if(flag&1) {
|
if(flag&1) {
|
||||||
ret= Sfile_make_argv(xorriso->progname, line, &argc, &argv, 4|8);
|
ret= Sfile_make_argv(xorriso->progname, line, &argc, &argv,
|
||||||
|
4 | 8 | ((xorriso->bsl_interpretation & 3) << 5));
|
||||||
if(ret<=0)
|
if(ret<=0)
|
||||||
goto problem_handler;
|
goto problem_handler;
|
||||||
ret= Xorriso_prescan_args(xorriso,argc,argv,1);
|
ret= Xorriso_prescan_args(xorriso,argc,argv,1);
|
||||||
Sfile_make_argv("", "", &argc, &argv, 2); /* release memory */
|
|
||||||
if(ret==0)
|
if(ret==0)
|
||||||
{ret= 3; goto ex;}
|
{ret= 3; goto ex;}
|
||||||
if(ret<0)
|
if(ret<0)
|
||||||
@ -13123,6 +13374,7 @@ problem_handler:;
|
|||||||
}
|
}
|
||||||
ret= 1;
|
ret= 1;
|
||||||
ex:;
|
ex:;
|
||||||
|
Sfile_make_argv("", "", &argc, &argv, 2); /* release memory */
|
||||||
Xorriso_read_lines(xorriso, fp, &linecount, &linec, &linev, 2);
|
Xorriso_read_lines(xorriso, fp, &linecount, &linec, &linev, 2);
|
||||||
Xorriso_reset_counters(xorriso,0);
|
Xorriso_reset_counters(xorriso,0);
|
||||||
if(fp!=NULL)
|
if(fp!=NULL)
|
||||||
@ -14197,7 +14449,8 @@ int Xorriso_count_args(struct XorrisO *xorriso, int argc, char **argv,
|
|||||||
""
|
""
|
||||||
};
|
};
|
||||||
static char arg1_commands[][40]= {
|
static char arg1_commands[][40]= {
|
||||||
"abort_on","add_plainly","blank","cd","cdi","cdx","close","commit_eject",
|
"abort_on","add_plainly","backslash_codes","blank",
|
||||||
|
"cd","cdi","cdx","close","commit_eject",
|
||||||
"dev", "dummy","dialog","disk_pattern","eject","iso_rr_pattern","follow",
|
"dev", "dummy","dialog","disk_pattern","eject","iso_rr_pattern","follow",
|
||||||
"format","fs","gid","grow_blindly",
|
"format","fs","gid","grow_blindly",
|
||||||
"history","indev","joliet","list_delimiter","mark","not_leaf",
|
"history","indev","joliet","list_delimiter","mark","not_leaf",
|
||||||
@ -14280,16 +14533,16 @@ int Xorriso_count_args(struct XorrisO *xorriso, int argc, char **argv,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* @param flag bit0= recursion
|
||||||
|
bit1= these are command line arguments
|
||||||
|
(for xorriso->argument_emulation)
|
||||||
|
*/
|
||||||
int Xorriso_interpreter(struct XorrisO *xorriso,
|
int Xorriso_interpreter(struct XorrisO *xorriso,
|
||||||
int argc, char **argv, int *idx, int flag)
|
int argc, char **argv, int *idx, int flag)
|
||||||
/*
|
/*
|
||||||
return:
|
return:
|
||||||
<=0 error , 1 = success , 2 = problem event ignored , 3 = end program run
|
<=0 error , 1 = success , 2 = problem event ignored , 3 = end program run
|
||||||
*/
|
*/
|
||||||
/*
|
|
||||||
bit0= recursion
|
|
||||||
bit1= these are command line arguments (for xorriso->argument_emulation)
|
|
||||||
*/
|
|
||||||
{
|
{
|
||||||
int ret, was_dashed, end_ret, num1, num2;
|
int ret, was_dashed, end_ret, num1, num2;
|
||||||
char *cmd, *original_cmd, cmd_data[2*SfileadrL], *arg1, *arg2;
|
char *cmd, *original_cmd, cmd_data[2*SfileadrL], *arg1, *arg2;
|
||||||
@ -14370,6 +14623,10 @@ next_command:;
|
|||||||
} else if(strcmp(cmd,"as")==0) {
|
} else if(strcmp(cmd,"as")==0) {
|
||||||
ret= Xorriso_option_as(xorriso, argc, argv, idx, 0);
|
ret= Xorriso_option_as(xorriso, argc, argv, idx, 0);
|
||||||
|
|
||||||
|
} else if(strcmp(cmd,"backslash_codes")==0) {
|
||||||
|
(*idx)++;
|
||||||
|
ret= Xorriso_option_backslash_codes(xorriso, arg1, 0);
|
||||||
|
|
||||||
} else if(strcmp(cmd,"ban_stdio_write")==0) {
|
} else if(strcmp(cmd,"ban_stdio_write")==0) {
|
||||||
ret= Xorriso_option_ban_stdio_write(xorriso, 0);
|
ret= Xorriso_option_ban_stdio_write(xorriso, 0);
|
||||||
|
|
||||||
@ -14908,7 +15165,8 @@ int Xorriso_execute_option(struct XorrisO *xorriso, char *line, int flag)
|
|||||||
tdiff= tv.tv_sec+(1.e-6*(double) tv.tv_usec);
|
tdiff= tv.tv_sec+(1.e-6*(double) tv.tv_usec);
|
||||||
|
|
||||||
/* parse line into args */
|
/* parse line into args */
|
||||||
ret= Sfile_make_argv(xorriso->progname, line, &argc, &argv, 4);
|
ret= Sfile_make_argv(xorriso->progname, line, &argc, &argv,
|
||||||
|
4 | ((xorriso->bsl_interpretation & 3) << 5));
|
||||||
if(ret < 0) {
|
if(ret < 0) {
|
||||||
Xorriso_msgs_submit(xorriso, 0,
|
Xorriso_msgs_submit(xorriso, 0,
|
||||||
"Severe lack of resources during command line parsing", 0, "FATAL", 0);
|
"Severe lack of resources during command line parsing", 0, "FATAL", 0);
|
||||||
@ -15021,6 +15279,7 @@ int Xorriso_prescan_args(struct XorrisO *xorriso, int argc, char **argv,
|
|||||||
{
|
{
|
||||||
int i, ret, was_dashed, num2, arg_count;
|
int i, ret, was_dashed, num2, arg_count;
|
||||||
int was_report_about= 0, was_abort_on= 0, was_return_with= 0;
|
int was_report_about= 0, was_abort_on= 0, was_return_with= 0;
|
||||||
|
int was_backslash_codes= 0;
|
||||||
char *cmd, *original_cmd, cmd_data[5*SfileadrL], *arg1, *arg2;
|
char *cmd, *original_cmd, cmd_data[5*SfileadrL], *arg1, *arg2;
|
||||||
char mem_list_delimiter[81];
|
char mem_list_delimiter[81];
|
||||||
|
|
||||||
@ -15103,11 +15362,18 @@ protect_stdout:;
|
|||||||
goto protect_stdout;
|
goto protect_stdout;
|
||||||
|
|
||||||
} else if(strcmp(cmd, "list_delimiter") == 0) {
|
} else if(strcmp(cmd, "list_delimiter") == 0) {
|
||||||
|
/* Needed for interpreting other args. Gets reset after prescan. */
|
||||||
i++;
|
i++;
|
||||||
ret= Xorriso_option_list_delimiter(xorriso, arg1, 0);
|
ret= Xorriso_option_list_delimiter(xorriso, arg1, 0);
|
||||||
if(ret <= 0)
|
if(ret <= 0)
|
||||||
goto ex;
|
goto ex;
|
||||||
|
|
||||||
|
} else if(strcmp(cmd,"backslash_codes")==0) {
|
||||||
|
i++;
|
||||||
|
if(!was_backslash_codes)
|
||||||
|
Xorriso_option_backslash_codes(xorriso, arg1, 0);
|
||||||
|
was_backslash_codes= 1;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
ret= Xorriso_count_args(xorriso, argc-i, argv+i, &arg_count, 1);
|
ret= Xorriso_count_args(xorriso, argc-i, argv+i, &arg_count, 1);
|
||||||
if(ret==1)
|
if(ret==1)
|
||||||
@ -15222,6 +15488,8 @@ int Xorriso_main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Interpret program arguments */
|
/* Interpret program arguments */
|
||||||
|
if(xorriso->bsl_interpretation & 16)
|
||||||
|
Sfile_argv_bsl(argc, &argv, 0); /* apply Sfile_bsl_interpreter() to args */
|
||||||
i= 1;
|
i= 1;
|
||||||
ret= Xorriso_interpreter(xorriso,argc,argv,&i,2);
|
ret= Xorriso_interpreter(xorriso,argc,argv,&i,2);
|
||||||
if(ret==3)
|
if(ret==3)
|
||||||
|
@ -282,6 +282,17 @@ int Xorriso_option_alter_date(struct XorrisO *xorriso,
|
|||||||
char *time_type, char *timestring,
|
char *time_type, char *timestring,
|
||||||
int argc, char **argv, int *idx, int flag);
|
int argc, char **argv, int *idx, int flag);
|
||||||
|
|
||||||
|
/* Option -as */
|
||||||
|
/* @param flag bit0=do not report the added item
|
||||||
|
bit1=do not reset pacifier, no final pacifier message
|
||||||
|
*/
|
||||||
|
int Xorriso_option_as(struct XorrisO *xorriso, int argc, char **argv,
|
||||||
|
int *idx, int flag);
|
||||||
|
|
||||||
|
/* Option -backslash_codes */
|
||||||
|
int Xorriso_option_backslash_codes(struct XorrisO *xorriso, char *mode,
|
||||||
|
int flag);
|
||||||
|
|
||||||
/* Option -ban_stdio_write */
|
/* Option -ban_stdio_write */
|
||||||
int Xorriso_option_ban_stdio_write(struct XorrisO *xorriso, int flag);
|
int Xorriso_option_ban_stdio_write(struct XorrisO *xorriso, int flag);
|
||||||
|
|
||||||
|
@ -209,6 +209,16 @@ struct XorrisO { /* the global context of xorriso */
|
|||||||
|
|
||||||
int dialog; /* 0=off , 1=single-line , 2=multi-line */
|
int dialog; /* 0=off , 1=single-line , 2=multi-line */
|
||||||
|
|
||||||
|
int bsl_interpretation;
|
||||||
|
/* whether to run input through Sfile_bsl_interpreter():
|
||||||
|
bit0-1= dialog and quoted file reading
|
||||||
|
0= no interpretation, leave unchanged
|
||||||
|
1= only inside double quotes
|
||||||
|
2= outside single quotes
|
||||||
|
3= everywhere
|
||||||
|
bit2-3= reserved as future expansion of bit0-1
|
||||||
|
bit4= interpretation within program start arguments
|
||||||
|
*/
|
||||||
|
|
||||||
/* Pattern matching facility. It still carries legacy from scdbackup/askme.c
|
/* Pattern matching facility. It still carries legacy from scdbackup/askme.c
|
||||||
but is fully functional for xorriso.
|
but is fully functional for xorriso.
|
||||||
|
@ -1 +1 @@
|
|||||||
#define Xorriso_timestamP "2008.10.15.182605"
|
#define Xorriso_timestamP "2008.10.17.074953"
|
||||||
|
Loading…
Reference in New Issue
Block a user