AcePerl
view release on metacpan or search on metacpan
acelib/arraysub.c view on Meta::CPAN
/* File: arraysub.c
* Author: Jean Thierry-Mieg (mieg@mrc-lmba.cam.ac.uk)
* Copyright (C) J Thierry-Mieg and R Durbin, 1991
*-------------------------------------------------------------------
* This file is part of the ACEDB genome database package, written by
* Richard Durbin (MRC LMB, UK) rd@mrc-lmba.cam.ac.uk, and
* Jean Thierry-Mieg (CRBM du CNRS, France) mieg@crbm.cnrs-mop.fr
*
* Description:
* Arbitrary length arrays, stacks, associators
* line breaking and all sorts of other goodies
* These functions are declared in array.h
* (part of regular.h - the header for libfree.a)
* Exported functions:
* See Header file: array.h (includes lots of macros)
* HISTORY:
* Last edited: Dec 4 11:12 1998 (fw)
* * Nov 1 16:11 1996 (srk)
* - MEM_DEBUG code clean-up
* (some loose ends crept in from WIN32)
* - int (*order)(void*,void*) prototypes used
* uniformly throughout
* * Jun 5 00:48 1996 (rd)
* * May 2 22:33 1995 (mieg): killed the arrayReport at 20000
otherwise it swamps 50 Mbytes of RAM
* * Jan 21 16:25 1992 (mieg): messcrash in uArrayCreate(size<=0)
* * Dec 17 11:40 1991 (mieg): stackTokeniseTextOn() tokeniser.
* * Dec 12 15:45 1991 (mieg): Stack magic and stackNextText
* Created: Thu Dec 12 15:43:25 1989 (mieg)
*-------------------------------------------------------------------
*/
/* $Id: arraysub.c,v 1.1 2002/11/14 20:00:06 lstein Exp $ */
/* Warning : if you modify Array or Stack structures or
procedures in this file or array.h, you may need to modify
accordingly the persistent array package asubs.c.
*/
#include "regular.h"
/*#include <limits.h>*/
extern BOOL finalCleanup ; /* in messubs.c */
/******** tells how much system stack used *********/
char *stackorigin ;
unsigned int stackused (void)
{ char x ;
if (!stackorigin) /* ideally should set in main() */
stackorigin = &x ;
return stackorigin - &x ; /* MSDOS stack grows down */
}
/************ Array : class to implement variable length arrays ************/
static int totalAllocatedMemory = 0 ;
static int totalNumberCreated = 0 ;
static int totalNumberActive = 0 ;
static Array reportArray = 0 ;
static void uArrayFinalise (void *cp) ;
#ifndef MEM_DEBUG
Array uArrayCreate (int n, int size, STORE_HANDLE handle)
{ int id = totalNumberCreated++ ;
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 ?
acelib/arraysub.c view on Meta::CPAN
int i, n ;
if(!stackExists(s) || !text || !delimiters)
messcrash("stackTextOn received some null parameter") ;
n = strlen(delimiters) ;
cp = cq = text ;
while(TRUE)
{
while(*cp == ' ')
cp++ ;
cq = cp ;
old = 0 ;
while(*cq)
{ for (cd = delimiters, i = 0 ; i < n ; cd++, i++)
if (*cd == *cq)
{ old = *cq ;
*cq = 0 ;
goto found ;
}
cq++ ;
}
found:
cend = cq ;
while(cend > cp && *--cend == ' ') ;
if (*cend != ' ') cend++ ;
oldend = *cend ; *cend = 0 ;
if (*cp && cend > cp)
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;
}
( run in 2.187 seconds using v1.01-cache-2.11-cpan-524268b4103 )