create-package-feed.pl: Polish file and directory handling
[privoxy.git] / ssplit.c
index 313bac2..0161898 100644 (file)
--- a/ssplit.c
+++ b/ssplit.c
@@ -1,11 +1,11 @@
-const char ssplit_rcs[] = "$Id: ssplit.c,v 1.16 2012/07/23 12:44:17 fabiankeil Exp $";
+const char ssplit_rcs[] = "$Id: ssplit.c,v 1.19 2012/07/23 12:46:40 fabiankeil Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/ssplit.c,v $
  *
  * Purpose     :  A function to split a string at specified delimiters.
  *
- * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+ * Copyright   :  Written by and Copyright (C) 2001-2012 the
  *                Privoxy team. http://www.privoxy.org/
  *
  *                Based on the Internet Junkbuster originally written
@@ -37,6 +37,7 @@ const char ssplit_rcs[] = "$Id: ssplit.c,v 1.16 2012/07/23 12:44:17 fabiankeil E
 
 #include <string.h>
 #include <stdlib.h>
+#include <assert.h>
 
 #include "ssplit.h"
 #include "miscutil.h"
@@ -70,6 +71,12 @@ int ssplit(char *str, const char *delim, char *vec[], size_t vec_len)
    unsigned char is_delim[256];
    unsigned char char_type;
    int vec_count = 0;
+   enum char_type {
+      WANTED     = 0,
+      SEPARATOR  = 1,
+      TERMINATOR = 2,
+   };
+
 
    if (!str)
    {
@@ -88,23 +95,23 @@ int ssplit(char *str, const char *delim, char *vec[], size_t vec_len)
 
    while (*delim)
    {
-      is_delim[(unsigned)(unsigned char)*delim++] = 1;   /* separator  */
+      is_delim[(unsigned)(unsigned char)*delim++] = SEPARATOR;
    }
 
-   is_delim[(unsigned)(unsigned char)'\0'] = 2;   /* terminator */
-   is_delim[(unsigned)(unsigned char)'\n'] = 2;   /* terminator */
+   is_delim[(unsigned)(unsigned char)'\0'] = TERMINATOR;
+   is_delim[(unsigned)(unsigned char)'\n'] = TERMINATOR;
 
 
    /* Parse string */
 
    /* Skip leading separators. XXX: Why do they matter? */
-   while (is_delim[(unsigned)(unsigned char)*str] == 1)
+   while (is_delim[(unsigned)(unsigned char)*str] == SEPARATOR)
    {
       str++;
    }
 
    /* The first pointer is the beginning of string */
-   if (is_delim[(unsigned)(unsigned char)*str] == 0)
+   if (is_delim[(unsigned)(unsigned char)*str] == WANTED)
    {
       /*
        * The first character in this field is not a
@@ -117,9 +124,9 @@ int ssplit(char *str, const char *delim, char *vec[], size_t vec_len)
       vec[vec_count++] = str;
    }
 
-   while ((char_type = is_delim[(unsigned)(unsigned char)*str]) != 2)
+   while ((char_type = is_delim[(unsigned)(unsigned char)*str]) != TERMINATOR)
    {
-      if (char_type == 1)
+      if (char_type == SEPARATOR)
       {
          /* the char is a separator */
 
@@ -127,7 +134,7 @@ int ssplit(char *str, const char *delim, char *vec[], size_t vec_len)
          *str++ = '\0';
 
          /* Check if we want to save this field */
-         if (is_delim[(unsigned)(unsigned char)*str] == 0)
+         if (is_delim[(unsigned)(unsigned char)*str] == WANTED)
          {
             /*
              * The first character in this field is not a
@@ -146,6 +153,8 @@ int ssplit(char *str, const char *delim, char *vec[], size_t vec_len)
       }
    }
    /* null terminate the substring */
+   /* XXX: this shouldn't be necessary, so assert that it isn't. */
+   assert(*str == '\0');
    *str = '\0';
 
    return(vec_count);