/* PSPP - a program for statistical analysis.
- Copyright (C) 2007, 2009, 2010 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
#include <config.h>
-#include <libpspp/sparse-xarray.h>
+#include "libpspp/sparse-xarray.h"
#include <limits.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
-#include <libpspp/assertion.h>
-#include <libpspp/ext-array.h>
-#include <libpspp/misc.h>
-#include <libpspp/range-set.h>
-#include <libpspp/sparse-array.h>
+#include "libpspp/assertion.h"
+#include "libpspp/ext-array.h"
+#include "libpspp/misc.h"
+#include "libpspp/range-set.h"
+#include "libpspp/sparse-array.h"
-#include "md4.h"
-#include "minmax.h"
-#include "xalloc.h"
+#include "gl/md4.h"
+#include "gl/minmax.h"
+#include "gl/xalloc.h"
/* A sparse array of arrays of bytes. */
struct sparse_xarray
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);
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)
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);
sx->disk_rows = NULL;
return false;
}
- range_set_insert (sx->disk_rows, idx, 1);
+ range_set_set1 (sx->disk_rows, idx, 1);
}
- sparse_array_destroy (sx->memory);
- sx->memory = NULL;
+ free_memory_rows (sx);
return true;
}
return ext_array_write (sx->disk, ofs + start, n, data);
else
{
- range_set_insert (sx->disk_rows, row, 1);
+ range_set_set1 (sx->disk_rows, row, 1);
return (ext_array_write (sx->disk, ofs, start, sx->default_row)
&& ext_array_write (sx->disk, ofs + start, n, data)
&& ext_array_write (sx->disk, ofs + start + n,
{
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);
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);
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);