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:26:00 UTC

[lucy-commits] svn commit: r1071509 - in /incubator/lucy/trunk/clownfish: lib/Clownfish.xs src/CFCDocuComment.c src/CFCDocuComment.h

Author: marvin
Date: Thu Feb 17 06:25:59 2011
New Revision: 1071509

URL: http://svn.apache.org/viewvc?rev=1071509&view=rev
Log:
Simplify CFCDocuComment by removing Perl-ish wrappers and cruft.

Modified:
    incubator/lucy/trunk/clownfish/lib/Clownfish.xs
    incubator/lucy/trunk/clownfish/src/CFCDocuComment.c
    incubator/lucy/trunk/clownfish/src/CFCDocuComment.h

Modified: incubator/lucy/trunk/clownfish/lib/Clownfish.xs
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/lib/Clownfish.xs?rev=1071509&r1=1071508&r2=1071509&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/lib/Clownfish.xs (original)
+++ incubator/lucy/trunk/clownfish/lib/Clownfish.xs Thu Feb 17 06:25:59 2011
@@ -115,23 +115,6 @@ PPCODE:
 MODULE = Clownfish    PACKAGE = Clownfish::DocuComment
 
 SV*
-_new(klass, description, brief, long_description, param_names, param_docs, retval_sv)
-    const char *klass;
-    const char *description;
-    const char *brief;
-    const char *long_description;
-    SV *param_names;
-    SV *param_docs;
-    SV *retval_sv;
-CODE:
-    const char *retval = SvOK(retval_sv) ? SvPV_nolen(retval_sv) : NULL;
-    CFCDocuComment *self = CFCDocuComment_new(description, brief,
-        long_description, param_names, param_docs, retval);
-    RETVAL = newSV(0);
-	sv_setref_pv(RETVAL, klass, (void*)self);
-OUTPUT: RETVAL
-
-SV*
 parse(klass, text)
     const char *klass;
     const char *text;
@@ -175,12 +158,30 @@ PPCODE:
                 retval = newSVpvn(long_description, strlen(long_description));
             }
             break;
-        case 8:
-            retval = newSVsv((SV*)CFCDocuComment_get_param_names(self));
+        case 8: {
+            AV *av = newAV();
+            const char **names = CFCDocuComment_get_param_names(self);
+            size_t i;
+            for (i = 0; names[i] != NULL; i++) {
+                SV *val_sv = newSVpvn(names[i], strlen(names[i]));
+                av_store(av, i, val_sv);
+            }
+            retval = newRV((SV*)av);
+            SvREFCNT_dec(av);
             break;
-        case 10:
-            retval = newSVsv((SV*)CFCDocuComment_get_param_docs(self));
+        }
+        case 10: {
+            AV *av = newAV();
+            const char **docs = CFCDocuComment_get_param_docs(self);
+            size_t i;
+            for (i = 0; docs[i] != NULL; i++) {
+                SV *val_sv = newSVpvn(docs[i], strlen(docs[i]));
+                av_store(av, i, val_sv);
+            }
+            retval = newRV((SV*)av);
+            SvREFCNT_dec(av);
             break;
+        }
         case 12: {
                 const char *rv = CFCDocuComment_get_retval(self);
                 retval = rv ? newSVpvn(rv, strlen(rv)) : newSV(0);
@@ -189,16 +190,6 @@ PPCODE:
     END_SET_OR_GET_SWITCH
 }
 
-SV*
-strip(text)
-    SV *text;
-CODE:
-    RETVAL = newSVsv(text);
-    STRLEN len;
-    char *ptr = SvPV(RETVAL, len);
-    CFCDocuComment_strip(ptr);
-    SvCUR_set(RETVAL, strlen(ptr));
-OUTPUT: RETVAL
 
 MODULE = Clownfish    PACKAGE = Clownfish::File
 

Modified: incubator/lucy/trunk/clownfish/src/CFCDocuComment.c
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCDocuComment.c?rev=1071509&r1=1071508&r2=1071509&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCDocuComment.c (original)
+++ incubator/lucy/trunk/clownfish/src/CFCDocuComment.c Thu Feb 17 06:25:59 2011
@@ -23,19 +23,19 @@
 #include "CFCDocuComment.h"
 
 struct CFCDocuComment {
-    const char *description;
-    const char *brief;
-    const char *long_des;
-    void *param_names;
-    void *param_docs;
+    char *description;
+    char *brief;
+    char *long_des;
+    char **param_names;
+    char **param_docs;
     const char *retval;
 };
 
-void
-CFCDocuComment_strip(char *comment)
+/** Remove comment open, close, and left border from raw comment text.
+ */
+static void
+S_strip(char *comment)
 {
-    CFCUtil_trim_whitespace(comment);
-
     size_t len = strlen(comment);
     char *scratch = (char*)malloc(len + 1);
     if (!scratch) {
@@ -85,13 +85,14 @@ CFCDocuComment*
 CFCDocuComment_parse(const char *raw_text)
 {
     char *text = savepv(raw_text);
+    CFCDocuComment *self = (CFCDocuComment*)calloc(1, sizeof(CFCDocuComment));
+    if (!self) { croak("calloc failed"); }
 
     // Strip whitespace, comment open, close, and left border.
     CFCUtil_trim_whitespace(text);
-    CFCDocuComment_strip(text);
+    S_strip(text);
 
     // Extract the brief description.
-    char *brief = NULL;
     {
         char *ptr = text;
         size_t len = strlen(text);
@@ -105,26 +106,23 @@ CFCDocuComment_parse(const char *raw_tex
             ) {
                 ptr++;
                 size_t brief_len = ptr - text;
-                brief = (char*)malloc(brief_len + 1);
-                if (!brief) { croak("malloc failed"); }
-                memcpy(brief, text, brief_len);
-                brief[brief_len] = '\0';
+                self->brief = savepv(text);
+                self->brief[brief_len] = '\0';
                 break;
             }
             ptr++;
         }
     }
-    if (!brief) {
-        // croak("Can't find at least one sentence in '%s'", raw_text);
-        brief = (char*)calloc(1, sizeof(char));
+    if (!self->brief) {
+        self->brief = savepv("");
     }
 
     // Extract @param directives.
     size_t num_params = 0;
-    char **param_names = (char**)calloc(num_params, sizeof(char*));
-    char **param_docs  = (char**)calloc(num_params, sizeof(char*));
-    if (!param_names || !param_docs) { 
-        croak("malloc failed"); 
+    self->param_names = (char**)calloc(num_params + 1, sizeof(char*));
+    self->param_docs  = (char**)calloc(num_params + 1, sizeof(char*));
+    if (!self->param_names || !self->param_docs) { 
+        croak("calloc failed"); 
     }
     {
         char *candidate = strstr(text, "@param");
@@ -164,15 +162,17 @@ CFCDocuComment_parse(const char *raw_tex
 
             num_params++;
             size_t size = (num_params + 1) * sizeof(char*);
-            param_names = realloc(param_names, size);
-            param_docs  = realloc(param_docs, size);
-            if (!param_names || !param_docs) { 
+            self->param_names = realloc(self->param_names, size);
+            self->param_docs  = realloc(self->param_docs, size);
+            if (!self->param_names || !self->param_docs) { 
                 croak("realloc failed"); 
             }
-            param_names[num_params - 1] = savepvn(param_name, param_name_len);
-            param_docs[num_params - 1]  = savepvn(param_doc, param_doc_len);
-            CFCUtil_trim_whitespace(param_names[num_params - 1]);
-            CFCUtil_trim_whitespace(param_docs[num_params - 1]);
+            self->param_names[num_params - 1] = savepvn(param_name, param_name_len);
+            self->param_docs[num_params - 1]  = savepvn(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;
+            self->param_docs[num_params]  = NULL;
             
             if (ptr == limit) {
                 break;
@@ -185,104 +185,59 @@ CFCDocuComment_parse(const char *raw_tex
     }
 
     // Extract full description.
-    char *full_description = savepv(text);
+    self->description = savepv(text);
     {
-        char *terminus = strstr(full_description, "@param");
+        char *terminus = strstr(self->description, "@param");
         if (!terminus) {
-            terminus = strstr(full_description, "@return");
+            terminus = strstr(self->description, "@return");
         }
         if (terminus) {
             *terminus = '\0';
         }
     }
-    CFCUtil_trim_whitespace(full_description);
+    CFCUtil_trim_whitespace(self->description);
 
     // Extract long description.
-    char *long_description = savepv(full_description + strlen(brief));
-    CFCUtil_trim_whitespace(long_description);
+    self->long_des = savepv(self->description + strlen(self->brief));
+    CFCUtil_trim_whitespace(self->long_des);
 
-    char *retval = strstr(text, "@return ");
-    if (retval) {
-        retval = savepv(retval + sizeof("@return ") - 1);
-        char *terminus = strchr(retval, '@');
+    // Extract @return directive.
+    char *maybe_retval = strstr(text, "@return ");
+    if (maybe_retval) {
+        self->retval = savepv(maybe_retval + sizeof("@return ") - 1);
+        char *terminus = strchr(self->retval, '@');
         if (terminus) {
             *terminus = '\0';
         }
-        CFCUtil_trim_whitespace(retval);
-    }
-
-    // Wrap param names and param docs in Perl arrays for now.
-    AV *param_names_av = newAV();
-    AV *param_docs_av  = newAV();
-    {
-        size_t i;
-        for (i = 0; i < num_params; i++) {
-            SV *name = newSVpvn(param_names[i], strlen(param_names[i]));
-            av_store(param_names_av, i, name);
-            SV *doc = newSVpvn(param_docs[i], strlen(param_docs[i]));
-            av_store(param_docs_av, i, doc);
-            Safefree(param_names[i]);
-            Safefree(param_docs[i]);
-        }
-        free(param_names);
-        free(param_docs);
+        CFCUtil_trim_whitespace(self->retval);
     }
 
-    SV *param_names_ref = newRV((SV*)param_names_av);
-    SV *param_docs_ref = newRV((SV*)param_docs_av);
-    CFCDocuComment *self = CFCDocuComment_new(full_description, brief, 
-        long_description, param_names_ref, param_docs_ref, retval);
-    Safefree(full_description);
-    free(brief);
-    Safefree(long_description);
-    Safefree(retval);
-    Safefree(text);
-    SvREFCNT_dec((SV*)param_names_av);
-    SvREFCNT_dec((SV*)param_docs_av);
-    SvREFCNT_dec(param_names_ref);
-    SvREFCNT_dec(param_docs_ref);
-
-    return self;
-}
-
-CFCDocuComment*
-CFCDocuComment_new(const char *description, const char *brief, 
-                   const char *long_description, void *param_names, 
-                   void *param_docs, const char *retval)
-{
-    CFCDocuComment *self = (CFCDocuComment*)malloc(sizeof(CFCDocuComment));
-    if (!self) { croak("malloc failed"); }
-    return CFCDocuComment_init(self, description, brief, long_description,
-        param_names, param_docs, retval);
-}
-
-CFCDocuComment*
-CFCDocuComment_init(CFCDocuComment *self, const char *description, 
-                    const char *brief, const char *long_description, 
-                    void *param_names, void *param_docs, const char *retval)
-{
-    self->description = savepv(description);
-    self->brief       = savepv(brief);
-    self->long_des    = savepv(long_description);
-    self->param_names = newSVsv((SV*)param_names);
-    self->param_docs  = newSVsv((SV*)param_docs);
-    self->retval      = retval ? savepv(retval) : NULL;
     return self;
 }
 
 void
 CFCDocuComment_destroy(CFCDocuComment *self)
 {
+    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);
+    }
+    if (self->param_docs) {
+        for (i = 0; self->param_docs[i] != NULL; i++) {
+            Safefree(self->param_docs[i]);
+        }
+        free(self->param_docs);
+    }
     Safefree(self->description);
     Safefree(self->brief);
     Safefree(self->long_des);
-    SvREFCNT_dec((SV*)self->param_names);
-    SvREFCNT_dec((SV*)self->param_docs);
     Safefree(self->retval);
     free(self);
 }
 
-
 const char*
 CFCDocuComment_get_description(CFCDocuComment *self)
 {
@@ -301,16 +256,16 @@ CFCDocuComment_get_long(CFCDocuComment *
     return self->long_des;
 }
 
-void*
+const char**
 CFCDocuComment_get_param_names(CFCDocuComment *self)
 {
-    return self->param_names;
+    return (const char**)self->param_names;
 }
 
-void*
+const char**
 CFCDocuComment_get_param_docs(CFCDocuComment *self)
 {
-    return self->param_docs;
+    return (const char**)self->param_docs;
 }
 
 const char*

Modified: incubator/lucy/trunk/clownfish/src/CFCDocuComment.h
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCDocuComment.h?rev=1071509&r1=1071508&r2=1071509&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCDocuComment.h (original)
+++ incubator/lucy/trunk/clownfish/src/CFCDocuComment.h Thu Feb 17 06:25:59 2011
@@ -16,24 +16,9 @@
 
 typedef struct CFCDocuComment CFCDocuComment;
 
-/** Remove comment open, close, and left border from raw comment text.
- */
-void
-CFCDocuComment_strip(char *comment);
-
 CFCDocuComment*
 CFCDocuComment_parse(const char *raw_text);
 
-CFCDocuComment*
-CFCDocuComment_new(const char *description, const char *brief, 
-                   const char *long_description, void *param_names, 
-                   void *param_docs, const char *retval);
-
-CFCDocuComment*
-CFCDocuComment_init(CFCDocuComment *self, const char *description, 
-                    const char *brief, const char *long_description, 
-                    void *param_names, void *param_docs, const char *retval);
-
 void
 CFCDocuComment_destroy(CFCDocuComment *self);
 
@@ -46,10 +31,10 @@ CFCDocuComment_get_brief(CFCDocuComment 
 const char*
 CFCDocuComment_get_long(CFCDocuComment *self);
 
-void*
+const char**
 CFCDocuComment_get_param_names(CFCDocuComment *self);
 
-void*
+const char**
 CFCDocuComment_get_param_docs(CFCDocuComment *self);
 
 // May be NULL.