version 1.3, 2000/08/22 05:04:27 |
version 1.4, 2018/03/29 01:32:54 |
|
|
* DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, |
* DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, |
* PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. |
* PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. |
* |
* |
* $OpenXM: OpenXM_contrib2/asir2000/parse/history.c,v 1.2 2000/08/21 08:31:46 noro Exp $ |
* $OpenXM: OpenXM_contrib2/asir2000/parse/history.c,v 1.3 2000/08/22 05:04:27 noro Exp $ |
*/ |
*/ |
#include <stdio.h> |
#include <stdio.h> |
#include <string.h> |
#include <string.h> |
Line 63 static int hist_traverse, hist_traverse_index; |
|
Line 63 static int hist_traverse, hist_traverse_index; |
|
|
|
void init_hist(int max) |
void init_hist(int max) |
{ |
{ |
hist_length = max; |
hist_length = max; |
hist_table = (char **)calloc(hist_length,sizeof(char *)); |
hist_table = (char **)calloc(hist_length,sizeof(char *)); |
hist_full = 0; |
hist_full = 0; |
hist_current = -1; |
hist_current = -1; |
} |
} |
|
|
void reset_traverse(void) |
void reset_traverse(void) |
{ |
{ |
hist_traverse = 0; |
hist_traverse = 0; |
} |
} |
|
|
void add_hist(char *p) |
void add_hist(char *p) |
{ |
{ |
if ( hist_current >= 0 && CURRENT && !strcmp(p,CURRENT) ) |
if ( hist_current >= 0 && CURRENT && !strcmp(p,CURRENT) ) |
return; |
return; |
hist_current++; |
hist_current++; |
if ( hist_current == hist_length ) { |
if ( hist_current == hist_length ) { |
hist_current = 0; |
hist_current = 0; |
hist_full = 1; |
hist_full = 1; |
} |
} |
CURRENT = (char *)realloc(CURRENT,strlen(p)+1); |
CURRENT = (char *)realloc(CURRENT,strlen(p)+1); |
strcpy(CURRENT,p); |
strcpy(CURRENT,p); |
} |
} |
|
|
char *search_hist(char *p) |
char *search_hist(char *p) |
{ |
{ |
int len,slen,index,i; |
int len,slen,index,i; |
|
|
if ( *p == '!' ) { |
if ( *p == '!' ) { |
if ( hist_current < 0 ) |
if ( hist_current < 0 ) |
return 0; |
return 0; |
else |
else |
return CURRENT; |
return CURRENT; |
} |
} |
slen = strlen(p); |
slen = strlen(p); |
len = hist_full ? hist_length : hist_current+1; |
len = hist_full ? hist_length : hist_current+1; |
index = hist_current; |
index = hist_current; |
for ( i = len; i; i--, index-- ) { |
for ( i = len; i; i--, index-- ) { |
if ( index < 0 ) |
if ( index < 0 ) |
index += hist_length; |
index += hist_length; |
if ( !strncmp(p,hist_table[index],slen) ) |
if ( !strncmp(p,hist_table[index],slen) ) |
return hist_table[index]; |
return hist_table[index]; |
} |
} |
return 0; |
return 0; |
} |
} |
|
|
void read_hist(char *fname) |
void read_hist(char *fname) |
{ |
{ |
int l; |
int l; |
char buf[BUFSIZ]; |
char buf[BUFSIZ]; |
FILE *fp; |
FILE *fp; |
|
|
if ( !(fp = fopen(fname,"rb")) ) |
if ( !(fp = fopen(fname,"rb")) ) |
return; |
return; |
while ( fgets(buf,BUFSIZ-1,fp) ) { |
while ( fgets(buf,BUFSIZ-1,fp) ) { |
l = strlen(buf); |
l = strlen(buf); |
if ( buf[l-1] == '\n' ) |
if ( buf[l-1] == '\n' ) |
buf[l-1] = 0; |
buf[l-1] = 0; |
add_hist(buf); |
add_hist(buf); |
} |
} |
fclose(fp); |
fclose(fp); |
} |
} |
|
|
void write_hist(char *fname) |
void write_hist(char *fname) |
{ |
{ |
int len,index,i; |
int len,index,i; |
FILE *fp; |
FILE *fp; |
|
|
if ( !(fp = fopen(fname,"wb")) ) |
if ( !(fp = fopen(fname,"wb")) ) |
return; |
return; |
len = hist_full ? hist_length : hist_current+1; |
len = hist_full ? hist_length : hist_current+1; |
index = hist_full ? hist_current+1 : 0; |
index = hist_full ? hist_current+1 : 0; |
for ( i = 0; i < len; i++, index++ ) { |
for ( i = 0; i < len; i++, index++ ) { |
if ( index >= hist_length ) |
if ( index >= hist_length ) |
index -= hist_length; |
index -= hist_length; |
fprintf(fp,"%s\n",hist_table[index]); |
fprintf(fp,"%s\n",hist_table[index]); |
} |
} |
fclose(fp); |
fclose(fp); |
} |
} |
|
|
char *next_hist(void) { |
char *next_hist(void) { |
if ( !hist_traverse || hist_traverse_index == hist_current ) |
if ( !hist_traverse || hist_traverse_index == hist_current ) |
return 0; |
return 0; |
else { |
else { |
hist_traverse_index = (hist_traverse_index+1) % hist_length; |
hist_traverse_index = (hist_traverse_index+1) % hist_length; |
return hist_table[hist_traverse_index]; |
return hist_table[hist_traverse_index]; |
} |
} |
} |
} |
|
|
char *prev_hist(void) { |
char *prev_hist(void) { |
if ( !hist_traverse ) { |
if ( !hist_traverse ) { |
if ( hist_current >= 0 ) { |
if ( hist_current >= 0 ) { |
hist_traverse = 1; |
hist_traverse = 1; |
hist_traverse_index = hist_current; |
hist_traverse_index = hist_current; |
return hist_table[hist_traverse_index]; |
return hist_table[hist_traverse_index]; |
} else |
} else |
return 0; |
return 0; |
} else { |
} else { |
hist_traverse_index--; |
hist_traverse_index--; |
if ( hist_traverse_index < 0 ) |
if ( hist_traverse_index < 0 ) |
if ( hist_full ) |
if ( hist_full ) |
hist_traverse_index += hist_length; |
hist_traverse_index += hist_length; |
else |
else |
hist_traverse_index = 0; |
hist_traverse_index = 0; |
return hist_table[hist_traverse_index]; |
return hist_table[hist_traverse_index]; |
} |
} |
} |
} |