|
|
1.1 root 1: #line 1 "SCFGLIB2.C"
2:
3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
4:
5: #include "sbbs.h"
6: #include "scfglib.h"
7:
8: #ifdef SCFG /* SCFG allocate max length */
9: #define readline_alloc(l,s,m,i) readline(l,s,m,i)
10: #else
11: char *readline_alloc(long *offset, char *outstr, int maxline
12: , FILE *instream);
13: #define readline_alloc(l,s,m,i) s=readline_alloc(l,s,m,i)
14: #define get_alloc(o,s,l,i) s=get_alloc(o,s,l,i)
15: #endif
16:
17:
18: #ifndef NO_FILE_CFG
19:
20: /****************************************************************************/
21: /* Reads in LIBS.CNF and initializes the associated variables */
22: /****************************************************************************/
23: void read_file_cfg(read_cfg_text_t txt)
24: {
25: char str[256],fname[13],c,cmd[LEN_CMD+1];
26: int file;
27: short i,j,k,l,n;
28: long offset=0,t;
29: FILE *instream;
30:
31: #ifndef SCFG
32:
33: sprintf(data_dir_dirs,"%sDIRS\\",data_dir);
34:
35: #endif
36:
37: strcpy(fname,"FILE.CNF");
38: sprintf(str,"%s%s",ctrl_dir,fname);
39: if((instream=fnopen(&file,str,O_RDONLY))==NULL) {
40: lprintf(txt.openerr,str);
41: bail(1); }
42:
43: lprintf(txt.reading,fname);
44:
45: get_int(min_dspace,instream);
46: get_int(max_batup,instream);
47:
48: #ifdef SBBS
49: if(max_batup) {
50: if((batup_desc=(char **)MALLOC(sizeof(char *)*max_batup))==NULL)
51: allocerr(txt,offset,fname,sizeof(char *)*max_batup);
52: if((batup_name=(char **)MALLOC(sizeof(char *)*max_batup))==NULL)
53: allocerr(txt,offset,fname,sizeof(char *)*max_batup);
54: if((batup_misc=(char *)MALLOC(sizeof(char)*max_batup))==NULL)
55: allocerr(txt,offset,fname,sizeof(char)*max_batup);
56: if((batup_dir=(uint *)MALLOC(sizeof(uint)*max_batup))==NULL)
57: allocerr(txt,offset,fname,sizeof(uint)*max_batup);
58: if((batup_alt=(ushort *)MALLOC(sizeof(ushort)*max_batup))==NULL)
59: allocerr(txt,offset,fname,sizeof(ushort)*max_batup);
60: for(i=0;i<max_batup;i++) {
61: if((batup_desc[i]=(char *)MALLOC(59))==NULL)
62: allocerr(txt,offset,fname,59);
63: if((batup_name[i]=(char *)MALLOC(13))==NULL)
64: allocerr(txt,offset,fname,13); } }
65: #endif
66: get_int(max_batdn,instream);
67:
68: #ifdef SBBS
69: if(max_batdn) {
70: if((batdn_name=(char **)MALLOC(sizeof(char *)*max_batdn))==NULL)
71: allocerr(txt,offset,fname,sizeof(char *)*max_batdn);
72: if((batdn_dir=(uint *)MALLOC(sizeof(uint)*max_batdn))==NULL)
73: allocerr(txt,offset,fname,sizeof(uint)*max_batdn);
74: if((batdn_offset=(long *)MALLOC(sizeof(long)*max_batdn))==NULL)
75: allocerr(txt,offset,fname,sizeof(long)*max_batdn);
76: if((batdn_size=(ulong *)MALLOC(sizeof(ulong)*max_batdn))==NULL)
77: allocerr(txt,offset,fname,sizeof(ulong)*max_batdn);
78: if((batdn_cdt=(ulong *)MALLOC(sizeof(ulong)*max_batdn))==NULL)
79: allocerr(txt,offset,fname,sizeof(ulong)*max_batdn);
80: if((batdn_alt=(ushort *)MALLOC(sizeof(ushort)*max_batdn))==NULL)
81: allocerr(txt,offset,fname,sizeof(ushort)*max_batdn);
82: for(i=0;i<max_batdn;i++)
83: if((batdn_name[i]=(char *)MALLOC(13))==NULL)
84: allocerr(txt,offset,fname,13); }
85: #endif
86: get_int(max_userxfer,instream);
87:
88: get_int(t,instream); /* unused - was cdt_byte_value */
89: get_int(cdt_up_pct,instream);
90: get_int(cdt_dn_pct,instream);
91: get_int(t,instream); /* unused - was temp_ext */
92: get_str(cmd,instream); /* unused - was temp_cmd */
93: get_int(leech_pct,instream);
94: get_int(leech_sec,instream);
95:
96: for(i=0;i<32;i++)
97: get_int(n,instream);
98:
99: /**************************/
100: /* Extractable File Types */
101: /**************************/
102:
103: get_int(total_fextrs,instream);
104:
105: if(total_fextrs) {
106: if((fextr=(fextr_t **)MALLOC(sizeof(fextr_t *)*total_fextrs))==NULL)
107: allocerr(txt,offset,fname,sizeof(fextr_t*)*total_fextrs); }
108: else
109: fextr=NULL;
110:
111: for(i=0; i<total_fextrs; i++) {
112: if(feof(instream))
113: break;
114: if((fextr[i]=(fextr_t *)MALLOC(sizeof(fextr_t)))==NULL)
115: allocerr(txt,offset,fname,sizeof(fextr_t));
116: memset(fextr[i],0,sizeof(fextr_t));
117: get_str(fextr[i]->ext,instream);
118: get_alloc(&offset,fextr[i]->cmd,LEN_CMD,instream);
119: #ifdef SCFG
120: get_str(fextr[i]->ar,instream);
121: #else
122: fread(str,LEN_ARSTR+1,1,instream);
123: offset+=LEN_ARSTR+1;
124: fextr[i]->ar=arstr(0,str);
125: #endif
126: for(j=0;j<8;j++)
127: get_int(n,instream);
128: }
129: total_fextrs=i;
130:
131: /***************************/
132: /* Compressable File Types */
133: /***************************/
134:
135: get_int(total_fcomps,instream);
136:
137: if(total_fcomps) {
138: if((fcomp=(fcomp_t **)MALLOC(sizeof(fcomp_t *)*total_fcomps))==NULL)
139: allocerr(txt,offset,fname,sizeof(fcomp_t*)*total_fcomps); }
140: else
141: fcomp=NULL;
142:
143: for(i=0; i<total_fcomps; i++) {
144: if(feof(instream))
145: break;
146: if((fcomp[i]=(fcomp_t *)MALLOC(sizeof(fcomp_t)))==NULL)
147: allocerr(txt,offset,fname,sizeof(fcomp_t));
148: memset(fcomp[i],0,sizeof(fcomp_t));
149: get_str(fcomp[i]->ext,instream);
150: get_alloc(&offset,fcomp[i]->cmd,LEN_CMD,instream);
151: #ifdef SCFG
152: get_str(fcomp[i]->ar,instream);
153: #else
154: fread(str,LEN_ARSTR+1,1,instream);
155: offset+=LEN_ARSTR+1;
156: fcomp[i]->ar=arstr(0,str);
157: #endif
158: for(j=0;j<8;j++)
159: get_int(n,instream);
160: }
161: total_fcomps=i;
162:
163: /***********************/
164: /* Viewable File Types */
165: /***********************/
166:
167: get_int(total_fviews,instream);
168:
169: if(total_fviews) {
170: if((fview=(fview_t **)MALLOC(sizeof(fview_t *)*total_fviews))==NULL)
171: allocerr(txt,offset,fname,sizeof(fview_t*)*total_fviews); }
172: else
173: fview=NULL;
174:
175: for(i=0; i<total_fviews; i++) {
176: if(feof(instream)) break;
177: if((fview[i]=(fview_t *)MALLOC(sizeof(fview_t)))==NULL)
178: allocerr(txt,offset,fname,sizeof(fview_t));
179: memset(fview[i],0,sizeof(fview_t));
180: get_str(fview[i]->ext,instream);
181: get_alloc(&offset,fview[i]->cmd,LEN_CMD,instream);
182: #ifdef SCFG
183: get_str(fview[i]->ar,instream);
184: #else
185: fread(str,LEN_ARSTR+1,1,instream);
186: offset+=LEN_ARSTR+1;
187: fview[i]->ar=arstr(0,str);
188: #endif
189: for(j=0;j<8;j++)
190: get_int(n,instream);
191: }
192: total_fviews=i;
193:
194: /***********************/
195: /* Testable File Types */
196: /***********************/
197:
198: get_int(total_ftests,instream);
199:
200: if(total_ftests) {
201: if((ftest=(ftest_t **)MALLOC(sizeof(ftest_t *)*total_ftests))==NULL)
202: allocerr(txt,offset,fname,sizeof(ftest_t*)*total_ftests); }
203: else
204: ftest=NULL;
205:
206: for(i=0; i<total_ftests; i++) {
207: if(feof(instream)) break;
208: if((ftest[i]=(ftest_t *)MALLOC(sizeof(ftest_t)))==NULL)
209: allocerr(txt,offset,fname,sizeof(ftest_t));
210: memset(ftest[i],0,sizeof(ftest_t));
211: get_str(ftest[i]->ext,instream);
212: get_alloc(&offset,ftest[i]->cmd,LEN_CMD,instream);
213: get_alloc(&offset,ftest[i]->workstr,40,instream);
214: #ifdef SCFG
215: get_str(ftest[i]->ar,instream);
216: #else
217: fread(str,LEN_ARSTR+1,1,instream);
218: offset+=LEN_ARSTR+1;
219: ftest[i]->ar=arstr(0,str);
220: #endif
221: for(j=0;j<8;j++)
222: get_int(n,instream);
223: }
224: total_ftests=i;
225:
226: /*******************/
227: /* Download events */
228: /*******************/
229:
230: get_int(total_dlevents,instream);
231:
232: if(total_dlevents) {
233: if((dlevent=(dlevent_t **)MALLOC(sizeof(dlevent_t *)*total_dlevents))
234: ==NULL)
235: allocerr(txt,offset,fname,sizeof(dlevent_t*)*total_dlevents); }
236: else
237: dlevent=NULL;
238:
239: for(i=0; i<total_dlevents; i++) {
240: if(feof(instream)) break;
241: if((dlevent[i]=(dlevent_t *)MALLOC(sizeof(dlevent_t)))==NULL)
242: allocerr(txt,offset,fname,sizeof(dlevent_t));
243: memset(dlevent[i],0,sizeof(dlevent_t));
244: get_str(dlevent[i]->ext,instream);
245: get_alloc(&offset,dlevent[i]->cmd,LEN_CMD,instream);
246: get_alloc(&offset,dlevent[i]->workstr,40,instream);
247: #ifdef SCFG
248: get_str(dlevent[i]->ar,instream);
249: #else
250: fread(str,LEN_ARSTR+1,1,instream);
251: offset+=LEN_ARSTR+1;
252: dlevent[i]->ar=arstr(0,str);
253: #endif
254: for(j=0;j<8;j++)
255: get_int(n,instream);
256: }
257: total_dlevents=i;
258:
259:
260: /***************************/
261: /* File Transfer Protocols */
262: /***************************/
263:
264: get_int(total_prots,instream);
265:
266: if(total_prots) {
267: if((prot=(prot_t **)MALLOC(sizeof(prot_t *)*total_prots))==NULL)
268: allocerr(txt,offset,fname,sizeof(prot_t*)*total_prots); }
269: else
270: prot=NULL;
271:
272: for(i=0;i<total_prots;i++) {
273: if(feof(instream)) break;
274: if((prot[i]=(prot_t *)MALLOC(sizeof(prot_t)))==NULL)
275: allocerr(txt,offset,fname,sizeof(prot_t));
276: memset(prot[i],0,sizeof(prot_t));
277:
278: get_int(prot[i]->mnemonic,instream);
279: get_alloc(&offset,prot[i]->name,25,instream);
280: get_alloc(&offset,prot[i]->ulcmd,LEN_CMD,instream);
281: get_alloc(&offset,prot[i]->dlcmd,LEN_CMD,instream);
282: get_alloc(&offset,prot[i]->batulcmd,LEN_CMD,instream);
283: get_alloc(&offset,prot[i]->batdlcmd,LEN_CMD,instream);
284: get_alloc(&offset,prot[i]->blindcmd,LEN_CMD,instream);
285: get_alloc(&offset,prot[i]->bicmd,LEN_CMD,instream);
286: get_int(prot[i]->misc,instream);
287: #ifdef SCFG
288: get_str(prot[i]->ar,instream);
289: #else
290: fread(str,LEN_ARSTR+1,1,instream);
291: offset+=LEN_ARSTR+1;
292: prot[i]->ar=arstr(0,str);
293: #endif
294: for(j=0;j<8;j++)
295: get_int(n,instream);
296: }
297:
298: /************************/
299: /* Alternate File Paths */
300: /************************/
301:
302: get_int(altpaths,instream);
303:
304: if(altpaths) {
305: if((altpath=(char **)MALLOC(sizeof(char *)*altpaths))==NULL)
306: allocerr(txt,offset,fname,sizeof(char *)*altpaths); }
307: else
308: altpath=NULL;
309:
310: for(i=0;i<altpaths;i++) {
311: if(feof(instream)) break;
312: fread(str,LEN_DIR+1,1,instream);
313: offset+=LEN_DIR+1;
314: backslash(str);
315: #ifdef SCFG
316: j=LEN_DIR+1;
317: #else
318: j=strlen(str)+1;
319: #endif
320: if((altpath[i]=(char *)MALLOC(j))==NULL)
321: allocerr(txt,offset,fname,j);
322: memset(altpath[i],0,j);
323: strcpy(altpath[i],str);
324: for(j=0;j<8;j++)
325: get_int(n,instream);
326: }
327:
328: altpaths=i;
329:
330: /******************/
331: /* File Libraries */
332: /******************/
333:
334: get_int(total_libs,instream);
335:
336: if(total_libs) {
337: if((lib=(lib_t **)MALLOC(sizeof(lib_t *)*total_libs))==NULL)
338: allocerr(txt,offset,fname,sizeof(lib_t *)*total_libs); }
339: else
340: lib=NULL;
341:
342: #ifdef SBBS
343:
344: if(total_libs) {
345: if((curdir=(uint *)MALLOC(sizeof(uint)*total_libs))==NULL)
346: allocerr(txt,offset,fname,sizeof(uint)*total_libs);
347:
348: if((usrlib=(uint *)MALLOC(sizeof(uint)*total_libs))==NULL)
349: allocerr(txt,offset,fname,sizeof(uint)*total_libs);
350:
351: if((usrdirs=(uint *)MALLOC(sizeof(uint)*total_libs))==NULL)
352: allocerr(txt,offset,fname,sizeof(uint)*total_libs);
353:
354: if((usrdir=(uint **)MALLOC(sizeof(uint *)*total_libs))==NULL)
355: allocerr(txt,offset,fname,sizeof(uint *)*total_libs); }
356:
357: #endif
358: for(i=0;i<total_libs;i++) {
359: if(feof(instream)) break;
360: if((lib[i]=(lib_t *)MALLOC(sizeof(lib_t)))==NULL)
361: allocerr(txt,offset,fname,sizeof(lib_t));
362: memset(lib[i],0,sizeof(lib_t));
363: lib[i]->offline_dir=INVALID_DIR;
364:
365: get_alloc(&offset,lib[i]->lname,LEN_GLNAME,instream);
366: get_alloc(&offset,lib[i]->sname,LEN_GSNAME,instream);
367:
368: #if !defined(SCFG) && defined(SAVE_MEMORY) /* Save memory */
369: if(!strcmp(lib[i]->lname,lib[i]->sname) && lib[i]->sname!=scfgnulstr) {
370: FREE(lib[i]->sname);
371: lib[i]->sname=lib[i]->lname; }
372: #endif
373:
374: #ifdef SCFG
375: get_str(lib[i]->ar,instream);
376: #else
377: fread(str,1,LEN_ARSTR+1,instream);
378: offset+=LEN_ARSTR+1;
379: lib[i]->ar=arstr(0,str);
380: #endif
381: for(j=0;j<48;j++)
382: get_int(n,instream);
383: }
384: total_libs=i;
385:
386: /********************/
387: /* File Directories */
388: /********************/
389:
390: sysop_dir=user_dir=upload_dir=INVALID_DIR;
391: get_int(total_dirs,instream);
392:
393: if(total_dirs) {
394: if((dir=(dir_t **)MALLOC(sizeof(dir_t *)*(total_dirs+1)))==NULL)
395: allocerr(txt,offset,fname,sizeof(dir_t *)*(total_dirs+1)); }
396: else
397: dir=NULL;
398:
399: for(i=0;i<total_dirs;i++) {
400: if(feof(instream)) break;
401: if((dir[i]=(dir_t *)MALLOC(sizeof(dir_t)))==NULL)
402: allocerr(txt,offset,fname,sizeof(dir_t));
403: memset(dir[i],0,sizeof(dir_t));
404:
405: get_int(dir[i]->lib,instream);
406: get_alloc(&offset,dir[i]->lname,LEN_SLNAME,instream);
407: get_alloc(&offset,dir[i]->sname,LEN_SSNAME,instream);
408:
409: #if !defined(SCFG) && defined(SAVE_MEMORY) /* Save memory */
410: if(!strcmp(dir[i]->lname,dir[i]->sname) && dir[i]->sname!=scfgnulstr) {
411: FREE(dir[i]->sname);
412: dir[i]->sname=dir[i]->lname; }
413: #endif
414:
415: if(!strcmpi(dir[i]->sname,"SYSOP")) /* Sysop upload directory */
416: sysop_dir=i;
417: else if(!strcmpi(dir[i]->sname,"USER")) /* User to User xfer dir */
418: user_dir=i;
419: else if(!strcmpi(dir[i]->sname,"UPLOADS")) /* Upload directory */
420: upload_dir=i;
421: else if(!strcmpi(dir[i]->sname,"OFFLINE")) /* Offline files dir */
422: lib[dir[i]->lib]->offline_dir=i;
423:
424: get_str(dir[i]->code,instream);
425:
426: #ifdef SCFG
427: get_str(dir[i]->data_dir,instream);
428: #else
429: fread(str,LEN_DIR+1,1,instream); /* substitute data dir */
430: offset+=LEN_DIR+1;
431: if(str[0]) {
432: backslash(str);
433: if((dir[i]->data_dir=(char *)MALLOC(strlen(str)+1))==NULL)
434: allocerr(txt,offset,fname,strlen(str)+1);
435: strcpy(dir[i]->data_dir,str); }
436: else
437: dir[i]->data_dir=data_dir_dirs;
438: #endif
439:
440: #ifdef SCFG
441: get_str(dir[i]->ar,instream);
442: get_str(dir[i]->ul_ar,instream);
443: get_str(dir[i]->dl_ar,instream);
444: get_str(dir[i]->op_ar,instream);
445: #else
446: fread(str,1,LEN_ARSTR+1,instream);
447: offset+=LEN_ARSTR+1;
448: dir[i]->ar=arstr(0,str);
449: fread(str,1,LEN_ARSTR+1,instream);
450: offset+=LEN_ARSTR+1;
451: dir[i]->ul_ar=arstr(0,str);
452: fread(str,1,LEN_ARSTR+1,instream);
453: offset+=LEN_ARSTR+1;
454: dir[i]->dl_ar=arstr(0,str);
455: fread(str,1,LEN_ARSTR+1,instream);
456: offset+=LEN_ARSTR+1;
457: dir[i]->op_ar=arstr(0,str);
458: #endif
459: fread(str,1,LEN_DIR+1,instream);
460: offset+=LEN_DIR+1;
461: if(!str[0]) /* no path specified */
462: sprintf(str,"%sDIRS\\%s\\",data_dir,dir[i]->code);
463:
464: #ifndef SCFG
465: if((dir[i]->path=(char *)MALLOC(strlen(str)+1))==NULL)
466: allocerr(txt,offset,fname,strlen(str)+1);
467: #endif
468: strcpy(dir[i]->path,str);
469: get_alloc(&offset,dir[i]->upload_sem,LEN_DIR,instream);
470: get_int(dir[i]->maxfiles,instream);
471: if(dir[i]->maxfiles>MAX_FILES)
472: dir[i]->maxfiles=MAX_FILES;
473: get_alloc(&offset,dir[i]->exts,40,instream);
474: get_int(dir[i]->misc,instream);
475: get_int(dir[i]->seqdev,instream);
476: get_int(dir[i]->sort,instream);
477: #ifdef SCFG
478: get_str(dir[i]->ex_ar,instream);
479: #else
480: fread(str,1,LEN_ARSTR+1,instream);
481: offset+=LEN_ARSTR+1;
482: dir[i]->ex_ar=arstr(0,str);
483: #endif
484: get_int(dir[i]->maxage,instream);
485: get_int(dir[i]->up_pct,instream);
486: get_int(dir[i]->dn_pct,instream);
487: get_int(c,instream);
488: for(j=0;j<24;j++)
489: get_int(n,instream); }
490:
491: total_dirs=i;
492:
493: #ifndef NO_TEXT_CFG /* This must be the last section in CFG file */
494:
495: /**********************/
496: /* Text File Sections */
497: /**********************/
498:
499: get_int(total_txtsecs,instream);
500:
501:
502: if(total_txtsecs) {
503: if((txtsec=(txtsec_t **)MALLOC(sizeof(txtsec_t *)*total_txtsecs))==NULL)
504: allocerr(txt,offset,fname,sizeof(txtsec_t *)*total_txtsecs); }
505: else
506: txtsec=NULL;
507:
508: for(i=0;i<total_txtsecs;i++) {
509: if(feof(instream)) break;
510: if((txtsec[i]=(txtsec_t *)MALLOC(sizeof(txtsec_t)))==NULL)
511: allocerr(txt,offset,fname,sizeof(txtsec_t));
512: memset(txtsec[i],0,sizeof(txtsec_t));
513:
514: get_alloc(&offset,txtsec[i]->name,40,instream);
515: get_str(txtsec[i]->code,instream);
516: #ifdef SCFG
517: get_str(txtsec[i]->ar,instream);
518: #else
519: fread(str,LEN_ARSTR+1,1,instream);
520: offset+=LEN_ARSTR+1;
521: txtsec[i]->ar=arstr(0,str);
522: #endif
523: for(j=0;j<8;j++)
524: get_int(n,instream);
525: }
526: total_txtsecs=i;
527:
528: #endif
529:
530: fclose(instream);
531: lprintf(txt.readit,fname);
532: #ifdef SBBS
533: for(i=l=0;i<total_libs;i++) {
534: for(j=k=0;j<total_dirs;j++)
535: if(dir[j]->lib==i)
536: k++;
537: if(k>l) l=k; } /* l = largest number of dirs in a lib */
538: for(i=0;i<total_libs;i++)
539: if(l && (usrdir[i]=(uint *)MALLOC(sizeof(uint)*l))==NULL)
540: allocerr(txt,offset,fname,sizeof(uint)*l);
541: #endif
542: }
543:
544: #endif
545:
546:
547: #ifndef NO_XTRN_CFG
548:
549: /****************************************************************************/
550: /* Reads in XTRN.CNF and initializes the associated variables */
551: /****************************************************************************/
552: void read_xtrn_cfg(read_cfg_text_t txt)
553: {
554: char str[256],fname[13],*p,c;
555: int file;
556: short i,j,n;
557: long offset=0;
558: FILE *instream;
559:
560: strcpy(fname,"XTRN.CNF");
561: sprintf(str,"%s%s",ctrl_dir,fname);
562: if((instream=fnopen(&file,str,O_RDONLY))==NULL) {
563: lprintf(txt.openerr,str);
564: bail(1); }
565:
566: lprintf(txt.reading,fname);
567:
568: /*************/
569: /* Swap list */
570: /*************/
571:
572: get_int(total_swaps,instream);
573:
574: if(total_swaps) {
575: if((swap=(swap_t **)MALLOC(sizeof(swap_t *)*total_swaps))==NULL)
576: allocerr(txt,offset,fname,sizeof(swap_t *)*total_swaps); }
577: else
578: swap=NULL;
579:
580: for(i=0;i<total_swaps;i++) {
581: if(feof(instream)) break;
582: if((swap[i]=(swap_t *)MALLOC(sizeof(swap_t)))==NULL)
583: allocerr(txt,offset,fname,sizeof(swap_t));
584: get_alloc(&offset,swap[i]->cmd,LEN_CMD,instream); }
585: total_swaps=i;
586:
587: /********************/
588: /* External Editors */
589: /********************/
590:
591: get_int(total_xedits,instream);
592:
593: if(total_xedits) {
594: if((xedit=(xedit_t **)MALLOC(sizeof(xedit_t *)*total_xedits))==NULL)
595: allocerr(txt,offset,fname,sizeof(xedit_t *)*total_xedits); }
596: else
597: xedit=NULL;
598:
599: for(i=0;i<total_xedits;i++) {
600: if(feof(instream)) break;
601: if((xedit[i]=(xedit_t *)MALLOC(sizeof(xedit_t)))==NULL)
602: allocerr(txt,offset,fname,sizeof(xedit_t));
603: memset(xedit[i],0,sizeof(xedit_t));
604:
605: get_alloc(&offset,xedit[i]->name,40,instream);
606: get_str(xedit[i]->code,instream);
607: get_alloc(&offset,xedit[i]->lcmd,LEN_CMD,instream);
608: get_alloc(&offset,xedit[i]->rcmd,LEN_CMD,instream);
609:
610: #if !defined(SCFG) && defined(SAVE_MEMORY) /* Save memory */
611: if(!strcmp(xedit[i]->lcmd,xedit[i]->rcmd) && xedit[i]->rcmd!=scfgnulstr) {
612: FREE(xedit[i]->rcmd);
613: xedit[i]->rcmd=xedit[i]->lcmd; }
614: #endif
615:
616: get_int(xedit[i]->misc,instream);
617: #ifdef SCFG
618: get_str(xedit[i]->ar,instream);
619: #else
620: fread(str,LEN_ARSTR+1,1,instream);
621: offset+=LEN_ARSTR+1;
622: xedit[i]->ar=arstr(0,str);
623: #endif
624: get_int(xedit[i]->type,instream);
625: get_int(c,instream);
626: for(j=0;j<7;j++)
627: get_int(n,instream);
628: }
629: total_xedits=i;
630:
631:
632: /*****************************/
633: /* External Program Sections */
634: /*****************************/
635:
636: get_int(total_xtrnsecs,instream);
637:
638: if(total_xtrnsecs) {
639: if((xtrnsec=(xtrnsec_t **)MALLOC(sizeof(xtrnsec_t *)*total_xtrnsecs))
640: ==NULL)
641: allocerr(txt,offset,fname,sizeof(xtrnsec_t *)*total_xtrnsecs); }
642: else
643: xtrnsec=NULL;
644:
645: for(i=0;i<total_xtrnsecs;i++) {
646: if(feof(instream)) break;
647: if((xtrnsec[i]=(xtrnsec_t *)MALLOC(sizeof(xtrnsec_t)))==NULL)
648: allocerr(txt,offset,fname,sizeof(xtrnsec_t));
649: memset(xtrnsec[i],0,sizeof(xtrnsec_t));
650:
651: get_alloc(&offset,xtrnsec[i]->name,40,instream);
652: get_str(xtrnsec[i]->code,instream);
653: #ifdef SCFG
654: get_str(xtrnsec[i]->ar,instream);
655: #else
656: fread(str,LEN_ARSTR+1,1,instream);
657: offset+=LEN_ARSTR+1;
658: xtrnsec[i]->ar=arstr(0,str);
659: #endif
660: for(j=0;j<8;j++)
661: get_int(n,instream);
662: }
663: total_xtrnsecs=i;
664:
665:
666: /*********************/
667: /* External Programs */
668: /*********************/
669:
670: get_int(total_xtrns,instream);
671:
672: if(total_xtrns) {
673: if((xtrn=(xtrn_t **)MALLOC(sizeof(xtrn_t *)*total_xtrns))==NULL)
674: allocerr(txt,offset,fname,sizeof(xtrn_t *)*total_xtrns); }
675: else
676: xtrn=NULL;
677:
678: for(i=0;i<total_xtrns;i++) {
679: if(feof(instream)) break;
680: if((xtrn[i]=(xtrn_t *)MALLOC(sizeof(xtrn_t)))==NULL)
681: allocerr(txt,offset,fname,sizeof(xtrn_t));
682: memset(xtrn[i],0,sizeof(xtrn_t));
683:
684: get_int(xtrn[i]->sec,instream);
685: get_alloc(&offset,xtrn[i]->name,40,instream);
686: get_str(xtrn[i]->code,instream);
687: #ifdef SCFG
688: get_str(xtrn[i]->ar,instream);
689: get_str(xtrn[i]->run_ar,instream);
690: #else
691: fread(str,LEN_ARSTR+1,1,instream);
692: offset+=LEN_ARSTR+1;
693: xtrn[i]->ar=arstr(0,str);
694: fread(str,LEN_ARSTR+1,1,instream);
695: offset+=LEN_ARSTR+1;
696: xtrn[i]->run_ar=arstr(0,str);
697: #endif
698: get_int(xtrn[i]->type,instream);
699: get_int(xtrn[i]->misc,instream);
700: get_int(xtrn[i]->event,instream);
701: get_int(xtrn[i]->cost,instream);
702: get_alloc(&offset,xtrn[i]->cmd,LEN_CMD,instream);
703: get_alloc(&offset,xtrn[i]->clean,LEN_CMD,instream);
704: fread(str,LEN_DIR+1,1,instream);
705: offset+=LEN_DIR+1;
706: if(strcmp(str+1,":\\") && str[strlen(str)-1]=='\\') // C:\ is valid
707: str[strlen(str)-1]=0; // C:\SBBS\XTRN\GAME\ is not
708: #ifdef SBBS
709: if(!str[0]) /* Minimum path of '.' */
710: strcpy(str,".");
711: if((xtrn[i]->path=(char *)MALLOC(strlen(str)+1))==NULL)
712: allocerr(txt,offset,fname,strlen(str)+1);
713: #endif
714: strcpy(xtrn[i]->path,str);
715: get_int(xtrn[i]->textra,instream);
716: get_int(xtrn[i]->maxtime,instream);
717: for(j=0;j<7;j++)
718: get_int(n,instream);
719: }
720: total_xtrns=i;
721:
722:
723: /****************/
724: /* Timed Events */
725: /****************/
726:
727: get_int(total_events,instream);
728:
729: if(total_events) {
730: if((event=(event_t **)MALLOC(sizeof(event_t *)*total_events))==NULL)
731: allocerr(txt,offset,fname,sizeof(event_t *)*total_events); }
732: else
733: event=NULL;
734:
735: for(i=0;i<total_events;i++) {
736: if(feof(instream)) break;
737: if((event[i]=(event_t *)MALLOC(sizeof(event_t)))==NULL)
738: allocerr(txt,offset,fname,sizeof(event_t));
739: memset(event[i],0,sizeof(event_t));
740:
741: get_str(event[i]->code,instream);
742: get_alloc(&offset,event[i]->cmd,LEN_CMD,instream);
743: get_int(event[i]->days,instream);
744: get_int(event[i]->time,instream);
745: get_int(event[i]->node,instream);
746: get_int(event[i]->misc,instream);
747: get_alloc(&offset,event[i]->dir,LEN_DIR,instream);
748: if(event[i]->dir[0] // blank is valid
749: && strcmp(event[i]->dir+1,":\\") // C:\ is valid
750: && event[i]->dir[strlen(event[i]->dir)-1]=='\\') // C:\DIR\ !valid
751: event[i]->dir[strlen(event[i]->dir)-1]=0; // Remove \
752: for(j=0;j<8;j++)
753: get_int(n,instream);
754: }
755: total_events=i;
756:
757: #if defined(SCFG) || defined(__OS2__)
758:
759: /********************/
760: /* DOS Program list */
761: /********************/
762:
763: get_int(total_os2pgms,instream);
764:
765: if(total_os2pgms) {
766: if((os2pgm=(os2pgm_t **)MALLOC(sizeof(os2pgm_t *)*total_os2pgms))==NULL)
767: allocerr(txt,offset,fname,sizeof(os2pgm_t *)*total_os2pgms); }
768: else
769: os2pgm=NULL;
770:
771: for(i=0;i<total_os2pgms;i++) {
772: if(feof(instream)) break;
773: if((os2pgm[i]=(os2pgm_t *)MALLOC(sizeof(os2pgm_t)))==NULL)
774: allocerr(txt,offset,fname,sizeof(os2pgm_t));
775: get_alloc(&offset,os2pgm[i]->name,12,instream);
776: os2pgm[i]->misc=0; }
777: total_os2pgms=i;
778: for(i=0;i<total_os2pgms;i++) {
779: if(feof(instream)) break;
780: get_int(os2pgm[i]->misc,instream); }
781:
782: #endif // Don't add anything non-OS2 specific after this (without moding ^^ )
783:
784:
785: fclose(instream);
786: lprintf(txt.readit,fname);
787: }
788:
789: #endif
790:
791:
792: #ifndef NO_CHAT_CFG
793:
794: /****************************************************************************/
795: /* Reads in CHAT.CNF and initializes the associated variables */
796: /****************************************************************************/
797: void read_chat_cfg(read_cfg_text_t txt)
798: {
799: char str[256],fname[13],*p;
800: int file;
801: short i,j,n;
802: long offset=0;
803: FILE *instream;
804:
805: strcpy(fname,"CHAT.CNF");
806: sprintf(str,"%s%s",ctrl_dir,fname);
807: if((instream=fnopen(&file,str,O_RDONLY))==NULL) {
808: lprintf(txt.openerr,str);
809: bail(1); }
810:
811: lprintf(txt.reading,fname);
812:
813: /*********/
814: /* Gurus */
815: /*********/
816:
817: get_int(total_gurus,instream);
818:
819: if(total_gurus) {
820: if((guru=(guru_t **)MALLOC(sizeof(guru_t *)*total_gurus))==NULL)
821: allocerr(txt,offset,fname,sizeof(guru_t *)*total_gurus); }
822: else
823: guru=NULL;
824:
825: for(i=0;i<total_gurus;i++) {
826: if(feof(instream)) break;
827: if((guru[i]=(guru_t *)MALLOC(sizeof(guru_t)))==NULL)
828: allocerr(txt,offset,fname,sizeof(guru_t));
829: memset(guru[i],0,sizeof(guru_t));
830:
831: get_alloc(&offset,guru[i]->name,25,instream);
832: get_str(guru[i]->code,instream);
833:
834: #ifdef SCFG
835: get_str(guru[i]->ar,instream);
836: #else
837: fread(str,LEN_ARSTR+1,1,instream);
838: offset+=LEN_ARSTR+1;
839: guru[i]->ar=arstr(0,str);
840: #endif
841: for(j=0;j<8;j++)
842: get_int(n,instream);
843: }
844: total_chans=i;
845:
846:
847: /********************/
848: /* Chat Action Sets */
849: /********************/
850:
851: get_int(total_actsets,instream);
852:
853: if(total_actsets) {
854: if((actset=(actset_t **)MALLOC(sizeof(actset_t *)*total_actsets))==NULL)
855: allocerr(txt,offset,fname,sizeof(actset_t *)*total_actsets); }
856: else
857: actset=NULL;
858:
859: for(i=0;i<total_actsets;i++) {
860: if(feof(instream)) break;
861: if((actset[i]=(actset_t *)MALLOC(sizeof(actset_t)))==NULL)
862: allocerr(txt,offset,fname,sizeof(actset_t));
863: get_alloc(&offset,actset[i]->name,25,instream);
864: }
865: total_actsets=i;
866:
867:
868: /****************/
869: /* Chat Actions */
870: /****************/
871:
872: get_int(total_chatacts,instream);
873:
874: if(total_chatacts) {
875: if((chatact=(chatact_t **)MALLOC(sizeof(chatact_t *)*total_chatacts))
876: ==NULL)
877: allocerr(txt,offset,fname,sizeof(chatact_t *)*total_chatacts); }
878: else
879: chatact=NULL;
880:
881: for(i=0;i<total_chatacts;i++) {
882: if(feof(instream)) break;
883: if((chatact[i]=(chatact_t *)MALLOC(sizeof(chatact_t)))==NULL)
884: allocerr(txt,offset,fname,sizeof(chatact_t));
885: memset(chatact[i],0,sizeof(chatact_t));
886:
887: get_int(chatact[i]->actset,instream);
888: get_alloc(&offset,chatact[i]->cmd,LEN_CHATACTCMD,instream);
889: get_alloc(&offset,chatact[i]->out,LEN_CHATACTOUT,instream);
890: for(j=0;j<8;j++)
891: get_int(n,instream);
892: }
893:
894: total_chatacts=i;
895:
896:
897: /***************************/
898: /* Multinode Chat Channels */
899: /***************************/
900:
901: get_int(total_chans,instream);
902:
903: if(total_chans) {
904: if((chan=(chan_t **)MALLOC(sizeof(chan_t *)*total_chans))==NULL)
905: allocerr(txt,offset,fname,sizeof(chan_t *)*total_chans); }
906: else
907: chan=NULL;
908:
909: for(i=0;i<total_chans;i++) {
910: if(feof(instream)) break;
911: if((chan[i]=(chan_t *)MALLOC(sizeof(chan_t)))==NULL)
912: allocerr(txt,offset,fname,sizeof(chan_t));
913: memset(chan[i],0,sizeof(chan_t));
914:
915: get_int(chan[i]->actset,instream);
916: get_alloc(&offset,chan[i]->name,25,instream);
917:
918: get_str(chan[i]->code,instream);
919:
920: #ifdef SCFG
921: get_str(chan[i]->ar,instream);
922: #else
923: fread(str,LEN_ARSTR+1,1,instream);
924: offset+=LEN_ARSTR+1;
925: chan[i]->ar=arstr(0,str);
926: #endif
927: get_int(chan[i]->cost,instream);
928: get_int(chan[i]->guru,instream);
929: get_int(chan[i]->misc,instream);
930: for(j=0;j<8;j++)
931: get_int(n,instream); }
932: total_chans=i;
933:
934:
935: /**************/
936: /* Chat Pages */
937: /**************/
938:
939: get_int(total_pages,instream);
940:
941: if(total_pages) {
942: if((page=(page_t **)MALLOC(sizeof(page_t *)*total_pages))==NULL)
943: allocerr(txt,offset,fname,sizeof(page_t *)*total_pages); }
944: else
945: page=NULL;
946:
947: for(i=0;i<total_pages;i++) {
948: if(feof(instream)) break;
949: if((page[i]=(page_t *)MALLOC(sizeof(page_t)))==NULL)
950: allocerr(txt,offset,fname,sizeof(page_t));
951: memset(page[i],0,sizeof(page_t));
952:
953: get_alloc(&offset,page[i]->cmd,LEN_CMD,instream);
954:
955: #ifdef SCFG
956: get_str(page[i]->ar,instream);
957: #else
958: fread(str,LEN_ARSTR+1,1,instream);
959: offset+=LEN_ARSTR+1;
960: page[i]->ar=arstr(0,str);
961: #endif
962: get_int(page[i]->misc,instream);
963: for(j=0;j<8;j++)
964: get_int(n,instream);
965: }
966: total_pages=i;
967:
968:
969: fclose(instream);
970: lprintf(txt.readit,fname);
971: }
972:
973: #endif
974:
975: /****************************************************************************/
976: /* Read one line of up two 256 characters from the file pointed to by */
977: /* 'stream' and put upto 'maxlen' number of character into 'outstr' and */
978: /* truncate spaces off end of 'outstr'. */
979: /****************************************************************************/
980: char *readline(long *offset, char *outstr, int maxlen, FILE *instream)
981: {
982: char str[257];
983:
984: if(fgets(str,256,instream)==NULL)
985: return(NULL);
986: sprintf(outstr,"%.*s",maxlen,str);
987: truncsp(outstr);
988: (*offset)+=maxlen;
989: return(outstr);
990: }
991:
992: #undef readline_alloc
993:
994: char *readline_alloc(long *offset, char *outstr, int maxline, FILE *instream)
995: {
996: char str[257];
997:
998: readline(offset,str,maxline,instream);
999: if((outstr=(char *)MALLOC(strlen(str)+1))==NULL)
1000: return(NULL);
1001: strcpy(outstr,str);
1002: return(outstr);
1003: }
1004:
1005: /****************************************************************************/
1006: /* Turns char string of flags into a long */
1007: /****************************************************************************/
1008: long aftol(char *str)
1009: {
1010: char c=0;
1011: ulong l=0UL;
1012:
1013: strupr(str);
1014: while(str[c]) {
1015: if(str[c]>='A' && str[c]<='Z')
1016: l|=FLAG(str[c]);
1017: c++; }
1018: return(l);
1019: }
1020:
1021: /*****************************************************************************/
1022: /* Converts a long into an ASCII Flag string (A-Z) that represents bits 0-25 */
1023: /*****************************************************************************/
1024: char *ltoaf(long l,char *str)
1025: {
1026: char c=0;
1027:
1028: while(c<26) {
1029: if(l&(long)(1L<<c))
1030: str[c]='A'+c;
1031: else str[c]=SP;
1032: c++; }
1033: str[c]=0;
1034: return(str);
1035: }
1036:
1037: /****************************************************************************/
1038: /* Returns the actual attribute code from a string of ATTR characters */
1039: /****************************************************************************/
1040: int attrstr(char *str)
1041: {
1042: ulong l=0;
1043: short atr;
1044:
1045: atr=LIGHTGRAY;
1046: while(str[l]) {
1047: switch(str[l]) {
1048: case 'H': /* High intensity */
1049: atr|=HIGH;
1050: break;
1051: case 'I': /* Blink */
1052: atr|=BLINK;
1053: break;
1054: case 'K': /* Black */
1055: atr=(atr&0xf8)|BLACK;
1056: break;
1057: case 'W': /* White */
1058: atr=(atr&0xf8)|LIGHTGRAY;
1059: break;
1060: case '0': /* Black Background */
1061: atr=(atr&0x8f)|(BLACK<<4);
1062: break;
1063: case '7': /* White Background */
1064: atr=(atr&0x8f)|(LIGHTGRAY<<4);
1065: break;
1066: case 'R':
1067: atr=(atr&0xf8)|RED;
1068: break;
1069: case 'G':
1070: atr=(atr&0xf8)|GREEN;
1071: break;
1072: case 'Y': /* Yellow */
1073: atr=(atr&0xf8)|BROWN;
1074: break;
1075: case 'B':
1076: atr=(atr&0xf8)|BLUE;
1077: break;
1078: case 'M':
1079: atr=(atr&0xf8)|MAGENTA;
1080: break;
1081: case 'C':
1082: atr=(atr&0xf8)|CYAN;
1083: break;
1084: case '1': /* Red Background */
1085: atr=(atr&0x8f)|(RED<<4);
1086: break;
1087: case '2': /* Green Background */
1088: atr=(atr&0x8f)|(GREEN<<4);
1089: break;
1090: case '3': /* Yellow Background */
1091: atr=(atr&0x8f)|(BROWN<<4);
1092: break;
1093: case '4': /* Blue Background */
1094: atr=(atr&0x8f)|(BLUE<<4);
1095: break;
1096: case '5': /* Magenta Background */
1097: atr=(atr&0x8f)|(MAGENTA<<4);
1098: break;
1099: case '6': /* Cyan Background */
1100: atr=(atr&0x8f)|(CYAN<<4);
1101: break; }
1102: l++; }
1103: return(atr);
1104: }
1105:
1106:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.