Blob


1 /*
2 * Copyright (c) 2021 Omar Polo <op@omarpolo.com>
3 *
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
17 #include <stdlib.h>
19 #include "compl.h"
20 #include "telescope.h"
22 /*
23 * Provide completions for execute-extended-command (eecmd).
24 */
25 const char *
26 compl_eecmd(void **data, void **ret, const char **descr)
27 {
28 struct cmd **state = (struct cmd **)data;
30 /* first time: init the state */
31 if (*state == NULL)
32 *state = cmds;
34 if ((*state)->cmd == NULL)
35 return NULL;
37 *descr = (*state)->descr;
38 return (*state)++->cmd;
39 }
41 /*
42 * Provide completions for tab-select.
43 */
44 const char *
45 compl_ts(void **data, void **ret, const char **descr)
46 {
47 struct tab **tab = (struct tab **)data;
49 /* first time: init the state */
50 if (*tab == NULL)
51 *tab = TAILQ_FIRST(&tabshead);
52 else if ((*tab = TAILQ_NEXT(*tab, tabs)) == NULL)
53 return NULL;
55 *ret = *tab;
57 if (*(*tab)->buffer.page.title == '\0')
58 return (*tab)->hist_cur->h;
59 *descr = (*tab)->hist_cur->h;
60 return (*tab)->buffer.page.title;
61 }
63 /*
64 * Provide completions for link-select.
65 */
66 const char *
67 compl_ls(void **data, void **ret, const char **descr)
68 {
69 struct line **line = (struct line **)data;
70 struct line *l;
71 const char *link;
73 l = *line;
74 while (l != NULL && l->type != LINE_LINK)
75 l = TAILQ_NEXT(l, lines);
77 /* end of buffer */
78 if (l == NULL)
79 return NULL;
81 if ((link = l->line) == NULL) {
82 link = l->alt;
83 *descr = NULL;
84 } else
85 *descr = l->alt;
87 *ret = l;
88 *line = TAILQ_NEXT(l, lines);
89 return link;
90 }
92 /*
93 * Provide completions for swiper.
94 */
95 const char *
96 compl_swiper(void **data, void **ret, const char **descr)
97 {
98 struct line **line = (struct line **)data;
99 const char *text;
101 while (*line != NULL && (*line)->line == NULL)
102 *line = TAILQ_NEXT(*line, lines);
104 if (*line == NULL)
105 return NULL;
107 text = (*line)->line;
108 *ret = *line;
109 *line = TAILQ_NEXT(*line, lines);
110 return text;
113 /*
114 * Provide completions for toc
115 */
116 const char *
117 compl_toc(void **data, void **ret, const char **descr)
119 struct line **line = (struct line **)data;
120 struct line *l;
121 const char *text;
123 l = *line;
124 while (l != NULL && (l->line == NULL ||
125 (l->type != LINE_TITLE_1 &&
126 l->type != LINE_TITLE_2 &&
127 l->type != LINE_TITLE_3)))
128 l = TAILQ_NEXT(l, lines);
130 /* end of buffer */
131 if (l == NULL)
132 return NULL;
134 text = l->line;
135 *ret = l;
136 *line = TAILQ_NEXT(l, lines);
137 return text;