proboard/QUESTION.CPP

417 lines
11 KiB
C++

#include <string.h>
#include <stdlib.h>
#include "proboard.hpp"
static
void near adjust_parms( char *s,
String *param )
{
char delimiter;
strip_linefeed( s );
for ( int i = 0; i < 4; i++ )
{
param[ i ].clear();
while( *s == ' ' &&
*s )
{
s++;
}
if ( *s == '\0' )
{
break;
}
if ( *s == '\"' )
{
delimiter = *s++;
}
else
{
delimiter = ' ';
}
for ( int j = 0;
*s != delimiter &&
(*s);
j++ )
{
param[ i ] << (*s++);
}
}
}
#define NUMCOMMANDS 18
void questionnaire( char *data )
{
char str[ 300 ];
char *commands[] = {
"ASK" ,
"CHANGECOLOR",
"OUTPUTANSWER",
"POSTINFO",
"QUIT",
"SETFLAG",
"CLEARSCREEN",
"DISPLAY",
"ENDIF",
"IF",
"GETCHOICE",
"CAPITALISE",
"DISPLAYFILE",
"EXEC",
"LISTANSWER",
"MENUCMND",
"SETSECURITY",
"WAITENTER"
};
String answers[ 30 ];
String param [ 4 ];
File qf;
FileName qafile( pb_curlang.questPath[ 0 ]
? pb_curlang.questPath
: syspath,data,
".Q-A" );
FileName aswfile( data, ".ASW" );
int i;
bool capitalise = FALSE;
if ( ! qf.open( qafile,
fmode_read | fmode_text ) )
{
if ( strcmpl( data, "NEWUSER" ) )
{
LOG( "File %s not found!", (char *) qafile );
io << "\n\n\1Scriptfile not found! "
<< S_PRESS_ENTER_TO_CONTINUE;
}
return;
}
LOG( 2, "Questionnaire: %s", data );
for ( ; ; )
{
if ( ! qf.readLine( str, 299 ) )
{
break;
}
adjust_parms( str, param );
for ( i = 0; i < NUMCOMMANDS; i++ )
{
if ( param[ 0 ] != commands[ i ] )
{
continue;
}
switch ( i )
{
case 0:
char s[ 80 ];
io.read( s,
atoi( param[ 1 ] ),
capitalise
? READMODE_UPFIRST
: 0 );
answers[ atoi( param[ 2 ] ) - 1 ] = s;
io << '\n';
break;
case 1:
io.color( atoi( param[ 1 ] ) );
break;
case 2:
File f( aswfile,
fmode_write |
fmode_append |
fmode_copen |
fmode_text );
if ( param[ 2 ][ 0 ] )
{
f << form( "%s%s\n",
(char *) param[ 1 ],
(char *) answers[ atoi( param[ 2 ] ) - 1 ] );
}
else
{
f << form( "%s\n",
(char *) answers[ atoi( param[ 1 ] ) - 1 ] );
}
break;
case 3:
{
Date date( TODAY );
Time time( NOW );
File f( aswfile,
fmode_write |
fmode_append |
fmode_copen |
fmode_text );
f << form( "*** %s completed questionnaire at %02d:%02d on %02d-%s-%02d ***\n",
user.name,
time[ 0 ],
time[ 1 ],
date[ 0 ],
months_short[ date[ 1 ] ],
date[ 2 ] % 100 ); // Y2K FIXED
// date[ 2 ] ); // Y2K BUG
}
break;
case 4:
return;
case 5:
int flag = -1;
strupr( param[ 1 ] );
if ( param[ 1 ][ 1 ] >= '1' &&
param[ 1 ][ 1 ] <= '8' )
{
switch ( param[ 1 ][ 0 ] )
{
case 'A':
flag = param[ 1 ][ 1 ] - '1' + 1;
break;
case 'B':
flag = param[ 1 ][ 1 ] - '1' + 9;
break;
case 'C':
flag = param[ 1 ][ 1 ] - '1' + 17;
break;
case 'D':
flag = param[ 1 ][ 1 ] - '1' + 25;
break;
}
}
else
{
if ( param[ 1 ][ 0 ] >= 'A' &&
param[ 1 ][ 0 ] <= 'Z')
{
flag = param[ 1 ][ 0 ] - 'A' + 1;
}
if ( param[ 1 ][ 0 ] >= '1' &&
param[ 1 ][ 0 ] <= '6' )
{
flag = param[ 1 ][ 0 ] - '1' + 27;
}
}
if ( flag < 1 ||
flag > 32 )
{
break;
}
if ( param[ 2 ] == "ON" )
{
user.aFlags.setflag( flag );
}
if ( param[ 2 ] == "OFF" )
{
user.aFlags.clearflag( flag );
}
updatemenu = TRUE;
break;
case 6:
io.cls();
break;
case 7:
for ( int i = 0; i < param[ 1 ].len(); i++ )
{
if ( param[ 1 ][ i ] == '|' )
{
param[ 1 ][ i ] = '\n';
}
}
io << param[ 1 ];
break;
case 9:
if ( answers[ atoi( param[ 1 ] ) - 1 ] == param[ 3 ] )
{
break;
}
do
{
if ( ! qf.readLine( str, 299 ) )
{
return;
}
adjust_parms( str, param );
}
while ( param[ 0 ] != commands[ 8 ] );
break;
case 10:
char c = io.wait( param[ 1 ] );
answers[ atoi( param[ 2 ] ) - 1 ] = String( c );
io << c
<< '\n';
break;
case 11:
if ( param[ 1 ] == "ON" )
{
capitalise = TRUE;
}
else
{
capitalise = FALSE;
}
break;
case 12:
showansasc( param[ 1 ] );
break;
case 13:
shell( param[ 1 ] );
break;
case 14:
io << (char *) answers[ atoi( param[ 1 ] ) - 1 ]
<< '\n';
break;
case 15:
( *( menufunctions[ atoi( param[ 1 ] ) ] ) ) ( param[ 2 ] );
break;
case 16:
user.level = atoi( param[ 1 ] );
updatemenu = TRUE;
break;
case 17:
io << "\t\n";
break;
}
}
}
}