/* Autoconf patching by David Hedbor, neotron@lysator.liu.se */ /*********************************************************************/ /* file: history.c - functions for the history stuff */ /* TINTIN III */ /* (T)he K(I)cki(N) (T)ickin D(I)kumud Clie(N)t */ /* coded by peter unold 1992 */ /*********************************************************************/ #include <ctype.h> #ifdef HAVE_STRING_H #include <string.h> #else #ifdef HAVE_STRINGS_H #include <strings.h> #endif #endif #include "tintin.h" #ifdef HAVE_STDLIB_H #include <stdlib.h> #endif void insert_history(); extern char *space_out(); extern char *mystrdup(); extern struct session *parse_input(); /************************/ /* the #history command */ /************************/ void history_command(ses) struct session *ses; { if (ses) { int i; char temp[240]; for (i = HISTORY_SIZE - 1; i >= 0; i--) { if (ses->history[i]) { sprintf(temp, "%2d %s ", i, ses->history[i]); tintin_puts2(temp, ses); } } } else tintin_puts("#NO SESSION ACTIVE => NO HISTORY DUMMY!", ses); prompt(NULL); } void do_history(buffer, ses) char *buffer; struct session *ses; { char result[BUFFER_SIZE], *cptr; cptr = space_out(buffer); if (*cptr) { if (*cptr == '!') { if (*(cptr + 1) == '!') { if (ses->history[0]) { strcpy(result, ses->history[0]); strcat(result, cptr + 2); strcpy(buffer, result); } } else if (isdigit(*(cptr + 1))) { int i = atoi(cptr + 1); if (i >= 0 && i < HISTORY_SIZE && ses->history[i]) { strcpy(result, ses->history[i]); strcat(result, cptr + 2); strcpy(buffer, result); } } else { int i; for (i = 0; i < HISTORY_SIZE && ses->history[i]; i++) if (is_abrev(cptr + 1, ses->history[i])) { strcpy(buffer, ses->history[i]); break; } } } } insert_history(buffer, ses); } /***********************************************/ /* insert buffer into a session`s history list */ /***********************************************/ void insert_history(buffer, ses) char *buffer; struct session *ses; { int i; /* CHANGED to fix an annoying memory leak, these were never getting freed */ if (ses->history[HISTORY_SIZE - 1]) free(ses->history[HISTORY_SIZE - 1]); for (i = HISTORY_SIZE - 1; i > 0; i--) ses->history[i] = ses->history[i - 1]; ses->history[0] = mystrdup(buffer); } /************************************************************/ /* do all the parse stuff for !XXXX history commands */ /* i'm a nihilist alright(hell i felt like writing that..) */ /************************************************************/ struct session *parse_history_command(command, arg, ses) char *command; char *arg; struct session *ses; { if (ses) { if ((*(command + 1) == '!' || !*(command + 1)) && ses->history[0]) return parse_input(ses->history[0], ses); else if (isdigit(*(command + 1))) { int i = atoi(command + 1); if (i >= 0 && i < HISTORY_SIZE && ses->history[i]) { return parse_input(ses->history[i], ses); } } } tintin_puts("#I DON'T REMEMBER THAT COMMAND.", ses); return ses; }