From 82dd71c80368546aed2fe81c0736aee6cea305eb Mon Sep 17 00:00:00 2001 From: Lu Wang Date: Fri, 7 Sep 2012 07:55:10 +0800 Subject: [PATCH] slightly better memory management --- src/HTMLRenderer/general.cc | 1 + src/ff/ff.c | 27 +++++++++++++++++++++++++++ src/ff/ff.h | 1 + 3 files changed, 29 insertions(+) diff --git a/src/HTMLRenderer/general.cc b/src/HTMLRenderer/general.cc index 692d0dc..9c293e0 100644 --- a/src/HTMLRenderer/general.cc +++ b/src/HTMLRenderer/general.cc @@ -44,6 +44,7 @@ HTMLRenderer::HTMLRenderer(const Param * param) HTMLRenderer::~HTMLRenderer() { + ff_fin(); clean_tmp_files(); delete [] cur_mapping; delete [] cur_mapping2; diff --git a/src/ff/ff.c b/src/ff/ff.c index 9e35ef1..44b4211 100644 --- a/src/ff/ff.c +++ b/src/ff/ff.c @@ -21,6 +21,7 @@ static FontViewBase * cur_fv = NULL; static Encoding * original_enc = NULL; +static Encoding * enc_head = NULL; static void err(const char * format, ...) { @@ -65,6 +66,26 @@ void ff_init(void) original_enc = FindOrMakeEncoding("original"); } + +void ff_fin(void) +{ + while(enc_head) + { + Encoding * next = enc_head->next; + free(enc_head->enc_name); + free(enc_head->unicode); + if(enc_head->psnames) + { + int i; + for(i = 0; i < enc_head->char_cnt; ++i) + free(enc_head->psnames[i]); + free(enc_head->psnames); + } + free(enc_head); + enc_head = next; + } +} + void ff_load_font(const char * filename) { char * _filename = strcopy(filename); @@ -125,6 +146,9 @@ void ff_reencode_raw(int32 * mapping, int mapping_len, int force) memcpy(enc->unicode, mapping, mapping_len * sizeof(int32_t)); enc->enc_name = strcopy(""); + enc->next = enc_head; + enc_head = enc; + ff_do_reencode(enc, force); } @@ -149,6 +173,9 @@ void ff_reencode_raw2(char ** mapping, int mapping_len, int force) } } + enc->next = enc_head; + enc_head = enc; + ff_do_reencode(enc, force); } diff --git a/src/ff/ff.h b/src/ff/ff.h index eac0130..df8eb33 100644 --- a/src/ff/ff.h +++ b/src/ff/ff.h @@ -19,6 +19,7 @@ extern "C" { #endif void ff_init(void); +void ff_fin(void); void ff_load_font(const char * filename); void ff_reencode_glyph_order(void); void ff_reencode_raw(int32_t * mapping, int mapping_len, int force);