home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 January
/
usenetsourcesnewsgroupsinfomagicjanuary1994.iso
/
sources
/
misc
/
volume32
/
xbbs
/
part06
/
bbscqust.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-09-08
|
11KB
|
320 lines
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/locking.h>
#include <sys/stat.h>
#include "bbscdef.h"
struct stat statbuf;
char QST_FILE[50];
/*
The following questionnaire commands are available for usage:
Command Description
! Output the rest of the line and wait for an input
^ Same as '!' except strlen of input must be > 0
@ Output the rest of the line and send a \n\r
& Same as '@' without a terminal \n\r
$ Input line
* Same as '$' except strlen of input must be > 0
% Output \n\r
Y || y Output line and set flag true if answer is a Y or y
N || n Output line and set flag true if answer is an N or n
{ Start conditional response based on flag = true
} End conditional response
/ Exit questionnaire - normally used as a conditional
statement
The COMMAND is in column one of line
*/
question(typeofqst)
int typeofqst;
{
int result, fds, var;
char *ptr;
var = FALSE;
result=change_qst(0, typeofqst);
if( result != 0)
{
portsout("\n\rThere is NO questionnaire today!\n\r");
return;
}
if((inbuf=fopen(QST_FILE,"r")) == NULL)
{
portsout("\n\rThat questionnaire was not found -- notify the sysop!\n\r");
return;
}
if((otbuf=fopen(ANSWER,"a+")) == NULL)
{
portsout("\n\rError opening answer file!\n\r");
exit (1);
}
fds = fileno(otbuf);
rewind (otbuf);
locking(fds, LK_LOCK, 0L);
lseek(fds, 0L, 2);
fprintf(otbuf,"%s\n","***********************************************");
fprintf(otbuf, "%s %s %s %s %s\n", w_fname, w_lname, week, date, ttime);
next_qloop:
while ((fgets(buf128, 80, inbuf)) != NULL )
{
strip(buf128);
if(buf128[0] == '$')
{
portsout("\n\r? ");
portsin(buf128,80);
fprintf(otbuf, "%s\n", buf128);
continue;
}
if(buf128[0] == '*')
{
while (1) {
portsout("\n\r? ");
portsin(buf128,80);
if( strlen(buf128) > 0 )
break;
portsout("\n\rInput is required.");
}
fprintf(otbuf, "%s\n", buf128);
continue;
}
if(buf128[0] == '!')
{
ptr = buf128 + 1;
portsout(CRLF);
portsout(ptr);
portsout(" ? ");
portsin(buf128,80);
fprintf(otbuf, "%s\n", buf128);
continue;
}
if(buf128[0] == '^')
{
ptr = buf128 + 1;
portsout(CRLF);
portsout(ptr);
portsout(" ? ");
while(1) {
portsin(buf128,80);
if( strlen(buf128) > 0 )
break;
portsout("\n\rInput is required.");
portsout("\n\r? ");
}
fprintf(otbuf, "%s\n", buf128);
continue;
}
if(buf128[0] == '@')
{
ptr = buf128 + 1;
portsout(CRLF);
portsout(ptr);
portsout(CRLF);
continue;
}
if(buf128[0] == '&')
{
ptr = buf128 + 1;
portsout(CRLF);
portsout(ptr);
continue;
}
if(buf128[0] == '%' )
{
portsout(CRLF);
continue;
}
if(buf128[0] == 'y' || buf128[0] == 'Y')
{
ptr = buf128 + 1;
portsout(CRLF);
portsout(ptr);
portsout(" ? ");
portsin(buf128,1);
if(buf128[0] == 'Y' || buf128[0] == 'y') var = TRUE;
else var = FALSE;
continue;
}
if(buf128[0] == 'n' || buf128[0] == 'N')
{
ptr = buf128 + 1;
portsout(CRLF);
portsout(ptr);
portsout(" ? ");
portsin(buf128,1);
if(buf128[0] == 'N' || buf128[0] == 'n') var = TRUE;
else var = FALSE;
continue;
}
if(buf128[0] == '/')
{
rewind(otbuf);
locking(fds, LK_UNLCK, 0L);
fclose(inbuf);
fclose(otbuf);
return;
}
if(buf128[0] == '{' && var == TRUE ) continue;
if(buf128[0] == '{')
{
while ((fgets(buf128, 80, inbuf)) != NULL )
{
strip(buf128);
if(buf128[0] == '}')
goto next_qloop;
}
rewind(otbuf);
locking(fds, LK_UNLCK, 0L);
fclose(inbuf);
fclose(otbuf);
return;
}
if(buf128[0] == '}') continue;
}
rewind(otbuf);
locking(fds, LK_UNLCK, 0L);
fclose(inbuf);
fclose(otbuf);
}
int set_yet_q = TRUE;
extern int user_priv;
int change_qst( type, typeofqst ) int type, typeofqst;
{
FILE *fpt, *fopen();
char *fgets(), *getenv();
char choice[4];
#ifndef SYSV
char dir_priv_ascii[7];
#endif
#ifdef SYSV
char dir_priv_ascii[20];
#endif
char *buf_ptr;
int line_cnt, ret, i;
int index_value, ptr;
int length;
do_again:
strcpy(buf128, QUESTION);
if ((fpt = fopen(buf128, "r")) == NULL) {
portsout("\n\rError Opening Questionnaire List: Notify Sysop!\n\r");
return (-1);
}
if(!type) {
portsout("\n\r Questionnaire Description \n\r");
portsout(" ============= ========================================== \n\r");
}
line_cnt = 0;
while (fpt) {
zfl(f_lines[line_cnt], 81);
if ((fgets(f_lines[line_cnt], 80, fpt)) == NULL) {
if (line_cnt == 0) {
portsout("\n\rEOF Unexpected in Questionnaire List: Notify Sysop!\n\r");
return (-1);
}
break; /* if not 1st line */
} /* end of if ((fgets)) */
if (line_cnt > 0) {
length = strlen(f_lines[line_cnt]);
length -= 57;
if(length > 6)
length = 6;
substr(f_lines[line_cnt], dir_priv_ascii, 57, length);
dir_priv[line_cnt] = atoi(dir_priv_ascii);
if (dir_priv[line_cnt] > user_priv)
goto next_read;
strcpy(who_am_i, f_lines[line_cnt]);
buf_ptr = who_am_i;
buf_ptr += 56;
for (ptr = 0; ptr < 6; ptr++)
*buf_ptr++ = ' ';
*buf_ptr='\0';
sprintf(buf128, "%2d) %s", line_cnt, who_am_i);
if(!type) {
strip(buf128);
term_space(buf128);
portsout(buf128);
portsout("\n\r");
}
}
next_read:
++line_cnt;
} /* end of while (fpt) */
if (line_cnt <= 1)
return;
if (set_yet_q && !type) {
portsout(CRLF);
if(!typeofqst)
portsout(" Q) Quit to Previous Menu");
}
if(!type)portsout(CRLF);
fclose(fpt);
if(!type)portsout(CRLF);
while (1) {
if(!type) {
portsout("Enter Selection ===> ");
if(!typeofqst)
portsin_cmp(choice, 2, "Qq");
else
portsin(choice, 2);
portsout(CRLF);
*choice = toupper(*choice);
if (*choice == 'Q' && set_yet_q && !typeofqst)
return (-1);
index_value = atoi(choice);
}
else index_value = type;
if (index_value > 0 && index_value < line_cnt) {
if (dir_priv[index_value] <= user_priv) {
parse2arg(f_lines[index_value]);
set_yet_q = TRUE;
return (0);
}
}
if( type != 0 ) {
type = 0;
portsout("\n\rInvalid Questionnaire request!\n\r");
goto do_again;
}
}
}
parse2arg(string)
char *string;
{
register char *file_ptr, *xptr;
register int i;
strcpy(QST_FILE, ORGPATH);
file_ptr = (QST_FILE + strlen(QST_FILE));
i = 0;
while (string[i] != ' ') {
*file_ptr = string[i];
++file_ptr;
++i;
}
*file_ptr = '\0';
strcpy(ANSWER, QST_FILE);
strcat(QST_FILE, ".qst");
strcat(ANSWER, ".ans");
}