1 | #include <stdio.h> |
---|
2 | |
---|
3 | #ifdef READLINE_LIBRARY |
---|
4 | # include "history.h" |
---|
5 | #else |
---|
6 | # include <readline/history.h> |
---|
7 | #endif |
---|
8 | |
---|
9 | main (argc, argv) |
---|
10 | int argc; |
---|
11 | char **argv; |
---|
12 | { |
---|
13 | char line[1024], *t; |
---|
14 | int len, done = 0; |
---|
15 | |
---|
16 | line[0] = 0; |
---|
17 | |
---|
18 | using_history (); |
---|
19 | while (!done) |
---|
20 | { |
---|
21 | printf ("history$ "); |
---|
22 | fflush (stdout); |
---|
23 | t = fgets (line, sizeof (line) - 1, stdin); |
---|
24 | if (t && *t) |
---|
25 | { |
---|
26 | len = strlen (t); |
---|
27 | if (t[len - 1] == '\n') |
---|
28 | t[len - 1] = '\0'; |
---|
29 | } |
---|
30 | |
---|
31 | if (!t) |
---|
32 | strcpy (line, "quit"); |
---|
33 | |
---|
34 | if (line[0]) |
---|
35 | { |
---|
36 | char *expansion; |
---|
37 | int result; |
---|
38 | |
---|
39 | using_history (); |
---|
40 | |
---|
41 | result = history_expand (line, &expansion); |
---|
42 | if (result) |
---|
43 | fprintf (stderr, "%s\n", expansion); |
---|
44 | |
---|
45 | if (result < 0 || result == 2) |
---|
46 | { |
---|
47 | free (expansion); |
---|
48 | continue; |
---|
49 | } |
---|
50 | |
---|
51 | add_history (expansion); |
---|
52 | strncpy (line, expansion, sizeof (line) - 1); |
---|
53 | free (expansion); |
---|
54 | } |
---|
55 | |
---|
56 | if (strcmp (line, "quit") == 0) |
---|
57 | done = 1; |
---|
58 | else if (strcmp (line, "save") == 0) |
---|
59 | write_history ("history_file"); |
---|
60 | else if (strcmp (line, "read") == 0) |
---|
61 | read_history ("history_file"); |
---|
62 | else if (strcmp (line, "list") == 0) |
---|
63 | { |
---|
64 | register HIST_ENTRY **the_list; |
---|
65 | register int i; |
---|
66 | |
---|
67 | the_list = history_list (); |
---|
68 | if (the_list) |
---|
69 | for (i = 0; the_list[i]; i++) |
---|
70 | printf ("%d: %s\n", i + history_base, the_list[i]->line); |
---|
71 | } |
---|
72 | else if (strncmp (line, "delete", 6) == 0) |
---|
73 | { |
---|
74 | int which; |
---|
75 | if ((sscanf (line + 6, "%d", &which)) == 1) |
---|
76 | { |
---|
77 | HIST_ENTRY *entry = remove_history (which); |
---|
78 | if (!entry) |
---|
79 | fprintf (stderr, "No such entry %d\n", which); |
---|
80 | else |
---|
81 | { |
---|
82 | free (entry->line); |
---|
83 | free (entry); |
---|
84 | } |
---|
85 | } |
---|
86 | else |
---|
87 | { |
---|
88 | fprintf (stderr, "non-numeric arg given to `delete'\n"); |
---|
89 | } |
---|
90 | } |
---|
91 | } |
---|
92 | } |
---|