AcePerl
view release on metacpan or search on metacpan
acelib/freesubs.c view on Meta::CPAN
continue ;
case '/': /* // means start of comment */
if ((ch = _FREECHAR) == '/')
{ while ((ch = _FREECHAR) != '\n' && ch != (unsigned char)EOF) ;
goto got_line ;
}
else
{ if (isecho) putchar (*in) ;
if (currfil) /* push back ch */
ungetc (ch, currfil) ;
else
--currtext ;
}
break ;
case '%': /* possible parameter */
--in ; kpar = 0 ;
while (isdigit (ch = _FREECHAR))
kpar = kpar*10 + (ch - '0') ;
if (kpar > 0 && kpar <= stream[streamlevel].npar)
for (cp = (unsigned char *) stackText (parStack,
stream[streamlevel].parMark[kpar-1]) ; *cp ; ++cp)
{ if (++in >= cardEnd)
freeExtend (&in) ;
*in = *cp ;
if (isecho)
putchar (*in) ;
}
else
messout ("Parameter %%%d can not be substituted", kpar) ;
if (++in >= cardEnd)
freeExtend (&in) ;
*in = ch ;
goto lao ; /* mieg */
case '\\': /* escapes next character - interprets \n */
*in = _FREECHAR ;
if (*in == '\n') /* fold continuation lines */
{ if (isInteractive && !streamlevel)
printf (" Continuation >") ;
while ((ch = _FREECHAR) == ' ' || ch == '\t') ;
/* remove whitespace at start of next line */
if (currfil) /* push back ch */
ungetc (ch, currfil) ;
else
--currtext ;
stream[streamlevel].line++ ;
--in ;
}
#if !defined(WIN32)
else if (*in == 'n') /* reinterpret \n as a format */
{ *in = '\n' ;
}
#endif
else /* keep the \ till freeword is called */
{ *(in+1) = *in ;
*in = '\\' ;
if (++in >= cardEnd)
freeExtend (&in) ;
}
break ;
default:
messerror ("freesubs got unrecognised special character 0x%x = %c\n",
*in, *in) ;
}
else
{ if (!isprint(*in) && *in != '\t' && *in != '\n') /* mieg dec 15 94 */
--in ;
else if (isecho) /* write it out */
putchar (*in) ;
}
} /* while TRUE loop */
got_line:
stream[streamlevel].line++ ;
*in = 0 ;
if (isecho)
putchar ('\n') ;
pos = card ;
_losewhite ;
if (acceptCommand && _stepover ('@')) /* command file */
{ char *name ;
if ((name = freeword ()) &&
(fil = filopen (name, 0, "r")))
freesetfile (fil, (char*) pos) ;
goto restart ;
}
if (acceptShell && _stepover ('$')) /* shell command */
{
#if !defined(MACINTOSH)
system ((char*)pos) ;
#endif
goto restart ;
}
return (char*) card ;
}
/************************************************/
void freecardback (void) /* goes back one card */
{ stream[streamlevel].line-- ;
freesettext ((char*) card, "") ;
}
/************************************************/
BOOL freeread (FILE *fil) /* reads card from fil */
{
unsigned char ch, *in = card ;
int *line, chint ;
if (!assFind (filAss, fil, &line))
{ line = (int*) messalloc (sizeof (int)) ;
assInsert (filAss, fil, line) ;
}
--in ;
while (TRUE)
{ ++in ;
if (in >= cardEnd)
freeExtend (&in) ;
chint = getc(fil) ;
if (ferror(fil))
messerror ("chint was bad");
*in = chint ;
switch (*in)
{
case '\n' :
++*line ;
case (unsigned char) EOF :
goto got_line ;
case '/' : /* // means start of comment */
if ((ch = getc (fil)) == '/')
{ while (getc(fil) != '\n' && !feof(fil)) ;
++*line ;
if (in > card) /* // at start of line ignores line */
goto got_line ;
else
--in ; /* in = 0 unprintable, so backstepped */
}
else
ungetc (ch,fil) ;
break ;
case '\\' : /* escape next character */
*in = getc(fil) ;
if (*in == '\n') /* continuation */
{ ++*line ;
while (isspace (*in = getc(fil))) ; /* remove whitespace */
}
else if (*in == '"' || *in == '\\') /* escape for freeword */
{ *(in+1) = *in ;
*in = '\\' ;
++in ;
}
/* NB fall through - in case next char is nonprinting */
default:
if (!isprint (*in) && *in != '\t') /* ignore control chars, e.g. \x0d */
--in ;
}
}
got_line :
*in = 0 ;
pos = card ;
_losewhite ;
if (feof(fil))
{ assRemove (filAss, fil) ;
messfree (line) ;
}
return *pos || !feof(fil) ;
}
int freeline (FILE *fil)
{ int *line ;
if (assFind (filAss, fil, &line))
return *line ;
else
return 0 ;
}
int freestreamline (int level)
{
return stream[level].line ;
acelib/freesubs.c view on Meta::CPAN
if (isdigit((int)*fmt))
{sscanf (fmt,"%d",&length) ;
return length ;
}
for (cp = fmt ; *cp ; ++cp)
switch (*cp)
{
case 'i' : case 'f' : case 'd' : length += 8 ; break ;
case 'w' : length += 32 ; break ;
case 't' : length += 80 ; break ;
case 'o' :
if (*++cp)
messcrash ("'o' can not end free format %s",fmt) ;
length += 2 ; break ;
}
if (!length)
length = 40 ;
return length ;
}
/****************/
BOOL freecheck (char *fmt)
/* checks that whatever is in card fits specified format
note that 't' format option changes card by inserting a '"' */
{unsigned char *keep = pos ;
union {int i ; float r ; double d ;}
target ;
char *fp ;
unsigned char *start ;
int nquote = 1 ;
for (fp = fmt ; *fp ; ++fp)
switch (*fp)
{
case 'w' : if (freeword ()) break ; else goto retFALSE ;
case 'i' : if (freeint (&target.i)) break ; else goto retFALSE ;
case 'f' : if (freefloat (&target.r)) break ; else goto retFALSE ;
case 'd' : if (freedouble (&target.d)) break ; else goto retFALSE ;
case 't' : /* must insert '"' and escape any remaining '"'s or '\'s */
for (start = pos ; *pos ; ++pos)
if (*pos == '"' || *pos == '\\')
++nquote ;
*(pos+nquote+1) = '"' ; /* end of line */
for ( ; pos >= start ; --pos)
{ *(pos + nquote) = *pos ;
if (*pos == '"' || *pos == '\\')
*(pos + --nquote) = '\\' ;
}
*start = '"' ;
goto retTRUE ;
case 'z' : if (freeword ()) goto retFALSE ; else goto retTRUE ;
case 'o' :
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);
}
( run in 0.809 second using v1.01-cache-2.11-cpan-39bf76dae61 )