xref: /original-bsd/lib/libedit/hist.c (revision ce06cd54)
1 /*-
2  * Copyright (c) 1992 The Regents of the University of California.
3  * All rights reserved.
4  *
5  * This code is derived from software contributed to Berkeley by
6  * Christos Zoulas of Cornell University.
7  *
8  * %sccs.include.redist.c%
9  */
10 
11 #if !defined(lint) && !defined(SCCSID)
12 static char sccsid[] = "@(#)hist.c	5.2 (Berkeley) 07/03/92";
13 #endif /* not lint && not SCCSID */
14 
15 /*
16  * hist.c: History access functions
17  */
18 #include "sys.h"
19 #include <stdlib.h>
20 #include "el.h"
21 
22 /* hist_init():
23  *	Initialization function.
24  */
25 protected int
26 hist_init(el)
27     EditLine *el;
28 {
29     el->el_history.fun  = NULL;
30     el->el_history.ref  = NULL;
31     el->el_history.buf   = (char *) el_malloc(EL_BUFSIZ);
32     el->el_history.last  = el->el_history.buf;
33     return 0;
34 }
35 
36 
37 /* hist_end():
38  *	clean up history;
39  */
40 protected void
41 hist_end(el)
42     EditLine *el;
43 {
44     el_free((ptr_t) el->el_history.buf);
45     el->el_history.buf   = NULL;
46 }
47 
48 
49 /* hist_set():
50  *	Set new history interface
51  */
52 protected int
53 hist_set(el, fun, ptr)
54     EditLine *el;
55     hist_fun_t fun;
56     ptr_t ptr;
57 
58 {
59     el->el_history.ref = ptr;
60     el->el_history.fun = fun;
61     return 0;
62 }
63 
64 
65 /* hist_get():
66  *	Get a history line and update it in the buffer.
67  *	eventno tells us the event to get.
68  */
69 protected el_action_t
70 hist_get(el)
71     EditLine *el;
72 {
73     const char    *hp;
74     int     h;
75 
76     if (el->el_history.eventno == 0) {	/* if really the current line */
77 	(void) strncpy(el->el_line.buffer, el->el_history.buf, EL_BUFSIZ);
78 	el->el_line.lastchar = el->el_line.buffer +
79 		(el->el_history.last - el->el_history.buf);
80 
81 #ifdef KSHVI
82     if (el->el_map.type == MAP_VI)
83 	el->el_line.cursor = el->el_line.buffer;
84     else
85 #endif /* KSHVI */
86 	el->el_line.cursor = el->el_line.lastchar;
87 
88 	return CC_REFRESH;
89     }
90 
91     if (el->el_history.ref == NULL)
92 	return CC_ERROR;
93 
94     hp = HIST_FIRST(el);
95 
96     if (hp == NULL)
97 	return CC_ERROR;
98 
99     for (h = 1; h < el->el_history.eventno; h++)
100 	if ((hp = HIST_NEXT(el)) == NULL) {
101 	    el->el_history.eventno = h;
102 	    return CC_ERROR;
103 	}
104 
105     (void) strncpy(el->el_line.buffer, hp, EL_BUFSIZ);
106     el->el_line.lastchar = el->el_line.buffer + strlen(el->el_line.buffer);
107 
108     if (el->el_line.lastchar > el->el_line.buffer) {
109 	if (el->el_line.lastchar[-1] == '\n')
110 	    el->el_line.lastchar--;
111 	if (el->el_line.lastchar[-1] == ' ')
112 	    el->el_line.lastchar--;
113 	if (el->el_line.lastchar < el->el_line.buffer)
114 	    el->el_line.lastchar = el->el_line.buffer;
115     }
116 
117 #ifdef KSHVI
118     if (el->el_map.type == MAP_VI)
119 	el->el_line.cursor = el->el_line.buffer;
120     else
121 #endif /* KSHVI */
122 	el->el_line.cursor = el->el_line.lastchar;
123 
124     return CC_REFRESH;
125 }
126 
127 /* hist_list()
128  *	List history entries
129  */
130 protected int
131 /*ARGSUSED*/
132 hist_list(el, argc, argv)
133     EditLine *el;
134     int argc;
135     char **argv;
136 {
137     const char *str;
138 
139     if (el->el_history.ref == NULL)
140 	return -1;
141     for (str = HIST_LAST(el); str != NULL; str = HIST_PREV(el))
142 	(void) fprintf(el->el_outfile, "%d %s", el->el_history.ev->num, str);
143     return 0;
144 }
145