Annotation of embedaddon/readline/examples/hist_erasedups.c, revision 1.1
1.1 ! misho 1: /* hist_erasedups -- remove all duplicate entries from history file */
! 2:
! 3: /* Copyright (C) 2011 Free Software Foundation, Inc.
! 4:
! 5: This file is part of the GNU Readline Library (Readline), a library for
! 6: reading lines of text with interactive input and history editing.
! 7:
! 8: Readline is free software: you can redistribute it and/or modify
! 9: it under the terms of the GNU General Public License as published by
! 10: the Free Software Foundation, either version 3 of the License, or
! 11: (at your option) any later version.
! 12:
! 13: Readline is distributed in the hope that it will be useful,
! 14: but WITHOUT ANY WARRANTY; without even the implied warranty of
! 15: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! 16: GNU General Public License for more details.
! 17:
! 18: You should have received a copy of the GNU General Public License
! 19: along with Readline. If not, see <http://www.gnu.org/licenses/>.
! 20: */
! 21: #ifndef READLINE_LIBRARY
! 22: #define READLINE_LIBRARY 1
! 23: #endif
! 24:
! 25: #include <unistd.h>
! 26: #include <stdlib.h>
! 27: #include <stdio.h>
! 28:
! 29: #ifdef READLINE_LIBRARY
! 30: # include "history.h"
! 31: #else
! 32: # include <readline/history.h>
! 33: #endif
! 34:
! 35: #include <string.h>
! 36:
! 37: #define STREQ(a, b) ((a)[0] == (b)[0] && strcmp(a, b) == 0)
! 38: #define STREQN(a, b, n) ((n == 0) ? (1) \
! 39: : ((a)[0] == (b)[0] && strncmp(a, b, n) == 0))
! 40:
! 41: extern int history_offset;
! 42:
! 43: static void
! 44: usage()
! 45: {
! 46: fprintf (stderr, "hist_erasedups: usage: hist_erasedups [-t] [filename]\n");
! 47: exit (2);
! 48: }
! 49:
! 50: int
! 51: main (argc, argv)
! 52: int argc;
! 53: char **argv;
! 54: {
! 55: char *fn;
! 56: int r;
! 57:
! 58: while ((r = getopt (argc, argv, "t")) != -1)
! 59: {
! 60: switch (r)
! 61: {
! 62: case 't':
! 63: history_write_timestamps = 1;
! 64: break;
! 65: default:
! 66: usage ();
! 67: }
! 68: }
! 69: argv += optind;
! 70: argc -= optind;
! 71:
! 72: fn = argc ? argv[0] : getenv ("HISTFILE");
! 73: if (fn == 0)
! 74: {
! 75: fprintf (stderr, "hist_erasedups: no history file\n");
! 76: usage ();
! 77: }
! 78:
! 79: if ((r = read_history (fn)) != 0)
! 80: {
! 81: fprintf (stderr, "hist_erasedups: read_history: %s: %s\n", fn, strerror (r));
! 82: exit (1);
! 83: }
! 84:
! 85: hist_erasedups ();
! 86:
! 87: if ((r = write_history (fn)) != 0)
! 88: {
! 89: fprintf (stderr, "hist_erasedups: write_history: %s: %s\n", fn, strerror (r));
! 90: exit (1);
! 91: }
! 92:
! 93: exit (0);
! 94: }
! 95:
! 96: int
! 97: hist_erasedups ()
! 98: {
! 99: int r, n;
! 100: HIST_ENTRY *h, *temp;
! 101:
! 102: using_history ();
! 103: while (h = previous_history ())
! 104: {
! 105: r = where_history ();
! 106: for (n = 0; n < r; n++)
! 107: {
! 108: temp = history_get (n+history_base);
! 109: if (STREQ (h->line, temp->line))
! 110: {
! 111: remove_history (n);
! 112: r--; /* have to get one fewer now */
! 113: n--; /* compensate for above increment */
! 114: history_offset--; /* moving backwards in history list */
! 115: }
! 116: }
! 117: }
! 118: using_history ();
! 119:
! 120: return r;
! 121: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>