You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by ma...@apache.org on 2011/02/17 07:54:09 UTC

[lucy-commits] svn commit: r1071511 - in /incubator/lucy/trunk/clownfish/src: CFCCBlock.c CFCDocuComment.c CFCMethod.c CFCParamList.c CFCParcel.c CFCSymbol.c CFCSymbol.h CFCType.c CFCUtil.c CFCUtil.h

Author: marvin
Date: Thu Feb 17 06:54:08 2011
New Revision: 1071511

URL: http://svn.apache.org/viewvc?rev=1071511&view=rev
Log:
Introduce portable, NULL-safe implementations of strdup() and strndup() and
use them to replace some perlapi functions.  Remove some unnecessary
const-ing. 

Modified:
    incubator/lucy/trunk/clownfish/src/CFCCBlock.c
    incubator/lucy/trunk/clownfish/src/CFCDocuComment.c
    incubator/lucy/trunk/clownfish/src/CFCMethod.c
    incubator/lucy/trunk/clownfish/src/CFCParamList.c
    incubator/lucy/trunk/clownfish/src/CFCParcel.c
    incubator/lucy/trunk/clownfish/src/CFCSymbol.c
    incubator/lucy/trunk/clownfish/src/CFCSymbol.h
    incubator/lucy/trunk/clownfish/src/CFCType.c
    incubator/lucy/trunk/clownfish/src/CFCUtil.c
    incubator/lucy/trunk/clownfish/src/CFCUtil.h

Modified: incubator/lucy/trunk/clownfish/src/CFCCBlock.c
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCCBlock.c?rev=1071511&r1=1071510&r2=1071511&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCCBlock.c (original)
+++ incubator/lucy/trunk/clownfish/src/CFCCBlock.c Thu Feb 17 06:54:08 2011
@@ -20,9 +20,10 @@
 #include "XSUB.h"
 
 #include "CFCCBlock.h"
+#include "CFCUtil.h"
 
 struct CFCCBlock {
-    const char *contents;
+    char *contents;
 };
 
 CFCCBlock*
@@ -36,18 +37,17 @@ CFCCBlock_new(const char *contents)
 CFCCBlock*
 CFCCBlock_init(CFCCBlock *self, const char *contents) 
 {
-    self->contents = savepv(contents);
+    self->contents = CFCUtil_strdup(contents);
     return self;
 }
 
 void
 CFCCBlock_destroy(CFCCBlock *self)
 {
-    Safefree(self->contents);
+    free(self->contents);
     free(self);
 }
 
-
 const char*
 CFCCBlock_get_contents(CFCCBlock *self)
 {

Modified: incubator/lucy/trunk/clownfish/src/CFCDocuComment.c
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCDocuComment.c?rev=1071511&r1=1071510&r2=1071511&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCDocuComment.c (original)
+++ incubator/lucy/trunk/clownfish/src/CFCDocuComment.c Thu Feb 17 06:54:08 2011
@@ -21,6 +21,7 @@
 #include "XSUB.h"
 
 #include "CFCDocuComment.h"
+#include "CFCUtil.h"
 
 struct CFCDocuComment {
     char *description;
@@ -28,7 +29,7 @@ struct CFCDocuComment {
     char *long_des;
     char **param_names;
     char **param_docs;
-    const char *retval;
+    char *retval;
 };
 
 /** Remove comment open, close, and left border from raw comment text.
@@ -84,7 +85,7 @@ S_strip(char *comment)
 CFCDocuComment*
 CFCDocuComment_parse(const char *raw_text)
 {
-    char *text = savepv(raw_text);
+    char *text = CFCUtil_strdup(raw_text);
     CFCDocuComment *self = (CFCDocuComment*)calloc(1, sizeof(CFCDocuComment));
     if (!self) { croak("calloc failed"); }
 
@@ -106,7 +107,7 @@ CFCDocuComment_parse(const char *raw_tex
             ) {
                 ptr++;
                 size_t brief_len = ptr - text;
-                self->brief = savepv(text);
+                self->brief = CFCUtil_strdup(text);
                 self->brief[brief_len] = '\0';
                 break;
             }
@@ -114,7 +115,7 @@ CFCDocuComment_parse(const char *raw_tex
         }
     }
     if (!self->brief) {
-        self->brief = savepv("");
+        self->brief = CFCUtil_strdup("");
     }
 
     // Extract @param directives.
@@ -167,8 +168,10 @@ CFCDocuComment_parse(const char *raw_tex
             if (!self->param_names || !self->param_docs) { 
                 croak("realloc failed"); 
             }
-            self->param_names[num_params - 1] = savepvn(param_name, param_name_len);
-            self->param_docs[num_params - 1]  = savepvn(param_doc, param_doc_len);
+            self->param_names[num_params - 1] 
+                = CFCUtil_strndup(param_name, param_name_len);
+            self->param_docs[num_params - 1] 
+                = CFCUtil_strndup(param_doc, param_doc_len);
             CFCUtil_trim_whitespace(self->param_names[num_params - 1]);
             CFCUtil_trim_whitespace(self->param_docs[num_params - 1]);
             self->param_names[num_params] = NULL;
@@ -185,7 +188,7 @@ CFCDocuComment_parse(const char *raw_tex
     }
 
     // Extract full description.
-    self->description = savepv(text);
+    self->description = CFCUtil_strdup(text);
     {
         char *terminus = strstr(self->description, "@param");
         if (!terminus) {
@@ -198,13 +201,13 @@ CFCDocuComment_parse(const char *raw_tex
     CFCUtil_trim_whitespace(self->description);
 
     // Extract long description.
-    self->long_des = savepv(self->description + strlen(self->brief));
+    self->long_des = CFCUtil_strdup(self->description + strlen(self->brief));
     CFCUtil_trim_whitespace(self->long_des);
 
     // Extract @return directive.
     char *maybe_retval = strstr(text, "@return ");
     if (maybe_retval) {
-        self->retval = savepv(maybe_retval + sizeof("@return ") - 1);
+        self->retval = CFCUtil_strdup(maybe_retval + sizeof("@return ") - 1);
         char *terminus = strchr(self->retval, '@');
         if (terminus) {
             *terminus = '\0';
@@ -221,20 +224,20 @@ CFCDocuComment_destroy(CFCDocuComment *s
     size_t i;
     if (self->param_names) {
         for (i = 0; self->param_names[i] != NULL; i++) {
-            Safefree(self->param_names[i]);
+            free(self->param_names[i]);
         }
         free(self->param_names);
     }
     if (self->param_docs) {
         for (i = 0; self->param_docs[i] != NULL; i++) {
-            Safefree(self->param_docs[i]);
+            free(self->param_docs[i]);
         }
         free(self->param_docs);
     }
-    Safefree(self->description);
-    Safefree(self->brief);
-    Safefree(self->long_des);
-    Safefree(self->retval);
+    free(self->description);
+    free(self->brief);
+    free(self->long_des);
+    free(self->retval);
     free(self);
 }
 

Modified: incubator/lucy/trunk/clownfish/src/CFCMethod.c
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCMethod.c?rev=1071511&r1=1071510&r2=1071511&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCMethod.c (original)
+++ incubator/lucy/trunk/clownfish/src/CFCMethod.c Thu Feb 17 06:54:08 2011
@@ -22,11 +22,12 @@
 #define CFC_NEED_FUNCTION_STRUCT_DEF
 #include "CFCFunction.h"
 #include "CFCMethod.h"
+#include "CFCUtil.h"
 
 struct CFCMethod {
     CFCFunction function;
-    const char *macro_sym;
-    const char *short_typedef;
+    char *macro_sym;
+    char *short_typedef;
     int is_final;
     int is_abstract;
     int is_novel;
@@ -56,7 +57,7 @@ CFCMethod_init(CFCMethod *self, void *pa
     CFCFunction_init((CFCFunction*)self, parcel, exposure, class_name,
         class_cnick, micro_sym, return_type, param_list, docucomment,
         is_inline);
-    self->macro_sym     = savepv(macro_sym);
+    self->macro_sym     = CFCUtil_strdup(macro_sym);
     self->short_typedef = NULL;
     self->is_final      = is_final;
     self->is_abstract   = is_abstract;
@@ -71,8 +72,8 @@ CFCMethod_init(CFCMethod *self, void *pa
 void
 CFCMethod_destroy(CFCMethod *self)
 {
-    Safefree(self->macro_sym);
-    Safefree(self->short_typedef);
+    free(self->macro_sym);
+    free(self->short_typedef);
     CFCFunction_destroy((CFCFunction*)self);
 }
 
@@ -85,8 +86,8 @@ CFCMethod_get_macro_sym(CFCMethod *self)
 void
 CFCMethod_set_short_typedef(CFCMethod *self, const char *short_typedef)
 {
-    Safefree(self->short_typedef);
-    self->short_typedef = short_typedef ? savepv(short_typedef) : NULL;
+    free(self->short_typedef);
+    self->short_typedef = short_typedef ? CFCUtil_strdup(short_typedef) : NULL;
 }
 
 const char*

Modified: incubator/lucy/trunk/clownfish/src/CFCParamList.c
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCParamList.c?rev=1071511&r1=1071510&r2=1071511&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCParamList.c (original)
+++ incubator/lucy/trunk/clownfish/src/CFCParamList.c Thu Feb 17 06:54:08 2011
@@ -21,6 +21,7 @@
 
 #include "CFCParamList.h"
 #include "CFCVariable.h"
+#include "CFCUtil.h"
 
 struct CFCParamList {
     CFCVariable **variables;
@@ -59,7 +60,7 @@ CFCParamList_add_param(CFCParamList *sel
         croak("realloc failed.");
     }
     self->variables[self->num_vars - 1] = variable;
-    self->values[self->num_vars - 1] = value ? savepv(value) : NULL;
+    self->values[self->num_vars - 1] = value ? CFCUtil_strdup(value) : NULL;
     SvREFCNT_inc(CFCVariable_get_perl_obj(variable));
     self->variables[self->num_vars] = NULL;
     self->values[self->num_vars] = NULL;
@@ -71,7 +72,7 @@ CFCParamList_destroy(CFCParamList *self)
     size_t i;
     for (i = 0; i < self->num_vars; i++) {
         SvREFCNT_dec(CFCVariable_get_perl_obj(self->variables[i]));
-        Safefree(self->values[i]);
+        free(self->values[i]);
     }
     free(self->variables);
     free(self->values);

Modified: incubator/lucy/trunk/clownfish/src/CFCParcel.c
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCParcel.c?rev=1071511&r1=1071510&r2=1071511&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCParcel.c (original)
+++ incubator/lucy/trunk/clownfish/src/CFCParcel.c Thu Feb 17 06:54:08 2011
@@ -26,6 +26,7 @@
 #endif
 
 #include "CFCParcel.h"
+#include "CFCUtil.h"
 
 struct CFCParcel {
     char *name;
@@ -103,18 +104,18 @@ CFCParcel_init(CFCParcel *self, const ch
     if (!name || !S_validate_name_or_cnick(name)) {
         croak("Invalid name: '%s'", name ? name : "[NULL]");
     }
-    self->name = savepv(name);
+    self->name = CFCUtil_strdup(name);
 
     // Validate or derive cnick.
     if (cnick) {
         if (!S_validate_name_or_cnick(cnick)) {
             croak("Invalid cnick: '%s'", cnick);
         }
-        self->cnick = savepv(cnick);
+        self->cnick = CFCUtil_strdup(cnick);
     }
     else {  
         // Default cnick to name.
-        self->cnick = savepv(name);
+        self->cnick = CFCUtil_strdup(name);
     }
     
     // Derive prefix, Prefix, PREFIX.
@@ -153,8 +154,8 @@ CFCParcel_init(CFCParcel *self, const ch
 void
 CFCParcel_destroy(CFCParcel *self)
 {
-    Safefree(self->name);
-    Safefree(self->cnick);
+    free(self->name);
+    free(self->cnick);
     free(self->prefix);
     free(self->Prefix);
     free(self->PREFIX);

Modified: incubator/lucy/trunk/clownfish/src/CFCSymbol.c
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCSymbol.c?rev=1071511&r1=1071510&r2=1071511&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCSymbol.c (original)
+++ incubator/lucy/trunk/clownfish/src/CFCSymbol.c Thu Feb 17 06:54:08 2011
@@ -29,6 +29,7 @@
 #define CFC_NEED_SYMBOL_STRUCT_DEF
 #include "CFCSymbol.h"
 #include "CFCParcel.h"
+#include "CFCUtil.h"
 
 CFCSymbol*
 CFCSymbol_new(struct CFCParcel *parcel, const char *exposure, 
@@ -136,23 +137,23 @@ CFCSymbol_init(CFCSymbol *self, struct C
     if (!S_validate_exposure(exposure)) {
         croak("Invalid exposure: '%s'", exposure ? exposure : "[NULL]");
     }
-    self->exposure = savepv(exposure);
+    self->exposure = CFCUtil_strdup(exposure);
 
     // Validate class name (if supplied);
     if (class_name && !S_validate_class_name(class_name)) {
         croak("Invalid class_name: '%s'", class_name);
     }
-    self->class_name = savepv(class_name);
+    self->class_name = CFCUtil_strdup(class_name);
 
     // Derive class_cnick if necessary, then validate.
     if (class_name) {
         if (class_cnick) {
-            self->class_cnick = savepv(class_cnick);
+            self->class_cnick = CFCUtil_strdup(class_cnick);
         }
         else {
             const char *last_colon = strrchr(class_name, ':');
             const char *cnick = last_colon ? last_colon + 1 : class_name;
-            self->class_cnick = savepv(cnick);
+            self->class_cnick = CFCUtil_strdup(cnick);
         }
     }
     else if (class_cnick) {
@@ -169,7 +170,7 @@ CFCSymbol_init(CFCSymbol *self, struct C
     if (!micro_sym || !S_validate_identifier(micro_sym)) {
         croak("Invalid micro_sym: '%s'",  micro_sym ? micro_sym : "[NULL]");
     }
-    self->micro_sym = savepv(micro_sym);
+    self->micro_sym = CFCUtil_strdup(micro_sym);
 
     // Derive short_sym.
     size_t class_cnick_len = self->class_cnick 
@@ -178,7 +179,7 @@ CFCSymbol_init(CFCSymbol *self, struct C
     size_t short_sym_len = class_cnick_len
                          + strlen("_") 
                          + strlen(self->micro_sym);
-    self->short_sym = (const char*)malloc(short_sym_len + 1);
+    self->short_sym = (char*)malloc(short_sym_len + 1);
     if (self->class_cnick) {
         memcpy((void*)self->short_sym, self->class_cnick, class_cnick_len);
     }
@@ -191,7 +192,7 @@ CFCSymbol_init(CFCSymbol *self, struct C
     const char *prefix = CFCParcel_get_prefix(self->parcel);
     size_t prefix_len = strlen(prefix);
     size_t full_sym_len = prefix_len + short_sym_len;
-    self->full_sym = (const char*)malloc(full_sym_len + 1);
+    self->full_sym = (char*)malloc(full_sym_len + 1);
     memcpy((void*)self->full_sym, prefix, prefix_len);
     memcpy((void*)&self->full_sym[prefix_len], self->short_sym, short_sym_len);
     *((char*)&self->full_sym[full_sym_len]) = '\0';
@@ -203,10 +204,10 @@ void
 CFCSymbol_destroy(CFCSymbol *self)
 {
     // SvREFCNT_dec((SV*)self->parcel);
-    Safefree(self->exposure);
-    Safefree(self->class_name);
-    Safefree(self->class_cnick);
-    Safefree(self->micro_sym);
+    free(self->exposure);
+    free(self->class_name);
+    free(self->class_cnick);
+    free(self->micro_sym);
     free((void*)self->short_sym);
     free((void*)self->full_sym);
     free(self);

Modified: incubator/lucy/trunk/clownfish/src/CFCSymbol.h
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCSymbol.h?rev=1071511&r1=1071510&r2=1071511&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCSymbol.h (original)
+++ incubator/lucy/trunk/clownfish/src/CFCSymbol.h Thu Feb 17 06:54:08 2011
@@ -20,12 +20,12 @@ struct CFCParcel;
 #ifdef CFC_NEED_SYMBOL_STRUCT_DEF
 struct CFCSymbol {
     struct CFCParcel *parcel;
-    const char *exposure;
-    const char *class_name;
-    const char *class_cnick;
-    const char *micro_sym;
-    const char *short_sym;
-    const char *full_sym;
+    char *exposure;
+    char *class_name;
+    char *class_cnick;
+    char *micro_sym;
+    char *short_sym;
+    char *full_sym;
 };
 #endif
 

Modified: incubator/lucy/trunk/clownfish/src/CFCType.c
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCType.c?rev=1071511&r1=1071510&r2=1071511&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCType.c (original)
+++ incubator/lucy/trunk/clownfish/src/CFCType.c Thu Feb 17 06:54:08 2011
@@ -57,9 +57,9 @@ CFCType_init(CFCType *self, int flags, s
 {
     self->flags       = flags;
     self->parcel      = parcel;
-    self->specifier   = savepv(specifier);
+    self->specifier   = CFCUtil_strdup(specifier);
     self->indirection = indirection;
-    self->c_string    = c_string ? savepv(c_string) : savepv("");
+    self->c_string    = c_string ? CFCUtil_strdup(c_string) : CFCUtil_strdup("");
     self->width       = 0;
     self->array       = NULL;
     self->child       = NULL;
@@ -327,8 +327,8 @@ CFCType_destroy(CFCType *self)
     if (self->child) {
         SvREFCNT_dec((SV*)self->child->perl_obj);
     }
-    Safefree(self->specifier);
-    Safefree(self->c_string);
+    free(self->specifier);
+    free(self->c_string);
     free(self);
 }
 
@@ -383,8 +383,8 @@ CFCType_similar(CFCType *self, CFCType *
 void
 CFCType_set_specifier(CFCType *self, const char *specifier)
 {
-    Safefree(self->specifier);
-    self->specifier = savepv(specifier);
+    free(self->specifier);
+    self->specifier = CFCUtil_strdup(specifier);
 }
 
 const char*
@@ -408,8 +408,8 @@ CFCType_get_parcel(CFCType *self)
 void
 CFCType_set_c_string(CFCType *self, const char *c_string)
 {
-    Safefree(self->c_string);
-    self->c_string = savepv(c_string);
+    free(self->c_string);
+    self->c_string = CFCUtil_strdup(c_string);
 }
 
 const char*

Modified: incubator/lucy/trunk/clownfish/src/CFCUtil.c
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCUtil.c?rev=1071511&r1=1071510&r2=1071511&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCUtil.c (original)
+++ incubator/lucy/trunk/clownfish/src/CFCUtil.c Thu Feb 17 06:54:08 2011
@@ -39,6 +39,24 @@ CFCUtil_make_perl_obj(void *ptr, const c
     return  inner_obj;
 }
 
+char*
+CFCUtil_strdup(const char *string)
+{
+    if (!string) { return NULL; }
+    return CFCUtil_strndup(string, strlen(string));
+}
+
+char*
+CFCUtil_strndup(const char *string, size_t len)
+{
+    if (!string) { return NULL; }
+    char *copy = (char*)malloc(len + 1);
+    if (!copy) { croak("malloc failed"); }
+    memcpy(copy, string, len);
+    copy[len] = '\0';
+    return copy;
+}
+
 void
 CFCUtil_trim_whitespace(char *text)
 {

Modified: incubator/lucy/trunk/clownfish/src/CFCUtil.h
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCUtil.h?rev=1071511&r1=1071510&r2=1071511&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCUtil.h (original)
+++ incubator/lucy/trunk/clownfish/src/CFCUtil.h Thu Feb 17 06:54:08 2011
@@ -20,6 +20,16 @@
 void*
 CFCUtil_make_perl_obj(void *ptr, const char *klass);
 
+/** Portable, NULL-safe implementation of strdup().
+ */
+char*
+CFCUtil_strdup(const char *string);
+
+/** Portable, NULL-safe implementation of strndup().
+ */
+char*
+CFCUtil_strndup(const char *string, size_t len);
+
 /** Trim whitespace from the beginning and the end of a string.
  */
 void