changeset 67:3f2872a1a2fe

clear objects in *_free() for generated code
author Thinker K.F. Li <thinker@branda.to>
date Wed, 13 Aug 2008 08:05:50 +0800
parents 309f1eefbec0
children 018546012798
files tools/mb_c_header.m4 tools/mb_c_source.m4
diffstat 2 files changed, 60 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/tools/mb_c_header.m4	Wed Aug 13 02:17:19 2008 +0800
+++ b/tools/mb_c_header.m4	Wed Aug 13 08:05:50 2008 +0800
@@ -31,15 +31,18 @@
 
 define([MADBUTTERFLY],[dnl
 [#ifndef __$1_H_
-#define __$1_H_]
+#define __$1_H_
 
-[typedef struct $1 $1_t;]
+typedef struct $1 $1_t;
 
-struct [$1] {
-    coord_t *root_coord;
+struct $1 {
+    coord_t *root_coord;]
 $2[]dnl
-};
+[};
 
-[#endif /* __$1_H_ */]
+extern $1_t *$1_new(redraw_mant_t *rdman);
+extern void $1_free($1_t *obj);
+
+#endif /* __$1_H_ */]
 ])
 divert[]dnl
--- a/tools/mb_c_source.m4	Wed Aug 13 02:17:19 2008 +0800
+++ b/tools/mb_c_source.m4	Wed Aug 13 08:05:50 2008 +0800
@@ -114,6 +114,49 @@
 SIMPORT([STROKE_SHAPE_WITH_PAINT])
 divert[]])
 
+define([F_ADD_LINEAR_PAINT],[[
+    stops = paint_linear_stops(obj->$1, 0, NULL);
+    free(stops);
+    obj->$1->free(obj->$1);
+]])
+
+define([F_ADD_RADIAL_PAINT],[[
+    stops = paint_radial_stops(obj->$1, 0, NULL);
+    free(stops);
+    obj->$1->free(obj->$1);
+]])
+
+define([F_ADD_PATH],[[
+    sh_path_free(obj->$1);
+]]);
+
+define([F_ADD_RECT],[[
+    sh_rect_free(obj->$1);
+]]);
+
+define([F_FILL_SHAPE],[[
+    obj->$1->free(obj->$1);
+]])
+
+define([F_STROKE_SHAPE],[[
+    obj->$1->free(obj->$1);
+]])
+
+define([CLEAR_VARS],[divert([-1])
+define([FIMPORT],[IMPORT(]QUOTE($[]1)[,[F_])])
+FIMPORT([ADD_LINEAR_PAINT])
+FIMPORT([ADD_RADIAL_PAINT])
+define([COLOR_STOP])
+define([REF_STOPS])
+FIMPORT([ADD_PATH],)
+FIMPORT([ADD_RECT])
+define([ADD_COORD])
+FIMPORT([FILL_SHAPE])
+FIMPORT([STROKE_SHAPE])
+define([FILL_SHAPE_WITH_PAINT])
+define([STROKE_SHAPE_WITH_PAINT])
+divert[]])
+
 define([MADBUTTERFLY],[dnl
 [#include <stdio.h>
 #include "mb_types.h"
@@ -133,6 +176,13 @@
     obj->root_coord = rdman->root_coord;
 $2
 [    return obj;
-}]
+}
+
+void $1_free($1_t *obj) {
+    grad_stop_t *stops;
+]CLEAR_VARS[]$2[
+    free(obj);
+}
+]dnl
 ])
 divert[]dnl