📄 main.c
字号:
{
printf("\n Original Exec Stats: \"%s\", %s-style, %d bytes\n", oldfilename, execstyle[Exec_Type-1], oldfilesize);
printf("Compressed Exec Stats: \"%s\", %s-style, %d bytes (%1.1f%%)\n", newfilename, execstyle[2], newfilesize, (float)(newfilesize+0.01)/(float)(oldfilesize+0.01) *100);
}
else
{
if(!silent) printf("SC/32A: File \"%s\" has been successfully compressed\n", oldfilename);
}
exit(0);
}
/****************************************************************************/
void CompressExec()
{
int n;
CreateTemp();
CreateLCHeader();
CreateLCObjects();
CreateLCFixups();
AppendTitleFile();
close_temp();
unlink(tempname1);
}
/****************************************************************************/
void CreateLCHeader()
{
int n;
Print("+ Creating LC Header : ");
n=create_lc_header();
if(n!=0)
{
Print("Error! \n");
if(n==-1) err_seek(tempname1);
if(n==-2) err_read(tempname1);
if(n==-3) err_write(tempname2);
if(n==-4) err_linker(tempname1);
if(n==-5) err_objects(tempname1);
} else
if(!verbose) Print("Ok.\n");
else Print("Ok. (%d Objects)\n",app_num_objects);
}
void CreateLCObjects()
{
int n;
int obj;
char c;
for(obj=1; obj<=app_num_objects; obj++)
{
Print("+ Encoding Object #%-2d: ",obj);
n=create_lc_object(obj);
if(n!=0)
{
Print("Error! \n");
if(n==-1) err_seek(tempname1);
if(n==-2) err_read(tempname1);
if(n==-3) err_mem();
if(n==-4) err_write(tempname2);
if(n==-5) err_lcobjhdr(tempname1);
}
c = app_obj_seekattr[obj] ? '*':' ';
if(!quiet)
{
printf("[鸧 ");
if(!verbose) printf("(%1.1f%%)\n", ((float)(obj_new_size+0.01)/(float)(obj_old_size+0.01))*100);
else
{ printf("Old=%7d, New=%7d, (%1.1f%%) (%s)%c\n", obj_old_size,obj_new_size, ((float)(obj_new_size+0.01)/(float)(obj_old_size+0.01))*100, encodetype[app_enc_status], c);
if(verbxtra) printf(" ** %s **, ** %s **, %7d - fixups\n", app_obj_iscode ? "CODE":"DATA", app_obj_is32bit ? "32bit":"16bit", app_obj_seekattr[obj]);
}
}
}
}
void CreateLCFixups()
{
int n;
Print("+ Encoding LC Fixups : ");
n=create_lc_fixups();
if(n!=0)
{
Print("Error!\n");
if(n==-1) err_seek(tempname1);
if(n==-2) err_read(tempname1);
if(n==-3) err_mem();
if(n==-4) err_write(tempname2);
}
if(quiet!=TRUE)
{
printf("[鸧 ");
if(!verbose) printf("(%1.1f%%)\n", ((float)(obj_new_size+0.01)/(float)(obj_old_size+0.01))*100);
else printf("Old=%7d, New=%7d, (%1.1f%%) (%s)\n", obj_old_size,obj_new_size, ((float)(obj_new_size+0.01)/(float)(obj_old_size+0.01))*100, encodetype[app_enc_status]);
}
}
/****************************************************************************/
void UnbindExec()
{
int n;
char temppath[128]; // passed as *path argument
char tempname[128]; // passed as *argv[0]
char tempparm[128]; // name of file to be processed
const char *path=temppath;
const char *arg0=bindname;
const char *arg1="/U";
const char *arg2="/O";
const char *arg3="/S";
const char *arg4=tempparm;
const char *arg5=oldfilename;
strcpy(temppath,bindname);
strcpy(tempname,bindname);
strcpy(tempparm,"/UN");
strcat(tempparm,tempname1);
n=spawnle(P_WAIT, path, arg0,arg1,arg2,arg3,arg4,arg5, NULL, NULL);
if(n==-1)
{
GetDOS32APath();
strcpy(temppath,dos32apath);
strcat(temppath,bindname);
strcpy(tempname,dos32apath);
strcat(tempname,bindname);
n=spawnle(P_WAIT, path, arg0,arg1,arg2,arg3,arg4,arg5, NULL, NULL);
if(n==-1)
{
strcpy(temppath,bindname);
strcpy(tempname,bindname);
n=spawnlpe(P_WAIT, path, arg0,arg1,arg2,arg3,arg4,arg5, NULL, NULL);
if(n==-1) err_nosb();
}
}
if(n!=0)
{
if(n==127) err_support(oldfilename);
else {
DeleteTempFiles();
exit(1);
}
}
}
/****************************************************************************/
void BindExec() {
int n;
char temppath[128]; // passed as *path argument
char tempname[128]; // passed as *argv[0]
char tempparm[128]; // -UN name of file
char tempparm2[128]; // -BN name of file
char temptype[8]; // action type, either "-R" or "-RS"
const char *path=temppath;
const char *arg0=bindname;
const char *arg1=temptype;
const char *arg2="/S";
const char *arg3=tempparm;
const char *arg4=tempparm2;
const char *arg5=tempname2;
if(bindtype==0) strcpy(temptype,"/R");
else if(bindtype==1) strcpy(temptype,"/RS");
else if(bindtype==2) strcpy(temptype,"/RC");
strcpy(temppath,bindname);
strcpy(tempname,bindname);
strcpy(tempparm,"/UN");
strcat(tempparm,tempname2);
strcpy(tempparm2,"/BN");
strcat(tempparm2,newfilename);
n=spawnle(P_WAIT, path, arg0,arg1,arg2,arg3,arg4,arg5, NULL, NULL);
if(n==-1)
{
GetDOS32APath();
strcpy(temppath,dos32apath);
strcat(temppath,bindname);
strcpy(tempname,dos32apath);
strcat(tempname,bindname);
n=spawnle(P_WAIT, path, arg0,arg1,arg2,arg3,arg4,arg5, NULL, NULL);
if(n==-1)
{
strcpy(temppath,bindname);
strcpy(tempname,bindname);
n=spawnlpe(P_WAIT, path, arg0,arg1,arg2,arg3,arg4,arg5, NULL, NULL);
if(n==-1) err_nosb();
}
}
if(n!=0) {
if(n==127) err_support(tempname2);
else {
DeleteTempFiles();
exit(1);
}
}
}
/****************************************************************************/
void Print(char *format, ...)
{
va_list arglist;
char buffer[1024];
if(quiet==FALSE)
{
va_start(arglist,format);
vsprintf(buffer,format,arglist);
printf(buffer);
va_end(arglist);
}
}
int GetFileSize(char *name)
{
int n,m;
if( (n=open(name,O_RDONLY | O_BINARY)) == -1) return(0);
m=filelength(n);
close(n);
return(m);
}
void GetDOS32APath()
{
char *ptr;
char *envname;
char envbuf[512];
dos32apath[0]=NULL;
envname=getenv("DOS32A");
if(envname!=0)
{
ptr=strchr(envname,' ');
if(ptr==NULL) ptr=strchr(envname,0);
memset(envbuf,0,256);
strncpy(envbuf,envname,(dword)ptr-(dword)envname);
strcat(envbuf,"\\BINW\\");
strcpy(dos32apath,envbuf);
}
}
void CreateD32AEnvVar()
{
int n;
char *envname;
envname=getenv("DOS32A");
if(envname!=0)
{
strcpy(dos32aenv,envname);
strcat(dos32aenv," /NOC");
}
else strcpy(dos32aenv," /NOC");
n=setenv("DOS32A",dos32aenv,1);
// if(n!=0) Print("WARNING: could not adjust DOS32A environment variable\n");
}
void DeleteTempFiles()
{
close_temp();
close_exec();
unlink(tempname1);
unlink(tempname2);
}
void ShowCount(int count)
{
if(quiet!=TRUE) if(nocount!=TRUE) printf("%02d%%\b\b\b",count);
}
void CopyFile(char *f1, char *f2) {
int c;
FILE *src;
FILE *dest;
unlink(f2);
if((src=fopen(f1,"rb"))!=NULL)
{
if((dest=fopen(f2,"wb"))!=NULL)
{
while((c=fgetc(src))!=EOF) fputc(c,dest);
fclose(dest);
}
fclose(src);
}
}
void CheckExec(char *argv[])
{
char *bufptr;
strcpy(oldfilename,argv[execargn]);
strcpy(newfilename,argv[execargn]);
bufptr=(char *)strchr(newfilename,'.');
if(bufptr!=NULL) strset(bufptr,0);
if(bind==TRUE) strcat(newfilename,".exe");
else strcat(newfilename,".lc");
if(CheckIfExists(oldfilename)==TRUE) return;
bufptr=(char *)strchr(oldfilename,'.');
if(bufptr!=NULL) return;
strcat(oldfilename,".exe");
if(CheckIfExists(oldfilename)==TRUE) return;
bufptr=(char *)strchr(oldfilename,'.');
if(bufptr!=NULL) strset(bufptr,0);
strcat(oldfilename,".le");
if(CheckIfExists(oldfilename)==TRUE) return;
bufptr=(char *)strchr(oldfilename,'.');
if(bufptr!=NULL) strset(bufptr,0);
strcat(oldfilename,".lx");
if(CheckIfExists(oldfilename)==TRUE) return;
strcpy(oldfilename,argv[execargn]);
}
int CheckIfExists(char *name)
{
int n;
n=open(name,O_RDWR | O_BINARY);
if(n!=-1) { close(n); return(TRUE); }
return(FALSE);
}
void CheckEnvironment()
{
if(getenv("DOS32A")==NULL) err_environment();
}
void copy_file(char *f1, char *f2)
{
int c;
FILE *src;
FILE *dest;
if( (f1[1] != ':') && (f2[1] != ':') )
{
rename(f1,f2);
return;
}
if((src=fopen(f1,"rb"))!=NULL)
{
if((dest=fopen(f2,"wb"))!=NULL)
{
while((c=fgetc(src))!=EOF) fputc(c,dest);
fclose(dest);
}
fclose(src);
}
}
void AppendTitleFile()
{
int n,m,k;
char *ptr;
char *dirptr;
char tempbuf[512];
dirptr=inffilename-1;
strcpy(inffilename,oldfilename);
for(ptr=inffilename; *ptr!=0; ptr++) if(*ptr=='\\') dirptr=ptr;
*(dirptr+1)=0;
strcat(inffilename,titlename);
m=GetFileSize(inffilename);
if(m==0 || m>512) return;
if( (n=open(inffilename,O_RDONLY | O_BINARY)) != -1)
{
k=0;
Print("+ Appending OEM Info : ");
memset(tempbuf,0,512);
if(read(n,&tempbuf,m) == -1) k++;
if(write_oem_to_temp(temp_handle,&tempbuf,m+1) == -1) k++;
if(k==0)
{
Print("Ok.");
if(verbose) Print(" (%d bytes)",m);
Print("\n");
} else Print("Error!\n");
close(n);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -