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