From 7cef96c30d2f2d585aa2edd7b6ab22e9e007cddc Mon Sep 17 00:00:00 2001
From: Timo Teras <timo.teras@iki.fi>
Date: Tue, 14 Apr 2009 18:46:35 +0300
Subject: blob: add strspn helpers

---
 src/apk_blob.h | 10 +++++++++-
 src/blob.c     | 28 ++++++++++++++++++++++++++++
 2 files changed, 37 insertions(+), 1 deletion(-)

(limited to 'src')

diff --git a/src/apk_blob.h b/src/apk_blob.h
index fa7ad0f..7e63293 100644
--- a/src/apk_blob.h
+++ b/src/apk_blob.h
@@ -23,12 +23,20 @@ typedef struct apk_blob apk_blob_t;
 #define APK_BLOB_IS_NULL(blob)		(blob.ptr == NULL)
 
 #define APK_BLOB_NULL			((apk_blob_t){0, NULL})
-#define APK_BLOB_STR(str)		((apk_blob_t){strlen(str), (void *)(str)})
 #define APK_BLOB_BUF(buf)		((apk_blob_t){sizeof(buf), (char *)(buf)})
 #define APK_BLOB_PTR_LEN(beg,len)	((apk_blob_t){(len), (beg)})
 #define APK_BLOB_PTR_PTR(beg,end)	APK_BLOB_PTR_LEN((beg),(end)-(beg)+1)
 
+static inline apk_blob_t APK_BLOB_STR(const char *str)
+{
+	if (str == NULL)
+		return APK_BLOB_NULL;
+	return ((apk_blob_t){strlen(str), (void *)(str)});
+}
+
 char *apk_blob_cstr(apk_blob_t str);
+int apk_blob_spn(apk_blob_t blob, const char *accept, apk_blob_t *l, apk_blob_t *r);
+int apk_blob_cspn(apk_blob_t blob, const char *reject, apk_blob_t *l, apk_blob_t *r);
 int apk_blob_splitstr(apk_blob_t blob, const char *split, apk_blob_t *l, apk_blob_t *r);
 int apk_blob_rsplit(apk_blob_t blob, char split, apk_blob_t *l, apk_blob_t *r);
 unsigned apk_blob_uint(apk_blob_t blob, int base);
diff --git a/src/blob.c b/src/blob.c
index ab514f8..3aa61c7 100644
--- a/src/blob.c
+++ b/src/blob.c
@@ -31,6 +31,34 @@ char *apk_blob_cstr(apk_blob_t blob)
 	return cstr;
 }
 
+int apk_blob_spn(apk_blob_t blob, const char *accept, apk_blob_t *l, apk_blob_t *r)
+{
+	int i;
+
+	for (i = 0; i < blob.len; i++) {
+		if (strchr(accept, blob.ptr[i]) == NULL) {
+			*l = APK_BLOB_PTR_LEN(blob.ptr, i);
+			*r = APK_BLOB_PTR_LEN(blob.ptr+i, blob.len-i);
+			return 1;
+		}
+	}
+	return 0;
+}
+
+int apk_blob_cspn(apk_blob_t blob, const char *reject, apk_blob_t *l, apk_blob_t *r)
+{
+	int i;
+
+	for (i = 0; i < blob.len; i++) {
+		if (strchr(reject, blob.ptr[i]) != NULL) {
+			*l = APK_BLOB_PTR_LEN(blob.ptr, i);
+			*r = APK_BLOB_PTR_LEN(blob.ptr+i, blob.len-i);
+			return 1;
+		}
+	}
+	return 0;
+}
+
 int apk_blob_rsplit(apk_blob_t blob, char split, apk_blob_t *l, apk_blob_t *r)
 {
 	char *sep;
-- 
cgit v1.2.3-70-g09d2