AcePerl
view release on metacpan or search on metacpan
acelib/freesubs.c view on Meta::CPAN
if (!*++fp) messcrash ("'o' can not end free format %s",fmt) ;
freestep (*fp) ; break ;
case 'b' : break; /* special for graphToggleEditor no check needed il */
default :
if (!isdigit((int)*fp) && !isspace((int)*fp))
messerror ("unrecognised char %d = %c in free format %s",
*fp, *fp, fmt) ;
}
retTRUE :
pos = keep ; return TRUE ;
retFALSE :
pos = keep ; return FALSE ;
}
/************************ little routines ************************/
BOOL freestep (char x)
{return (*pos && freeupper (*pos) == x && pos++) ;
}
void freenext (void)
{_losewhite ;
}
char FREE_UPPER[] =
{ 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,
96,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
80,81,82,83,84,85,86,87,88,89,90,123,124,125,126,127
} ;
char FREE_LOWER[] =
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
64, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 91, 92, 93, 94, 95,
96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127
} ;
char* freepos (void) /* cheat to give pos onwards */
{ return (char*) pos ;
}
#ifdef JUNK
/* we want a more direct reciprocal to free protect */
char* freeunprotect (char *text)
{ int level ; char *cp ;
static Stack s = 0 ;
if (!text || !*text) return 0 ;
s = stackReCreate (s, 80) ;
level = freesettext (text,"") ;
freespecial ("\t\\") ; /* No \n, no subshells, No attach, No %, Nothing */
freecard(level) ;
while ((cp = freeword()))
{ if (stackMark(s)) catText (s, " ") ;
catText (s, cp);
}
freeclose (level) ;
return stackMark (s) ? stackText (s, 0) : "" ; /* is text is not 0, do not return 0 */
}
#endif
char* freeunprotect (char *text)
{
static char *buf = 0 ;
char *cp, *cp0, *cq ;
messfree (buf) ;
buf = strnew(text ? text : "", 0) ;
/* remove external space and tabs and first quotes */
cp = buf ;
while (*cp == ' ' || *cp == '\t') cp++ ;
if (*cp == '"') cp++ ;
while (*cp == ' ' || *cp == '\t') cp++ ;
cq = cp + strlen(cp) - 1 ;
while (cq > cp && (*cp == ' ' || *cq == '\t')) *cq-- = 0 ;
if (*cq == '"') /* remove one unprotected quote */
{
int i = 0 ; char *cr = cq - 1 ;
while (cr > cp && *cr == '\\')
{ i++ ; cr-- ; }
if ( i%2 == 0)
*cq-- = 0 ; /* discard */
}
while (cq > cp && (*cp == ' ' || *cq == '\t')) *cq-- = 0 ;
/* gobble the \ */
cp0 = cq = cp-- ;
while (*++cp)
switch (*cp)
{
case '\\':
if (*(cp+1) == '\\') { cp++ ; *cq++ = '\\' ; break ;}
if (*(cp+1) == '\n') { cp ++ ; break ; } /* skip backsalh-newline */
if (*(cp+1) == 'n') { cp ++ ; *cq++ = '\n' ; break ; }
break ;
default: *cq++ = *cp ;
}
*cq = 0 ; /* terminate the string */
return cp0 ;
}
char* freeprotect (char* text) /* freeword will read result back as text */
{
static Array a = 0 ;
char *cp, *cq ;
int base ;
/* code to make this efficiently reentrant */
if (a && text >= arrp(a,0,char) && text < arrp(a,arrayMax(a),char))
{ base = text - arrp(a,0,char) ;
( run in 0.973 second using v1.01-cache-2.11-cpan-39bf76dae61 )