AcePerl
view release on metacpan or search on metacpan
acelib/freesubs.c view on Meta::CPAN
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) ;
array (a, base+3*(1+strlen(text)), char) = 0 ; /* ensure long enough */
text = arrp(a,0,char) + base ; /* may have relocated */
base += 1 + strlen(text) ;
}
else
{ a = arrayReCreate (a, 128, char) ;
base = 0 ;
array (a, 2*(1+strlen(text)), char) = 0 ; /* ensure long enough */
}
cq = arrp (a, base, char) ;
*cq++ = '"' ;
for (cp = text ; *cp ; *cq++ = *cp++)
{ if (*cp == '\\' || *cp == '"' || /* protect these */
*cp == '/' || *cp == '%' || *cp == ';' ||
*cp == '\t' || *cp == '\n')
*cq++ = '\\' ;
if (*cp == '\n') {*cq++ = 'n' ; *cq++ = '\\' ; } /* -> /n/n (text then real) */
}
*cq++ = '"' ;
*cq = 0 ;
return arrp (a, base, char) ;
}
char* freejavaprotect (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) ;
array (a, base+3*(1+strlen(text)), char) = 0 ; /* ensure long enough */
text = arrp(a,0,char) + base ; /* may have relocated */
base += 1 + strlen(text) ;
}
else
{ a = arrayReCreate (a, 128, char) ;
base = 0 ;
array (a, 2*(1+strlen(text)), char) = 0 ; /* ensure long enough */
}
cq = arrp (a, base, char) ;
cp = text;
#ifdef JUNK
while (*cp) {
if (*cp == '\t' || *cp == '\n' || *cp == '\r') {
*cq++ = '\\' ;
switch (*cp) {
case '\t':
*cq++ = 't';
break;
case '\n':
*cq++ = 'n';
break;
case '\r':
*cq++ = 'r';
break;
default:
;
}
cp++; /* skip this character */
}
else {
if (*cp == '?') *cq++ = '\\';
*cq++ = *cp++;
}
}
#endif
while (*cp)
switch (*cp)
{
case '\n':
*cq++ = '\\';
*cq++ = 'n';
cp++;
break;
case '\\': case '?':
*cq++ = '\\' ;
/* fall thru */
default:
*cq++ = *cp++;
}
*cq = 0 ;
return arrp (a, base, char) ;
}
/*********** end of file *****************/
( run in 1.221 second using v1.01-cache-2.11-cpan-71847e10f99 )