#define BBSTYPE 1
#define BBSVERSION 2
#define SYSOPNAME 3
#define SYSOPHANDLE 4
#define BBSPATH 5
#define DTERATE 6
#define BPSRATE 7
#define PORTNAME 8
#define PORTHANDLE 9
#define PARITY 10
#define DATABITS 11
#define STOPBITS 12
#define LINENUMBER 13
#define USERNUMBER 14
#define NAME 15
#define HANDLE 16
#define ADDRESS 17
#define CITY 18
#define STATE 19
#define ZIPCODE 20
#define COUNTRY 21
#define HOMEPHONE 22
#define DATAPHONE 23
#define FAXPHONE 24
#define BUSPHONE 25
#define PASSWORD 26
#define PASSNUMBER 27
#define SECNUM 28
#define SECNAME 29
#define TIMESON 30
#define DATELASTON 31
#define TIMELASTON 32
#define TIMEON 33 // not to be confused with TIMESON
#define SECSLEFT 34
#define MINSLEFT 35
#define EXPIREDATE 36
#define SCREENLENGTH 37
#define SCREENWIDTH 38
#define BIRTHDAY 39
#define CONFERENCE 40
#define PROTOCOL 41
#define UPLOADS 42
#define DOWNLOADS 43
#define DLTODAY 44
#define MAXDLTODAY 45
#define DLKTODAY 46
#define MAXDLKTODAY 47
#define ULTODAY 48
#define MAXULTODAY 49
#define ULKTODAY 50
#define MAXULKTODAY 51
#define ULBYTES 52
#define DLBYTES 53
#define ULKBYTES 54
#define DLKBYTES 55
#define EVENTTIME 56
#define LASTNEWFILESCAN 57
#define TIMECREDIT 58
#define TIMESPOSTED 59
#define COMMENT 60
#define LOCAL 61
#define LOCKING 62
#define DISPLAY 63
#define PRINTER 64
#define SYSOPPAGE 65
#define EXPERT 66
#define NOVICE 67
#define ARQCONNECT 68
#define ANSICOLOR 69
#define ANSIMONO 70
#define HIGHASCII 71
#define MSGAREA 72
#define FILEAREA 73
#define FOSSIL 74
#define BBSNAME 75
#define SYSOP 76
#define BANKTIME 77
typedef struct _KEYWORD
{
char *Name;
int Number;
} KEYWORD, *PKEYWORD;
KEYWORD KeyWord[] =
{
"SessionInfoKeywords", 0,
"BBSTYPE", BBSTYPE,
"BBSVERSION", BBSVERSION,
"SYSOPNAME", SYSOPNAME,
"SYSOPHANDLE", SYSOPHANDLE,
"BBSPATH", BBSPATH,
"DTERATE", DTERATE,
"BPSRATE", BPSRATE,
"PORTNAME", PORTNAME,
"PORTHANDLE", PORTHANDLE,
"PARITY", PARITY,
"DATABITS", DATABITS,
"STOPBITS", STOPBITS,
"LINENUMBER", LINENUMBER,
"USERNUMBER", USERNUMBER,
"NAME", NAME,
"HANDLE", HANDLE,
"ADDRESS", ADDRESS,
"CITY", CITY,
"STATE", STATE,
"ZIPCODE", ZIPCODE,
"COUNTRY", COUNTRY,
"HOMEPHONE", HOMEPHONE,
"DATAPHONE", DATAPHONE,
"FAXPHONE", FAXPHONE,
"BUSPHONE", BUSPHONE,
"PASSWORD", PASSWORD,
"PASSNUMBER", PASSNUMBER,
"SECNUM", SECNUM,
"SECNAME", SECNAME,
"TIMESON", TIMESON,
"DATELASTON", DATELASTON,
"TIMELASTON", TIMELASTON,
"TIMEON", TIMEON,
"SECSLEFT", SECSLEFT,
"MINSLEFT", MINSLEFT,
"EXPIREDATE", EXPIREDATE,
"SCREENLENGTH", SCREENLENGTH,
"SCREENWIDTH", SCREENWIDTH,
"BIRTHDAY", BIRTHDAY,
"CONFERENCE", CONFERENCE,
"PROTOCOL", PROTOCOL,
"UPLOADS", UPLOADS,
"DOWNLOADS", DOWNLOADS,
"DLTODAY", DLTODAY,
"MAXDLTODAY", MAXDLTODAY,
"DLKTODAY", DLKTODAY,
"MAXDLKTODAY", MAXDLKTODAY,
"ULTODAY", ULTODAY,
"MAXULTODAY", MAXULTODAY,
"ULKTODAY", ULKTODAY,
"MAXULKTODAY", MAXULKTODAY,
"ULBYTES", ULBYTES,
"DLBYTES", DLBYTES,
"ULKBYTES", ULKBYTES,
"DLKBYTES", DLKBYTES,
"EVENTTIME", EVENTTIME,
"LASTNEWFILESCAN", LASTNEWFILESCAN,
"TIMECREDIT", TIMECREDIT,
"TIMESPOSTED", TIMESPOSTED,
"COMMENT", COMMENT,
"LOCAL", LOCAL,
"LOCKING", LOCKING,
"DISPLAY", DISPLAY,
"PRINTER", PRINTER,
"SYSOPPAGE", SYSOPPAGE,
"EXPERT", EXPERT,
"NOVICE", NOVICE,
"ARQCONNECT", ARQCONNECT,
"ANSICOLOR", ANSICOLOR,
"ANSIMONO", ANSIMONO,
"HIGHASCII", HIGHASCII,
"MSGAREA", MSGAREA,
"FILEAREA", FILEAREA,
"FOSSIL", FOSSIL,
"BBSNAME", BBSNAME,
"SYSOP", SYSOP,
"BANKTIME", BANKTIME,
NULL, 0
};
#define NUMKEYWORDS (sizeof(KeyWord)/sizeof(KEYWORD))
char *SkipWhiteSpace(char *String);
char *SkipNonWhiteSpace(char *String);
// goes thru keyword table looking for the keyword 'Lookfor'
// returns number of keyword, or 0 if keyword is not found.
int LookupKeyword(char *Lookfor)
{
int KeywordIndex = 1;
while (KeyWord[KeywordIndex].Name)
{
if (! stricmp(KeyWord[KeywordIndex].Name, Lookfor))
return (KeyWord[KeywordIndex].Number);
KeywordIndex++;
}
return (0);
}
// given the filename 'SessionInfoName'
// this function reads in the file and
// assigns variables of your choice with
// the info. Since this is an example
// the actual variables are not shown.
int ReadSessionInfo(char *SessionInfoName)
{
FILE *SessionInfoHandle;
char Input[301];
int Key;
char *Keyword;
char *Data;
char *NewLine;
SessionInfoHandle = _fsopen(SessionInfoName, "rt", SH_DENYNO);
if (SessionInfoHandle == NULL)
{
printf("SessionInfo file '%s' not found!\n", SessionInfoName);
return (-1);
}
while (! eof(SessionInfoHandle))
{
if (! fgets(Input, 301, SessionInfoHandle))
break;
if (*Input == ';')
{
// comment line
continue;
}
NewLine = strchr(Input, '\n');
if (NewLine)
*NewLine = '\0';
/**************************************************
on a return from a door, a BBS program
will want to check for a '!' which neans
the data has changed. It may also skip any data
that has not changed
(this code probably not needed for a door program)
if (*Input == '!')
{
// keyword starts on second char
Keyword = Input + 1;
}
else
{
// this line has not changed
continue;
}
***************************************************/
Keyword = Input;
Data = SkipNonWhiteSpace(Keyword);
if (*Data)
{
*Data++ = '\0';
Data = SkipWhiteSpace(Data);
// Data now points to data!
}
Key = LookupKeyword(Keyword);
switch (Key)
{
case BBSTYPE:
// assign BBS type
break;
case BBSVERSION:
// assign BBS version
break;
case BBSNAME:
// assign BBS name
break;
case SYSOPNAME:
// assign SysOp name
break;
//
//
//
// ETC. you need only look for and accept the data you want.
//
//
//
case FOSSIL
// assign FOSSIL boolean
break;
default:
printf("Key '%s' not used\n", Keyword);
break;
}
}
fclose(SessionInfoHandle);
return (0);
}
char *SkipWhiteSpace(char *String)
{
char *p = String;
while (*p == ' ' || *p == '\t')
p++;
return (p);
}
char *SkipNonWhiteSpace(char *String)
{
char *p = String;
while (*p && *p != ' ' && *p != '\t')
p++;
return (p);
}