You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by nw...@apache.org on 2012/12/28 22:34:30 UTC

[lucy-commits] [6/12] git commit: refs/heads/master - Start using CFCUtil_sprintf

Start using CFCUtil_sprintf


Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/e9641a06
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/e9641a06
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/e9641a06

Branch: refs/heads/master
Commit: e9641a06c485bcbe4843329a9326414a6b9c8c79
Parents: 2f96f72
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Wed Dec 26 21:22:30 2012 +0100
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Fri Dec 28 22:23:10 2012 +0100

----------------------------------------------------------------------
 clownfish/compiler/src/CFCBindClass.c       |   73 +++----------
 clownfish/compiler/src/CFCBindCore.c        |   32 +----
 clownfish/compiler/src/CFCBindFile.c        |   14 +--
 clownfish/compiler/src/CFCBindFunction.c    |   11 +--
 clownfish/compiler/src/CFCBindMethod.c      |   96 ++++------------
 clownfish/compiler/src/CFCClass.c           |   16 +--
 clownfish/compiler/src/CFCDumpable.c        |   44 ++------
 clownfish/compiler/src/CFCFile.c            |    8 +-
 clownfish/compiler/src/CFCMethod.c          |    7 +-
 clownfish/compiler/src/CFCPerl.c            |   61 +++--------
 clownfish/compiler/src/CFCPerlClass.c       |   17 +---
 clownfish/compiler/src/CFCPerlConstructor.c |   15 +--
 clownfish/compiler/src/CFCPerlMethod.c      |  133 +++++----------------
 clownfish/compiler/src/CFCPerlSub.c         |   23 +---
 clownfish/compiler/src/CFCPerlTypeMap.c     |   64 +++++------
 clownfish/compiler/src/CFCUtil.c            |   18 +--
 clownfish/compiler/src/CFCVariable.c        |   13 +--
 17 files changed, 168 insertions(+), 477 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/e9641a06/clownfish/compiler/src/CFCBindClass.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCBindClass.c b/clownfish/compiler/src/CFCBindClass.c
index 52aa5a5..50d9141 100644
--- a/clownfish/compiler/src/CFCBindClass.c
+++ b/clownfish/compiler/src/CFCBindClass.c
@@ -96,10 +96,8 @@ CFCBindClass_init(CFCBindClass *self, CFCClass *client) {
 
     const char *full_vtable_var = CFCClass_full_vtable_var(client);
     const char *PREFIX = CFCClass_get_PREFIX(client);
-    self->method_specs_var  = (char*)MALLOCATE(strlen(full_vtable_var) + 20);
-    self->short_names_macro = (char*)MALLOCATE(strlen(PREFIX) + 20);
-    sprintf(self->method_specs_var, "%s_METHODS", full_vtable_var);
-    sprintf(self->short_names_macro, "%sUSE_SHORT_NAMES", PREFIX);
+    self->method_specs_var  = CFCUtil_sprintf("%s_METHODS", full_vtable_var);
+    self->short_names_macro = CFCUtil_sprintf("%sUSE_SHORT_NAMES", PREFIX);
 
     return self;
 }
@@ -156,14 +154,8 @@ S_to_c_header_inert(CFCBindClass *self) {
         "\n"
         "%s\n"
         "\n";
-
-    size_t size = sizeof(pattern)
-                  + strlen(inert_var_defs)
-                  + strlen(inert_func_decs)
-                  + strlen(short_names)
-                  + 50;
-    char *content = (char*)MALLOCATE(size);
-    sprintf(content, pattern, inert_var_defs, inert_func_decs, short_names);
+    char *content = CFCUtil_sprintf(pattern, inert_var_defs, inert_func_decs,
+                                    short_names);
 
     FREEMEM(inert_var_defs);
     FREEMEM(inert_func_decs);
@@ -234,25 +226,11 @@ S_to_c_header_dynamic(CFCBindClass *self) {
         "\n"
         "%s\n"
         "\n";
-
-    size_t size = sizeof(pattern)
-                  + strlen(parent_include)
-                  + strlen(privacy_symbol)
-                  + strlen(struct_def)
-                  + strlen(privacy_symbol)
-                  + strlen(inert_var_defs)
-                  + strlen(sub_declarations)
-                  + strlen(method_typedefs)
-                  + strlen(method_defs)
-                  + strlen(visibility)
-                  + strlen(vt_var)
-                  + strlen(short_names)
-                  + 100;
-
-    char *content = (char*)MALLOCATE(size);
-    sprintf(content, pattern, parent_include, privacy_symbol, struct_def,
-            privacy_symbol, inert_var_defs, sub_declarations, method_typedefs,
-            method_defs, visibility, vt_var, short_names);
+    char *content
+        = CFCUtil_sprintf(pattern, parent_include, privacy_symbol,
+                          struct_def, privacy_symbol, inert_var_defs,
+                          sub_declarations, method_typedefs, method_defs,
+                          visibility, vt_var, short_names);
 
     FREEMEM(struct_def);
     FREEMEM(parent_include);
@@ -368,15 +346,8 @@ CFCBindClass_to_c_data(CFCBindClass *self) {
         "\n"
         "%s\n"
         "\n";
-    size_t size = sizeof(pattern)
-                  + strlen(offsets)
-                  + strlen(cb_funcs)
-                  + strlen(ms_var)
-                  + strlen(vt_var)
-                  + strlen(autocode)
-                  + 100;
-    char *code = (char*)MALLOCATE(size);
-    sprintf(code, pattern, offsets, cb_funcs, ms_var, vt_var, autocode);
+    char *code = CFCUtil_sprintf(pattern, offsets, cb_funcs, ms_var, vt_var,
+                                 autocode);
 
     FREEMEM(fresh_methods);
     FREEMEM(offsets);
@@ -401,12 +372,7 @@ S_struct_definition(CFCBindClass *self) {
     }
 
     char pattern[] = "struct %s {%s\n};\n";
-    size_t size = sizeof(pattern)
-                  + strlen(struct_sym)
-                  + strlen(member_decs)
-                  + 10;
-    char *struct_def = (char*)MALLOCATE(size);
-    sprintf(struct_def, pattern, struct_sym, member_decs);
+    char *struct_def = CFCUtil_sprintf(pattern, struct_sym, member_decs);
 
     FREEMEM(member_decs);
     return struct_def;
@@ -454,19 +420,8 @@ CFCBindClass_spec_def(CFCBindClass *self) {
         "        %d, /* num_novel */\n"
         "        %s /* method_specs */\n"
         "    }";
-
-    size_t size = sizeof(pattern)
-                  + strlen(vt_var)
-                  + strlen(parent_ref)
-                  + strlen(class_name)
-                  + strlen(struct_sym)
-                  + 10 // for num_fresh
-                  + 10 // for num_novel
-                  + strlen(ms_var)
-                  + 100;
-    char *code = (char*)MALLOCATE(size);
-    sprintf(code, pattern, vt_var, parent_ref, class_name, struct_sym,
-            num_fresh, num_novel, ms_var);
+    char *code = CFCUtil_sprintf(pattern, vt_var, parent_ref, class_name,
+                                 struct_sym, num_fresh, num_novel, ms_var);
 
     FREEMEM(parent_ref);
     return code;

http://git-wip-us.apache.org/repos/asf/lucy/blob/e9641a06/clownfish/compiler/src/CFCBindCore.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCBindCore.c b/clownfish/compiler/src/CFCBindCore.c
index 0cf7e30..903f429 100644
--- a/clownfish/compiler/src/CFCBindCore.c
+++ b/clownfish/compiler/src/CFCBindCore.c
@@ -249,17 +249,9 @@ S_write_parcel_h(CFCBindCore *self) {
         "\n"
         "%s\n"
         "\n";
-    size_t size = sizeof(pattern)
-                  + strlen(self->header)
-                  + strlen(aliases)
-                  + strlen(typedefs)
-                  + strlen(visibility)
-                  + 2 * strlen(prefix)
-                  + strlen(self->footer)
-                  + 100;
-    char *file_content = (char*)MALLOCATE(size);
-    sprintf(file_content, pattern, self->header, aliases, typedefs, visibility,
-            prefix, prefix, self->footer);
+    char *file_content
+        = CFCUtil_sprintf(pattern, self->header, aliases, typedefs, visibility,
+                          prefix, prefix, self->footer);
 
     // Unlink then write file.
     const char *inc_dest = CFCHierarchy_get_include_dest(hierarchy);
@@ -348,20 +340,10 @@ S_write_parcel_c(CFCBindCore *self) {
         "}\n"
         "\n"
         "%s\n";
-    size_t size = sizeof(pattern)
-                  + strlen(self->header)
-                  + strlen(privacy_syms)
-                  + strlen(includes)
-                  + strlen(c_data)
-                  + strlen(vt_specs)
-                  + strlen(prefix)
-                  + 10 // for num_specs
-                  + strlen(prefix)
-                  + strlen(self->footer)
-                  + 100;
-    char *file_content = (char*)MALLOCATE(size);
-    sprintf(file_content, pattern, self->header, privacy_syms, includes,
-            c_data, vt_specs, prefix, num_specs, prefix, self->footer);
+    char *file_content
+        = CFCUtil_sprintf(pattern, self->header, privacy_syms, includes,
+                          c_data, vt_specs, prefix, num_specs, prefix,
+                          self->footer);
 
     // Unlink then open file.
     const char *src_dest = CFCHierarchy_get_source_dest(hierarchy);

http://git-wip-us.apache.org/repos/asf/lucy/blob/e9641a06/clownfish/compiler/src/CFCBindFile.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCBindFile.c b/clownfish/compiler/src/CFCBindFile.c
index db4c175..914c1f5 100644
--- a/clownfish/compiler/src/CFCBindFile.c
+++ b/clownfish/compiler/src/CFCBindFile.c
@@ -101,17 +101,9 @@ CFCBindFile_write_h(CFCFile *file, const char *dest, const char *header,
         "\n"
         "%s\n"
         "\n";
-
-    size_t size = sizeof(pattern)
-                  + strlen(header)
-                  + strlen(include_guard_start)
-                  + strlen(content)
-                  + strlen(include_guard_close)
-                  + strlen(footer)
-                  + 50;
-    char *file_content = (char*)MALLOCATE(size);
-    sprintf(file_content, pattern, header, include_guard_start, content,
-            include_guard_close, footer);
+    char *file_content
+        = CFCUtil_sprintf(pattern, header, include_guard_start, content,
+                          include_guard_close, footer);
 
     // Unlink then write file.
     remove(h_path);

http://git-wip-us.apache.org/repos/asf/lucy/blob/e9641a06/clownfish/compiler/src/CFCBindFunction.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCBindFunction.c b/clownfish/compiler/src/CFCBindFunction.c
index 0f3cb46..2e3ea00 100644
--- a/clownfish/compiler/src/CFCBindFunction.c
+++ b/clownfish/compiler/src/CFCBindFunction.c
@@ -32,15 +32,8 @@ CFCBindFunc_func_declaration(CFCFunction *func) {
     const char   *inline_prop    = CFCFunction_inline(func)
                                    ? "static CHY_INLINE "
                                    : "";
-    size_t size = strlen(inline_prop)
-                  + strlen(ret_type_str)
-                  + strlen(full_func_sym)
-                  + strlen(param_list_str)
-                  + 20
-                  + strlen("\0");
-    char *buf = (char*)MALLOCATE(size);
-    sprintf(buf, "%s%s\n%s(%s);", inline_prop, ret_type_str, full_func_sym,
-            param_list_str);
+    char *buf = CFCUtil_sprintf("%s%s\n%s(%s);", inline_prop, ret_type_str,
+                                full_func_sym, param_list_str);
     return buf;
 }
 

http://git-wip-us.apache.org/repos/asf/lucy/blob/e9641a06/clownfish/compiler/src/CFCBindMethod.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCBindMethod.c b/clownfish/compiler/src/CFCBindMethod.c
index 85ac99e..c9ee631 100644
--- a/clownfish/compiler/src/CFCBindMethod.c
+++ b/clownfish/compiler/src/CFCBindMethod.c
@@ -75,18 +75,13 @@ S_final_method_def(CFCMethod *method, CFCClass *klass) {
     char *full_offset_sym = (char*)MALLOCATE(offset_sym_size);
     CFCMethod_full_offset_sym(method, klass, full_offset_sym, offset_sym_size);
 
-    const char pattern[] = "extern size_t %s;\n#define %s(%s) \\\n    %s((%s)%s)\n";
-    size_t size = sizeof(pattern)
-                  + strlen(full_offset_sym)
-                  + strlen(full_meth_sym)
-                  + strlen(arg_names)
-                  + strlen(full_func_sym)
-                  + strlen(self_type)
-                  + strlen(arg_names)
-                  + 20;
-    char *method_def = (char*)MALLOCATE(size);
-    sprintf(method_def, pattern, full_offset_sym, full_meth_sym, arg_names,
-            full_func_sym, self_type, arg_names);
+    const char pattern[] =
+        "extern size_t %s;\n"
+        "#define %s(%s) \\\n"
+        "    %s((%s)%s)\n";
+    char *method_def
+        = CFCUtil_sprintf(pattern, full_offset_sym, full_meth_sym, arg_names,
+                          full_func_sym, self_type, arg_names);
 
     FREEMEM(full_offset_sym);
     FREEMEM(full_meth_sym);
@@ -139,26 +134,12 @@ S_virtual_method_def(CFCMethod *method, CFCClass *klass) {
         "    const %s method = *((%s*)method_address);\n"
         "    %smethod((%s*)self%s);\n"
         "}\n";
-
-    size_t size = sizeof(pattern)
-                  + strlen(visibility)
-                  + strlen(full_offset_sym)
-                  + strlen(ret_type_str)
-                  + strlen(full_meth_sym)
-                  + strlen(invoker_struct)
-                  + strlen(params_minus_invoker)
-                  + strlen(full_offset_sym)
-                  + strlen(full_typedef)
-                  + strlen(full_typedef)
-                  + strlen(maybe_return)
-                  + strlen(common_struct)
-                  + strlen(arg_names_minus_invoker)
-                  + 40;
-    char *method_def = (char*)MALLOCATE(size);
-    sprintf(method_def, pattern, visibility, full_offset_sym, ret_type_str,
-            full_meth_sym, invoker_struct, params_minus_invoker,
-            full_offset_sym, full_typedef, full_typedef, maybe_return,
-            common_struct, arg_names_minus_invoker);
+    char *method_def
+        = CFCUtil_sprintf(pattern, visibility, full_offset_sym, ret_type_str,
+                          full_meth_sym, invoker_struct, params_minus_invoker,
+                          full_offset_sym, full_typedef, full_typedef,
+                          maybe_return, common_struct,
+                          arg_names_minus_invoker);
 
     FREEMEM(full_offset_sym);
     FREEMEM(full_meth_sym);
@@ -175,13 +156,8 @@ CFCBindMeth_typedef_dec(struct CFCMethod *method, CFCClass *klass) {
     char *full_typedef = (char*)MALLOCATE(full_typedef_size);
     CFCMethod_full_typedef(method, klass, full_typedef, full_typedef_size);
 
-    size_t size = strlen(params)
-                  + strlen(ret_type)
-                  + strlen(full_typedef)
-                  + 20
-                  + sizeof("\0");
-    char *buf = (char*)MALLOCATE(size);
-    sprintf(buf, "typedef %s\n(*%s)(%s);\n", ret_type, full_typedef, params);
+    char *buf = CFCUtil_sprintf("typedef %s\n(*%s)(%s);\n", ret_type,
+                                full_typedef, params);
     FREEMEM(full_typedef);
     return buf;
 }
@@ -209,16 +185,9 @@ CFCBindMeth_spec_def(CFCMethod *method) {
         "        (cfish_method_t)%s, /* callback_func */\n"
         "        &%s /* offset */\n"
         "    }";
-    size_t size = sizeof(pattern)
-                  + 10 /* for is_novel */
-                  + strlen(macro_sym)
-                  + strlen(impl_sym)
-                  + strlen(full_override_sym)
-                  + strlen(full_offset_sym)
-                  + 30;
-    char *def = (char*)MALLOCATE(size);
-    sprintf(def, pattern, is_novel, macro_sym, impl_sym, full_override_sym,
-            full_offset_sym);
+    char *def
+        = CFCUtil_sprintf(pattern, is_novel, macro_sym, impl_sym,
+                          full_override_sym, full_offset_sym);
 
     FREEMEM(full_offset_sym);
     return def;
@@ -248,9 +217,8 @@ S_maybe_unreachable(CFCType *return_type) {
     }
     else {
         const char *ret_type_str = CFCType_to_c(return_type);
-        return_statement = (char*)MALLOCATE(strlen(ret_type_str) + 60);
-        sprintf(return_statement, "\n    CHY_UNREACHABLE_RETURN(%s);",
-                ret_type_str);
+        char pattern[] = "\n    CHY_UNREACHABLE_RETURN(%s);";
+        return_statement = CFCUtil_sprintf(pattern, ret_type_str);
     }
     return return_statement;
 }
@@ -277,18 +245,9 @@ CFCBindMeth_abstract_method_def(CFCMethod *method) {
         "    cfish_CharBuf *klass = self ? Cfish_Obj_Get_Class_Name((cfish_Obj*)self) : %s->name;%s\n"
         "    CFISH_THROW(CFISH_ERR, \"Abstract method '%s' not defined by %%o\", klass);%s\n"
         "}\n";
-    size_t needed = sizeof(pattern)
-                    + strlen(ret_type_str)
-                    + strlen(full_func_sym)
-                    + strlen(params)
-                    + strlen(vtable_var)
-                    + strlen(unused)
-                    + strlen(macro_sym)
-                    + strlen(return_statement)
-                    + 50;
-    char *abstract_def = (char*)MALLOCATE(needed);
-    sprintf(abstract_def, pattern, ret_type_str, full_func_sym, params,
-            vtable_var, unused, macro_sym, return_statement);
+    char *abstract_def
+        = CFCUtil_sprintf(pattern, ret_type_str, full_func_sym, params,
+                          vtable_var, unused, macro_sym, return_statement);
 
     FREEMEM(unused);
     FREEMEM(return_statement);
@@ -305,13 +264,8 @@ CFCBindMeth_callback_dec(CFCMethod *method) {
     char pattern[] =
         "%s\n"
         "%s(%s);\n";
-    size_t size = sizeof(pattern)
-                  + strlen(ret_type_str)
-                  + strlen(override_sym)
-                  + strlen(params);
-
-    char *callback_dec = (char*)MALLOCATE(size);
-    sprintf(callback_dec, pattern, ret_type_str, override_sym, params);
+    char *callback_dec
+        = CFCUtil_sprintf(pattern, ret_type_str, override_sym, params);
 
     return callback_dec;
 }

http://git-wip-us.apache.org/repos/asf/lucy/blob/e9641a06/clownfish/compiler/src/CFCClass.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCClass.c b/clownfish/compiler/src/CFCClass.c
index 05e200c..09ffa68 100644
--- a/clownfish/compiler/src/CFCClass.c
+++ b/clownfish/compiler/src/CFCClass.c
@@ -160,30 +160,26 @@ CFCClass_do_create(CFCClass *self, struct CFCParcel *parcel,
                        ? CFCUtil_strdup(last_colon + 1)
                        : CFCUtil_strdup(class_name);
     const char *prefix = CFCClass_get_prefix(self);
-    size_t prefix_len = strlen(prefix);
     size_t struct_sym_len = strlen(self->struct_sym);
-    self->short_vtable_var   = (char*)MALLOCATE(struct_sym_len + 1);
-    self->full_struct_sym    = (char*)MALLOCATE(prefix_len + struct_sym_len + 1);
-    self->full_vtable_var    = (char*)MALLOCATE(prefix_len + struct_sym_len + 1);
-    self->privacy_symbol     = (char*)MALLOCATE(prefix_len + struct_sym_len + 2 + 1);
+    self->short_vtable_var = (char*)MALLOCATE(struct_sym_len + 1);
     size_t i;
     for (i = 0; i < struct_sym_len; i++) {
         self->short_vtable_var[i] = toupper(self->struct_sym[i]);
     }
     self->short_vtable_var[struct_sym_len] = '\0';
-    sprintf(self->full_struct_sym, "%s%s", prefix, self->struct_sym);
+    self->full_struct_sym = CFCUtil_sprintf("%s%s", prefix, self->struct_sym);
+    size_t full_struct_sym_len = strlen(self->full_struct_sym);
+    self->full_vtable_var = (char*)MALLOCATE(full_struct_sym_len + 1);
     for (i = 0; self->full_struct_sym[i] != '\0'; i++) {
         self->full_vtable_var[i] = toupper(self->full_struct_sym[i]);
     }
     self->full_vtable_var[i] = '\0';
-    sprintf(self->privacy_symbol, "C_%s", self->full_vtable_var);
+    self->privacy_symbol = CFCUtil_sprintf("C_%s", self->full_vtable_var);
 
     // Build the relative path to the autogenerated C header file.
     if (file_spec) {
         const char *path_part = CFCFileSpec_get_path_part(self->file_spec);
-        size_t path_part_len = strlen(path_part);
-        self->include_h = (char*)MALLOCATE(path_part_len + 3);
-        sprintf(self->include_h, "%s.h", path_part);
+        self->include_h = CFCUtil_sprintf("%s.h", path_part);
     }
     else {
         self->include_h = CFCUtil_strdup("class.h");

http://git-wip-us.apache.org/repos/asf/lucy/blob/e9641a06/clownfish/compiler/src/CFCDumpable.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCDumpable.c b/clownfish/compiler/src/CFCDumpable.c
index 2bdd076..feec89b 100644
--- a/clownfish/compiler/src/CFCDumpable.c
+++ b/clownfish/compiler/src/CFCDumpable.c
@@ -180,16 +180,9 @@ S_add_dump_method(CFCClass *klass) {
             "{\n"
             "    %s super_dump = SUPER_METHOD_PTR(%s, %s);\n"
             "    cfish_Hash *dump = (cfish_Hash*)super_dump(self);\n";
-        size_t amount = sizeof(pattern)
-                        + strlen(full_func_sym)
-                        + strlen(full_struct)
-                        + strlen(full_typedef) 
-                        + strlen(vtable_var)
-                        + strlen(full_meth)
-                        + 50;
-        char *autocode = (char*)MALLOCATE(amount);
-        sprintf(autocode, pattern, full_func_sym, full_struct, full_typedef,
-                vtable_var, full_meth);
+        char *autocode
+            = CFCUtil_sprintf(pattern, full_func_sym, full_struct,
+                              full_typedef, vtable_var, full_meth);
         CFCClass_append_autocode(klass, autocode);
         FREEMEM(full_meth);
         FREEMEM(full_typedef);
@@ -209,12 +202,7 @@ S_add_dump_method(CFCClass *klass) {
             "    cfish_Hash *dump = cfish_Hash_new(0);\n"
             "    Cfish_Hash_Store_Str(dump, \"_class\", 6,\n"
             "        (cfish_Obj*)Cfish_CB_Clone(Cfish_Obj_Get_Class_Name((cfish_Obj*)self)));\n";
-        size_t amount = sizeof(pattern)
-                        + strlen(full_func_sym)
-                        + strlen(full_struct)
-                        + 50;
-        char *autocode = (char*)MALLOCATE(amount);
-        sprintf(autocode, pattern, full_func_sym, full_struct);
+        char *autocode = CFCUtil_sprintf(pattern, full_func_sym, full_struct);
         CFCClass_append_autocode(klass, autocode);
         FREEMEM(autocode);
         CFCVariable **members = CFCClass_member_vars(klass);
@@ -254,16 +242,10 @@ S_add_load_method(CFCClass *klass) {
             "    cfish_Hash *source = (cfish_Hash*)CFISH_CERTIFY(dump, CFISH_HASH);\n"
             "    %s super_load = SUPER_METHOD_PTR(%s, %s);\n"
             "    %s *loaded = (%s*)super_load(self, dump);\n";
-        size_t amount = sizeof(pattern)
-                        + strlen(full_func_sym)
-                        + strlen(full_struct) * 3
-                        + strlen(full_typedef)
-                        + strlen(vtable_var)
-                        + strlen(full_meth)
-                        + 50;
-        char *autocode = (char*)MALLOCATE(amount);
-        sprintf(autocode, pattern, full_func_sym, full_struct, full_typedef,
-                vtable_var, full_meth, full_struct, full_struct);
+        char *autocode
+            = CFCUtil_sprintf(pattern, full_func_sym, full_struct,
+                              full_typedef, vtable_var, full_meth, full_struct,
+                              full_struct);
         CFCClass_append_autocode(klass, autocode);
         FREEMEM(full_meth);
         FREEMEM(full_typedef);
@@ -286,13 +268,9 @@ S_add_load_method(CFCClass *klass) {
             "    cfish_VTable *vtable = cfish_VTable_singleton(class_name, NULL);\n"
             "    %s *loaded = (%s*)Cfish_VTable_Make_Obj(vtable);\n"
             "    CHY_UNUSED_VAR(self);\n";
-        size_t amount = sizeof(pattern)
-                        + strlen(full_func_sym)
-                        + strlen(full_struct) * 3
-                        + 50;
-        char *autocode = (char*)MALLOCATE(amount);
-        sprintf(autocode, pattern, full_func_sym, full_struct, full_struct,
-                full_struct);
+        char *autocode
+            = CFCUtil_sprintf(pattern, full_func_sym, full_struct, full_struct,
+                              full_struct);
         CFCClass_append_autocode(klass, autocode);
         FREEMEM(autocode);
         CFCVariable **members = CFCClass_member_vars(klass);

http://git-wip-us.apache.org/repos/asf/lucy/blob/e9641a06/clownfish/compiler/src/CFCFile.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCFile.c b/clownfish/compiler/src/CFCFile.c
index badfec6..6e827d5 100644
--- a/clownfish/compiler/src/CFCFile.c
+++ b/clownfish/compiler/src/CFCFile.c
@@ -67,8 +67,6 @@ CFCFile_init(CFCFile *self, CFCFileSpec *spec) {
     const char *path_part = CFCFileSpec_get_path_part(self->spec);
     size_t len = strlen(path_part);
     self->guard_name = (char*)MALLOCATE(len + sizeof("H_") + 1);
-    self->guard_start = (char*)MALLOCATE(len * 2 + 40);
-    self->guard_close = (char*)MALLOCATE(len + 20);
     memcpy(self->guard_name, "H_", 2);
     size_t i, j;
     for (i = 0, j = 2; i < len; i++) {
@@ -81,9 +79,9 @@ CFCFile_init(CFCFile *self, CFCFileSpec *spec) {
         }
     }
     self->guard_name[j] = '\0';
-    sprintf(self->guard_start, "#ifndef %s\n#define %s 1\n", self->guard_name,
-            self->guard_name);
-    sprintf(self->guard_close, "#endif /* %s */\n", self->guard_name);
+    self->guard_start = CFCUtil_sprintf("#ifndef %s\n#define %s 1\n",
+                                        self->guard_name, self->guard_name);
+    self->guard_close = CFCUtil_sprintf("#endif /* %s */\n", self->guard_name);
 
     return self;
 }

http://git-wip-us.apache.org/repos/asf/lucy/blob/e9641a06/clownfish/compiler/src/CFCMethod.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCMethod.c b/clownfish/compiler/src/CFCMethod.c
index 6ed8f6e..329b109 100644
--- a/clownfish/compiler/src/CFCMethod.c
+++ b/clownfish/compiler/src/CFCMethod.c
@@ -113,8 +113,7 @@ CFCMethod_init(CFCMethod *self, CFCParcel *parcel, const char *exposure,
     const char *prefix    = CFCMethod_get_prefix(self);
     const char *last_colon = strrchr(class_name, ':');
     const char *struct_sym = last_colon ? last_colon + 1 : class_name;
-    char *wanted = (char*)MALLOCATE(strlen(prefix) + strlen(struct_sym) + 1);
-    sprintf(wanted, "%s%s", prefix, struct_sym);
+    char *wanted = CFCUtil_sprintf("%s%s", prefix, struct_sym);
     int mismatch = strcmp(wanted, specifier);
     FREEMEM(wanted);
     if (mismatch) {
@@ -128,9 +127,7 @@ CFCMethod_init(CFCMethod *self, CFCParcel *parcel, const char *exposure,
 
     // Derive more symbols.
     const char *full_func_sym = CFCMethod_implementing_func_sym(self);
-    size_t amount = strlen(full_func_sym) + sizeof("_OVERRIDE") + 1;
-    self->full_override_sym = (char*)MALLOCATE(amount);
-    sprintf(self->full_override_sym, "%s_OVERRIDE", full_func_sym);
+    self->full_override_sym = CFCUtil_sprintf("%s_OVERRIDE", full_func_sym);
 
     // Assume that this method is novel until we discover when applying
     // inheritance that it overrides another.

http://git-wip-us.apache.org/repos/asf/lucy/blob/e9641a06/clownfish/compiler/src/CFCPerl.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCPerl.c b/clownfish/compiler/src/CFCPerl.c
index dd5c378..dd6d667 100644
--- a/clownfish/compiler/src/CFCPerl.c
+++ b/clownfish/compiler/src/CFCPerl.c
@@ -214,18 +214,9 @@ S_write_boot_h(CFCPerl *self) {
         "#endif /* %s */\n"
         "\n"
         "%s\n";
-
-    size_t size = sizeof(pattern)
-                  + strlen(self->header)
-                  + strlen(guard)
-                  + strlen(guard)
-                  + strlen(self->boot_func)
-                  + strlen(guard)
-                  + strlen(self->footer)
-                  + 20;
-    char *content = (char*)MALLOCATE(size);
-    sprintf(content, pattern, self->header, guard, guard, self->boot_func,
-            guard, self->footer);
+    char *content
+        = CFCUtil_sprintf(pattern, self->header, guard, guard, self->boot_func,
+                          guard, self->footer);
     CFCUtil_write_file(self->boot_h_path, content, strlen(content));
 
     FREEMEM(content);
@@ -266,16 +257,9 @@ S_write_boot_c(CFCPerl *self) {
                     "    Cfish_ZCB_Assign_Str(alias, \"%s\", %u);\n"
                     "    cfish_VTable_add_alias_to_registry(%s,\n"
                     "        (cfish_CharBuf*)alias);\n";
-
-                size_t new_size = sizeof(pattern)
-                                  + strlen(alias_adds)
-                                  + alias_len
-                                  + 20    // stringified alias_len
-                                  + strlen(vtable_var)
-                                  + 50;
-                char *new_alias_adds = (char*)MALLOCATE(new_size);
-                sprintf(new_alias_adds, pattern, alias_adds, alias,
-                        (unsigned)alias_len, vtable_var);
+                char *new_alias_adds
+                    = CFCUtil_sprintf(pattern, alias_adds, alias,
+                                      (unsigned)alias_len, vtable_var);
                 FREEMEM(alias_adds);
                 alias_adds = new_alias_adds;
             }
@@ -319,20 +303,10 @@ S_write_boot_c(CFCPerl *self) {
         "\n"
         "%s\n"
         "\n";
-
-    size_t size = sizeof(pattern)
-                  + strlen(self->header)
-                  + strlen(self->boot_h_file)
-                  + strlen(pound_includes)
-                  + strlen(self->boot_func)
-                  + strlen(prefix)
-                  + strlen(alias_adds)
-                  + strlen(isa_pushes)
-                  + strlen(self->footer)
-                  + 100;
-    char *content = (char*)MALLOCATE(size);
-    sprintf(content, pattern, self->header, self->boot_h_file, pound_includes,
-            self->boot_func, prefix, alias_adds, isa_pushes, self->footer);
+    char *content
+        = CFCUtil_sprintf(pattern, self->header, self->boot_h_file,
+                          pound_includes, self->boot_func, prefix, alias_adds,
+                          isa_pushes, self->footer);
     CFCUtil_write_file(self->boot_c_path, content, strlen(content));
 
     FREEMEM(content);
@@ -392,17 +366,10 @@ S_xs_file_contents(CFCPerl *self, const char *generated_xs,
     "\n"
     "%s\n"
     "\n";
-
-    size_t size = sizeof(pattern)
-                  + strlen(self->boot_h_file)
-                  + strlen(generated_xs)
-                  + strlen(self->boot_class) * 2
-                  + strlen(xs_init)
-                  + strlen(hand_rolled_xs)
-                  + 30;
-    char *contents = (char*)MALLOCATE(size);
-    sprintf(contents, pattern, self->boot_h_file, generated_xs,
-            self->boot_class, self->boot_class, xs_init, hand_rolled_xs);
+    char *contents
+        = CFCUtil_sprintf(pattern, self->boot_h_file, generated_xs,
+                          self->boot_class, self->boot_class, xs_init,
+                          hand_rolled_xs);
 
     return contents;
 }

http://git-wip-us.apache.org/repos/asf/lucy/blob/e9641a06/clownfish/compiler/src/CFCPerlClass.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCPerlClass.c b/clownfish/compiler/src/CFCPerlClass.c
index 296aa01..03fdba7 100644
--- a/clownfish/compiler/src/CFCPerlClass.c
+++ b/clownfish/compiler/src/CFCPerlClass.c
@@ -491,20 +491,9 @@ CFCPerlClass_create_pod(CFCPerlClass *self) {
     "\n"
     "=cut\n"
     "\n";
-
-    size_t size = sizeof(pattern)
-                  + strlen(class_name)
-                  + strlen(brief)
-                  + strlen(synopsis)
-                  + strlen(description)
-                  + strlen(constructor_pod)
-                  + strlen(methods_pod)
-                  + strlen(inheritance)
-                  + 20;
-
-    char *pod = (char*)MALLOCATE(size);
-    sprintf(pod, pattern, class_name, brief, synopsis, description,
-            constructor_pod, methods_pod, inheritance);
+    char *pod
+        = CFCUtil_sprintf(pattern, class_name, brief, synopsis, description,
+                          constructor_pod, methods_pod, inheritance);
 
     FREEMEM(brief);
     FREEMEM(synopsis);

http://git-wip-us.apache.org/repos/asf/lucy/blob/e9641a06/clownfish/compiler/src/CFCPerlConstructor.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCPerlConstructor.c b/clownfish/compiler/src/CFCPerlConstructor.c
index 7e6b0b1..2ca468f 100644
--- a/clownfish/compiler/src/CFCPerlConstructor.c
+++ b/clownfish/compiler/src/CFCPerlConstructor.c
@@ -135,17 +135,10 @@ CFCPerlConstructor_xsub_def(CFCPerlConstructor *self) {
         "    sv_2mortal(ST(0));\n"
         "    XSRETURN(1);\n"
         "}\n\n";
-    size_t size = sizeof(pattern)
-                  + strlen(c_name) * 2
-                  + strlen(allot_params)
-                  + strlen(self_type_str) * 2
-                  + strlen(refcount_mods)
-                  + strlen(self_type_str)
-                  + strlen(func_sym)
-                  + strlen(name_list);
-    char *xsub_def = (char*)MALLOCATE(size);
-    sprintf(xsub_def, pattern, c_name, c_name, allot_params, self_type_str,
-            self_type_str, refcount_mods, self_type_str, func_sym, name_list);
+    char *xsub_def
+        = CFCUtil_sprintf(pattern, c_name, c_name, allot_params, self_type_str,
+                          self_type_str, refcount_mods, self_type_str,
+                          func_sym, name_list);
 
     FREEMEM(refcount_mods);
     FREEMEM(allot_params);

http://git-wip-us.apache.org/repos/asf/lucy/blob/e9641a06/clownfish/compiler/src/CFCPerlMethod.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCPerlMethod.c b/clownfish/compiler/src/CFCPerlMethod.c
index a0cb4db..0a3de96 100644
--- a/clownfish/compiler/src/CFCPerlMethod.c
+++ b/clownfish/compiler/src/CFCPerlMethod.c
@@ -239,13 +239,8 @@ S_self_assign_statement(CFCPerlMethod *self, CFCType *type,
                          ? "XSBind_maybe_sv_to_cfish_obj"
                          : "XSBind_sv_to_cfish_obj";
     char pattern[] = "%s self = (%s)%s(ST(0), %s, NULL);";
-    size_t size = sizeof(pattern)
-                  + strlen(type_c) * 2
-                  + strlen(binding_func)
-                  + strlen(vtable_var)
-                  + 10;
-    char *statement = (char*)MALLOCATE(size);
-    sprintf(statement, pattern, type_c, type_c, binding_func, vtable_var);
+    char *statement
+        = CFCUtil_sprintf(pattern, type_c, type_c, binding_func, vtable_var);
 
     return statement;
 }
@@ -278,16 +273,9 @@ S_xsub_def_labeled_params(CFCPerlMethod *self) {
         "    /* Execute */\n"
         "    %s\n"
         "}\n";
-    size_t size = sizeof(pattern)
-                  + strlen(c_name) * 2
-                  + strlen(self_micro_sym)
-                  + strlen(allot_params)
-                  + strlen(self_assign)
-                  + strlen(body)
-                  + 40;
-    char *xsub_def = (char*)MALLOCATE(size);
-    sprintf(xsub_def, pattern, c_name, c_name, self_micro_sym, allot_params,
-            self_assign, body);
+    char *xsub_def
+        = CFCUtil_sprintf(pattern, c_name, c_name, self_micro_sym,
+                          allot_params, self_assign, body);
 
     FREEMEM(self_assign);
     FREEMEM(allot_params);
@@ -326,17 +314,14 @@ S_xsub_def_positional_args(CFCPerlMethod *self) {
     }
     const char num_args_pattern[] =
         "if (items %s %u) { CFISH_THROW(CFISH_ERR, \"Usage: %%s(%s)\", GvNAME(CvGV(cv))); }";
-    size_t num_args_check_size = sizeof(num_args_pattern)
-                                 + strlen(xs_name_list)
-                                 + 30;
-    char *num_args_check = (char*)MALLOCATE(num_args_check_size);
+    char *num_args_check;
     if (min_required < num_vars) {
-        sprintf(num_args_check, num_args_pattern, "<", min_required,
-                xs_name_list);
+        num_args_check = CFCUtil_sprintf(num_args_pattern, "<", min_required,
+                                         xs_name_list);
     }
     else {
-        sprintf(num_args_check, num_args_pattern, "!=", num_vars,
-                xs_name_list);
+        num_args_check = CFCUtil_sprintf(num_args_pattern, "!=", num_vars,
+                                         xs_name_list);
     }
 
     // Var assignments.
@@ -367,15 +352,8 @@ S_xsub_def_positional_args(CFCPerlMethod *self) {
                 char pattern[] =
                     "\n    %s %s = ( items >= %u && XSBind_sv_defined(ST(%u)) )"
                     " ? %s : %s;";
-                size_t size = sizeof(pattern)
-                              + strlen(type_c)
-                              + strlen(var_name)
-                              + strlen(conversion)
-                              + strlen(val)
-                              + 100;
-                char *statement = (char*)MALLOCATE(size);
-                sprintf(statement, pattern, type_c, var_name, i, i,
-                        conversion, val);
+                char *statement = CFCUtil_sprintf(pattern, type_c, var_name, i,
+                                                  i, conversion, val);
                 var_assignments
                     = CFCUtil_cat(var_assignments, statement, NULL);
                 FREEMEM(statement);
@@ -403,15 +381,9 @@ S_xsub_def_positional_args(CFCPerlMethod *self) {
         "    /* Execute */\n"
         "    %s\n"
         "}\n";
-    size_t size = sizeof(pattern)
-                  + strlen(self->sub.c_name) * 2
-                  + strlen(num_args_check)
-                  + strlen(var_assignments)
-                  + strlen(body)
-                  + 20;
-    char *xsub = (char*)MALLOCATE(size);
-    sprintf(xsub, pattern, self->sub.c_name, self->sub.c_name, num_args_check,
-            var_assignments, body);
+    char *xsub
+        = CFCUtil_sprintf(pattern, self->sub.c_name, self->sub.c_name,
+                          num_args_check, var_assignments, body);
 
     FREEMEM(num_args_check);
     FREEMEM(var_assignments);
@@ -477,9 +449,8 @@ S_maybe_unreachable(CFCType *return_type) {
     }
     else {
         const char *ret_type_str = CFCType_to_c(return_type);
-        return_statement = (char*)MALLOCATE(strlen(ret_type_str) + 60);
-        sprintf(return_statement, "\n    CHY_UNREACHABLE_RETURN(%s);",
-                ret_type_str);
+        char pattern[] = "\n    CHY_UNREACHABLE_RETURN(%s);";
+        return_statement = CFCUtil_sprintf(pattern, ret_type_str);
     }
     return return_statement;
 }
@@ -498,8 +469,7 @@ S_callback_start(CFCMethod *method) {
     int num_to_extend = num_args == 0 ? 1
                       : num_args == 1 ? 2
                       : 1 + (num_args * 2);
-    char *params = (char*)MALLOCATE(sizeof(pattern) + 20);
-    sprintf(params, pattern, num_to_extend);
+    char *params = CFCUtil_sprintf(pattern, num_to_extend);
 
     // Iterate over arguments, mapping them to Perl scalars.
     CFCVariable **arg_vars = CFCParamList_get_variables(param_list);
@@ -623,17 +593,9 @@ S_invalid_callback_def(CFCMethod *method) {
         "%s(%s) {%s\n"
         "    CFISH_THROW(CFISH_ERR, \"Can't override %s via binding\");%s\n"
         "}\n";
-    size_t size = sizeof(pattern)
-                  + strlen(ret_type_str)
-                  + strlen(override_sym)
-                  + strlen(params)
-                  + strlen(unused)
-                  + strlen(full_method_sym)
-                  + strlen(unreachable)
-                  + 20;
-    char *callback_def = (char*)MALLOCATE(size);
-    sprintf(callback_def, pattern, ret_type_str, override_sym, params, unused,
-            full_method_sym, unreachable);
+    char *callback_def
+        = CFCUtil_sprintf(pattern, ret_type_str, override_sym, params, unused,
+                          full_method_sym, unreachable);
 
     FREEMEM(full_method_sym);
     FREEMEM(unreachable);
@@ -653,17 +615,9 @@ S_void_callback_def(CFCMethod *method, const char *callback_start,
         "%s"
         "    S_finish_callback_void(\"%s\");%s\n"
         "}\n";
-
-    size_t size = sizeof(pattern)
-                  + strlen(override_sym)
-                  + strlen(params)
-                  + strlen(callback_start)
-                  + strlen(micro_sym)
-                  + strlen(refcount_mods)
-                  + 20;
-    char *callback_def = (char*)MALLOCATE(size);
-    sprintf(callback_def, pattern, override_sym, params, callback_start,
-            micro_sym, refcount_mods);
+    char *callback_def
+        = CFCUtil_sprintf(pattern, override_sym, params, callback_start,
+                          micro_sym, refcount_mods);
 
     return callback_def;
 }
@@ -695,21 +649,10 @@ S_primitive_callback_def(CFCMethod *method, const char *callback_start,
         "    %s retval = (%s)%s(\"%s\");%s\n"
         "    return retval;\n"
         "}\n";
-    size_t size = sizeof(pattern)
-                  + strlen(ret_type_str)
-                  + strlen(override_sym)
-                  + strlen(params)
-                  + strlen(callback_start)
-                  + strlen(ret_type_str)
-                  + strlen(ret_type_str)
-                  + strlen(callback_func)
-                  + strlen(micro_sym)
-                  + strlen(refcount_mods)
-                  + 30;
-    char *callback_def = (char*)MALLOCATE(size);
-    sprintf(callback_def, pattern, ret_type_str, override_sym, params,
-            callback_start, ret_type_str, ret_type_str, callback_func,
-            micro_sym, refcount_mods);
+    char *callback_def
+        = CFCUtil_sprintf(pattern, ret_type_str, override_sym, params,
+                          callback_start, ret_type_str, ret_type_str,
+                          callback_func, micro_sym, refcount_mods);
 
     return callback_def;
 }
@@ -731,22 +674,10 @@ S_obj_callback_def(CFCMethod *method, const char *callback_start,
         "    %s retval = (%s)S_finish_callback_obj(self, \"%s\", %s);%s\n"
         "    return retval;\n"
         "}\n";
-
-    size_t size = sizeof(pattern)
-                  + strlen(ret_type_str)
-                  + strlen(override_sym)
-                  + strlen(params)
-                  + strlen(callback_start)
-                  + strlen(ret_type_str)
-                  + strlen(ret_type_str)
-                  + strlen(micro_sym)
-                  + strlen(nullable)
-                  + strlen(refcount_mods)
-                  + 30;
-    char *callback_def = (char*)MALLOCATE(size);
-    sprintf(callback_def, pattern, ret_type_str, override_sym, params,
-            callback_start, ret_type_str, ret_type_str, micro_sym, nullable,
-            refcount_mods);
+    char *callback_def
+        = CFCUtil_sprintf(pattern, ret_type_str, override_sym, params,
+                          callback_start, ret_type_str, ret_type_str,
+                          micro_sym, nullable, refcount_mods);
 
     return callback_def;
 }

http://git-wip-us.apache.org/repos/asf/lucy/blob/e9641a06/clownfish/compiler/src/CFCPerlSub.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCPerlSub.c b/clownfish/compiler/src/CFCPerlSub.c
index c3533a5..ccc9077 100644
--- a/clownfish/compiler/src/CFCPerlSub.c
+++ b/clownfish/compiler/src/CFCPerlSub.c
@@ -159,16 +159,8 @@ S_allot_params_arg(CFCType *type, const char *label, int required) {
                                      ? "alloca(cfish_ZCB_size())"
                                      : "NULL";
         const char pattern[] = "ALLOT_OBJ(&%s, \"%s\", %u, %s, %s, %s)";
-        size_t size = sizeof(pattern)
-                      + label_len * 2
-                      + 20
-                      + 5
-                      + strlen(vtable_var)
-                      + strlen(zcb_allocation)
-                      + 50;
-        char *arg = (char*)MALLOCATE(size);
-        sprintf(arg, pattern, label, label, label_len, req_string, vtable_var,
-                zcb_allocation);
+        char *arg = CFCUtil_sprintf(pattern, label, label, label_len,
+                                    req_string, vtable_var, zcb_allocation);
         return arg;
     }
     else if (CFCType_is_primitive(type)) {
@@ -177,15 +169,8 @@ S_allot_params_arg(CFCType *type, const char *label, int required) {
             if (strcmp(prim_type, type_c_string) == 0) {
                 const char *allot = prim_type_to_allot_macro[i].allot_macro;
                 char pattern[] = "%s(&%s, \"%s\", %u, %s)";
-                size_t size = sizeof(pattern)
-                              + strlen(allot)
-                              + label_len * 2
-                              + 20
-                              + 5
-                              + 20; // extra
-                char *arg = (char*)MALLOCATE(size);
-                sprintf(arg, pattern, allot, label, label, label_len,
-                        req_string);
+                char *arg = CFCUtil_sprintf(pattern, allot, label, label,
+                                            label_len, req_string);
                 return arg;
             }
         }

http://git-wip-us.apache.org/repos/asf/lucy/blob/e9641a06/clownfish/compiler/src/CFCPerlTypeMap.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCPerlTypeMap.c b/clownfish/compiler/src/CFCPerlTypeMap.c
index 3ab05eb..864ede4 100644
--- a/clownfish/compiler/src/CFCPerlTypeMap.c
+++ b/clownfish/compiler/src/CFCPerlTypeMap.c
@@ -61,56 +61,54 @@ CFCPerlTypeMap_from_perl(CFCType *type, const char *xs_var) {
     }
     else if (CFCType_is_primitive(type)) {
         const char *specifier = CFCType_get_specifier(type);
-        size_t size = 80 + strlen(xs_var) * 2;
-        result = (char*)MALLOCATE(size);
 
         if (strcmp(specifier, "double") == 0) {
-            sprintf(result, "SvNV(%s)", xs_var);
+            result = CFCUtil_sprintf("SvNV(%s)", xs_var);
         }
         else if (strcmp(specifier, "float") == 0) {
-            sprintf(result, "(float)SvNV(%s)", xs_var);
+            result = CFCUtil_sprintf("(float)SvNV(%s)", xs_var);
         }
         else if (strcmp(specifier, "int") == 0) {
-            sprintf(result, "(int)SvIV(%s)", xs_var);
+            result = CFCUtil_sprintf("(int)SvIV(%s)", xs_var);
         }
         else if (strcmp(specifier, "short") == 0) {
-            sprintf(result, "(short)SvIV(%s)", xs_var);
+            result = CFCUtil_sprintf("(short)SvIV(%s)", xs_var);
         }
         else if (strcmp(specifier, "long") == 0) {
             const char pattern[] =
                 "((sizeof(long) <= sizeof(IV)) ? (long)SvIV(%s) "
                 ": (long)SvNV(%s))";
-            sprintf(result, pattern, xs_var, xs_var);
+            result = CFCUtil_sprintf(pattern, xs_var, xs_var);
         }
         else if (strcmp(specifier, "size_t") == 0) {
-            sprintf(result, "(size_t)SvIV(%s)", xs_var);
+            result = CFCUtil_sprintf("(size_t)SvIV(%s)", xs_var);
         }
         else if (strcmp(specifier, "uint64_t") == 0) {
-            sprintf(result, "(uint64_t)SvNV(%s)", xs_var);
+            result = CFCUtil_sprintf("(uint64_t)SvNV(%s)", xs_var);
         }
         else if (strcmp(specifier, "uint32_t") == 0) {
-            sprintf(result, "(uint32_t)SvUV(%s)", xs_var);
+            result = CFCUtil_sprintf("(uint32_t)SvUV(%s)", xs_var);
         }
         else if (strcmp(specifier, "uint16_t") == 0) {
-            sprintf(result, "(uint16_t)SvUV(%s)", xs_var);
+            result = CFCUtil_sprintf("(uint16_t)SvUV(%s)", xs_var);
         }
         else if (strcmp(specifier, "uint8_t") == 0) {
-            sprintf(result, "(uint8_t)SvUV(%s)", xs_var);
+            result = CFCUtil_sprintf("(uint8_t)SvUV(%s)", xs_var);
         }
         else if (strcmp(specifier, "int64_t") == 0) {
-            sprintf(result, "(int64_t)SvNV(%s)", xs_var);
+            result = CFCUtil_sprintf("(int64_t)SvNV(%s)", xs_var);
         }
         else if (strcmp(specifier, "int32_t") == 0) {
-            sprintf(result, "(int32_t)SvIV(%s)", xs_var);
+            result = CFCUtil_sprintf("(int32_t)SvIV(%s)", xs_var);
         }
         else if (strcmp(specifier, "int16_t") == 0) {
-            sprintf(result, "(int16_t)SvIV(%s)", xs_var);
+            result = CFCUtil_sprintf("(int16_t)SvIV(%s)", xs_var);
         }
         else if (strcmp(specifier, "int8_t") == 0) {
-            sprintf(result, "(int8_t)SvIV(%s)", xs_var);
+            result = CFCUtil_sprintf("(int8_t)SvIV(%s)", xs_var);
         }
         else if (strcmp(specifier, "bool") == 0) {
-            sprintf(result, "SvTRUE(%s) ? 1 : 0", xs_var);
+            result = CFCUtil_sprintf("SvTRUE(%s) ? 1 : 0", xs_var);
         }
         else {
             FREEMEM(result);
@@ -135,60 +133,58 @@ CFCPerlTypeMap_to_perl(CFCType *type, const char *cf_var) {
     else if (CFCType_is_primitive(type)) {
         // Convert from a primitive type to a Perl scalar.
         const char *specifier = CFCType_get_specifier(type);
-        size_t size = 80 + strlen(cf_var) * 2;
-        result = (char*)MALLOCATE(size);
 
         if (strcmp(specifier, "double") == 0) {
-            sprintf(result, "newSVnv(%s)", cf_var);
+            result = CFCUtil_sprintf("newSVnv(%s)", cf_var);
         }
         else if (strcmp(specifier, "float") == 0) {
-            sprintf(result, "newSVnv(%s)", cf_var);
+            result = CFCUtil_sprintf("newSVnv(%s)", cf_var);
         }
         else if (strcmp(specifier, "int") == 0) {
-            sprintf(result, "newSViv(%s)", cf_var);
+            result = CFCUtil_sprintf("newSViv(%s)", cf_var);
         }
         else if (strcmp(specifier, "short") == 0) {
-            sprintf(result, "newSViv(%s)", cf_var);
+            result = CFCUtil_sprintf("newSViv(%s)", cf_var);
         }
         else if (strcmp(specifier, "long") == 0) {
             char pattern[] =
                 "((sizeof(long) <= sizeof(IV)) ? "
                 "newSViv((IV)%s) : newSVnv((NV)%s))";
-            sprintf(result, pattern, cf_var, cf_var);
+            result = CFCUtil_sprintf(pattern, cf_var, cf_var);
         }
         else if (strcmp(specifier, "size_t") == 0) {
-            sprintf(result, "newSViv(%s)", cf_var);
+            result = CFCUtil_sprintf("newSViv(%s)", cf_var);
         }
         else if (strcmp(specifier, "uint64_t") == 0) {
             char pattern[] =
                 "sizeof(UV) == 8 ? "
                 "newSVuv((UV)%s) : newSVnv((NV)CHY_U64_TO_DOUBLE(%s))";
-            sprintf(result, pattern, cf_var, cf_var);
+            result = CFCUtil_sprintf(pattern, cf_var, cf_var);
         }
         else if (strcmp(specifier, "uint32_t") == 0) {
-            sprintf(result, "newSVuv(%s)", cf_var);
+            result = CFCUtil_sprintf("newSVuv(%s)", cf_var);
         }
         else if (strcmp(specifier, "uint16_t") == 0) {
-            sprintf(result, "newSVuv(%s)", cf_var);
+            result = CFCUtil_sprintf("newSVuv(%s)", cf_var);
         }
         else if (strcmp(specifier, "uint8_t") == 0) {
-            sprintf(result, "newSVuv(%s)", cf_var);
+            result = CFCUtil_sprintf("newSVuv(%s)", cf_var);
         }
         else if (strcmp(specifier, "int64_t") == 0) {
             char pattern[] = "sizeof(IV) == 8 ? newSViv((IV)%s) : newSVnv((NV)%s)";
-            sprintf(result, pattern, cf_var, cf_var);
+            result = CFCUtil_sprintf(pattern, cf_var, cf_var);
         }
         else if (strcmp(specifier, "int32_t") == 0) {
-            sprintf(result, "newSViv(%s)", cf_var);
+            result = CFCUtil_sprintf("newSViv(%s)", cf_var);
         }
         else if (strcmp(specifier, "int16_t") == 0) {
-            sprintf(result, "newSViv(%s)", cf_var);
+            result = CFCUtil_sprintf("newSViv(%s)", cf_var);
         }
         else if (strcmp(specifier, "int8_t") == 0) {
-            sprintf(result, "newSViv(%s)", cf_var);
+            result = CFCUtil_sprintf("newSViv(%s)", cf_var);
         }
         else if (strcmp(specifier, "bool") == 0) {
-            sprintf(result, "newSViv(%s)", cf_var);
+            result = CFCUtil_sprintf("newSViv(%s)", cf_var);
         }
         else {
             FREEMEM(result);

http://git-wip-us.apache.org/repos/asf/lucy/blob/e9641a06/clownfish/compiler/src/CFCUtil.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCUtil.c b/clownfish/compiler/src/CFCUtil.c
index 5316f00..3f56cd0 100644
--- a/clownfish/compiler/src/CFCUtil.c
+++ b/clownfish/compiler/src/CFCUtil.c
@@ -374,25 +374,17 @@ CFCUtil_walk(const char *path, CFCUtil_walk_callback_t callback,
     if (!(stat_buf.st_mode & S_IFDIR)) {
         return;
     }
-    void   *dirhandle   = CFCUtil_opendir(path);
-    size_t  dir_len     = strlen(path);
-    size_t  subpath_cap = dir_len * 2;
-    char   *subpath     = (char*)MALLOCATE(subpath_cap);
-    const char *entry   = NULL;
+    void   *dirhandle = CFCUtil_opendir(path);
+    const char *entry = NULL;
     while (NULL != (entry = CFCUtil_dirnext(dirhandle))) {
         if (strcmp(entry, ".") == 0 || strcmp(entry, "..") == 0) {
             continue;
         }
-        size_t name_len = strlen(entry);
-        size_t needed = dir_len + 1 + name_len + 1;
-        if (needed > subpath_cap) {
-            subpath_cap = needed;
-            subpath = (char*)REALLOCATE(subpath, subpath_cap);
-        }
-        sprintf(subpath, "%s" CFCUTIL_PATH_SEP "%s", path, entry);
+        char *subpath = CFCUtil_sprintf("%s" CFCUTIL_PATH_SEP "%s", path,
+                                        entry);
         CFCUtil_walk(subpath, callback, context);
+        FREEMEM(subpath);
     }
-    FREEMEM(subpath);
     CFCUtil_closedir(dirhandle, path);
 }
 

http://git-wip-us.apache.org/repos/asf/lucy/blob/e9641a06/clownfish/compiler/src/CFCVariable.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/src/CFCVariable.c b/clownfish/compiler/src/CFCVariable.c
index 0eabb07..631480a 100644
--- a/clownfish/compiler/src/CFCVariable.c
+++ b/clownfish/compiler/src/CFCVariable.c
@@ -80,17 +80,10 @@ CFCVariable_init(CFCVariable *self, struct CFCParcel *parcel,
     if (CFCType_is_composite(type) && CFCType_get_array(type) != NULL) {
         postfix = CFCType_get_array(type);
     }
-    size_t size = strlen(type_str) + sizeof(" ") + strlen(micro_sym) +
-                  strlen(postfix) + 1;
-    self->local_c = (char*)MALLOCATE(size);
-    sprintf(self->local_c, "%s %s%s", type_str, micro_sym, postfix);
-    self->local_dec = (char*)MALLOCATE(strlen(self->local_c) + sizeof(";\0"));
-    sprintf(self->local_dec, "%s;", self->local_c);
+    self->local_c = CFCUtil_sprintf("%s %s%s", type_str, micro_sym, postfix);
+    self->local_dec = CFCUtil_sprintf("%s;", self->local_c);
     const char *full_sym = CFCVariable_full_sym(self);
-    size_t full_size = strlen(type_str) + sizeof(" ") + strlen(full_sym) +
-                       strlen(postfix) + 1;
-    self->global_c = (char*)MALLOCATE(full_size);
-    sprintf(self->global_c, "%s %s%s", type_str, full_sym, postfix);
+    self->global_c = CFCUtil_sprintf("%s %s%s", type_str, full_sym, postfix);
 
     return self;
 }