aboutsummaryrefslogtreecommitdiffstats
path: root/search.c
diff options
context:
space:
mode:
Diffstat (limited to 'search.c')
-rw-r--r--search.c181
1 files changed, 87 insertions, 94 deletions
diff --git a/search.c b/search.c
index a723933..607124b 100644
--- a/search.c
+++ b/search.c
@@ -15,7 +15,7 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
- * $OpenBSD: search.c,v 1.63 2017/09/06 14:15:13 okan Exp $
+ * $OpenBSD: search.c,v 1.64 2017/12/07 15:40:54 okan Exp $
*/
#include <sys/types.h>
@@ -36,9 +36,35 @@
#define PATH_ANY 0x0001
#define PATH_EXEC 0x0002
-static void search_match_path_type(struct menu_q *, struct menu_q *,
- char *, int);
-static int strsubmatch(char *, char *, int);
+static void match_path_type(struct menu_q *, char *, int);
+static int match_substr(char *, char *, int);
+
+static int
+match_substr(char *sub, char *str, int zeroidx)
+{
+ size_t len, sublen;
+ unsigned int n, flen;
+
+ if (sub == NULL || str == NULL)
+ return(0);
+
+ len = strlen(str);
+ sublen = strlen(sub);
+
+ if (sublen > len)
+ return(0);
+
+ if (zeroidx)
+ flen = 0;
+ else
+ flen = len - sublen;
+
+ for (n = 0; n <= flen; n++)
+ if (strncasecmp(sub, str + n, sublen) == 0)
+ return(1);
+
+ return(0);
+}
void
search_match_client(struct menu_q *menuq, struct menu_q *resultq, char *search)
@@ -46,29 +72,28 @@ search_match_client(struct menu_q *menuq, struct menu_q *resultq, char *search)
struct winname *wn;
struct menu *mi, *tierp[4], *before = NULL;
- TAILQ_INIT(resultq);
-
(void)memset(tierp, 0, sizeof(tierp));
+ TAILQ_INIT(resultq);
TAILQ_FOREACH(mi, menuq, entry) {
int tier = -1, t;
struct client_ctx *cc = (struct client_ctx *)mi->ctx;
/* Match on label. */
- if (strsubmatch(search, cc->label, 0))
+ if (match_substr(search, cc->label, 0))
tier = 0;
/* Match on window name history, from present to past. */
if (tier < 0) {
TAILQ_FOREACH_REVERSE(wn, &cc->nameq, name_q, entry)
- if (strsubmatch(search, wn->name, 0)) {
+ if (match_substr(search, wn->name, 0)) {
tier = 2;
break;
}
}
/* Match on window resource class. */
- if ((tier < 0) && strsubmatch(search, cc->ch.res_class, 0))
+ if ((tier < 0) && match_substr(search, cc->ch.res_class, 0))
tier = 3;
if (tier < 0)
@@ -104,49 +129,8 @@ search_match_client(struct menu_q *menuq, struct menu_q *resultq, char *search)
}
}
-void
-search_print_text(struct menu *mi, int listing)
-{
- (void)snprintf(mi->print, sizeof(mi->print), "%s", mi->text);
-}
-
-void
-search_print_cmd(struct menu *mi, int listing)
-{
- struct cmd_ctx *cmd = (struct cmd_ctx *)mi->ctx;
-
- (void)snprintf(mi->print, sizeof(mi->print), "%s", cmd->name);
-}
-
-void
-search_print_group(struct menu *mi, int listing)
-{
- struct group_ctx *gc = (struct group_ctx *)mi->ctx;
-
- (void)snprintf(mi->print, sizeof(mi->print),
- (group_holds_only_hidden(gc)) ? "%d: [%s]" : "%d: %s",
- gc->num, gc->name);
-}
-
-void
-search_print_client(struct menu *mi, int listing)
-{
- struct client_ctx *cc = (struct client_ctx *)mi->ctx;
- char flag = ' ';
-
- if (cc->flags & CLIENT_ACTIVE)
- flag = '!';
- else if (cc->flags & CLIENT_HIDDEN)
- flag = '&';
-
- (void)snprintf(mi->print, sizeof(mi->print), "(%d) %c[%s] %s",
- (cc->gc) ? cc->gc->num : 0, flag,
- (cc->label) ? cc->label : "", cc->name);
-}
-
static void
-search_match_path_type(struct menu_q *menuq, struct menu_q *resultq,
- char *search, int flag)
+match_path_type(struct menu_q *resultq, char *search, int flag)
{
struct menu *mi;
char pattern[PATH_MAX];
@@ -155,7 +139,6 @@ search_match_path_type(struct menu_q *menuq, struct menu_q *resultq,
(void)strlcpy(pattern, search, sizeof(pattern));
(void)strlcat(pattern, "*", sizeof(pattern));
-
if (glob(pattern, GLOB_MARK, NULL, &g) != 0)
return;
for (i = 0; i < g.gl_pathc; i++) {
@@ -169,35 +152,14 @@ search_match_path_type(struct menu_q *menuq, struct menu_q *resultq,
}
void
-search_match_path(struct menu_q *menuq, struct menu_q *resultq, char *search)
-{
- TAILQ_INIT(resultq);
-
- search_match_path_type(menuq, resultq, search, PATH_ANY);
-}
-
-void
-search_match_text(struct menu_q *menuq, struct menu_q *resultq, char *search)
-{
- struct menu *mi;
-
- TAILQ_INIT(resultq);
-
- TAILQ_FOREACH(mi, menuq, entry)
- if (strsubmatch(search, mi->text, 0))
- TAILQ_INSERT_TAIL(resultq, mi, resultentry);
-}
-
-void
search_match_exec(struct menu_q *menuq, struct menu_q *resultq, char *search)
{
struct menu *mi, *mj;
int r;
TAILQ_INIT(resultq);
-
TAILQ_FOREACH(mi, menuq, entry) {
- if (strsubmatch(search, mi->text, 1) == 0 &&
+ if (match_substr(search, mi->text, 1) == 0 &&
fnmatch(search, mi->text, 0) == FNM_NOMATCH)
continue;
TAILQ_FOREACH(mj, resultq, resultentry) {
@@ -210,34 +172,65 @@ search_match_exec(struct menu_q *menuq, struct menu_q *resultq, char *search)
if (mj == NULL)
TAILQ_INSERT_TAIL(resultq, mi, resultentry);
}
-
if (TAILQ_EMPTY(resultq))
- search_match_path_type(menuq, resultq, search, PATH_EXEC);
+ match_path_type(resultq, search, PATH_EXEC);
}
-static int
-strsubmatch(char *sub, char *str, int zeroidx)
+void
+search_match_path(struct menu_q *menuq, struct menu_q *resultq, char *search)
{
- size_t len, sublen;
- unsigned int n, flen;
+ TAILQ_INIT(resultq);
+ match_path_type(resultq, search, PATH_ANY);
+}
- if (sub == NULL || str == NULL)
- return(0);
+void
+search_match_text(struct menu_q *menuq, struct menu_q *resultq, char *search)
+{
+ struct menu *mi;
- len = strlen(str);
- sublen = strlen(sub);
+ TAILQ_INIT(resultq);
+ TAILQ_FOREACH(mi, menuq, entry) {
+ if (match_substr(search, mi->text, 0))
+ TAILQ_INSERT_TAIL(resultq, mi, resultentry);
+ }
+}
- if (sublen > len)
- return(0);
+void
+search_print_client(struct menu *mi, int listing)
+{
+ struct client_ctx *cc = (struct client_ctx *)mi->ctx;
+ char flag = ' ';
- if (!zeroidx)
- flen = len - sublen;
- else
- flen = 0;
+ if (cc->flags & CLIENT_ACTIVE)
+ flag = '!';
+ else if (cc->flags & CLIENT_HIDDEN)
+ flag = '&';
- for (n = 0; n <= flen; n++)
- if (strncasecmp(sub, str + n, sublen) == 0)
- return(1);
+ (void)snprintf(mi->print, sizeof(mi->print), "(%d) %c[%s] %s",
+ (cc->gc) ? cc->gc->num : 0, flag,
+ (cc->label) ? cc->label : "", cc->name);
+}
- return(0);
+void
+search_print_cmd(struct menu *mi, int listing)
+{
+ struct cmd_ctx *cmd = (struct cmd_ctx *)mi->ctx;
+
+ (void)snprintf(mi->print, sizeof(mi->print), "%s", cmd->name);
+}
+
+void
+search_print_group(struct menu *mi, int listing)
+{
+ struct group_ctx *gc = (struct group_ctx *)mi->ctx;
+
+ (void)snprintf(mi->print, sizeof(mi->print),
+ (group_holds_only_hidden(gc)) ? "%d: [%s]" : "%d: %s",
+ gc->num, gc->name);
+}
+
+void
+search_print_text(struct menu *mi, int listing)
+{
+ (void)snprintf(mi->print, sizeof(mi->print), "%s", mi->text);
}