Rearrange struct client_state to reduce memory on amd64
[privoxy.git] / ssplit.c
index a271ac8..ef40e64 100644 (file)
--- a/ssplit.c
+++ b/ssplit.c
@@ -1,12 +1,11 @@
-const char ssplit_rcs[] = "$Id: ssplit.c,v 1.15 2012/06/08 15:16:15 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
- *                Privoxy team. http://www.privoxy.org/
+ * Copyright   :  Written by and Copyright (C) 2001-2012 the
+ *                Privoxy team. https://www.privoxy.org/
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and
@@ -37,12 +36,11 @@ const char ssplit_rcs[] = "$Id: ssplit.c,v 1.15 2012/06/08 15:16:15 fabiankeil E
 
 #include <string.h>
 #include <stdlib.h>
+#include <assert.h>
 
 #include "ssplit.h"
 #include "miscutil.h"
 
-const char ssplit_h_rcs[] = SSPLIT_H_VERSION;
-
 
 /*********************************************************************
  *
@@ -70,6 +68,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 +92,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
@@ -114,12 +118,12 @@ int ssplit(char *str, const char *delim, char *vec[], size_t vec_len)
       {
          return(-1); /* overflow */
       }
-      vec[vec_count++] = (char *) str;
+      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 +131,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
@@ -137,7 +141,7 @@ int ssplit(char *str, const char *delim, char *vec[], size_t vec_len)
             {
                return(-1); /* overflow */
             }
-            vec[vec_count++] = (char *) str;
+            vec[vec_count++] = str;
          }
       }
       else
@@ -146,6 +150,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);