projects
/
pspp
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
acb9e3d
)
Fewer memory leaks
author
John Darrington
<john@darrington.wattle.id.au>
Thu, 7 Mar 2013 13:48:39 +0000
(14:48 +0100)
committer
John Darrington
<john@darrington.wattle.id.au>
Thu, 7 Mar 2013 13:48:39 +0000
(14:48 +0100)
src/data/gnumeric-reader.c
patch
|
blob
|
history
src/data/gnumeric-reader.h
patch
|
blob
|
history
src/data/ods-reader.c
patch
|
blob
|
history
src/data/ods-reader.h
patch
|
blob
|
history
src/data/spreadsheet-reader.c
patch
|
blob
|
history
src/data/spreadsheet-reader.h
patch
|
blob
|
history
src/language/data-io/get-data.c
patch
|
blob
|
history
src/libpspp/zip-reader.c
patch
|
blob
|
history
diff --git
a/src/data/gnumeric-reader.c
b/src/data/gnumeric-reader.c
index 578ff8ab4b69a67764653df5eff52154a46a6abe..cda95e5378e5d435c524aa50086fc3e77e0c87da 100644
(file)
--- a/
src/data/gnumeric-reader.c
+++ b/
src/data/gnumeric-reader.c
@@
-63,6
+63,7
@@
static void gnm_file_casereader_destroy (struct casereader *, void *);
static struct ccase *gnm_file_casereader_read (struct casereader *, void *);
static struct ccase *gnm_file_casereader_read (struct casereader *, void *);
+
static const struct casereader_class gnm_file_casereader_class =
{
gnm_file_casereader_read,
static const struct casereader_class gnm_file_casereader_class =
{
gnm_file_casereader_read,
@@
-133,6
+134,23
@@
struct gnumeric_reader
};
};
+void
+gnumeric_destroy (struct spreadsheet *s)
+{
+ struct gnumeric_reader *r = s;
+ int i;
+
+ for (i = 0; i < s->n_sheets; ++i)
+ {
+ xmlFree (r->sheets[i].name);
+ }
+
+ free (r->sheets);
+
+ free (r);
+}
+
+
const char *
gnumeric_get_sheet_name (struct spreadsheet *s, int n)
{
const char *
gnumeric_get_sheet_name (struct spreadsheet *s, int n)
{
@@
-175,7
+193,6
@@
gnumeric_get_sheet_range (struct spreadsheet *s, int n)
static void
gnm_file_casereader_destroy (struct casereader *reader UNUSED, void *r_)
{
static void
gnm_file_casereader_destroy (struct casereader *reader UNUSED, void *r_)
{
- int i;
struct gnumeric_reader *r = r_;
if ( r == NULL)
return ;
struct gnumeric_reader *r = r_;
if ( r == NULL)
return ;
@@
-188,18
+205,9
@@
gnm_file_casereader_destroy (struct casereader *reader UNUSED, void *r_)
case_unref (r->first_case);
caseproto_unref (r->proto);
case_unref (r->first_case);
caseproto_unref (r->proto);
-
- for (i = 0; i < r->spreadsheet.n_sheets; ++i)
- {
- xmlFree (r->sheets[i].name);
- }
-
- free (r->sheets);
-
-
- free (r);
}
}
+
static void
process_node (struct gnumeric_reader *r)
{
static void
process_node (struct gnumeric_reader *r)
{
@@
-424,13
+432,6
@@
struct var_spec
};
};
-void
-gnumeric_destroy (struct spreadsheet *s)
-{
- gnm_file_casereader_destroy (NULL, s);
-}
-
-
static void
gnumeric_error_handler (void *ctx, const char *mesg,
UNUSED xmlParserSeverities sev, xmlTextReaderLocatorPtr loc)
static void
gnumeric_error_handler (void *ctx, const char *mesg,
UNUSED xmlParserSeverities sev, xmlTextReaderLocatorPtr loc)
diff --git
a/src/data/gnumeric-reader.h
b/src/data/gnumeric-reader.h
index e0a5f5cad03fab20c3f977505b09a0ce1ab8349d..1f5a32e3a48b7cd519d41b143015d70ce8c671ea 100644
(file)
--- a/
src/data/gnumeric-reader.h
+++ b/
src/data/gnumeric-reader.h
@@
-29,10
+29,10
@@
struct spreadsheet *gnumeric_probe (const char *filename, bool report_errors);
const char * gnumeric_get_sheet_name (struct spreadsheet *s, int n);
char * gnumeric_get_sheet_range (struct spreadsheet *s, int n);
const char * gnumeric_get_sheet_name (struct spreadsheet *s, int n);
char * gnumeric_get_sheet_range (struct spreadsheet *s, int n);
-void gnumeric_destroy (struct spreadsheet *);
-
struct casereader * gnumeric_make_reader (struct spreadsheet *spreadsheet,
const struct spreadsheet_read_options *opts);
struct casereader * gnumeric_make_reader (struct spreadsheet *spreadsheet,
const struct spreadsheet_read_options *opts);
+void gnumeric_destroy (struct spreadsheet *r);
+
#endif
#endif
diff --git
a/src/data/ods-reader.c
b/src/data/ods-reader.c
index 5f5c0eed9374573c04733463550d5a30d10d8822..a36a020a0b063eb4b31ab84c94838ec071240b5c 100644
(file)
--- a/
src/data/ods-reader.c
+++ b/
src/data/ods-reader.c
@@
-67,14
+67,15
@@
ods_open_reader (const struct spreadsheet_read_options *opts,
#include "gl/xalloc.h"
static void ods_file_casereader_destroy (struct casereader *, void *);
#include "gl/xalloc.h"
static void ods_file_casereader_destroy (struct casereader *, void *);
-
static struct ccase *ods_file_casereader_read (struct casereader *, void *);
static struct ccase *ods_file_casereader_read (struct casereader *, void *);
+static struct casereader *ods_file_casereader_clone (struct casereader *, void *);
+
static const struct casereader_class ods_file_casereader_class =
{
ods_file_casereader_read,
ods_file_casereader_destroy,
static const struct casereader_class ods_file_casereader_class =
{
ods_file_casereader_read,
ods_file_casereader_destroy,
-
NULL
,
+
ods_file_casereader_clone
,
NULL,
};
NULL,
};
@@
-105,6
+106,7
@@
struct ods_reader
struct spreadsheet spreadsheet;
struct zip_reader *zreader;
xmlTextReaderPtr xtr;
struct spreadsheet spreadsheet;
struct zip_reader *zreader;
xmlTextReaderPtr xtr;
+ int ref_cnt;
enum reader_state state;
int row;
enum reader_state state;
int row;
@@
-113,7
+115,7
@@
struct ods_reader
int current_sheet;
xmlChar *current_sheet_name;
int current_sheet;
xmlChar *current_sheet_name;
-
const
xmlChar *target_sheet_name;
+ xmlChar *target_sheet_name;
int target_sheet_index;
int target_sheet_index;
@@
-136,6
+138,26
@@
struct ods_reader
struct string ods_errs;
};
struct string ods_errs;
};
+void
+ods_destroy (struct spreadsheet *s)
+{
+ struct ods_reader *r = s;
+ if (--r->ref_cnt == 0)
+ {
+ int i;
+
+ for (i = 0; i < r->n_allocated_sheets; ++i)
+ {
+ xmlFree (r->sheets[i].name);
+ }
+
+ zip_reader_destroy (r->zreader);
+ free (r->sheets);
+ free (r);
+ }
+}
+
+
static bool
reading_target_sheet (const struct ods_reader *r)
static bool
reading_target_sheet (const struct ods_reader *r)
@@
-206,10
+228,19
@@
ods_get_sheet_range (struct spreadsheet *s, int n)
}
}
+static struct casereader *
+ods_file_casereader_clone (struct casereader *r_, void *s)
+{
+ struct ods_reader *r = r_;
+
+ printf ("%s:%d CLONE reffing %p %d\n", __FILE__, __LINE__, s, r->ref_cnt);
+
+ return r_;
+}
+
static void
ods_file_casereader_destroy (struct casereader *reader UNUSED, void *r_)
{
static void
ods_file_casereader_destroy (struct casereader *reader UNUSED, void *r_)
{
- int i;
struct ods_reader *r = r_;
if ( r == NULL)
return ;
struct ods_reader *r = r_;
if ( r == NULL)
return ;
@@
-229,16
+260,14
@@
ods_file_casereader_destroy (struct casereader *reader UNUSED, void *r_)
caseproto_unref (r->proto);
xmlFree (r->current_sheet_name);
caseproto_unref (r->proto);
xmlFree (r->current_sheet_name);
+ xmlFree (r->target_sheet_name);
+
+ ods_destroy (r);
+}
+
- for (i = 0; i < r->n_allocated_sheets; ++i)
- {
- xmlFree (r->sheets[i].name);
- }
- free (r->sheets);
- free (r);
-}
static void
process_node (struct ods_reader *r)
static void
process_node (struct ods_reader *r)
@@
-483,7
+512,7
@@
get_sheet_count (struct zip_reader *zreader)
return -1;
mxtr = xmlReaderForIO ((xmlInputReadCallback) zip_member_read,
return -1;
mxtr = xmlReaderForIO ((xmlInputReadCallback) zip_member_read,
- (xmlInputCloseCallback)
zip_member_finish
,
+ (xmlInputCloseCallback)
NULL
,
meta, NULL, NULL, 0);
while (1 == xmlTextReaderRead (mxtr))
meta, NULL, NULL, 0);
while (1 == xmlTextReaderRead (mxtr))
@@
-533,11
+562,10
@@
init_reader (struct ods_reader *r, bool report_errors)
if ( content == NULL)
return false;
if ( content == NULL)
return false;
- zip_member_ref (content);
-
if (r->xtr)
xmlFreeTextReader (r->xtr);
if (r->xtr)
xmlFreeTextReader (r->xtr);
+ zip_member_ref (content);
xtr = xmlReaderForIO ((xmlInputReadCallback) zip_member_read,
(xmlInputCloseCallback) zip_member_finish,
content, NULL, NULL,
xtr = xmlReaderForIO ((xmlInputReadCallback) zip_member_read,
(xmlInputCloseCallback) zip_member_finish,
content, NULL, NULL,
@@
-582,6
+610,7
@@
ods_probe (const char *filename, bool report_errors)
r = xzalloc (sizeof *r);
r->zreader = zr;
r = xzalloc (sizeof *r);
r->zreader = zr;
+ r->ref_cnt = 1;
if (! init_reader (r, report_errors))
{
if (! init_reader (r, report_errors))
{
@@
-622,12
+651,12
@@
ods_make_reader (struct spreadsheet *spreadsheet,
assert (r);
r->read_names = opts->read_names;
ds_init_empty (&r->ods_errs);
assert (r);
r->read_names = opts->read_names;
ds_init_empty (&r->ods_errs);
-
+ ++r->ref_cnt;
if ( !init_reader (r, true))
goto error;
if ( !init_reader (r, true))
goto error;
- if (
opts->cell_range
)
+ if (
opts->cell_range
)
{
if ( ! convert_cell_ref (opts->cell_range,
&r->start_col, &r->start_row,
{
if ( ! convert_cell_ref (opts->cell_range,
&r->start_col, &r->start_row,
@@
-647,7
+676,7
@@
ods_make_reader (struct spreadsheet *spreadsheet,
}
r->state = STATE_INIT;
}
r->state = STATE_INIT;
- r->target_sheet_name =
BAD_CAST opts->sheet_name
;
+ r->target_sheet_name =
xmlStrdup (BAD_CAST opts->sheet_name)
;
r->target_sheet_index = opts->sheet_index;
r->row = r->col = 0;
r->target_sheet_index = opts->sheet_index;
r->row = r->col = 0;
@@
-825,7
+854,6
@@
ods_make_reader (struct spreadsheet *spreadsheet,
break;
}
break;
}
- // zip_reader_destroy (zreader);
for ( i = 0 ; i < n_var_specs ; ++i )
{
for ( i = 0 ; i < n_var_specs ; ++i )
{
@@
-846,8
+874,7
@@
ods_make_reader (struct spreadsheet *spreadsheet,
error:
error:
- //zip_reader_destroy (zreader);
-
+#if 0
for ( i = 0 ; i < n_var_specs ; ++i )
{
free (var_spec[i].firstval.type);
for ( i = 0 ; i < n_var_specs ; ++i )
{
free (var_spec[i].firstval.type);
@@
-860,6
+887,7
@@
ods_make_reader (struct spreadsheet *spreadsheet,
dict_destroy (r->spreadsheet.dict);
r->spreadsheet.dict = NULL;
dict_destroy (r->spreadsheet.dict);
r->spreadsheet.dict = NULL;
+#endif
ods_file_casereader_destroy (NULL, r);
ods_file_casereader_destroy (NULL, r);
diff --git
a/src/data/ods-reader.h
b/src/data/ods-reader.h
index 3d939a80486e6948bdfbe7b20807de4b37a77b76..4acda231da0c0c51f542d21e1345ec6c556c21f4 100644
(file)
--- a/
src/data/ods-reader.h
+++ b/
src/data/ods-reader.h
@@
-31,5
+31,7
@@
struct spreadsheet *ods_probe (const char *filename, bool report_errors);
struct casereader * ods_make_reader (struct spreadsheet *spreadsheet,
const struct spreadsheet_read_options *opts);
struct casereader * ods_make_reader (struct spreadsheet *spreadsheet,
const struct spreadsheet_read_options *opts);
+void ods_destroy (struct spreadsheet *s);
+
#endif
#endif
diff --git
a/src/data/spreadsheet-reader.c
b/src/data/spreadsheet-reader.c
index 4a85cb22ddbc05597e1e456bac10ef7b4dc372ac..fc1dfa8dd5dde8d4b980ef784bf2ebc2f507f023 100644
(file)
--- a/
src/data/spreadsheet-reader.c
+++ b/
src/data/spreadsheet-reader.c
@@
-18,6
+18,7
@@
#include "spreadsheet-reader.h"
#include "spreadsheet-reader.h"
+#include <libpspp/assertion.h>
#include "gnumeric-reader.h"
#include "ods-reader.h"
#include "gnumeric-reader.h"
#include "ods-reader.h"
@@
-28,9
+29,22
@@
#include <gl/c-xvasprintf.h>
#include <stdlib.h>
#include <gl/c-xvasprintf.h>
#include <stdlib.h>
+
void
void
-spreadsheet_
close (UNUSED struct spreadsheet *spreadsheet
)
+spreadsheet_
destroy (struct spreadsheet *s
)
{
{
+ switch (s->type)
+ {
+ case SPREADSHEET_ODS:
+ ods_destroy (s);
+ break;
+ case SPREADSHEET_GNUMERIC:
+ gnumeric_destroy (s);
+ break;
+ default:
+ NOT_REACHED ();
+ break;
+ }
}
}
diff --git
a/src/data/spreadsheet-reader.h
b/src/data/spreadsheet-reader.h
index 960d076b38bdb42d060240c667459650c0fddd97..9a46b35e9eb6a255e78403e9cfa242f6c133a754 100644
(file)
--- a/
src/data/spreadsheet-reader.h
+++ b/
src/data/spreadsheet-reader.h
@@
-79,7
+79,7
@@
char * spreadsheet_get_sheet_range (struct spreadsheet *s, int n);
char *create_cell_ref (int col0, int row0, int coli, int rowi);
char *create_cell_ref (int col0, int row0, int coli, int rowi);
-void spreadsheet_
close
(struct spreadsheet *);
+void spreadsheet_
destroy
(struct spreadsheet *);
diff --git
a/src/language/data-io/get-data.c
b/src/language/data-io/get-data.c
index 70f6c89cbc13df4f24f2c0fb85b64be1cdeab361..daec18f41da340c9d0e5b9c882eae4e3c2fbc53d 100644
(file)
--- a/
src/language/data-io/get-data.c
+++ b/
src/language/data-io/get-data.c
@@
-62,7
+62,7
@@
cmd_get_data (struct lexer *lexer, struct dataset *ds)
lex_force_match (lexer, T_SLASH);
if (!lex_force_match_id (lexer, "TYPE"))
lex_force_match (lexer, T_SLASH);
if (!lex_force_match_id (lexer, "TYPE"))
-
return CMD_FAILURE
;
+
goto error
;
lex_force_match (lexer, T_EQUALS);
lex_force_match (lexer, T_EQUALS);
@@
-102,6
+102,7
@@
cmd_get_data (struct lexer *lexer, struct dataset *ds)
goto error;
reader = ods_make_reader (spreadsheet, &opts);
dict = spreadsheet->dict;
goto error;
reader = ods_make_reader (spreadsheet, &opts);
dict = spreadsheet->dict;
+ ods_destroy (spreadsheet);
}
free (filename);
}
free (filename);
@@
-111,6
+112,7
@@
cmd_get_data (struct lexer *lexer, struct dataset *ds)
dataset_set_dict (ds, dict);
dataset_set_source (ds, reader);
free (tok);
dataset_set_dict (ds, dict);
dataset_set_source (ds, reader);
free (tok);
+ destroy_spreadsheet_read_info (&opts);
return CMD_SUCCESS;
}
}
return CMD_SUCCESS;
}
}
@@
-118,8
+120,6
@@
cmd_get_data (struct lexer *lexer, struct dataset *ds)
msg (SE, _("Unsupported TYPE %s."), tok);
msg (SE, _("Unsupported TYPE %s."), tok);
-
-
error:
destroy_spreadsheet_read_info (&opts);
free (tok);
error:
destroy_spreadsheet_read_info (&opts);
free (tok);
diff --git
a/src/libpspp/zip-reader.c
b/src/libpspp/zip-reader.c
index 985b0a9027723180f6362d430ad66e9b8f49c045..a36bd6f25f24d3db7176f403bbea9337017740b1 100644
(file)
--- a/
src/libpspp/zip-reader.c
+++ b/
src/libpspp/zip-reader.c
@@
-126,7
+126,9
@@
zip_reader_destroy (struct zip_reader *zr)
if (zr == NULL)
return;
if (zr == NULL)
return;
- fclose (zr->fr);
+ if (zr->fr != NULL)
+ fclose (zr->fr);
+
free (zr->filename);
for (i = 0; i < zr->n_members; ++i)
free (zr->filename);
for (i = 0; i < zr->n_members; ++i)