AcePerl
view release on metacpan or search on metacpan
acelib/freesubs.c view on Meta::CPAN
BOOL freeselect (KEY *kpt, FREEOPT *options) /* like the old freemenu */
{
if (isInteractive)
printf ("%s > ",options[0].text) ;
freecard (0) ; /* just get a card */
if (isInteractive)
while (freestep ('?')) /* write out options list */
{ int i ;
for (i = 1 ; i <= options[0].key ; i++)
printf (" %s\n",options[i].text) ;
printf ("%s > ",options[0].text) ;
freecard (0) ;
}
return freekey (kpt,options) ;
}
/* same but returns TRUE, -1, if stremlevel drops below level */
BOOL freelevelselect (int level, KEY *kpt, FREEOPT *options) /* like the old freemenu */
{
if (isInteractive)
printf ("%s > ",options[0].text) ;
if (!freecard (level)) /* try to get another card */
{ *kpt = (KEY)(-1) ;
return TRUE ;
}
if (isInteractive)
while (freestep ('?')) /* write out options list */
{ int i ;
for (i = 1 ; i <= options[0].key ; i++)
printf (" %s\n",options[i].text) ;
printf ("%s > ",options[0].text) ;
if (!freecard (level)) /* try to get another card */
{ *kpt = (KEY)(-1) ;
return TRUE ;
}
}
return freekey (kpt,options) ;
}
/**************************************/
BOOL freequery (char *query)
{
if (isInteractive)
{ int retval, answer = 0 ;
printf ("%s (y or n) ",query) ;
answer = getchar () ;
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)
( run in 1.190 second using v1.01-cache-2.11-cpan-6aa56a78535 )