install: add install sources and resources
[doom2d-restoration.git] / GAME / LEVELS / CONFIG.C
blobbf9a9b4478e4c19eb09a6b82cbfc793f758d73ae
1 #include "glob.h"
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include <process.h>
6 #include <dos.h>
7 #include "config.h"
8 #include "vga.h"
9 #include "error.h"
10 #include "files.h"
11 #include "memory.h"
12 #include "view.h"
14 enum{NONE,BYTE,WORD,DWORD,STRING,SW_ON,SW_OFF,FILES,MAINWAD};
16 extern int gamma;
18 void F_mainwad(char *);
20 typedef struct{
21   char *par,*cfg;
22   void *p;
23   byte t,o;
24 }cfg_t;
26 static cfg_t cfg[]={
27   {"file",NULL,NULL,FILES,0},
28   {"mainwad","main_wad",NULL,MAINWAD,0},
29   {"waitrr","wait_retrace",&vp_waitrr,SW_ON,0},
30   {"nowaitrr",NULL,&vp_waitrr,SW_OFF,0},
31   {"gamma","gamma",&gamma,WORD,0},
32   {"config",NULL,cfg_file,STRING,0},
33   {NULL,NULL,NONE,0}
36 char cfg_file[128]="EDITOR.CFG";
38 static char buf[256];
40 void CFG_args(void) {
41   int j;
42   dword n;
43   char *s;
45   logo("CFG_args: проверка командной строки\n");
46   for(s=strtok(getcmd(buf)," \r\n\t");s;s=strtok(NULL," \r\n\t")) {
47 next:
48     if(*s=='/' || *s=='-') ++s;
49     for(j=0;cfg[j].t;++j) if(cfg[j].par) if(stricmp(s,cfg[j].par)==0) {
50           switch(cfg[j].t) {
51         case BYTE:
52           n=strtol(s=strtok(NULL," \r\n\t"),NULL,0);
53           *((byte *)cfg[j].p)=(byte)n;
54           break;
55         case WORD:
56           n=strtol(s=strtok(NULL," \r\n\t"),NULL,0);
57           *((word *)cfg[j].p)=(word)n;
58           break;
59         case DWORD:
60           n=strtol(s=strtok(NULL," \r\n\t"),NULL,0);
61           *((dword *)cfg[j].p)=n;
62           break;
63         case STRING:
64           strcpy((char *)cfg[j].p,s=strtok(NULL," \r\n\t"));
65           break;
66         case SW_ON:
67           *((byte *)cfg[j].p)=ON;
68           if(cfg[j+1].t==SW_OFF && cfg[j+1].p==cfg[j].p) cfg[j+1].o=1;
69           if(j>0) if(cfg[j-1].t==SW_OFF && cfg[j-1].p==cfg[j].p) cfg[j-1].o=1;
70           break;
71         case SW_OFF:
72           *((byte *)cfg[j].p)=OFF;
73           if(cfg[j+1].t==SW_ON && cfg[j+1].p==cfg[j].p) cfg[j+1].o=1;
74           if(j>0) if(cfg[j-1].t==SW_ON && cfg[j-1].p==cfg[j].p) cfg[j-1].o=1;
75           break;
76         case FILES:
77           for(s=strtok(NULL," \r\n\t");s;s=strtok(NULL," \r\n\t")) {
78                 if(*s=='/' || *s=='-') goto next;
79                 F_addwad(s);
80           }break;
81         case MAINWAD:
82           F_mainwad(s=strtok(NULL," \r\n\t"));
83           break;
84         default:
85           ERR_failinit("Неизвестный тип в cfg!");
86           }
87           cfg[j].o=1;break;
88     }
89   }
92 void CFG_load(void) {
93   int j,h;
94   dword n;
95   char s[128];
96   char *p1,*p2;
98   logo("CFG_load: загрузка конфигурации из %s\n",cfg_file);
99   if((h=open(cfg_file,O_RDONLY|O_BINARY))==-1) {
100     perror("Cannot open file");return;
101   }
102   while(!eof(h)) {
103     F_readstr(h,s,127);
104         if(*s==';' || s[1]==';') continue; // comment
105     if(!(p1=strtok(s,"\r\n\t =;"))) continue;
106     if(!(p2=strtok(NULL,"\r\n\t =;"))) continue;
107     for(j=0;cfg[j].t;++j) if(cfg[j].cfg && !cfg[j].o)
108      if(stricmp(p1,cfg[j].cfg)==0) {
109       switch(cfg[j].t) {
110         case BYTE:
111           n=strtol(p2,NULL,0);
112           *((byte *)cfg[j].p)=(byte)n;
113           break;
114         case WORD:
115           n=strtol(p2,NULL,0);
116           *((word *)cfg[j].p)=(word)n;
117           break;
118         case DWORD:
119           n=strtol(p2,NULL,0);
120           *((dword *)cfg[j].p)=n;
121           break;
122         case STRING:
123           strcpy((char *)cfg[j].p,p2);
124           break;
125         case SW_ON:
126         case SW_OFF:
127           if(stricmp(p2,"ON")==0) {*((byte *)cfg[j].p)=ON;break;}
128           if(stricmp(p2,"OFF")==0) {*((byte *)cfg[j].p)=OFF;break;}
129           *((byte *)cfg[j].p)=strtol(p2,NULL,0);
130           break;
131         case FILES:
132           break;
133         case MAINWAD:
134           F_mainwad(p2);
135           break;
136         default:
137           ERR_failinit("Неизвестный тип в cfg!");
138           }
139           break;
140     }
141   }
142   close(h);