home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1998 September / PCO_0998.ISO / filesbbs / dos / sbbs_src.exe / SBBS / INITDATA.C < prev    next >
Encoding:
C/C++ Source or Header  |  1997-04-13  |  6.5 KB  |  240 lines

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