/****************************************************************************** * TinTin++ * * Copyright (C) 2006 (See CREDITS file) * * * * This program is protected under the GNU GPL (See COPYING) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * *******************************************************************************/ /****************************************************************************** * (T)he K(I)cki(N) (T)ickin D(I)kumud Clie(N)t * * * * coded by Igor van den Hoven 2006 * ******************************************************************************/ #include "tintin.h" DO_COMMAND(do_history) { char left[BUFFER_SIZE], right[BUFFER_SIZE]; int cnt; arg = get_arg_in_braces(arg, left, FALSE); arg = get_arg_in_braces(arg, right, TRUE); substitute(ses, right, right, SUB_VAR|SUB_FUN); if (*left == 0) { tintin_header(ses, " HISTORY COMMANDS "); for (cnt = 0 ; *history_table[cnt].name != 0 ; cnt++) { tintin_printf2(ses, " [%-13s] %s", history_table[cnt].name, history_table[cnt].desc); } tintin_header(ses, ""); return ses; } for (cnt = 0 ; *history_table[cnt].name ; cnt++) { if (!is_abbrev(left, history_table[cnt].name)) { continue; } history_table[cnt].fun(ses, right); return ses; } do_history(ses, ""); return ses; } void add_line_history(struct session *ses, char *line) { struct listroot *root; root = ses->list[LIST_HISTORY]; if (*line == 0) { if (root->used && HAS_BIT(ses->flags, SES_FLAG_REPEATENTER)) { strcpy(line, root->list[root->used - 1]->left); } return; } if (*line == gtd->repeat_char) { search_line_history(ses, line); } update_node_list(ses->list[LIST_HISTORY], line, "", ""); while (root->used > gtd->history_size) { delete_index_list(ses->list[LIST_HISTORY], 0); } return; } void search_line_history(struct session *ses, char *line) { struct listroot *root; int i; root = ses->list[LIST_HISTORY]; for (i = root->used - 1 ; i >= 0 ; i--) { if (is_abbrev(&line[1], root->list[i]->left)) { strcpy(line, root->list[i]->left); return; } } tintin_printf2(ses, "#REPEAT: NO MATCH FOUND FOR '%s'", line); } DO_HISTORY(history_character) { gtd->repeat_char = *arg; show_message(ses, LIST_HISTORY, "#HISTORY CHARACTER SET TO {%c}.", gtd->repeat_char); } DO_HISTORY(history_delete) { if (ses->list[LIST_HISTORY]->used) { delete_index_list(ses->list[LIST_HISTORY], ses->list[LIST_HISTORY]->used - 1); } return; } DO_HISTORY(history_insert) { add_line_history(ses, arg); } DO_HISTORY(history_list) { struct listroot *root; int i, cnt = 1; root = ses->list[LIST_HISTORY]; for (i = 0 ; i < root->used ; i++) { tintin_printf2(ses, "%6d - %s", cnt++, root->list[i]->left); } return; } DO_HISTORY(history_read) { FILE *file; char *cptr, buffer[BUFFER_SIZE]; file = fopen(arg, "r"); if (file == NULL) { tintin_printf2(ses, "#HISTORY: COULDN'T OPEN FILE {%s} TO READ.", arg); return; } kill_list(ses->list[LIST_HISTORY]); while (fgets(buffer, BUFFER_SIZE-1, file)) { cptr = strchr(buffer, '\n'); if (cptr) { *cptr = 0; if (*buffer) { insert_node_list(ses->list[LIST_HISTORY], buffer, "", ""); } } } insert_node_list(ses->list[LIST_HISTORY], "", "", ""); fclose(file); return; } DO_HISTORY(history_size) { if (atoi(arg) < 1 || atoi(arg) > 100000) { tintin_printf(ses, "#HISTORY SIZE: PROVIDE A NUMBER BETWEEN 1 and 100,000"); } else { gtd->history_size = atoi(arg); } return; } DO_HISTORY(history_write) { struct listroot *root = ses->list[LIST_HISTORY]; FILE *file; int i; file = fopen(arg, "w"); if (file == NULL) { tintin_printf2(ses, "#HISTORY: COULDN'T OPEN FILE {%s} TO WRITE.", arg); return; } for (i = 0 ; i < root->used ; i++) { fprintf(file, "%s\n", root->list[i]->left); } fclose(file); return; }