152#include <config_auto.h>
157#include "allheaders.h"
161static const l_uint32 MaxDoubleArraySize = 100000000;
162static const l_uint32 MaxPtrArraySize = 1000000;
183 if (n <= 0 || n > MaxDoubleArraySize)
187 if ((da->
array = (l_float64 *)LEPT_CALLOC(n,
sizeof(l_float64))) == NULL) {
189 return (
L_DNA *)ERROR_PTR(
"double array not made", __func__, NULL);
225 return (
L_DNA *)ERROR_PTR(
"iarray not defined", __func__, NULL);
227 return (
L_DNA *)ERROR_PTR(
"size must be > 0", __func__, NULL);
230 for (i = 0; i < size; i++)
261 return (
L_DNA *)ERROR_PTR(
"darray not defined", __func__, NULL);
263 return (
L_DNA *)ERROR_PTR(
"size must be > 0", __func__, NULL);
265 return (
L_DNA *)ERROR_PTR(
"invalid copyflag", __func__, NULL);
273 for (i = 0; i < size; i++)
299 return (
L_DNA *)ERROR_PTR(
"da not made", __func__, NULL);
301 for (i = 0; i < size; i++) {
302 val = startval + i * increment;
328 L_WARNING(
"ptr address is NULL\n", __func__);
332 if ((da = *pda) == NULL)
338 LEPT_FREE(da->
array);
363 return (
L_DNA *)ERROR_PTR(
"da not defined", __func__, NULL);
366 return (
L_DNA *)ERROR_PTR(
"dac not made", __func__, NULL);
370 for (i = 0; i < da->
n; i++)
387 return (
L_DNA *)ERROR_PTR(
"da not defined", __func__, NULL);
411 return ERROR_INT(
"da not defined", __func__, 1);
436 return ERROR_INT(
"da not defined", __func__, 1);
441 return ERROR_INT(
"extension failed", __func__, 1);
464size_t oldsize, newsize;
467 return ERROR_INT(
"da not defined", __func__, 1);
468 if (da->
nalloc > MaxDoubleArraySize)
469 return ERROR_INT(
"da at maximum size; can't extend", __func__, 1);
470 oldsize = da->
nalloc *
sizeof(l_float64);
471 if (da->
nalloc > MaxDoubleArraySize / 2) {
472 newsize = MaxDoubleArraySize *
sizeof(l_float64);
473 da->
nalloc = MaxDoubleArraySize;
475 newsize = 2 * oldsize;
478 if ((da->
array = (l_float64 *)reallocNew((
void **)&da->
array,
479 oldsize, newsize)) == NULL)
480 return ERROR_INT(
"new ptr array not returned", __func__, 1);
511 return ERROR_INT(
"da not defined", __func__, 1);
513 if (index < 0 || index > n) {
514 L_ERROR(
"index %d not in [0,...,%d]\n", __func__, index, n);
520 return ERROR_INT(
"extension failed", __func__, 1);
522 for (i = n; i > index; i--)
524 da->
array[index] = val;
551 return ERROR_INT(
"da not defined", __func__, 1);
553 if (index < 0 || index >= n) {
554 L_ERROR(
"index %d not in [0,...,%d]\n", __func__, index, n - 1);
558 for (i = index + 1; i < n; i++)
581 return ERROR_INT(
"da not defined", __func__, 1);
583 if (index < 0 || index >= n) {
584 L_ERROR(
"index %d not in [0,...,%d]\n", __func__, index, n - 1);
588 da->
array[index] = val;
606 return ERROR_INT(
"da not defined", __func__, 0);
632 return ERROR_INT(
"da not defined", __func__, 1);
633 if (newcount > da->
nalloc) {
634 if ((da->
array = (l_float64 *)reallocNew((
void **)&da->
array,
635 sizeof(l_float64) * da->
nalloc,
636 sizeof(l_float64) * newcount)) == NULL)
637 return ERROR_INT(
"new ptr array not returned", __func__, 1);
665 return ERROR_INT(
"&val not defined", __func__, 1);
668 return ERROR_INT(
"da not defined", __func__, 1);
670 if (index < 0 || index >= da->
n)
671 return ERROR_INT(
"index not valid", __func__, 1);
673 *pval = da->
array[index];
700 return ERROR_INT(
"&ival not defined", __func__, 1);
703 return ERROR_INT(
"da not defined", __func__, 1);
705 if (index < 0 || index >= da->
n)
706 return ERROR_INT(
"index not valid", __func__, 1);
708 val = da->
array[index];
709 *pival = (l_int32)(val + L_SIGN(val) * 0.5);
728 return ERROR_INT(
"da not defined", __func__, 1);
729 if (index < 0 || index >= da->
n)
730 return ERROR_INT(
"index not valid", __func__, 1);
732 da->
array[index] = val;
751 return ERROR_INT(
"da not defined", __func__, 1);
752 if (index < 0 || index >= da->
n)
753 return ERROR_INT(
"index not valid", __func__, 1);
755 da->
array[index] += diff;
786 return (l_int32 *)ERROR_PTR(
"da not defined", __func__, NULL);
789 if ((array = (l_int32 *)LEPT_CALLOC(n,
sizeof(l_int32))) == NULL)
790 return (l_int32 *)ERROR_PTR(
"array not made", __func__, NULL);
791 for (i = 0; i < n; i++) {
829 return (l_float64 *)ERROR_PTR(
"da not defined", __func__, NULL);
835 if ((array = (l_float64 *)LEPT_CALLOC(n,
sizeof(l_float64))) == NULL)
836 return (l_float64 *)ERROR_PTR(
"array not made", __func__, NULL);
837 for (i = 0; i < n; i++)
838 array[i] = da->
array[i];
858 if (pstartx) *pstartx = 0.0;
859 if (pdelx) *pdelx = 1.0;
860 if (!pstartx && !pdelx)
861 return ERROR_INT(
"neither &startx nor &delx are defined", __func__, 1);
863 return ERROR_INT(
"da not defined", __func__, 1);
865 if (pstartx) *pstartx = da->
startx;
866 if (pdelx) *pdelx = da->
delx;
887 return ERROR_INT(
"da not defined", __func__, 1);
906l_float64 start, binsize;
909 return ERROR_INT(
"das and dad not both defined", __func__, 1);
933 return (
L_DNA *)ERROR_PTR(
"filename not defined", __func__, NULL);
935 if ((fp = fopenReadStream(filename)) == NULL)
936 return (
L_DNA *)ERROR_PTR_1(
"stream not opened",
937 filename, __func__, NULL);
941 return (
L_DNA *)ERROR_PTR_1(
"da not read",
942 filename, __func__, NULL);
962l_int32 i, n, index, ret, version;
963l_float64 val, startx, delx;
967 return (
L_DNA *)ERROR_PTR(
"stream not defined", __func__, NULL);
969 ret = fscanf(fp,
"\nL_Dna Version %d\n", &version);
971 return (
L_DNA *)ERROR_PTR(
"not a l_dna file", __func__, NULL);
973 return (
L_DNA *)ERROR_PTR(
"invalid l_dna version", __func__, NULL);
974 if (fscanf(fp,
"Number of numbers = %d\n", &n) != 1)
975 return (
L_DNA *)ERROR_PTR(
"invalid number of numbers", __func__, NULL);
977 return (
L_DNA *)ERROR_PTR(
"num doubles < 0", __func__, NULL);
978 if (n > MaxDoubleArraySize)
979 return (
L_DNA *)ERROR_PTR(
"too many doubles", __func__, NULL);
980 if (n == 0) L_INFO(
"the dna is empty\n", __func__);
983 return (
L_DNA *)ERROR_PTR(
"da not made", __func__, NULL);
984 for (i = 0; i < n; i++) {
985 if (fscanf(fp,
" [%d] = %lf\n", &index, &val) != 2) {
987 return (
L_DNA *)ERROR_PTR(
"bad input data", __func__, NULL);
993 if (fscanf(fp,
"startx = %lf, delx = %lf\n", &startx, &delx) == 2)
1014 return (
L_DNA *)ERROR_PTR(
"data not defined", __func__, NULL);
1015 if ((fp = fopenReadFromMemory(data, size)) == NULL)
1016 return (
L_DNA *)ERROR_PTR(
"stream not opened", __func__, NULL);
1020 if (!da) L_ERROR(
"dna not read\n", __func__);
1040 return ERROR_INT(
"filename not defined", __func__, 1);
1042 return ERROR_INT(
"da not defined", __func__, 1);
1044 if ((fp = fopenWriteStream(filename,
"w")) == NULL)
1045 return ERROR_INT_1(
"stream not opened", filename, __func__, 1);
1049 return ERROR_INT_1(
"da not written to stream", filename, __func__, 1);
1066l_float64 startx, delx;
1069 return ERROR_INT(
"da not defined", __func__, 1);
1075 fprintf(fp,
"Number of numbers = %d\n", n);
1076 for (i = 0; i < n; i++)
1077 fprintf(fp,
" [%d] = %f\n", i, da->
array[i]);
1082 if (startx != 0.0 || delx != 1.0)
1083 fprintf(fp,
"startx = %f, delx = %f\n", startx, delx);
1099l_float64 startx, delx;
1102 return ERROR_INT(
"da not defined", __func__, 1);
1106 lept_stderr(
"Number of numbers = %d\n", n);
1107 for (i = 0; i < n; i++)
1108 lept_stderr(
" [%d] = %f\n", i, da->
array[i]);
1113 if (startx != 0.0 || delx != 1.0)
1114 lept_stderr(
"startx = %f, delx = %f\n", startx, delx);
1141 if (pdata) *pdata = NULL;
1142 if (psize) *psize = 0;
1144 return ERROR_INT(
"&data not defined", __func__, 1);
1146 return ERROR_INT(
"&size not defined", __func__, 1);
1148 return ERROR_INT(
"da not defined", __func__, 1);
1151 if ((fp = open_memstream((
char **)pdata, psize)) == NULL)
1152 return ERROR_INT(
"stream not opened", __func__, 1);
1156 if (*psize > 0) *psize = *psize - 1;
1158 L_INFO(
"no fmemopen API --> work-around: write to temp file\n", __func__);
1160 if ((fp = fopenWriteWinTempfile()) == NULL)
1161 return ERROR_INT(
"tmpfile stream not opened", __func__, 1);
1163 if ((fp = tmpfile()) == NULL)
1164 return ERROR_INT(
"tmpfile stream not opened", __func__, 1);
1168 *pdata = l_binaryReadStream(fp, psize);
1190 if (n <= 0 || n > MaxPtrArraySize)
1194 if ((daa->
dna = (
L_DNA **)LEPT_CALLOC(n,
sizeof(
L_DNA *))) == NULL) {
1196 return (
L_DNAA *)ERROR_PTR(
"l_dna ptr array not made", __func__, NULL);
1228 for (i = 0; i < nptr; i++) {
1257 return ERROR_INT(
"daa not defined", __func__, 1);
1260 for (i = n - 1; i >= 0; i--) {
1289 L_WARNING(
"ptr address is NULL!\n", __func__);
1293 if ((daa = *pdaa) == NULL)
1296 for (i = 0; i < daa->
n; i++)
1298 LEPT_FREE(daa->
dna);
1324 return ERROR_INT(
"daa not defined", __func__, 1);
1326 return ERROR_INT(
"da not defined", __func__, 1);
1330 }
else if (copyflag ==
L_COPY) {
1332 return ERROR_INT(
"dac not made", __func__, 1);
1333 }
else if (copyflag ==
L_CLONE) {
1336 return ERROR_INT(
"invalid copyflag", __func__, 1);
1344 return ERROR_INT(
"extension failed", __func__, 1);
1368size_t oldsize, newsize;
1371 return ERROR_INT(
"daa not defined", __func__, 1);
1372 if (daa->
nalloc > MaxPtrArraySize)
1373 return ERROR_INT(
"daa has too many ptrs", __func__, 1);
1375 newsize = 2 * oldsize;
1376 if (newsize > 8 * MaxPtrArraySize)
1377 return ERROR_INT(
"newsize > 8 MB; too large", __func__, 1);
1379 if ((daa->
dna = (
L_DNA **)reallocNew((
void **)&daa->
dna,
1380 oldsize, newsize)) == NULL)
1381 return ERROR_INT(
"new ptr array not returned", __func__, 1);
1401 return ERROR_INT(
"daa not defined", __func__, 0);
1418 return ERROR_INT(
"daa not defined", __func__, 0);
1419 if (index < 0 || index >= daa->
n)
1420 return ERROR_INT(
"invalid index into daa", __func__, 0);
1439 return ERROR_INT(
"daa not defined", __func__, 0);
1442 for (sum = 0, i = 0; i < n; i++) {
1466 return (
L_DNA *)ERROR_PTR(
"daa not defined", __func__, NULL);
1467 if (index < 0 || index >= daa->
n)
1468 return (
L_DNA *)ERROR_PTR(
"index not valid", __func__, NULL);
1470 if (accessflag ==
L_COPY)
1472 else if (accessflag ==
L_CLONE)
1475 return (
L_DNA *)ERROR_PTR(
"invalid accessflag", __func__, NULL);
1502 return ERROR_INT(
"daa not defined", __func__, 1);
1504 return ERROR_INT(
"da not defined", __func__, 1);
1506 if (index < 0 || index >= n)
1507 return ERROR_INT(
"index not valid", __func__, 1);
1510 daa->
dna[index] = da;
1534 return ERROR_INT(
"&val not defined", __func__, 1);
1537 return ERROR_INT(
"daa not defined", __func__, 1);
1539 if (i < 0 || i >= n)
1540 return ERROR_INT(
"invalid index into daa", __func__, 1);
1542 if (j < 0 || j >= da->
n)
1543 return ERROR_INT(
"invalid index into da", __func__, 1);
1544 *pval = da->
array[j];
1571 return ERROR_INT(
"daa not defined", __func__, 1);
1573 if (index < 0 || index >= n)
1574 return ERROR_INT(
"invalid index in daa", __func__, 1);
1599 return (
L_DNAA *)ERROR_PTR(
"filename not defined", __func__, NULL);
1601 if ((fp = fopenReadStream(filename)) == NULL)
1602 return (
L_DNAA *)ERROR_PTR_1(
"stream not opened",
1603 filename, __func__, NULL);
1607 return (
L_DNAA *)ERROR_PTR_1(
"daa not read",
1608 filename, __func__, NULL);
1627l_int32 i, n, index, ret, version;
1632 return (
L_DNAA *)ERROR_PTR(
"stream not defined", __func__, NULL);
1634 ret = fscanf(fp,
"\nL_Dnaa Version %d\n", &version);
1636 return (
L_DNAA *)ERROR_PTR(
"not a l_dna file", __func__, NULL);
1638 return (
L_DNAA *)ERROR_PTR(
"invalid l_dnaa version", __func__, NULL);
1639 if (fscanf(fp,
"Number of L_Dna = %d\n\n", &n) != 1)
1640 return (
L_DNAA *)ERROR_PTR(
"invalid number of l_dna", __func__, NULL);
1642 return (
L_DNAA *)ERROR_PTR(
"num l_dna <= 0", __func__, NULL);
1643 if (n > MaxPtrArraySize)
1644 return (
L_DNAA *)ERROR_PTR(
"too many l_dna", __func__, NULL);
1645 if (n == 0) L_INFO(
"the dnaa is empty\n", __func__);
1648 return (
L_DNAA *)ERROR_PTR(
"daa not made", __func__, NULL);
1649 for (i = 0; i < n; i++) {
1650 if (fscanf(fp,
"L_Dna[%d]:", &index) != 1) {
1652 return (
L_DNAA *)ERROR_PTR(
"invalid l_dna header", __func__, NULL);
1656 return (
L_DNAA *)ERROR_PTR(
"da not made", __func__, NULL);
1680 return (
L_DNAA *)ERROR_PTR(
"data not defined", __func__, NULL);
1681 if ((fp = fopenReadFromMemory(data, size)) == NULL)
1682 return (
L_DNAA *)ERROR_PTR(
"stream not opened", __func__, NULL);
1686 if (!daa) L_ERROR(
"daa not read\n", __func__);
1706 return ERROR_INT(
"filename not defined", __func__, 1);
1708 return ERROR_INT(
"daa not defined", __func__, 1);
1710 if ((fp = fopenWriteStream(filename,
"w")) == NULL)
1711 return ERROR_INT_1(
"stream not opened", filename, __func__, 1);
1715 return ERROR_INT_1(
"daa not written to stream", filename, __func__, 1);
1735 return ERROR_INT(
"stream not defined", __func__, 1);
1737 return ERROR_INT(
"daa not defined", __func__, 1);
1741 fprintf(fp,
"Number of L_Dna = %d\n\n", n);
1742 for (i = 0; i < n; i++) {
1744 return ERROR_INT(
"da not found", __func__, 1);
1745 fprintf(fp,
"L_Dna[%d]:", i);
1775 if (pdata) *pdata = NULL;
1776 if (psize) *psize = 0;
1778 return ERROR_INT(
"&data not defined", __func__, 1);
1780 return ERROR_INT(
"&size not defined", __func__, 1);
1782 return ERROR_INT(
"daa not defined", __func__, 1);
1785 if ((fp = open_memstream((
char **)pdata, psize)) == NULL)
1786 return ERROR_INT(
"stream not opened", __func__, 1);
1790 if (*psize > 0) *psize = *psize - 1;
1792 L_INFO(
"no fmemopen API --> work-around: write to temp file\n", __func__);
1794 if ((fp = fopenWriteWinTempfile()) == NULL)
1795 return ERROR_INT(
"tmpfile stream not opened", __func__, 1);
1797 if ((fp = tmpfile()) == NULL)
1798 return ERROR_INT(
"tmpfile stream not opened", __func__, 1);
1802 *pdata = l_binaryReadStream(fp, psize);
#define DNA_VERSION_NUMBER
L_DNA * l_dnaReadMem(const l_uint8 *data, size_t size)
l_dnaReadMem()
l_ok l_dnaWriteStream(FILE *fp, L_DNA *da)
l_dnaWriteStream()
l_ok l_dnaaReplaceDna(L_DNAA *daa, l_int32 index, L_DNA *da)
l_dnaaReplaceDna()
l_int32 l_dnaaGetCount(L_DNAA *daa)
l_dnaaGetCount()
L_DNA * l_dnaCreateFromDArray(l_float64 *darray, l_int32 size, l_int32 copyflag)
l_dnaCreateFromDArray()
l_int32 l_dnaaGetDnaCount(L_DNAA *daa, l_int32 index)
l_dnaaGetDnaCount()
l_ok l_dnaGetIValue(L_DNA *da, l_int32 index, l_int32 *pival)
l_dnaGetIValue()
l_ok l_dnaAddNumber(L_DNA *da, l_float64 val)
l_dnaAddNumber()
l_ok l_dnaCopyParameters(L_DNA *dad, L_DNA *das)
l_dnaCopyParameters()
l_ok l_dnaaTruncate(L_DNAA *daa)
l_dnaaTruncate()
L_DNAA * l_dnaaCreate(l_int32 n)
l_dnaaCreate()
l_ok l_dnaSetValue(L_DNA *da, l_int32 index, l_float64 val)
l_dnaSetValue()
static l_int32 l_dnaaExtendArray(L_DNAA *daa)
l_dnaaExtendArray()
l_ok l_dnaaAddNumber(L_DNAA *daa, l_int32 index, l_float64 val)
l_dnaaAddNumber()
static l_int32 l_dnaExtendArray(L_DNA *da)
l_dnaExtendArray()
l_ok l_dnaaWriteStream(FILE *fp, L_DNAA *daa)
l_dnaaWriteStream()
L_DNA * l_dnaClone(L_DNA *da)
l_dnaClone()
l_ok l_dnaShiftValue(L_DNA *da, l_int32 index, l_float64 diff)
l_dnaShiftValue()
l_ok l_dnaRemoveNumber(L_DNA *da, l_int32 index)
l_dnaRemoveNumber()
L_DNA * l_dnaMakeSequence(l_float64 startval, l_float64 increment, l_int32 size)
l_dnaMakeSequence()
L_DNAA * l_dnaaCreateFull(l_int32 nptr, l_int32 n)
l_dnaaCreateFull()
l_ok l_dnaEmpty(L_DNA *da)
l_dnaEmpty()
l_ok l_dnaSetParameters(L_DNA *da, l_float64 startx, l_float64 delx)
l_dnaSetParameters()
l_ok l_dnaaWrite(const char *filename, L_DNAA *daa)
l_dnaaWrite()
L_DNAA * l_dnaaReadStream(FILE *fp)
l_dnaaReadStream()
L_DNA * l_dnaCreateFromIArray(l_int32 *iarray, l_int32 size)
l_dnaCreateFromIArray()
L_DNA * l_dnaCopy(L_DNA *da)
l_dnaCopy()
L_DNA * l_dnaRead(const char *filename)
l_dnaRead()
l_ok l_dnaGetDValue(L_DNA *da, l_int32 index, l_float64 *pval)
l_dnaGetDValue()
static const l_int32 InitialArraySize
l_ok l_dnaaWriteMem(l_uint8 **pdata, size_t *psize, L_DNAA *daa)
l_dnaaWriteMem()
L_DNA * l_dnaCreate(l_int32 n)
l_dnaCreate()
l_ok l_dnaInsertNumber(L_DNA *da, l_int32 index, l_float64 val)
l_dnaInsertNumber()
l_int32 l_dnaaGetNumberCount(L_DNAA *daa)
l_dnaaGetNumberCount()
L_DNAA * l_dnaaReadMem(const l_uint8 *data, size_t size)
l_dnaaReadMem()
L_DNA * l_dnaReadStream(FILE *fp)
l_dnaReadStream()
l_ok l_dnaSetCount(L_DNA *da, l_int32 newcount)
l_dnaSetCount()
l_ok l_dnaaAddDna(L_DNAA *daa, L_DNA *da, l_int32 copyflag)
l_dnaaAddDna()
l_int32 * l_dnaGetIArray(L_DNA *da)
l_dnaGetIArray()
l_ok l_dnaaGetValue(L_DNAA *daa, l_int32 i, l_int32 j, l_float64 *pval)
l_dnaaGetValue()
l_ok l_dnaWriteStderr(L_DNA *da)
l_dnaWriteStrderr()
l_ok l_dnaReplaceNumber(L_DNA *da, l_int32 index, l_float64 val)
l_dnaReplaceNumber()
l_float64 * l_dnaGetDArray(L_DNA *da, l_int32 copyflag)
l_dnaGetDArray()
L_DNAA * l_dnaaRead(const char *filename)
l_dnaaRead()
void l_dnaDestroy(L_DNA **pda)
l_dnaDestroy()
l_ok l_dnaGetParameters(L_DNA *da, l_float64 *pstartx, l_float64 *pdelx)
l_dnaGetParameters()
l_ok l_dnaWriteMem(l_uint8 **pdata, size_t *psize, L_DNA *da)
l_dnaWriteMem()
l_ok l_dnaWrite(const char *filename, L_DNA *da)
l_dnaWrite()
l_int32 l_dnaGetCount(L_DNA *da)
l_dnaGetCount()
void l_dnaaDestroy(L_DNAA **pdaa)
l_dnaaDestroy()
L_DNA * l_dnaaGetDna(L_DNAA *daa, l_int32 index, l_int32 accessflag)
l_dnaaGetDna()