summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJari Vetoniemi <mailroxas@gmail.com>2014-04-12 19:59:21 +0300
committerJari Vetoniemi <mailroxas@gmail.com>2014-04-12 19:59:21 +0300
commit311e4b36768a0d4e113ccf6d2256ca95c6621508 (patch)
tree04be6cb3158375ca9932481f279167eff145435d
parentcd73a1ba610db7cfa928b37039a1bbdaee88972a (diff)
downloadbemenu-311e4b36768a0d4e113ccf6d2256ca95c6621508.tar.gz
bemenu-311e4b36768a0d4e113ccf6d2256ca95c6621508.tar.bz2
bemenu-311e4b36768a0d4e113ccf6d2256ca95c6621508.zip
Use strcspn instead of strtok
-rw-r--r--client/client.c7
-rw-r--r--lib/draw/curses.c10
-rw-r--r--lib/filter.c9
-rw-r--r--lib/internal.h1
-rw-r--r--lib/util.c13
5 files changed, 33 insertions, 7 deletions
diff --git a/client/client.c b/client/client.c
index c031c0b..8e670b1 100644
--- a/client/client.c
+++ b/client/client.c
@@ -26,13 +26,16 @@ static void readItemsToMenuFromStdin(bmMenu *menu)
}
buffer[allocated - step + read - 1] = 0;
- char *s;
- for (s = strtok(buffer, "\n"); s; s = strtok(NULL, "\n")) {
+ size_t pos;
+ char *s = buffer;
+ while ((pos = strcspn(s, "\n")) != 0) {
+ s[pos] = 0;
bmItem *item = bmItemNew(s);
if (!item)
break;
bmMenuAddItem(menu, item);
+ s += pos + 1;
}
free(buffer);
diff --git a/lib/draw/curses.c b/lib/draw/curses.c
index 26754be..3b99cd9 100644
--- a/lib/draw/curses.c
+++ b/lib/draw/curses.c
@@ -1,14 +1,18 @@
#include "../internal.h"
-#define _XOPEN_SOURCE 700
+
+#define _XOPEN_SOURCE 500
+#include <signal.h> /* sigaction */
+#include <stdarg.h> /* vsnprintf */
+#undef _XOPEN_SOURCE
+
#include <wchar.h>
+#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <locale.h>
#include <ncurses.h>
#include <dlfcn.h>
-#include <signal.h>
#include <assert.h>
-#include <unistd.h>
#if _WIN32
static const char *TTY = "CON";
diff --git a/lib/filter.c b/lib/filter.c
index 836ad83..811451b 100644
--- a/lib/filter.c
+++ b/lib/filter.c
@@ -54,12 +54,17 @@ static char* _bmFilterTokenize(bmMenu *menu, char ***outTokv, unsigned int *outT
if (!(buffer = _bmStrdup(menu->filter)))
goto fail;
- char *s, **tmp = NULL;
+ size_t pos = 0;
unsigned int tokc = 0, tokn = 0;
- for (s = strtok(buffer, " "); s; tmp[tokc - 1] = s, s = strtok(NULL, " "), tokv = tmp)
+ char *s = buffer, **tmp = NULL;
+ while ((pos = _bmStripToken(s, " ")) != 0) {
if (++tokc > tokn && !(tmp = realloc(tmp, ++tokn * sizeof(char*))))
goto fail;
+ tmp[tokc - 1] = s;
+ s += pos + 1;
+ }
+
*outTokv = tmp;
*outTokc = tokc;
return buffer;
diff --git a/lib/internal.h b/lib/internal.h
index b3ca87c..1ed13b4 100644
--- a/lib/internal.h
+++ b/lib/internal.h
@@ -163,6 +163,7 @@ int _bmItemListRemoveItem(struct _bmItemList *list, const bmItem *item);
/* util.c */
char* _bmStrdup(const char *s);
+size_t _bmStripToken(char *string, const char *token);
int _bmStrupcmp(const char *hay, const char *needle);
int _bmStrnupcmp(const char *hay, const char *needle, size_t len);
char* _bmStrupstr(const char *hay, const char *needle);
diff --git a/lib/util.c b/lib/util.c
index a77e2ff..49f9175 100644
--- a/lib/util.c
+++ b/lib/util.c
@@ -28,6 +28,19 @@ char* _bmStrdup(const char *string)
}
/**
+ * Replaces next token in string with '\0' and returns position for the replaced token.
+ *
+ * @param string C "string" where token will be replaced.
+ * @return Position of the replaced token.
+ */
+size_t _bmStripToken(char *string, const char *token)
+{
+ size_t len = strcspn(string, token);
+ string[len] = 0;
+ return len;
+}
+
+/**
* Portable case-insensitive strcmp.
*
* @param hay C "string" to match against.