mirror of
https://github.com/ondra-novak/gates_of_skeldal.git
synced 2025-07-04 21:50:38 -04:00
505 lines
9.4 KiB
C
505 lines
9.4 KiB
C
#include <libs/types.h>
|
||
#include <ctype.h>
|
||
#include <io.h>
|
||
#include <dos.h>
|
||
#include <malloc.h>
|
||
#include <direct.h>
|
||
#include <libs/memman.h>
|
||
#include <string.h>
|
||
#include <libs/event.h>
|
||
#include <libs/strlite.h>
|
||
#include <stdio.h>
|
||
#include <ctype.h>
|
||
#include <libs/bgraph.h>
|
||
#include <vesa.h>
|
||
#include <libs/bmouse.h>
|
||
#include <libs/gui.h>
|
||
#include <libs/basicobj.h>
|
||
#include "setuplib.h"
|
||
#include "setupcpy.h"
|
||
#include "setup.h"
|
||
|
||
#define COPY "COPY"
|
||
#define MKDIR "MKDIR"
|
||
#define INI "INI"
|
||
|
||
#define DIR_NAMES 6
|
||
char *dirnames[]=
|
||
{
|
||
"GAMES.*",
|
||
"GAME*.*",
|
||
"HRY.*",
|
||
"ZABAVA.*",
|
||
"SKELDAL",
|
||
"NAPOLEON",
|
||
};
|
||
|
||
TSTR_LIST file_list=NULL;
|
||
|
||
static void done_bar_init(OBJREC *o,long *params)
|
||
{
|
||
o->userptr=New(long);
|
||
*(long *)o->userptr=*params;
|
||
}
|
||
|
||
static void done_bar_draw(int x1,int y1,int x2,int y2,OBJREC *o)
|
||
{
|
||
long value,max,x3;
|
||
|
||
value=*(long *)o->data;
|
||
max=*(long *)o->userptr;
|
||
x3=x1+(x2-x1)*value/max;
|
||
if (x3<=x1) x3=x1;
|
||
if (x3>=x2) x3=x2;
|
||
bar(x3,y1,x2,y2);
|
||
curcolor=o->f_color[1];
|
||
bar(x1,y1,x3,y2);
|
||
}
|
||
|
||
void done_bar(OBJREC *o) //define(...done_bar,max);
|
||
{
|
||
o->call_init=done_bar_init;
|
||
o->call_draw=done_bar_draw;
|
||
o->datasize=4;
|
||
}
|
||
|
||
|
||
|
||
char select_disk()
|
||
{
|
||
char last=3;
|
||
struct diskfree_t ds;
|
||
int max=0,i;
|
||
long now;
|
||
|
||
for(i=('C'-'@');i<('Z'-'@');i++)
|
||
{
|
||
if (_dos_getdiskfree(i,&ds)==0)
|
||
{
|
||
now=ds.avail_clusters*ds.sectors_per_cluster*ds.bytes_per_sector;
|
||
if (now>max)
|
||
{
|
||
max=now;
|
||
last=i;
|
||
}
|
||
}
|
||
}
|
||
return last;
|
||
}
|
||
|
||
char dir_finder()
|
||
{
|
||
struct find_t ft;
|
||
int i;
|
||
int rc;
|
||
|
||
for(i=0;i<DIR_NAMES;i++)
|
||
{
|
||
rc=_dos_findfirst(dirnames[i],_A_SUBDIR,&ft);
|
||
if (rc==0 && ft.attrib & _A_SUBDIR) break;
|
||
do_events();
|
||
}
|
||
if (i==DIR_NAMES) return 0;
|
||
if (strcmp(dirnames[i],"SKELDAL"))
|
||
{
|
||
chdir(ft.name);
|
||
}
|
||
return 1;
|
||
}
|
||
|
||
long get_disk_free(char disk)
|
||
{
|
||
struct diskfree_t ds;
|
||
if (_dos_getdiskfree(disk,&ds)==0)
|
||
return ds.avail_clusters*ds.sectors_per_cluster*ds.bytes_per_sector;
|
||
return 0;
|
||
}
|
||
|
||
|
||
char all_finder()
|
||
{
|
||
unsigned total;
|
||
int i,j,max,lmax,p;
|
||
long sz[30];
|
||
int end='Z'-'@';
|
||
|
||
exit_wait=0;
|
||
lmax=0x7fffffff;
|
||
for(i=3;i<end;i++) sz[i]=get_disk_free(i);
|
||
for(i=3;i<end;i++)
|
||
{
|
||
p=3;max=0;
|
||
for(j=3;j<end;j++) if (sz[j]>max && sz[j]<lmax) p=j,max=sz[j];
|
||
lmax=max;
|
||
_dos_setdrive(p,&total);
|
||
chdir("\\");
|
||
if (dir_finder()) return 1;
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
TSTR_LIST script=NULL;
|
||
char work_buff[8000];
|
||
|
||
static char compile_script(char *in,char *out,char *source,char *target)
|
||
{
|
||
char *c,*d;
|
||
|
||
c=in;d=out;
|
||
while (*c)
|
||
{
|
||
if (*c=='%')
|
||
switch(toupper(*(++c)))
|
||
{
|
||
case 'T':strcpy(d,target);d=strchr(d,0);break;
|
||
case 'S':strcpy(d,source);d=strchr(d,0);break;
|
||
default: return 1;
|
||
}
|
||
else
|
||
*d++=*c;
|
||
c++;
|
||
}
|
||
*d=0;
|
||
return 0;
|
||
}
|
||
|
||
char read_script(char *filename,char *source_path,char *target_path)
|
||
{
|
||
FILE *f;
|
||
char buff[161];
|
||
int i=0;
|
||
|
||
if (script!=NULL) release_list(script);
|
||
script=create_list(16);
|
||
f=fopen(filename,"r");
|
||
if (f==NULL) return 1;
|
||
while (!feof(f))
|
||
{
|
||
if (fgets(buff,160,f)==NULL) break;
|
||
if (buff[strlen(buff)-1]=='\n') buff[strlen(buff)-1]=0;
|
||
if (buff[0]==0) continue;
|
||
if (compile_script(buff,work_buff,source_path,target_path))
|
||
{
|
||
fclose(f);
|
||
return 2;
|
||
}
|
||
str_replace(&script,i,work_buff);
|
||
i++;
|
||
}
|
||
fclose(f);
|
||
return 0;
|
||
}
|
||
|
||
long check_size(int gr)
|
||
{
|
||
int group,pocet,i;
|
||
char prikaz[20];
|
||
long suma=0;
|
||
|
||
pocet=str_count(script);
|
||
for(i=0;i<pocet;i++) if (script[i]!=NULL)
|
||
{
|
||
if (sscanf(script[i],"%d %s %s",&group,prikaz,work_buff)<1) group=gr+1;
|
||
strupper(prikaz);
|
||
if (!strcmp(prikaz,COPY) && group==gr)
|
||
{
|
||
struct find_t ft;
|
||
int rc;
|
||
|
||
rc=_dos_findfirst(work_buff,_A_NORMAL,&ft);
|
||
while (rc==0)
|
||
{
|
||
suma+=ft.size;
|
||
rc=_dos_findnext(&ft);
|
||
}
|
||
}
|
||
}
|
||
return suma;
|
||
}
|
||
|
||
|
||
|
||
static void view_line_init(OBJREC *o,int *len)
|
||
{
|
||
o->datasize=(*len)+1;
|
||
}
|
||
|
||
static void view_line_draw(int x1,int y1, int x2, int y2, OBJREC *o)
|
||
{
|
||
char *c;
|
||
|
||
bar(x1,y1,x2,y2);
|
||
c=(char *)o->data;
|
||
if (!*c) return;
|
||
set_aligned_position(x2,y1,2,0,c);
|
||
outtext(c);
|
||
}
|
||
|
||
|
||
void view_line(OBJREC *o)
|
||
{
|
||
o->call_init=view_line_init;
|
||
o->call_draw=view_line_draw;
|
||
}
|
||
|
||
|
||
char get_max_res()
|
||
{
|
||
if (vesasupport(0x110)) return 2;
|
||
if (vesasupport(0x100)) return 1;
|
||
return 0;
|
||
}
|
||
|
||
void add_to_list(char *name)
|
||
{
|
||
if (file_list==NULL) file_list=create_list(256);
|
||
str_add(&file_list,name);
|
||
}
|
||
|
||
static void copy_1_file(char *init_mask,char *filename,char *target)
|
||
{
|
||
char *c,*d;
|
||
|
||
c=alloca(strlen(init_mask)+strlen(filename)+1);
|
||
strcpy(c,init_mask);
|
||
d=strrchr(c,'\\');
|
||
d++;
|
||
strcpy(d,filename);
|
||
d=alloca(strlen(target)+strlen(filename)+10);
|
||
strcpy(d,target);
|
||
if (d[0]==0 || d[strlen(d)-1]!='\\') strcat(d,"\\");
|
||
strcat(d,filename);
|
||
set_value(0,20,filename);
|
||
add_to_list(d);
|
||
cpy_file(c,d);
|
||
}
|
||
|
||
static void copy_files(char *param)
|
||
{
|
||
struct find_t ft;
|
||
char *source_mask;
|
||
char *target;
|
||
int rc;
|
||
|
||
target=strchr(param,' ');
|
||
if (target==NULL) return;
|
||
source_mask=alloca(target-param);
|
||
source_mask[target-param]=0;
|
||
strncpy(source_mask,param,target-param);
|
||
target++;
|
||
rc=_dos_findfirst(source_mask,_A_NORMAL,&ft);
|
||
while (rc==0)
|
||
{
|
||
copy_1_file(source_mask,ft.name,target);
|
||
rc=_dos_findnext(&ft);
|
||
}
|
||
_dos_findclose(&ft);
|
||
}
|
||
|
||
char cascade_mkdir(char *path)
|
||
{
|
||
char *c;
|
||
char d;
|
||
|
||
if (path[0]==0||path[1]==':' && path[2]==0) return 0;
|
||
if (!access(path,F_OK)) return 0;
|
||
c=strrchr(path,'\\');
|
||
if (c==NULL) return 0;
|
||
*c=0;
|
||
d=cascade_mkdir(path);
|
||
*c='\\';
|
||
if (d==1) return 1;
|
||
if (mkdir(path)!=0) return 1;
|
||
add_to_list(path);
|
||
return 0;
|
||
}
|
||
|
||
|
||
static char add_to_ini(char *params)
|
||
{
|
||
return fprintf(ini,"%s\n",params)<0;
|
||
}
|
||
|
||
static char *commands[]=
|
||
{
|
||
COPY,
|
||
MKDIR,
|
||
INI,
|
||
};
|
||
|
||
static char (*calls[])(char *params)=
|
||
{
|
||
copy_files,
|
||
cascade_mkdir,
|
||
add_to_ini,
|
||
};
|
||
|
||
|
||
|
||
static char command_match(char *cmd,char *test,char **params)
|
||
{
|
||
while (*test) if (toupper(*cmd++)!=toupper(*test++)) return 0;
|
||
if (*cmd!=' ') return 0;
|
||
*params=cmd+1;
|
||
return 1;
|
||
}
|
||
|
||
|
||
char do_script(int section)
|
||
{
|
||
int pos;
|
||
int num;
|
||
int str_siz=str_count(script);
|
||
char *command;
|
||
|
||
for(pos=0;pos<str_siz;pos++) if (script[pos]!=NULL)
|
||
{
|
||
num=-1;
|
||
sscanf(script[pos],"%d",&num);
|
||
if (num==section && (command=strchr(script[pos],' '))!=NULL)
|
||
{
|
||
int i;
|
||
command++;
|
||
|
||
for(i=0;i<sizeof(commands)/4;i++)
|
||
{
|
||
char *p;
|
||
if (command_match(command,commands[i],&p))
|
||
if (calls[i](p))
|
||
{
|
||
char s[200];
|
||
|
||
sprintf(s,"Instal<EFBFBD>tor nedok<6F>z<EFBFBD>l zpracovat <20><>dek '%s' - P<><50>kaz '%s' vr<76>til chybu",command,commands[i]);
|
||
if (msg_box("Chyba v INF",'\x1',s,"Ignoruj","P<EFBFBD>eru<EFBFBD>it",NULL)==2) return 1;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
|
||
char test_mscdex();
|
||
#pragma aux test_mscdex =\
|
||
"mov eax,1500h"\
|
||
"mov ebx,0h"\
|
||
"int 2fh"\
|
||
"cmp al,0ffh"\
|
||
"mov al,0"\
|
||
"jnz nook"\
|
||
"mov al,cl"\
|
||
"add al,65"\
|
||
"nook:"\
|
||
value[al] modify [eax ebx ecx]
|
||
|
||
int mscdex_ver();
|
||
#pragma aux mscdex_ver =\
|
||
"mov eax,150ch"\
|
||
"int 2fh"\
|
||
value [ebx] modify [eax]
|
||
|
||
char *get_cdrom()
|
||
{
|
||
static char s[80];
|
||
char c;
|
||
int v;
|
||
|
||
c=test_mscdex();
|
||
if (c)
|
||
{
|
||
v=mscdex_ver();
|
||
sprintf(s," MSCDEX %d.%02d drive %c:",v/256,v%256,c);
|
||
}
|
||
else
|
||
{
|
||
strcpy(s,"<nen<65>>");
|
||
}
|
||
return s;
|
||
}
|
||
|
||
char validate_path(char *path)
|
||
{
|
||
unsigned disk;
|
||
unsigned cdisk,lastdrv;
|
||
char *c,ll=0,tt=0,d;
|
||
|
||
static char valid[]="$%'_@{}~`#()&-";
|
||
|
||
if (path==NULL || path[0]==0 || path[1]!=':' || path[2]!='\\') return 0;
|
||
disk=toupper(path[0]);
|
||
if (disk<'A' || disk>'Z') return 0;
|
||
_dos_getdrive(&cdisk);
|
||
disk-='@';_dos_setdrive(disk,&lastdrv);
|
||
_dos_getdrive(&lastdrv);
|
||
disk=(disk==lastdrv);
|
||
_dos_setdrive(cdisk,&lastdrv);
|
||
if (!disk) return 0;
|
||
c=path+2;ll=0;
|
||
while (*c)
|
||
{
|
||
d=toupper(*c);
|
||
if (d=='\\')
|
||
if (ll) return 0;else ll=1,tt=0;
|
||
else
|
||
if (d>='A' && d<='Z' || d>='0' && d<='9' || strchr(valid,d)!=NULL || d>127) ll=0;
|
||
else if (d=='.') if (tt) return 0;else tt=1;
|
||
else return 0;
|
||
c++;
|
||
}
|
||
if (ll) return 0;
|
||
return 1;
|
||
}
|
||
|
||
void clean_up()
|
||
{
|
||
int i,cnt;
|
||
if (file_list==NULL) return;
|
||
cnt=str_count(file_list);
|
||
for(i=cnt-1;i>=0;i--) if (file_list[i]!=NULL)
|
||
{
|
||
if (remove(file_list[i])) rmdir(file_list[i]);
|
||
}
|
||
release_list(file_list);
|
||
file_list=NULL;
|
||
}
|
||
|
||
void purge_file_list()
|
||
{
|
||
if (file_list==NULL) return;
|
||
release_list(file_list);
|
||
file_list=NULL;
|
||
}
|
||
|
||
char cascade_delete(char ignore_sav)
|
||
{
|
||
struct find_t f;
|
||
int rc;
|
||
|
||
rc=_dos_findfirst("*.*",_A_SUBDIR,&f);
|
||
while (rc==0)
|
||
{
|
||
if (f.attrib & _A_SUBDIR)
|
||
{
|
||
if (f.name[0]!='.')
|
||
{
|
||
chdir(f.name);
|
||
cascade_delete(ignore_sav);
|
||
chdir("..");
|
||
rmdir(f.name);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
char *c=strchr(f.name,'.');
|
||
|
||
if (c!=NULL)
|
||
{
|
||
strupper(c);
|
||
if (!ignore_sav || strncmp(c,".SAV",4)) remove(f.name);
|
||
}
|
||
else remove(f.name);
|
||
}
|
||
rc=_dos_findnext(&f);
|
||
}
|
||
return 0;
|
||
}
|