#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #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;imax && sz[j]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"); } 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; }