/* 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;
}