|
|
|
@ -41,8 +41,14 @@
|
|
|
|
|
#include <readline/readline.h> |
|
|
|
|
#include <readline/history.h> |
|
|
|
|
#endif /* ! Xorriso_with_old_readlinE */ |
|
|
|
|
#define Xorriso_with_line_editoR yes |
|
|
|
|
#endif /* Xorriso_with_readlinE */ |
|
|
|
|
|
|
|
|
|
#ifdef Xorriso_with_editlinE |
|
|
|
|
#include <histedit.h> |
|
|
|
|
#define Xorriso_with_line_editoR yes |
|
|
|
|
#endif /* Xorriso_with_editlinE */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "xorriso.h" |
|
|
|
|
#include "xorriso_private.h" |
|
|
|
@ -59,6 +65,218 @@ int Xorriso_protect_stdout(struct XorrisO *xorriso, int flag)
|
|
|
|
|
return(1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#ifdef Xorriso_with_editlinE |
|
|
|
|
|
|
|
|
|
/* These have to be global and shared by all XorrisOs which might be active.
|
|
|
|
|
*/ |
|
|
|
|
static EditLine *editline_handle= NULL; |
|
|
|
|
static History *editline_history= NULL; |
|
|
|
|
static int editline_is_initialized= 0; |
|
|
|
|
|
|
|
|
|
char *Xorriso__editline_prompt(EditLine *el_handle) |
|
|
|
|
{ |
|
|
|
|
return ""; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void Xorriso_init_editline(struct XorrisO *xorriso, int flag) |
|
|
|
|
{ |
|
|
|
|
HistEvent ev; |
|
|
|
|
|
|
|
|
|
/* >>> Need mutex */ |
|
|
|
|
|
|
|
|
|
if(editline_is_initialized != 0) |
|
|
|
|
return; |
|
|
|
|
editline_is_initialized= -1; /* Invalid */ |
|
|
|
|
|
|
|
|
|
editline_handle= el_init(xorriso->progname, stdin, stdout, stderr); |
|
|
|
|
if(editline_handle == NULL) |
|
|
|
|
return; |
|
|
|
|
el_set(editline_handle, EL_EDITOR, "emacs"); |
|
|
|
|
el_set(editline_handle, EL_PROMPT, &Xorriso__editline_prompt); |
|
|
|
|
|
|
|
|
|
editline_history= history_init(); |
|
|
|
|
if(editline_history == NULL) |
|
|
|
|
return; |
|
|
|
|
history(editline_history, &ev, H_SETSIZE, 1000); |
|
|
|
|
el_set(editline_handle, EL_HIST, history, editline_history); |
|
|
|
|
|
|
|
|
|
/* >>> ??? where to apply history_end() and el_end() ? */; |
|
|
|
|
|
|
|
|
|
editline_is_initialized= 1; /* Valid now */ |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#endif /* Xorriso_with_editlinE */ |
|
|
|
|
|
|
|
|
|
#ifdef Xorriso_with_line_editoR |
|
|
|
|
|
|
|
|
|
char *Xorriso_emul_readline(struct XorrisO *xorriso, int flag) |
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
#ifdef Xorriso_with_editlinE |
|
|
|
|
|
|
|
|
|
const char *cpt; |
|
|
|
|
int count= 0; |
|
|
|
|
char *retpt; |
|
|
|
|
|
|
|
|
|
/* >>> Need mutex */ |
|
|
|
|
|
|
|
|
|
Xorriso_init_editline(xorriso, 0); |
|
|
|
|
if(editline_is_initialized < 0) { |
|
|
|
|
|
|
|
|
|
/* >>> fallback */; |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cpt= el_gets(editline_handle, &count); |
|
|
|
|
if(count == -1 || cpt == NULL) |
|
|
|
|
return(NULL); |
|
|
|
|
retpt= calloc(1, count + 1); |
|
|
|
|
if(retpt == NULL) |
|
|
|
|
return(NULL); |
|
|
|
|
memcpy(retpt, cpt, count); |
|
|
|
|
retpt[count]= 0; |
|
|
|
|
return(retpt); |
|
|
|
|
|
|
|
|
|
#else |
|
|
|
|
|
|
|
|
|
#ifdef Xorriso_with_readlinE |
|
|
|
|
|
|
|
|
|
char *cpt; |
|
|
|
|
|
|
|
|
|
cpt= readline(""); |
|
|
|
|
return(cpt); |
|
|
|
|
|
|
|
|
|
#else |
|
|
|
|
|
|
|
|
|
return(NULL); |
|
|
|
|
|
|
|
|
|
#endif /* ! Xorriso_with_readlinE */ |
|
|
|
|
#endif /* ! Xorriso_with_editlinE */ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void Xorriso_emul_add_history(struct XorrisO *xorriso, char *line, int flag) |
|
|
|
|
{ |
|
|
|
|
#ifdef Xorriso_with_editlinE |
|
|
|
|
|
|
|
|
|
HistEvent ev; |
|
|
|
|
|
|
|
|
|
/* >>> Need mutex */ |
|
|
|
|
|
|
|
|
|
Xorriso_init_editline(xorriso, 0); |
|
|
|
|
if(editline_is_initialized < 0) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
history(editline_history, &ev, H_ENTER, line); |
|
|
|
|
|
|
|
|
|
#else |
|
|
|
|
|
|
|
|
|
#ifdef Xorriso_with_readlinE |
|
|
|
|
|
|
|
|
|
add_history(line); |
|
|
|
|
|
|
|
|
|
#else |
|
|
|
|
|
|
|
|
|
/* ??? How to raise protest ? */; |
|
|
|
|
|
|
|
|
|
#endif /* ! Xorriso_with_readlinE */ |
|
|
|
|
#endif /* ! Xorriso_with_editlinE */ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* @param flag bit1= do only report to fp
|
|
|
|
|
*/ |
|
|
|
|
int Xorriso_status_history(struct XorrisO *xorriso, char *filter, FILE *fp, |
|
|
|
|
int flag) |
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
#ifdef Xorriso_with_editlinE |
|
|
|
|
|
|
|
|
|
int ret, l; |
|
|
|
|
HistEvent ev; |
|
|
|
|
int hc, i, was_end= 0; |
|
|
|
|
char *str= NULL; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* >>> Need mutex */ |
|
|
|
|
|
|
|
|
|
Xorriso_init_editline(xorriso, 0); |
|
|
|
|
if(editline_is_initialized < 0) |
|
|
|
|
{ret= 0; goto ex;} |
|
|
|
|
|
|
|
|
|
Xorriso_alloc_meM(str, char, SfileadrL); |
|
|
|
|
|
|
|
|
|
ret= history(editline_history, &ev, H_LAST); |
|
|
|
|
for(hc= 0; ret != -1; hc++) { |
|
|
|
|
ret= history(editline_history, &ev, H_PREV); |
|
|
|
|
was_end = (strcmp(ev.str, "-end") == 0); |
|
|
|
|
} |
|
|
|
|
if(was_end) |
|
|
|
|
hc--; |
|
|
|
|
if(hc >= xorriso->status_history_max) |
|
|
|
|
i= hc - xorriso->status_history_max; |
|
|
|
|
else |
|
|
|
|
i= 0; |
|
|
|
|
|
|
|
|
|
ret= history(editline_history, &ev, H_LAST); |
|
|
|
|
for(; i < hc && ret != -1; i++) { |
|
|
|
|
/* Eat newline at line end */ |
|
|
|
|
strncpy(str, ev.str, SfileadrL - 1); |
|
|
|
|
str[SfileadrL - 1]= 0; |
|
|
|
|
l= strlen(str); |
|
|
|
|
if(l > 0) |
|
|
|
|
if(str[l - 1] == '\n') |
|
|
|
|
str[l - 1]= 0; |
|
|
|
|
|
|
|
|
|
sprintf(xorriso->result_line, "-history "); |
|
|
|
|
Text_shellsafe(str, xorriso->result_line, 1); |
|
|
|
|
strcat(xorriso->result_line, "\n"); |
|
|
|
|
Xorriso_status_result(xorriso, filter, fp, flag & 2); |
|
|
|
|
ret= history(editline_history, &ev, H_PREV); |
|
|
|
|
} |
|
|
|
|
ret= 1; |
|
|
|
|
ex:; |
|
|
|
|
Xorriso_free_meM(str); |
|
|
|
|
return(ret); |
|
|
|
|
|
|
|
|
|
#else |
|
|
|
|
#ifdef Xorriso_with_readlinE |
|
|
|
|
|
|
|
|
|
HIST_ENTRY **hl; |
|
|
|
|
int hc, i; |
|
|
|
|
|
|
|
|
|
hl= history_list(); |
|
|
|
|
if(hl != NULL) { |
|
|
|
|
for(hc= 0; hl[hc] != NULL; hc++); |
|
|
|
|
if(hc > 0) |
|
|
|
|
if(strcmp(hl[hc-1]->line, "-end") == 0) |
|
|
|
|
hc--; |
|
|
|
|
if(hc >= xorriso->status_history_max) |
|
|
|
|
i= hc - xorriso->status_history_max; |
|
|
|
|
else |
|
|
|
|
i= 0; |
|
|
|
|
for(; i < hc; i++) { |
|
|
|
|
sprintf(xorriso->result_line, "-history "); |
|
|
|
|
Text_shellsafe(hl[i]->line, xorriso->result_line, 1); |
|
|
|
|
strcat(xorriso->result_line, "\n"); |
|
|
|
|
Xorriso_status_result(xorriso, filter, fp, flag & 2); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return(1); |
|
|
|
|
|
|
|
|
|
#else /* Xorriso_with_readlinE */ |
|
|
|
|
|
|
|
|
|
return(0); |
|
|
|
|
|
|
|
|
|
#endif /* ! Xorriso_with_readlinE */ |
|
|
|
|
#endif /* ! Xorriso_with_editlinE */ |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#endif /* Xorriso_with_line_editoR */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int Xorriso_dialog_input(struct XorrisO *xorriso, char line[], int linesize, |
|
|
|
|
int flag) |
|
|
|
@ -73,10 +291,10 @@ int Xorriso_dialog_input(struct XorrisO *xorriso, char line[], int linesize,
|
|
|
|
|
{ |
|
|
|
|
char *cpt= NULL, **argv= NULL, *linept, *why_append= ""; |
|
|
|
|
int ret, argc= 0, base_length= 0, l, append_line; |
|
|
|
|
#ifdef Xorriso_with_readlinE |
|
|
|
|
#ifdef Xorriso_with_line_editoR |
|
|
|
|
static char last_input[SfileadrL]= {""}; |
|
|
|
|
int no_history= 0; |
|
|
|
|
#endif /* ! Xorriso_with_readlinE */ |
|
|
|
|
#endif /* Xorriso_with_line_editoR */ |
|
|
|
|
double tdiff; |
|
|
|
|
struct timeval tv; |
|
|
|
|
struct timezone tz; |
|
|
|
@ -88,7 +306,7 @@ int Xorriso_dialog_input(struct XorrisO *xorriso, char line[], int linesize,
|
|
|
|
|
fflush(stdout); |
|
|
|
|
linept= line; |
|
|
|
|
|
|
|
|
|
#ifdef Xorriso_with_readlinE |
|
|
|
|
#ifdef Xorriso_with_line_editoR |
|
|
|
|
no_history= (flag & 1) || xorriso->use_stdin; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
@ -103,7 +321,7 @@ get_single:;
|
|
|
|
|
goto process_single; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#ifdef Xorriso_with_readlinE |
|
|
|
|
#ifdef Xorriso_with_line_editoR |
|
|
|
|
|
|
|
|
|
if(xorriso->use_stdin || xorriso->dev_fd_1>=0 || |
|
|
|
|
xorriso->tolerate_stdin_eof) { |
|
|
|
@ -125,7 +343,7 @@ get_single:;
|
|
|
|
|
if(flag&2) { |
|
|
|
|
cpt= NULL; |
|
|
|
|
} else { |
|
|
|
|
cpt= readline(""); |
|
|
|
|
cpt= Xorriso_emul_readline(xorriso, 0); |
|
|
|
|
if(cpt==NULL) { |
|
|
|
|
/* need a very dramatic end */ |
|
|
|
|
kill(getpid(),SIGHUP); |
|
|
|
@ -142,7 +360,7 @@ get_single:;
|
|
|
|
|
strcpy(linept, cpt); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#else /* Xorriso_with_readlinE */ |
|
|
|
|
#else /* Xorriso_with_line_editoR */ |
|
|
|
|
|
|
|
|
|
if(flag&2) |
|
|
|
|
{ret= 1; goto ex;} |
|
|
|
@ -155,7 +373,7 @@ get_single:;
|
|
|
|
|
{ret= -1; goto ex;} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#endif /* ! Xorriso_with_readlinE */ |
|
|
|
|
#endif /* ! Xorriso_with_line_editoR */ |
|
|
|
|
|
|
|
|
|
process_single:; |
|
|
|
|
|
|
|
|
@ -209,19 +427,19 @@ new_empty:;
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#ifdef Xorriso_with_readlinE |
|
|
|
|
#ifdef Xorriso_with_line_editoR |
|
|
|
|
|
|
|
|
|
put_into_history:; |
|
|
|
|
if((flag & 32) || (line[0]!=0 && strcmp(last_input,line)!=0 && !no_history)) { |
|
|
|
|
if(!((flag&4) &&
|
|
|
|
|
(strncmp(line,"-history:",9)==0 || strncmp(line,"-history ",9)==0))) { |
|
|
|
|
add_history(line); |
|
|
|
|
Xorriso_emul_add_history(xorriso, line, 0); |
|
|
|
|
strncpy(last_input,line,sizeof(last_input)-1); |
|
|
|
|
last_input[sizeof(last_input)-1]= 0; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#endif /* ! Xorriso_with_readlinE */ |
|
|
|
|
#endif /* Xorriso_with_line_editoR */ |
|
|
|
|
|
|
|
|
|
ret= 1; |
|
|
|
|
ex:; |
|
|
|
@ -3185,30 +3403,12 @@ int Xorriso_status(struct XorrisO *xorriso, char *filter, FILE *fp, int flag)
|
|
|
|
|
Xorriso_status_result(xorriso,filter,fp,flag&2); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#ifdef Xorriso_with_readlinE |
|
|
|
|
#ifdef Xorriso_with_line_editoR |
|
|
|
|
|
|
|
|
|
if((flag&8) && xorriso->status_history_max>0) { |
|
|
|
|
HIST_ENTRY **hl; |
|
|
|
|
int hc,i; |
|
|
|
|
|
|
|
|
|
hl= history_list(); |
|
|
|
|
if(hl!=NULL) { |
|
|
|
|
for(hc= 0;hl[hc]!=NULL;hc++); |
|
|
|
|
if(hc>0) |
|
|
|
|
if(strcmp(hl[hc-1]->line,"-end")==0) |
|
|
|
|
hc--; |
|
|
|
|
if(hc>=xorriso->status_history_max) |
|
|
|
|
i= hc-xorriso->status_history_max; |
|
|
|
|
else |
|
|
|
|
i= 0; |
|
|
|
|
for(;i<hc;i++) { |
|
|
|
|
sprintf(line,"-history %s\n",Text_shellsafe(hl[i]->line,sfe,0)); |
|
|
|
|
Xorriso_status_result(xorriso,filter,fp,flag&2); |
|
|
|
|
}
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if((flag & 8) && xorriso->status_history_max > 0 && !xorriso->use_stdin) |
|
|
|
|
Xorriso_status_history(xorriso, filter, fp, flag & 2); |
|
|
|
|
|
|
|
|
|
#endif /* Xorriso_with_readlinE */ |
|
|
|
|
#endif /* Xorriso_with_line_editoR */ |
|
|
|
|
|
|
|
|
|
is_default= (xorriso->toc_emulation_flag == 0); |
|
|
|
|
sprintf(line,"-rom_toc_scan %s:%s:%s\n", |
|
|
|
|