/* init.C */
#include "../ZV.h"
/*--------------------------------------------------------------------*/
/*
---------------------------------------------
simplest initialization method
data is cleared
if entries != NULL
the object does not own the entries,
it just points to the entries base address
else if size > 0
the object will own the entries,
it allocates a vector of 2*size doubles's.
else
nothing happens
endif
created -- 98jan22, cca
---------------------------------------------
*/
void
ZV_init (
ZV *zv,
int size,
double *entries
) {
if ( zv == NULL || size < 0 ) {
fprintf(stderr, "\n fatal error in ZV_init(%p,%d,%p)"
"\n bad input\n", zv, size, entries) ;
exit(-1) ;
}
/*
--------------
clear any data
--------------
*/
ZV_clearData(zv) ;
/*
-----------------------------
set the size and maximum size
-----------------------------
*/
zv->maxsize = zv->size = size ;
/*
-------------------------
set vector and owner flag
-------------------------
*/
if ( entries != NULL ) {
zv->owned = 0 ;
zv->vec = entries ;
} else if ( size > 0 ) {
zv->owned = 1 ;
zv->vec = DVinit(2*size, 0.0) ;
}
return ; }
/*--------------------------------------------------------------------*/
/*
-------------------------
basic initializion method
created -- 98jan22, cca
-------------------------
*/
void
ZV_init1 (
ZV *zv,
int size
) {
ZV_init(zv, size, NULL) ;
return ; }
/*--------------------------------------------------------------------*/
/*
-------------------------
total initializion method
created -- 98jan22, cca
-------------------------
*/
void
ZV_init2 (
ZV *zv,
int size,
int maxsize,
int owned,
double *vec
) {
/*
---------------
check the input
---------------
*/
if ( zv == NULL ) {
fprintf(stderr, "\n fatal error in ZV_init2(%p,%d,%d,%d,%p)"
"\n bad input\n", zv, size, maxsize, owned, vec) ;
exit(-1) ;
}
if ( size < 0 || maxsize < size ) {
fprintf(stderr, "\n fatal error in ZV_init2(%p,%d,%d,%d,%p)"
"\n size = %d, maxsize = %d \n",
zv, size, maxsize, owned, vec, size, maxsize) ;
exit(-1) ;
}
if ( owned < 0 || 1 < owned ) {
fprintf(stderr, "\n fatal error in ZV_init2(%p,%d,%d,%d,%p)"
"\n owned = %d\n", zv, size, maxsize, owned, vec, owned) ;
exit(-1) ;
}
if ( owned == 1 && vec == NULL ) {
fprintf(stderr, "\n fatal error in ZV_init2(%p,%d,%d,%d,%p)"
"\n owned = %d and vec = %p",
zv, size, maxsize, owned, vec, owned, vec) ;
exit(-1) ;
}
/*
--------------
clear any data
--------------
*/
ZV_clearData(zv) ;
if ( vec == NULL ) {
/*
----------------------------------------------
no entries input, use the simplest initializer
----------------------------------------------
*/
ZV_init(zv, size, NULL) ;
} else {
/*
---------------------------------
entries are input, set the fields
---------------------------------
*/
zv->size = size ;
zv->maxsize = maxsize ;
zv->owned = owned ;
zv->vec = vec ;
}
return ; }
/*--------------------------------------------------------------------*/
/*
----------------------------------
set the maximum size of the vector
created -- 98jan22, cca
----------------------------------
*/
void
ZV_setMaxsize (
ZV *zv,
int newmaxsize
) {
/*
---------------
check the input
---------------
*/
if ( zv == NULL || newmaxsize < 0 ) {
fprintf(stderr, "\n fatal error in ZV_setMaxsize(%p,%d)"
"\n bad input\n", zv, newmaxsize) ;
exit(-1) ;
}
if ( zv->maxsize > 0 && zv->owned == 0 ) {
fprintf(stderr, "\n fatal error in ZV_setMaxsize(%p,%d)"
"\n zv->maxsize = %d, zv->owned = %d\n",
zv, newmaxsize, zv->maxsize, zv->owned) ;
exit(-1) ;
}
if ( zv->maxsize != newmaxsize ) {
/*
-----------------------------------
allocate new storage for the vector
-----------------------------------
*/
double *vec = DVinit(2*newmaxsize, 0.0) ;
if ( zv->size > 0 ) {
/*
---------------------------------
copy old entries into new entries
---------------------------------
*/
if ( zv->vec == NULL ) {
fprintf(stderr, "\n fatal error in ZV_setMaxsize(%p,%d)"
"\n zv->size = %d, zv->vec is NULL\n",
zv, newmaxsize, zv->size) ;
exit(-1) ;
}
if ( zv->size <= newmaxsize ) {
DVcopy(2*zv->size, vec, zv->vec) ;
} else {
/*
-----------------------
note, data is truncated
-----------------------
*/
DVcopy(2*newmaxsize, vec, zv->vec) ;
zv->size = newmaxsize ;
}
}
if ( zv->vec != NULL ) {
/*
----------------
free old entries
----------------
*/
DVfree(zv->vec) ;
}
/*
----------
set fields
----------
*/
zv->maxsize = newmaxsize ;
zv->owned = 1 ;
zv->vec = vec ;
}
return ; }
/*--------------------------------------------------------------------*/
/*
--------------------------
set the size of the vector
created -- 98jan22, cca
--------------------------
*/
void
ZV_setSize (
ZV *zv,
int newsize
) {
/*
---------------
check the input
---------------
*/
if ( zv == NULL || newsize < 0 ) {
fprintf(stderr, "\n fatal error in ZV_setSize(%p,%d)"
"\n bad input\n", zv, newsize) ;
exit(-1) ;
}
if ( 0 < zv->maxsize && zv->maxsize < newsize && zv->owned == 0 ) {
fprintf(stderr, "\n fatal error in ZV_setSize(%p,%d)"
"\n zv->maxsize = %d, newsize = %d, zv->owned = %d\n",
zv, newsize, zv->maxsize, newsize, zv->owned) ;
exit(-1) ;
}
if ( zv->maxsize < newsize ) {
/*
-------------------------------------------------------------
new size requested is more than maxsize, set new maximum size
-------------------------------------------------------------
*/
ZV_setMaxsize(zv, newsize) ;
}
zv->size = newsize ;
return ; }
/*--------------------------------------------------------------------*/
syntax highlighted by Code2HTML, v. 0.9.1