AcePerl
view release on metacpan or search on metacpan
acelib/freesubs.c view on Meta::CPAN
retval = (answer == 'y' || answer == 'Y') ? TRUE : FALSE ;
while (answer != (unsigned char) EOF &&
answer != -1 && /* mieg: used not to break on EOF in pipes */
answer != '\n')
answer = getchar () ;
return retval ;
}
else
return TRUE ;
}
/**********/
BOOL freeprompt (char *prompt, char *dfault, char *fmt)
{
if (isInteractive)
printf("%s ? > ",prompt);
freecard (0) ; /* just get a card */
if (freecheck (fmt))
return TRUE ;
else
{ messout ("input mismatch : format '%s' expected, card was\n%s",
fmt, card) ;
return FALSE ;
}
}
/*************************************/
int freefmtlength (char *fmt)
{char *cp ;
int length = 0 ;
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,
( run in 0.507 second using v1.01-cache-2.11-cpan-0bb4e1dffa6 )