/* Copie de l'historique pour l'edition. */ /* Copyright (C) 2008 Emmanuel Varoquaux This file is part of XOS. 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 3 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, see . */ /* A la difference de GNU readline, cette implementation ne permet pas de * modifier l'historique pendant l'edition. A la place, les lignes de * l'historique sont copiees pendant l'edition, et seules les copies sont * modifiables. */ #include "localhist.h" #include "line.h" #include "xmalloc.h" #include #include /* derniere ligne de l'historique, i.e., la ligne en cours d'edition */ static struct linebuf_struct local_history_end_linebuf; static struct linebuf_struct *fetch_history(HIST_ENTRY *hist_entry) { if (!hist_entry->data) { hist_entry->data = xmalloc(sizeof (struct linebuf_struct)); linebuf_init(hist_entry->data, hist_entry->line); } return hist_entry->data; } static void cleanup_hist_entry(HIST_ENTRY *hist_entry) { if (hist_entry->data) { linebuf_destroy(hist_entry->data); free(hist_entry->data); hist_entry->data = NULL; } } void local_history_init() { using_history(); linebuf_init(&local_history_end_linebuf, ""); } struct linebuf_struct *local_history_current() { HIST_ENTRY *hist_entry; return (hist_entry = current_history()) ? current_history()->data : &local_history_end_linebuf; } struct linebuf_struct *local_history_previous() { HIST_ENTRY *hist_entry; if (!(hist_entry = previous_history())) return NULL; return fetch_history(hist_entry); } struct linebuf_struct *local_history_next() { HIST_ENTRY *hist_entry; if (!current_history()) return NULL; return (hist_entry = next_history()) ? fetch_history(hist_entry) : &local_history_end_linebuf; } struct linebuf_struct *local_history_begin() { if (where_history() == 0) return NULL; history_set_pos(0); return fetch_history(current_history()); } struct linebuf_struct *local_history_end() { if (!current_history()) return NULL; using_history(); return &local_history_end_linebuf; } void local_history_destroy() { HIST_ENTRY *hist_entry; using_history(); linebuf_destroy(&local_history_end_linebuf); while ((hist_entry = previous_history())) cleanup_hist_entry(hist_entry); }