intern: New function intern_strlen().
authorBen Pfaff <blp@cs.stanford.edu>
Wed, 13 Apr 2011 05:19:45 +0000 (22:19 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Wed, 13 Apr 2011 05:19:45 +0000 (22:19 -0700)
src/libpspp/intern.c
src/libpspp/intern.h

index 258e2829af132f8548b59a00577a29c623fcbabc..fe0e784cda6b02db4e28e54a7fdce3eb04e08cd3 100644 (file)
@@ -33,20 +33,22 @@ struct interned_string
   {
     struct hmap_node node;      /* Node in hash table. */
     size_t ref_cnt;             /* Reference count. */
+    size_t length;              /* strlen(string).  */
     char string[1];             /* Null-terminated string. */
   };
 
 /* All interned strings. */
 static struct hmap interns = HMAP_INITIALIZER (interns);
 
-/* Searches the table of interned string for  */
+/* Searches the table of interned strings for one equal to S, which has length
+   LENGTH and hash value HASH. */
 static struct interned_string *
 intern_lookup__ (const char *s, size_t length, unsigned int hash)
 {
   struct interned_string *is;
 
   HMAP_FOR_EACH_WITH_HASH (is, struct interned_string, node, hash, &interns)
-    if (!memcmp (s, is->string, length + 1))
+    if (is->length == length && !memcmp (s, is->string, length))
       return is;
 
   return NULL;
@@ -69,6 +71,7 @@ intern_new (const char *s)
       is = xmalloc (length + sizeof *is);
       hmap_insert (&interns, &is->node, hash);
       is->ref_cnt = 1;
+      is->length = length;
       memcpy (is->string, s, length + 1);
     }
   return is->string;
@@ -119,3 +122,11 @@ is_interned_string (const char *s)
   unsigned int hash = hash_bytes (s, length, 0);
   return intern_lookup__ (s, length, hash) != NULL;
 }
+
+/* Returns the length of S, which must be an interned string returned by
+   intern_new(). */
+size_t
+intern_strlen (const char *s)
+{
+  return interned_string_from_string (s)->length;
+}
index 147a69a8bced253be9c747f70f4e0a94e1ae95f2..2f07a9ef77808b17f19e85adc2ffc9dc8d024262 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 2010 Free Software Foundation, Inc.
+   Copyright (C) 2010, 2011 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    See http://en.wikipedia.org/wiki/String_interning for more information. */
 
 #include <stdbool.h>
+#include <stddef.h>
 
 const char *intern_new (const char *);
 const char *intern_ref (const char *);
 void intern_unref (const char *);
 
+size_t intern_strlen (const char *);
+
 bool is_interned_string (const char *);
 
 #endif /* libpspp/intern.h */