|
|
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.