diff options
| author | B. Watson <yalhcru@gmail.com> | 2019-03-16 06:09:59 -0400 | 
|---|---|---|
| committer | B. Watson <yalhcru@gmail.com> | 2019-03-16 06:09:59 -0400 | 
| commit | 6b0a4ed26a9197b18f983317c5deed53d2206f43 (patch) | |
| tree | ce73518d7200bbee95c7ea2d5679fa6adc51bdc7 /src | |
| parent | ec250814476ff63360600067cb6c1124f6aa2388 (diff) | |
| download | fujichat-6b0a4ed26a9197b18f983317c5deed53d2206f43.tar.gz | |
nick completion with Tab key
Diffstat (limited to 'src')
| -rw-r--r-- | src/features.h | 4 | ||||
| -rw-r--r-- | src/fujichat.atr | bin | 92176 -> 92176 bytes | |||
| -rw-r--r-- | src/fujichat.c | 88 | ||||
| -rw-r--r-- | src/fujitest.atr | bin | 92176 -> 92176 bytes | 
4 files changed, 85 insertions, 7 deletions
| diff --git a/src/features.h b/src/features.h index 90f0cd9..822d8e7 100644 --- a/src/features.h +++ b/src/features.h @@ -28,6 +28,7 @@  #undef FEAT_ATRACT_AWAY  #undef FEAT_KEYBOARD_BUFFER  #undef FEAT_COLOR_COMMAND +#undef FEAT_NICK_COMPLETE  #elif defined(FEAT_COL80_HACK) @@ -37,6 +38,7 @@  // #define FEAT_TRAFFIC_INDICATOR  #define FEAT_KEYBOARD_BUFFER  #define FEAT_COLOR_COMMAND +#undef FEAT_NICK_COMPLETE  /* COL80 hack uses 9K of high RAM, so let's disable  	some bells & whistles. */ @@ -101,5 +103,7 @@  /* End of features */ +#define FEAT_NICK_COMPLETE +  #endif  #endif diff --git a/src/fujichat.atr b/src/fujichat.atrBinary files differ index df4ebd6..8a2a997 100644 --- a/src/fujichat.atr +++ b/src/fujichat.atr diff --git a/src/fujichat.c b/src/fujichat.c index 3d61a09..5d47387 100644 --- a/src/fujichat.c +++ b/src/fujichat.c @@ -136,6 +136,13 @@ struct telnet_state *tstate; /* ../apps/telnet.h */  struct timer vbell_timer;  #endif +#ifdef FEAT_NICK_COMPLETE +#define NICK_LIST_SIZE 20 +void nick_completion(void); +void add_to_nick_list(char *); +static char nick_list[NICK_LIST_SIZE][NICKLEN+1]; +#endif +  /*---------------------------------------------------------------------------*/  void main(void) {  #ifdef FEAT_DYNAMIC_VERSION @@ -194,6 +201,8 @@ void main(void) {  		if(strcasecmp(cmdbuf, "d") == 0) {  			exit(0); +		} else if(strcasecmp(cmdbuf, "r") == 0) { +			(void)atari_exec("D:FUJICHAT.COM");  		} else if(strcasecmp(cmdbuf, "s") == 0) {  			i = atari_exec(SETUP_FILENAME);  			printf("Error %d!\n", i); @@ -526,7 +535,11 @@ static void handle_keystroke(void) {  		c = NL;  		send_buf = 1;  	} else if(c == A_TAB) { +#ifdef FEAT_NICK_COMPLETE +		nick_completion(); +#else  		c = TAB; +#endif  	}  // #ifdef FEAT_COL80_HACK  	// else { col80_cursor(); } @@ -813,8 +826,16 @@ void do_msg() {  				output_buf[output_buf_len - 2] = A_EOL;  				output_buf[output_buf_len - 1] = '\0';  				printf("* %s %s", nick, msg + 8); +#ifdef FEAT_NICK_COMPLETE +				add_to_nick_list(nick); +#endif  			} else {  				printf("%s %s", nick, msg); +#ifdef FEAT_NICK_COMPLETE +				nick++; +				bang[0] = '\0'; +				add_to_nick_list(nick); +#endif  			}  		} else {  			// privmsg, is to our nick @@ -1014,18 +1035,71 @@ void resolv_found(char *name, u16_t *ipaddr) {  		done = 1;  	} else {  		printf("%s is %s\n", name, format_ip((uip_ipaddr_t *)ipaddr)); -		/* -		printf("Found name '%s' = %d.%d.%d.%d\n", name, -				htons(ipaddr[0]) >> 8, -				htons(ipaddr[0]) & 0xff, -				htons(ipaddr[1]) >> 8, -				htons(ipaddr[1]) & 0xff); -				*/  		if(!connected)  			(void)uip_connect((uip_ipaddr_t *)ipaddr, htons(config->server_port));  	}  } +#ifdef FEAT_NICK_COMPLETE +/* nick completion: if the cursor is at the end of a word, search backwards +	to the previous space or the beginning of the line to find the start +	of the search term. Then search for that term in the nick list. If +	we find anything, truncate the input buffer at the start of the search +	term, then append whatever we found. */ + +void add_to_nick_list(char *nick) { +	int i; +	for(i=0; i<NICK_LIST_SIZE; i++) { +		if(strcmp(nick, nick_list[i]) == 0) { +			/* already in list */ +			return; +		} +	} + +	for(i=0; i<NICK_LIST_SIZE; i++) { +		if(nick_list[i][0] == '\0') { +			/* found empty slot, add it here */ +			strcpy(nick_list[i], nick); +			return; +		} +	} + +	/* list full, replace 1st element (FIXME: *very* naive strategy) */ +	strcpy(nick_list[0], nick); +} + +void nick_completion(void) { +	static char term[NICKLEN+1]; +	static char result[NICKLEN+1]; +	int len = 0; +	int i; +	char *start = input_buf + input_buf_len; + +	while(start > input_buf && start[-1] != ' ' && len < NICKLEN) { +		start--; +		len++; +		fuji_putchar(A_BS); +	} +	if(len == 0) return; +	input_buf_len -= len; + +	for(i=0; i<len; i++) { +		term[i] = start[i]; +	} +	term[i] = '\0'; + +	for(i=0; i<NICK_LIST_SIZE; i++) { +		if(strnicmp(term, nick_list[i], len) == 0) { +			strcpy(input_buf + input_buf_len, nick_list[i]); +			input_buf_len += strlen(nick_list[i]); +			del_user_buffer(); +			redraw_user_buffer(); +		} +	} + +} +#endif +  #ifdef FEAT_LOGGING  /* 0x100 * 32 = 8K (but we likely won't get that much) */ diff --git a/src/fujitest.atr b/src/fujitest.atrBinary files differ index cd85879..4b178d3 100644 --- a/src/fujitest.atr +++ b/src/fujitest.atr | 
