|
|
1.1 root 1: #line 1 "INITDATA.C"
2:
3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
4:
5: /**************************************************************************/
6: /* This file contains the function initdata() and its exclusive functions */
7: /**************************************************************************/
8:
9: #include "sbbs.h"
10:
11: /****************************************************************/
12: /* Prototypes of functions that are called only by initdata() */
13: /****************************************************************/
14: void md(char *path);
15: char *readtext(long *line, FILE *stream);
16:
17: /****************************************************************************/
18: /* Initializes system and node configuration information and data variables */
19: /****************************************************************************/
20: void initdata()
21: {
22: char str[256],str2[LEN_ALIAS+1],fname[13];
23: int file;
24: uint i,j;
25: long l,line=0L;
26: FILE *instream;
27: read_cfg_text_t txt;
28:
29: txt.openerr="\7\r\nError opening %s for read.\r\n";
30: txt.reading="\r\nReading %s...";
31: txt.readit="\rRead %s ";
32: txt.allocerr="\7\r\nError allocating %u bytes of memory\r\n";
33: txt.error="\7\r\nERROR: Offset %lu in %s\r\n\r\n";
34:
35: read_node_cfg(txt);
36: read_main_cfg(txt);
37: read_msgs_cfg(txt);
38: read_file_cfg(txt);
39: read_xtrn_cfg(txt);
40: read_chat_cfg(txt);
41: read_attr_cfg(txt);
42:
43: strcpy(fname,"TEXT.DAT");
44: sprintf(str,"%s%s",ctrl_dir,fname);
45: if((instream=fnopen(&file,str,O_RDONLY))==NULL) {
46: lprintf(txt.openerr,str);
47: bail(1); }
48: lprintf(txt.reading,fname);
49: for(i=0;i<TOTAL_TEXT && !feof(instream) && !ferror(instream);i++)
50: if((text[i]=text_sav[i]=readtext(&line,instream))==NULL)
51: i--;
52: if(i<TOTAL_TEXT) {
53: lprintf(txt.error,line,fname);
54: lprintf("Less than TOTAL_TEXT (%u) strings defined in %s\r\n"
55: ,TOTAL_TEXT,fname);
56: bail(1); }
57: /****************************/
58: /* Read in static text data */
59: /****************************/
60: fclose(instream);
61: lprintf(txt.readit,fname);
62:
63: strcpy(str,temp_dir);
64: if(strcmp(str+1,":\\")) /* not root directory */
65: str[strlen(str)-1]=0; /* chop off '\' */
66: md(str);
67:
68: for(i=0;i<=sys_nodes;i++) {
69: sprintf(str,"%sDSTS.DAB",i ? node_path[i-1] : ctrl_dir);
70: if(flength(str)<DSTSDABLEN) {
71: if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) {
72: lprintf("\7\r\nError creating %s\r\n",str);
73: bail(1); }
74: while(filelength(file)<DSTSDABLEN)
75: if(write(file,"\0",1)!=1)
76: break; /* Create NULL system dsts.dab */
77: close(file); } }
78:
79: j=0;
80: sprintf(str,"%sUSER\\USER.DAT",data_dir);
81: if((l=flength(str))>0L) {
82: if(l%U_LEN) {
83: lprintf("\7\r\n%s is not evenly divisable by U_LEN (%d)\r\n"
84: ,str,U_LEN);
85: bail(1); }
86: j=lastuser(); }
87: if(node_valuser>j) /* j still equals last user */
88: node_valuser=1;
89: sys_status|=SS_INITIAL;
90: #ifdef __MSDOS__
91: freedosmem=farcoreleft();
92: #endif
93: }
94:
95: /****************************************************************************/
96: /* If the directory 'path' doesn't exist, create it. */
97: /****************************************************************************/
98: void md(char *path)
99: {
100: struct ffblk ff;
101:
102: if(findfirst(path,&ff,FA_DIREC)) {
103: lprintf("\r\nCreating Directory %s... ",path);
104: if(mkdir(path)) {
105: lprintf("\7failed!\r\nFix configuration or make directory by "
106: "hand.\r\n");
107: bail(1); }
108: lputs(crlf); }
109: }
110:
111: /****************************************************************************/
112: /* Reads special TEXT.DAT printf style text lines, splicing multiple lines, */
113: /* replacing escaped characters, and allocating the memory */
114: /****************************************************************************/
115: char *readtext(long *line,FILE *stream)
116: {
117: char buf[2048],str[2048],*p,*p2;
118: int i,j,k;
119:
120: if(!fgets(buf,256,stream))
121: return(NULL);
122: if(line)
123: (*line)++;
124: if(buf[0]=='#')
125: return(NULL);
126: p=strrchr(buf,'"');
127: if(!p) {
128: if(line) {
129: lprintf("\7\r\nNo quotation marks in line %d of TEXT.DAT\r\n",*line);
130: bail(1); }
131: return(NULL); }
132: if(*(p+1)=='\\') /* merge multiple lines */
133: while(strlen(buf)<2000) {
134: if(!fgets(str,255,stream))
135: return(NULL);
136: if(line)
137: (*line)++;
138: p2=strchr(str,'"');
139: if(!p2)
140: continue;
141: strcpy(p,p2+1);
142: p=strrchr(p,'"');
143: if(p && *(p+1)=='\\')
144: continue;
145: break; }
146: *(p)=0;
147: k=strlen(buf);
148: for(i=1,j=0;i<k;j++) {
149: if(buf[i]=='\\') { /* escape */
150: i++;
151: if(isdigit(buf[i])) {
152: str[j]=atoi(buf+i); /* decimal, NOT octal */
153: if(isdigit(buf[++i])) /* skip up to 3 digits */
154: if(isdigit(buf[++i]))
155: i++;
156: continue; }
157: switch(buf[i++]) {
158: case '\\':
159: str[j]='\\';
160: break;
161: case '?':
162: str[j]='?';
163: break;
164: case 'x':
165: tmp[0]=buf[i++]; /* skip next character */
166: tmp[1]=0;
167: if(isxdigit(buf[i])) { /* if another hex digit, skip too */
168: tmp[1]=buf[i++];
169: tmp[2]=0; }
170: str[j]=(char)ahtoul(tmp);
171: break;
172: case '\'':
173: str[j]='\'';
174: break;
175: case '"':
176: str[j]='"';
177: break;
178: case 'r':
179: str[j]=CR;
180: break;
181: case 'n':
182: str[j]=LF;
183: break;
184: case 't':
185: str[j]=TAB;
186: break;
187: case 'b':
188: str[j]=BS;
189: break;
190: case 'a':
191: str[j]=7; /* BEL */
192: break;
193: case 'f':
194: str[j]=FF;
195: break;
196: case 'v':
197: str[j]=11; /* VT */
198: break;
199: default:
200: str[j]=buf[i];
201: break; }
202: continue; }
203: str[j]=buf[i++]; }
204: str[j]=0;
205: if((p=(char *)MALLOC(j+1))==NULL) {
206: lprintf("\7\r\nError allocating %u bytes of memory from TEXT.DAT\r\n",j);
207: bail(1); }
208: strcpy(p,str);
209: return(p);
210: }
211:
212: /****************************************************************************/
213: /* Reads in ATTR.CFG and initializes the associated variables */
214: /****************************************************************************/
215: void read_attr_cfg(read_cfg_text_t txt)
216: {
217: char str[256],fname[13];
218: int file,i;
219: long offset=0;
220: FILE *instream;
221:
222: strcpy(fname,"ATTR.CFG");
223: sprintf(str,"%s%s",ctrl_dir,fname);
224: if((instream=fnopen(&file,str,O_RDONLY))==NULL) {
225: lprintf(txt.openerr,str);
226: bail(1); }
227: lprintf(txt.reading,fname);
228: for(i=0;i<TOTAL_COLORS && !feof(instream) && !ferror(instream);i++) {
229: readline(&offset,str,4,instream);
230: color[i]=attrstr(str); }
231: if(i<TOTAL_COLORS) {
232: lprintf(txt.error,offset,fname);
233: lprintf("Less than TOTAL_COLORS (%u) defined in %s\r\n"
234: ,TOTAL_COLORS,fname);
235: bail(1); }
236: fclose(instream);
237: lprintf(txt.readit,fname);
238: }
239:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.