|
|
2.30b OS/2
#line 1 "INITDATA.C"
/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
/**************************************************************************/
/* This file contains the function initdata() and its exclusive functions */
/**************************************************************************/
#include "sbbs.h"
/****************************************************************/
/* Prototypes of functions that are called only by initdata() */
/****************************************************************/
void md(char *path);
char *readtext(long *line, FILE *stream);
/****************************************************************************/
/* Initializes system and node configuration information and data variables */
/****************************************************************************/
void initdata()
{
char str[256],str2[LEN_ALIAS+1],fname[13];
int file;
uint i,j;
long l,line=0L;
FILE *instream;
read_cfg_text_t txt;
txt.openerr="\7\r\nError opening %s for read.\r\n";
txt.reading="\r\nReading %s...";
txt.readit="\rRead %s ";
txt.allocerr="\7\r\nError allocating %u bytes of memory\r\n";
txt.error="\7\r\nERROR: Offset %lu in %s\r\n\r\n";
read_node_cfg(txt);
read_main_cfg(txt);
read_msgs_cfg(txt);
read_file_cfg(txt);
read_xtrn_cfg(txt);
read_chat_cfg(txt);
read_attr_cfg(txt);
strcpy(fname,"TEXT.DAT");
sprintf(str,"%s%s",ctrl_dir,fname);
if((instream=fnopen(&file,str,O_RDONLY))==NULL) {
lprintf(txt.openerr,str);
bail(1); }
lprintf(txt.reading,fname);
for(i=0;i<TOTAL_TEXT && !feof(instream) && !ferror(instream);i++)
if((text[i]=text_sav[i]=readtext(&line,instream))==NULL)
i--;
if(i<TOTAL_TEXT) {
lprintf(txt.error,line,fname);
lprintf("Less than TOTAL_TEXT (%u) strings defined in %s\r\n"
,TOTAL_TEXT,fname);
bail(1); }
/****************************/
/* Read in static text data */
/****************************/
fclose(instream);
lprintf(txt.readit,fname);
strcpy(str,temp_dir);
if(strcmp(str+1,":\\")) /* not root directory */
str[strlen(str)-1]=0; /* chop off '\' */
md(str);
for(i=0;i<=sys_nodes;i++) {
sprintf(str,"%sDSTS.DAB",i ? node_path[i-1] : ctrl_dir);
if(flength(str)<DSTSDABLEN) {
if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) {
lprintf("\7\r\nError creating %s\r\n",str);
bail(1); }
while(filelength(file)<DSTSDABLEN)
if(write(file,"\0",1)!=1)
break; /* Create NULL system dsts.dab */
close(file); } }
j=0;
sprintf(str,"%sUSER\\USER.DAT",data_dir);
if((l=flength(str))>0L) {
if(l%U_LEN) {
lprintf("\7\r\n%s is not evenly divisable by U_LEN (%d)\r\n"
,str,U_LEN);
bail(1); }
j=lastuser(); }
if(node_valuser>j) /* j still equals last user */
node_valuser=1;
sys_status|=SS_INITIAL;
#ifdef __MSDOS__
freedosmem=farcoreleft();
#endif
}
/****************************************************************************/
/* If the directory 'path' doesn't exist, create it. */
/****************************************************************************/
void md(char *path)
{
struct ffblk ff;
if(findfirst(path,&ff,FA_DIREC)) {
lprintf("\r\nCreating Directory %s... ",path);
if(mkdir(path)) {
lprintf("\7failed!\r\nFix configuration or make directory by "
"hand.\r\n");
bail(1); }
lputs(crlf); }
}
/****************************************************************************/
/* Reads special TEXT.DAT printf style text lines, splicing multiple lines, */
/* replacing escaped characters, and allocating the memory */
/****************************************************************************/
char *readtext(long *line,FILE *stream)
{
char buf[2048],str[2048],*p,*p2;
int i,j,k;
if(!fgets(buf,256,stream))
return(NULL);
if(line)
(*line)++;
if(buf[0]=='#')
return(NULL);
p=strrchr(buf,'"');
if(!p) {
if(line) {
lprintf("\7\r\nNo quotation marks in line %d of TEXT.DAT\r\n",*line);
bail(1); }
return(NULL); }
if(*(p+1)=='\\') /* merge multiple lines */
while(strlen(buf)<2000) {
if(!fgets(str,255,stream))
return(NULL);
if(line)
(*line)++;
p2=strchr(str,'"');
if(!p2)
continue;
strcpy(p,p2+1);
p=strrchr(p,'"');
if(p && *(p+1)=='\\')
continue;
break; }
*(p)=0;
k=strlen(buf);
for(i=1,j=0;i<k;j++) {
if(buf[i]=='\\') { /* escape */
i++;
if(isdigit(buf[i])) {
str[j]=atoi(buf+i); /* decimal, NOT octal */
if(isdigit(buf[++i])) /* skip up to 3 digits */
if(isdigit(buf[++i]))
i++;
continue; }
switch(buf[i++]) {
case '\\':
str[j]='\\';
break;
case '?':
str[j]='?';
break;
case 'x':
tmp[0]=buf[i++]; /* skip next character */
tmp[1]=0;
if(isxdigit(buf[i])) { /* if another hex digit, skip too */
tmp[1]=buf[i++];
tmp[2]=0; }
str[j]=(char)ahtoul(tmp);
break;
case '\'':
str[j]='\'';
break;
case '"':
str[j]='"';
break;
case 'r':
str[j]=CR;
break;
case 'n':
str[j]=LF;
break;
case 't':
str[j]=TAB;
break;
case 'b':
str[j]=BS;
break;
case 'a':
str[j]=7; /* BEL */
break;
case 'f':
str[j]=FF;
break;
case 'v':
str[j]=11; /* VT */
break;
default:
str[j]=buf[i];
break; }
continue; }
str[j]=buf[i++]; }
str[j]=0;
if((p=(char *)MALLOC(j+1))==NULL) {
lprintf("\7\r\nError allocating %u bytes of memory from TEXT.DAT\r\n",j);
bail(1); }
strcpy(p,str);
return(p);
}
/****************************************************************************/
/* Reads in ATTR.CFG and initializes the associated variables */
/****************************************************************************/
void read_attr_cfg(read_cfg_text_t txt)
{
char str[256],fname[13];
int file,i;
long offset=0;
FILE *instream;
strcpy(fname,"ATTR.CFG");
sprintf(str,"%s%s",ctrl_dir,fname);
if((instream=fnopen(&file,str,O_RDONLY))==NULL) {
lprintf(txt.openerr,str);
bail(1); }
lprintf(txt.reading,fname);
for(i=0;i<TOTAL_COLORS && !feof(instream) && !ferror(instream);i++) {
readline(&offset,str,4,instream);
color[i]=attrstr(str); }
if(i<TOTAL_COLORS) {
lprintf(txt.error,offset,fname);
lprintf("Less than TOTAL_COLORS (%u) defined in %s\r\n"
,TOTAL_COLORS,fname);
bail(1); }
fclose(instream);
lprintf(txt.readit,fname);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.