60#include <grass/glocale.h>
61#include <grass/ogsf.h>
67static int init_gsds(
void);
68static int check_numsets(
void);
69static dataset *get_dataset(
int);
70static int get_type(dataset *);
72static dataset *Data[
MAX_DS];
75static int Numsets = 0;
77static int Cur_id =
LUCKY;
79static size_t Tot_mem = 0;
84static int init_gsds(
void)
88 for (i = 0; i <
MAX_DS; i++) {
103static int check_numsets(
void)
105 if (Numsets < Cur_max) {
123static dataset *get_dataset(
int id)
127 for (i = 0; i < Numsets; i++) {
128 if (Data[i]->data_id ==
id) {
144static int get_type(dataset *ds)
147 if (ds->databuff.bm) {
151 if (ds->databuff.cb) {
155 if (ds->databuff.sb) {
159 if (ds->databuff.ib) {
163 if (ds->databuff.fb) {
193 start = begin ? 0 : i + 1;
195 for (i = start; i < Numsets; i++) {
196 if (!strcmp(Data[i]->unique_name,
name)) {
197 if ((Data[i]->changed & *changes) || !(Data[i]->changed)) {
198 if (get_type(Data[i]) & *types) {
199 *changes = Data[i]->changed;
200 *types = get_type(Data[i]);
202 return (Data[i]->data_id);
222 static int first = 1;
226 if (0 > init_gsds()) {
232 else if (0 > check_numsets()) {
244 new->data_id = Cur_id++;
246 for (i = 0; i < MAXDIMS; i++) {
251 new->databuff.fb =
NULL;
252 new->databuff.ib =
NULL;
253 new->databuff.sb =
NULL;
254 new->databuff.cb =
NULL;
255 new->databuff.bm =
NULL;
256 new->databuff.nm =
NULL;
257 new->databuff.k = 0.0;
260 new->need_reload = 1;
262 return (new->data_id);
285 if ((ds = get_dataset(
id))) {
286 ds->changed = ds->changed | change_flag;
289 return (&(ds->databuff));
307 static char retstr[GPATH_MAX];
309 for (i = 0; i < Numsets; i++) {
310 if (Data[i]->data_id ==
id) {
312 strcpy(retstr, fds->unique_name);
336 for (i = 0; i < Numsets; i++) {
337 if (Data[i]->data_id ==
id) {
341 G_free((
void *)fds->unique_name);
342 fds->unique_name =
NULL;
345 for (j = i; j < (Numsets - 1); j++) {
346 Data[j] = Data[j + 1];
374 for (i = 0; i < Numsets; i++) {
375 if (Data[i]->data_id ==
id) {
396 size_t siz, nsiz = 1, freed = 0;
398 for (i = 0; i < ds->ndims; i++) {
402 if (typ & ATTY_NULL) {
403 if (ds->databuff.nm) {
406 ds->databuff.nm =
NULL;
411 if (typ & ATTY_MASK) {
412 if (ds->databuff.bm) {
415 ds->databuff.bm =
NULL;
420 if (typ & ATTY_CHAR) {
421 if (ds->databuff.cb) {
422 siz = nsiz *
sizeof(char);
423 free(ds->databuff.cb);
424 ds->databuff.cb =
NULL;
429 if (typ & ATTY_SHORT) {
430 if (ds->databuff.sb) {
431 siz = nsiz *
sizeof(short);
432 free(ds->databuff.sb);
433 ds->databuff.sb =
NULL;
438 if (typ & ATTY_INT) {
439 if (ds->databuff.ib) {
440 siz = nsiz *
sizeof(int);
441 free(ds->databuff.ib);
442 ds->databuff.ib =
NULL;
447 if (typ & ATTY_FLOAT) {
448 if (ds->databuff.fb) {
449 siz = nsiz *
sizeof(float);
450 free(ds->databuff.fb);
451 ds->databuff.fb =
NULL;
457 ds->numbytes -= freed;
460 G_debug(5,
"free_data_buffs(): freed data from id no. %d", ds->data_id);
461 G_debug(5,
"free_data_buffs(): %.3f Kbytes freed, current total = %.3f",
462 freed / 1000., Tot_mem / 1000.);
486 if ((ds = get_dataset(
id))) {
494 for (i = 0; i < ndims; i++) {
495 ds->dims[i] = dims[i];
506 if (
NULL == (ds->databuff.nm =
BM_create(dims[1], dims[0]))) {
520 if (
NULL == (ds->databuff.bm =
BM_create(dims[1], dims[0]))) {
533 (ds->databuff.cb = (
unsigned char *)G_malloc(siz))) {
544 siz *=
sizeof(short);
547 if (
NULL == (ds->databuff.sb = (
short *)G_malloc(siz))) {
561 if (
NULL == (ds->databuff.ib = (
int *)G_malloc(siz))) {
572 siz *=
sizeof(float);
575 if (
NULL == (ds->databuff.fb = (
float *)G_malloc(siz))) {
596 "gsds_alloc_typbuff(): %f Kbytes allocated, current total = %f",
597 siz / 1000., Tot_mem / 1000.);
617 if ((ds = get_dataset(
id))) {
618 return ((
int)ds->changed);
637 if ((ds = get_dataset(
id))) {
638 ds->changed = reason;
655 ds = get_dataset(
id);
657 return (get_type(ds));
void G_free(void *buf)
Free allocated memory.
struct BM * BM_create(int x, int y)
Create bitmap of dimension x/y and return structure token.
size_t BM_get_map_size(struct BM *map)
Returns size in bytes that bitmap is taking up.
int BM_destroy(struct BM *map)
Destroy bitmap and free all associated memory.
int G_debug(int level, const char *msg,...)
Print debugging message.
void G_fatal_error(const char *msg,...)
Print a fatal error message to stderr.
char * gsds_get_name(int id)
Get name.
int gsds_get_type(int id)
ADD.
int gsds_newh(const char *name)
Get handle to gsds.
int gsds_findh(const char *name, IFLAG *changes, IFLAG *types, int begin)
Get handle to gsds.
typbuff * gsds_get_typbuff(int id, IFLAG change_flag)
Get data buffer.
size_t free_data_buffs(dataset *ds, int typ)
Free data buffer.
int gsds_set_changed(int id, IFLAG reason)
ADD.
int gsds_free_datah(int id)
Free allocated dataset.
size_t gsds_alloc_typbuff(int id, int *dims, int ndims, int type)
Allocates correct buffer according to type, keeps track of total mem.
int gsds_free_data_buff(int id, int typ)
Free allocated buffer.
int gsds_get_changed(int id)
ADD.
char * G_store(const char *s)
Copy string to allocated memory.