aboutsummaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2004-09-02 18:25:50 +0000
committerNick Mathewson <nickm@torproject.org>2004-09-02 18:25:50 +0000
commitf311206d1db3bb88f686cfb52a4c503e97cbe249 (patch)
tree365adfb183859ff5a52cd2f8d5f017efaa226db7 /src/common
parent3590eb535a539911cf899511f6f3f21c745c65b8 (diff)
downloadtor-f311206d1db3bb88f686cfb52a4c503e97cbe249.tar
tor-f311206d1db3bb88f686cfb52a4c503e97cbe249.tar.gz
Make split function smarter; add a strcmpstart function so we can stop bungling strcmp(x, y, strlen(y));
svn:r2325
Diffstat (limited to 'src/common')
-rw-r--r--src/common/util.c41
-rw-r--r--src/common/util.h5
2 files changed, 35 insertions, 11 deletions
diff --git a/src/common/util.c b/src/common/util.c
index 4886f9b10..cc589bdfb 100644
--- a/src/common/util.c
+++ b/src/common/util.c
@@ -482,12 +482,16 @@ void smartlist_insert(smartlist_t *sl, int idx, void *val)
}
/**
- * Split a string <b>str</b> along all occurences of <b>sep</b>, adding the
- * split strings, in order, to <b>sl</b>. If <b>skipSpace</b> is true,
- * remove initial and trailing space from each entry.
+ * Split a string <b>str</b> along all occurences of <b>sep</b>,
+ * adding the split strings, in order, to <b>sl</b>. If
+ * <b>flags</b>&amp;SPLIT_SKIP_SPACE is true, remove initial and
+ * trailing space from each entry. If
+ * <b>flags</b>&amp;SPLIT_IGNORE_BLANK is true, remove any entries of
+ * length 0. If max>0, divide the string into no more than <b>max</b>
+ * pieces.
*/
int smartlist_split_string(smartlist_t *sl, const char *str, const char *sep,
- int skipSpace)
+ int flags, int max)
{
const char *cp, *end, *next;
int n = 0;
@@ -496,23 +500,31 @@ int smartlist_split_string(smartlist_t *sl, const char *str, const char *sep,
cp = str;
while (1) {
- if (skipSpace) {
+ if (flags&SPLIT_SKIP_SPACE) {
while (isspace((int)*cp)) ++cp;
}
- end = strstr(cp,sep);
- if (!end) {
+
+ if (max>0 && n == max-1) {
end = strchr(cp,'\0');
+ } else {
+ end = strstr(cp,sep);
+ if (!end)
+ end = strchr(cp,'\0');
+ }
+ if (!*end) {
next = NULL;
} else {
next = end+strlen(sep);
}
- if (skipSpace) {
+ if (flags&SPLIT_SKIP_SPACE) {
while (end > cp && isspace((int)*(end-1)))
--end;
}
- smartlist_add(sl, tor_strndup(cp, end-cp));
- ++n;
+ if (end != cp || !(flags&SPLIT_IGNORE_BLANK)) {
+ smartlist_add(sl, tor_strndup(cp, end-cp));
+ ++n;
+ }
if (!next)
break;
cp = next;
@@ -799,6 +811,15 @@ void tor_strlower(char *s)
}
}
+/* Compares the first strlen(s2) characters of s1 with s2. Returns as for
+ * strcmp.
+ */
+int strcmpstart(const char *s1, const char *s2)
+{
+ size_t n = strlen(s2);
+ return strncmp(s1, s2, n);
+}
+
/** Return a pointer to the first char of s that is not whitespace and
* not a comment, or to the terminating NUL if no such character exists.
diff --git a/src/common/util.h b/src/common/util.h
index 184a78b66..e96b16129 100644
--- a/src/common/util.h
+++ b/src/common/util.h
@@ -86,6 +86,7 @@ char *tor_strdup(const char *s);
char *tor_strndup(const char *s, size_t n);
#define tor_free(p) do {if(p) {free(p); (p)=NULL;}} while(0)
void tor_strlower(char *s);
+int strcmpstart(const char *s1, const char *s2);
/* Some platforms segfault when you try to access a multi-byte type
* that isn't aligned to a word boundary. The macros and/or functions
@@ -153,8 +154,10 @@ void *smartlist_del(smartlist_t *sl, int idx);
void *smartlist_del_keeporder(smartlist_t *sl, int idx);
void smartlist_insert(smartlist_t *sl, int idx, void *val);
int smartlist_len(const smartlist_t *sl);
+#define SPLIT_SKIP_SPACE 0x01
+#define SPLIT_IGNORE_BLANK 0x02
int smartlist_split_string(smartlist_t *sl, const char *str, const char *sep,
- int skipSpace);
+ int flags, int max);
#define SMARTLIST_FOREACH(sl, type, var, cmd) \
do { \