AcePerl
view release on metacpan or search on metacpan
acelib/arraysub.c view on Meta::CPAN
pushText(s,cp) ;
*cend = oldend ;
if(!old)
{ stackCursor(s, 0) ;
return ;
}
*cq = old ;
cp = cq + 1 ;
}
}
void stackClear(Stack s)
{ if (stackExists(s))
{ s->pos = s->ptr = s->a->base;
s->a->max = 0;
}
}
/****************** routines to set text into lines ***********************/
static char *linesText ;
static Array lines ;
static Array textcopy ;
static int kLine, popLine ;
/**********/
int uLinesText (char *text, int width)
{
char *cp,*bp ;
int i ;
int nlines = 0 ;
int length = strlen (text) ;
int safe = length + 2*(length/(width > 0 ? width : 1) + 1) ; /* mieg: avoid zero divide */
static int isFirst = TRUE ;
if (isFirst)
{ isFirst = FALSE ;
lines = arrayCreate(16,char*) ;
textcopy = arrayCreate(128,char) ;
}
linesText = text ;
array(textcopy,safe,char) = 0 ; /* ensures textcopy is long enough */
if (!*text)
{ nlines = popLine = kLine = 0 ;
array(lines,0,char*) = 0 ;
return 0 ;
}
cp = textcopy->base ;
nlines = 0 ;
for (bp = text ; *bp ; ++bp)
{ array(lines,nlines++,char*) = cp ;
for (i = 0 ; (*cp = *bp) && *cp != '\n' ; ++i, ++cp, ++bp)
if (i == width) /* back up to last space */
{ while (i--)
{ --bp ; --cp ;
if (*cp == ' ' || *cp == ',' || *cp == ';')
goto eol ;
}
cp += width ; /* no coma or spaces in whole line ! */
bp += width ;
break ;
}
eol: if (!*cp)
break ;
if (*cp != '\n')
++cp ;
*cp++ = 0 ;
}
kLine = 0 ; /* reset for uNextLine() */
popLine = nlines ;
array(lines,nlines,char*) = 0 ; /* 0 terminate */
return nlines ;
}
char *uNextLine (char *text)
{
if (text != linesText)
messout ("Warning : uNextLine being called with bad context") ;
return array(lines,kLine++,char*) ;
}
char *uPopLine (char *text)
{
if (text != linesText)
messout ("Warning : uPopLine being called with bad context") ;
if (popLine)
return array(lines,--popLine,char*) ;
else return 0;
}
char **uBrokenLines (char *text, int width)
{
uLinesText (text,width) ;
return (char**)lines->base ;
}
char *uBrokenText (char *text, int width)
{
char *cp ;
uLinesText (text,width) ;
uNextLine (text) ;
while ((cp = uNextLine (text)))
*(cp-1) = '\n' ;
return arrp(textcopy,0,char) ;
}
/*************************************************************/
/* perfmeters */
int assBounce = 0, assFound = 0, assNotFound = 0, assInserted = 0, assRemoved = 0 ;
/* Associator package is for associating pairs of pointers.
Assumes that an "in" item is non-zero and non -1.
Implemented as a hash table of size 2^m.
Originally grabbed from Steve Om's sather code by Richard Durbin.
Entirelly rewritten by mieg, using bouncing by relative primes
and deletion flagging.
User has access to structure member ->n = # of pairs
*/
( run in 2.166 seconds using v1.01-cache-2.11-cpan-5735350b133 )