X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flibpspp%2Fsparse-xarray.c;h=5168d87922f46fb62b317b89172f4d6831f9acc8;hb=e314315b24e8f4356c1e72a61bef6633f8992bf4;hp=12509fdff529cc0600318f4d1048342374140516;hpb=52852e8feec36031e33665b3bf011e7e54f62783;p=pspp diff --git a/src/libpspp/sparse-xarray.c b/src/libpspp/sparse-xarray.c index 12509fdff5..5168d87922 100644 --- a/src/libpspp/sparse-xarray.c +++ b/src/libpspp/sparse-xarray.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2007, 2009, 2010, 2011 Free Software Foundation, Inc. + Copyright (C) 2007, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -105,8 +105,7 @@ sparse_xarray_clone (const struct sparse_xarray *old) new->disk = ext_array_create (); new->disk_rows = range_set_clone (old->disk_rows, NULL); - for (node = range_set_first (old->disk_rows); node != NULL; - node = range_set_next (old->disk_rows, node)) + RANGE_SET_FOR_EACH (node, old->disk_rows) { unsigned long int start = range_set_node_get_start (node); unsigned long int end = range_set_node_get_end (node); @@ -135,6 +134,21 @@ sparse_xarray_clone (const struct sparse_xarray *old) return new; } +static void +free_memory_rows (struct sparse_xarray *sx) +{ + if (sx->memory != NULL) + { + unsigned long int idx; + uint8_t **row; + for (row = sparse_array_first (sx->memory, &idx); row != NULL; + row = sparse_array_next (sx->memory, idx, &idx)) + free (*row); + sparse_array_destroy (sx->memory); + sx->memory = NULL; + } +} + /* Destroys sparse array of rows SX. */ void sparse_xarray_destroy (struct sparse_xarray *sx) @@ -142,15 +156,7 @@ sparse_xarray_destroy (struct sparse_xarray *sx) if (sx != NULL) { free (sx->default_row); - if (sx->memory != NULL) - { - unsigned long int idx; - uint8_t **row; - for (row = sparse_array_first (sx->memory, &idx); row != NULL; - row = sparse_array_next (sx->memory, idx, &idx)) - free (*row); - sparse_array_destroy (sx->memory); - } + free_memory_rows (sx); ext_array_destroy (sx->disk); range_set_destroy (sx->disk_rows); free (sx); @@ -209,8 +215,7 @@ dump_sparse_xarray_to_disk (struct sparse_xarray *sx) } range_set_set1 (sx->disk_rows, idx, 1); } - sparse_array_destroy (sx->memory); - sx->memory = NULL; + free_memory_rows (sx); return true; } @@ -336,8 +341,7 @@ sparse_xarray_write_columns (struct sparse_xarray *sx, size_t start, { const struct range_set_node *node; - for (node = range_set_first (sx->disk_rows); node != NULL; - node = range_set_next (sx->disk_rows, node)) + RANGE_SET_FOR_EACH (node, sx->disk_rows) { unsigned long int start_row = range_set_node_get_start (node); unsigned long int end_row = range_set_node_get_end (node); @@ -446,8 +450,7 @@ sparse_xarray_copy (const struct sparse_xarray *sx, struct sparse_xarray *dx, const struct range_set_node *node; void *tmp = xmalloc (sx->n_bytes); - for (node = range_set_first (sx->disk_rows); node != NULL; - node = range_set_next (sx->disk_rows, node)) + RANGE_SET_FOR_EACH (node, sx->disk_rows) { unsigned long int start = range_set_node_get_start (node); unsigned long int end = range_set_node_get_end (node); @@ -587,8 +590,7 @@ sparse_xarray_model_checker_hash (const struct sparse_xarray *sx, void *tmp = xmalloc (sx->n_bytes); md4_process_bytes ("d", 1, &ctx); - for (node = range_set_first (sx->disk_rows); node != NULL; - node = range_set_next (sx->disk_rows, node)) + RANGE_SET_FOR_EACH (node, sx->disk_rows) { unsigned long int start = range_set_node_get_start (node); unsigned long int end = range_set_node_get_end (node);