Category : Miscellaneous Language Source Code
Archive   : OVL312.ZIP
Filename : SPLIT.C

 
Output of file : SPLIT.C contained in archive : OVL312.ZIP
/* SPLIT.C

programmed in the small memory model of Turbo C version 2.0

splits root file appended overlay files into separate files with
the extension of .001, .002, etc.

*/

#include "stdio.h"
#include "dos.h"
#include "string.h"
#include "io.h"

FILE *fpin,*fpout;

char fname[128];
char f_noext_name[125]; /* file name in fname without extension */
unsigned char header[27];
char inbuff[4096]; /* file inbuffer for setvbuf */
char outbuff[4096]; /* file outbuffer for setvbuf */
char transbuff[512]; /* file bytes transfer buffer */

int filecount=0;

void operate();
int split(char *workname);

void main(int argc, char *argv[])
{
char *period_pos; /* position of period in fname */

if(argc<2){ /* file name was not provided on command line */
cprintf("\n\rInput overlay file to split\r\n");
gets(fname);
}
else{ /* command link provided file name */
strcpy(fname,argv[1]);
}
strcpy(f_noext_name,fname);
if((period_pos=strchr(f_noext_name,'.'))==NULL){ /* need to add default .exe file extension */
strcat(fname,".exe"); /* add the .exe extension */
}
else{
period_pos[0]=0; /* kill the extension */
}
operate();
}

void operate()
{
char workname[128];
char file_ext[5]; /* file extension; .$$$, .001, .002, etc. */

if((fpin=fopen(fname,"rb"))==NULL){ /* error opening file */
printf("\n\007Error opening file %s",fname);
exit(1);
}
setvbuf(fpin,inbuff,_IOFBF,4096); /* speed up i/o */
while(!feof(fpin)){ /* split out .exe files until end of file or invalid .EXE information */
strcpy(workname,f_noext_name);
/* get appropriate extension for work file */
sprintf(file_ext,!filecount?".$$$":".%03d",filecount);
strcat(workname,file_ext); /* add extension to the work file name */
if(split(workname)){
break; /* all done splitting out files */
}
filecount++; /* increment count of files split */
}
fclose(fpin);
/* no errors, kill old file, rename temporary .$$$ file to old name */
strcpy(workname,f_noext_name);
strcat(workname,".$$$");
unlink(fname);
rename(workname,fname);
printf("\nSplit complete: %d overlay file%s",filecount-1,filecount!=2?"s":"");
}

int split(char *workname)
{
int signature,ovl_number;
unsigned long loop;
unsigned long filelen; /* length of .exe file (overlay or root) */

fread(header,27,1,fpin); /* read in first 27 .exe header bytes */
fseek(fpin,-27L,SEEK_CUR); /* position back to start of .exe file */

signature=(header[0]=='M' && header[1]=='Z'); /* check for valid MZ .exe signature */
ovl_number=header[26]; /* get overlay number */
if(!signature || ovl_number!=filecount){ /* header bytes have invalid values */
return(1); /* not a proper .EXE file to split */
}

if((fpout=fopen(workname,"wb"))==NULL){ /* error opening file */
printf("\n\007Error opening file %s",workname);
exit(1);
}
setvbuf(fpout,outbuff,_IOFBF,4096); /* speed up i/o */

filelen=header[5];
filelen*=256L;
filelen+=header[4];
filelen*=512L; /* get length of .exe file to nearest 512 byte page */
for(loop=0L;loop<=filelen-512L;loop+=512L){ /* transfer in 512 byte chunks */
fread(transbuff,1,512,fpin);
fwrite(transbuff,1,512,fpout);
}
/* transfer leftover bytes */
fread(transbuff,1,filelen%512,fpin);
fwrite(transbuff,1,filelen%512,fpout);

fclose(fpout);
return(0); /* successful file split */
}


  3 Responses to “Category : Miscellaneous Language Source Code
Archive   : OVL312.ZIP
Filename : SPLIT.C

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/