AcePerl
view release on metacpan or search on metacpan
acelib/arraysub.c view on Meta::CPAN
Array new = (Array) handleAlloc (uArrayFinalise,
handle,
sizeof (struct ArrayStruct)) ;
#else
Array uArrayCreate_dbg (int n, int size, STORE_HANDLE handle,
const char *hfname,int hlineno)
{ int id = totalNumberCreated++ ;
Array new = (Array) handleAlloc_dbg (uArrayFinalise,
handle,
sizeof (struct ArrayStruct),
dbgPos(hfname, hlineno, __FILE__), __LINE__) ;
#endif
if (!reportArray)
{ reportArray = (Array)1 ; /* prevents looping */
reportArray = arrayCreate (512, Array) ;
}
if (size <= 0)
messcrash("negative size %d in uArrayCreate", size) ;
if (n < 1)
n = 1 ;
totalAllocatedMemory += n * size ;
#ifndef MEM_DEBUG
new->base = messalloc (n*size) ;
#else
new->base = messalloc_dbg (n*size,dbgPos(hfname, hlineno, __FILE__), __LINE__) ;
#endif
new->dim = n ;
new->max = 0 ;
new->size = size ;
new->id = ++id ;
new->magic = ARRAY_MAGIC ;
totalNumberActive++ ;
if (reportArray != (Array)1)
{ if (new->id < 20000)
array (reportArray, new->id, Array) = new ;
else
{ Array aa = reportArray ;
reportArray = (Array)1 ; /* prevents looping */
arrayDestroy (aa) ;
}
}
return new ;
}
/**************/
int arrayReportMark (void)
{
return reportArray != (Array)1 ?
arrayMax(reportArray) : 0 ;
}
/**************/
void arrayReport (int j)
{ int i ;
Array a ;
if (reportArray == (Array)1)
{ fprintf(stderr,
"\n\n %d active arrays, %d created, %d kb allocated\n\n ",
totalNumberActive, totalNumberCreated , totalAllocatedMemory/1024) ;
return ;
}
fprintf(stderr,"\n\n") ;
i = arrayMax (reportArray) ;
while (i-- && i > j)
{ a = arr (reportArray, i, Array) ;
if (arrayExists(a))
fprintf (stderr, "Array %d size=%d max=%d\n", i, a->size, a->max) ;
}
}
/**************/
void arrayStatus (int *nmadep, int *nusedp, int *memAllocp, int *memUsedp)
{
int i ;
Array a, *ap ;
*nmadep = totalNumberCreated ;
*nusedp = totalNumberActive ;
*memAllocp = totalAllocatedMemory ;
*memUsedp = 0 ;
if (reportArray == (Array)1)
return ;
i = arrayMax(reportArray) ;
ap = arrp(reportArray, 0, Array) - 1 ;
while (ap++, i--)
if (arrayExists (*ap))
{ a = *ap ;
*memUsedp += a->max * a->size ;
}
}
/**************/
Array uArrayReCreate (Array a, int n, int size)
{ if (!arrayExists(a))
return uArrayCreate(n, size, 0) ;
if(a->size != size)
messcrash("Type missmatch in uArrayRecreate, you should always "
"call recreate using the same type") ;
if (n < 1)
n = 1 ;
if (a->dim < n ||
(a->dim - n)*size > (1 << 19) ) /* free if save > 1/2 meg */
{ totalAllocatedMemory -= a->dim * size ;
messfree (a->base) ;
a->dim = n ;
totalAllocatedMemory += a->dim * size ;
a->base = messalloc (a->dim*size) ;
}
memset(a->base,0,(mysize_t)(a->dim*size)) ;
a->max = 0 ;
return a ;
}
/**************/
void uArrayDestroy (Array a)
/* Note that the finalisation code attached to the memory does the work,
see below */
{
if (!a) return;
acelib/arraysub.c view on Meta::CPAN
}
else
return FALSE ;
}
/*******************/
/* if found, removes entry and returns TRUE, else returns FALSE */
/* Requires both xin and xout to match */
BOOL assPairRemove (Associator a, void* xin, void* xout)
{ if (!assExists(a) || !xin || xin == moins_un) return FALSE ;
if (uAssFind (a, xin, 0))
while (uAssFindNext (a, xin, 0))
if (a->out[a->i] == xout)
{ a->in[a->i] = moins_un ;
assRemoved++ ;
return TRUE ;
}
return FALSE ;
}
/************************ dumpers ********************************/
/* lets you step through all members of the table */
BOOL uAssNext (Associator a, void* *pin, void* *pout)
{ int size ;
void *test ;
if (!assExists(a))
messcrash("uAssNext received a non existing associator") ;
size = 1 << a->m ;
if (!*pin)
a->i = -1 ;
else if (*pin != a->in[a->i])
{ messerror ("Non-consecutive call to assNext()") ;
return FALSE ;
}
while (++a->i < size)
{ test = a->in[a->i] ;
if (test && test != moins_un) /* not empty or deleted */
{ *pin = a->in[a->i] ;
if (pout)
*pout = a->out[a->i] ;
return TRUE ;
}
}
return FALSE ;
}
/*******************/
void assDump (Associator a)
{ int i ;
void **in, **out ;
char *cp0 = 0 ;
if (!assExists(a)) return ;
i = 1 << a->m ;
in = a->in - 1 ; out = a->out - 1 ;
/* keep stderr here since it is for debugging */
fprintf (stderr,"Associator %lx : %d pairs\n",(unsigned long)a,a->n) ;
while (in++, out++, i--)
if (*in && *in != moins_un) /* not empty or deleted */
fprintf (stderr,"%lx - %lx\n",
(long)((char*)(*in) - cp0),(long)( (char *)(*out) - cp0)) ;
}
/************************ end of file ********************************/
/**********************************************************************/
( run in 1.353 second using v1.01-cache-2.11-cpan-389fe586d7c )