/* * MSBPCT.C * * Howie Kaye -- Columbia University 3/11/86 * * sibling program to MSBMKB.C. It is used to unpack BOO files, used for * encoding binary files into text, and back. This program does the decoding. * It is meant to replace the program "MSBPCT.BAS", and runs approximately * 200 times faster. * * For documentation on BOO file format, see MSBMKB.C, or MS-Kermit manual. * This program runs, as is, under Microsoft C on MSDOS, and under UNIX(4.2). * * Modification history: * * 1/1/88, Frank da Cruz. Remove default input file names -- too * confusing. Add exit(0) for good return code upon success. * * 3/23/86 - Davide P. Cervone -- University of Rochester * added AMIGA and VAX11C support * * 3/24/86 - Martin Knoblauch -- TH-Darmstadt (MK001) * test if 1. line of inputfile is delimited by "\r\n" instead of "\n" * * 5/5/86 - John Matthews, U of Delaware. * Explicitly close the files. * * 5/8/86 - L. John Junod, DTNSRDC. * Adapt for Computer Innovations MS-DOS CI-86 Compiler * Improve too many args error message */ #define MSDOS #define CI86 #include #ifdef AMIGA #include #else #ifdef MSDOS #ifndef CI86 #include #endif #else #ifdef vax11c #include #else #include #endif #endif #endif #define fixchr(x) ((x) -'0') #define NULLCHR fixchr('~') yes_or_no_p(arg) char *arg; { int c,x; while (1) { printf("%s",arg); c = getchar(); if (c == '\n') continue; while ((x = getchar()) != '\n') if (x == EOF) return(0); if ((c == 'Y') || (c == 'y')) return(1); if ((c == 'N') || (c == 'n') || (c == EOF)) return(0); printf("Please answer 'Y' or 'N'\n"); } } main(argc,argv) char **argv; { char *infile = ""; /* input file name, with default */ char outfile[100]; /* output file name */ FILE *ifp, *ofp; /* i/o files */ char inline[100],outline[200]; int f; if (argc > 2) { /* check for too many args */ printf("Too many args. Usage: msbpct input-boo-file-name\n"); exit(1); } if (argc > 1) { /* check for input file */ infile = argv[1]; } else if (argc < 2) { printf("Usage: msbpct input-boo-file-name\n"); exit(1); } if ((ifp = fopen(infile,"r")) == NULL) { /* open input file */ printf("%s not found.\n",infile); /* failure? */ exit(1); } fgets(outfile,100,ifp); /* get output file name */ if ((outfile[strlen(outfile)-2] == '\r')| /* MK001 */ (outfile[strlen(outfile)-2] == '\n')) { outfile[strlen(outfile)-2] = '\0'; } else { outfile[strlen(outfile)-1] = '\0'; } if ((ofp = fopen(outfile,"r")) != NULL) { char msg[100]; sprintf(msg,"output file '%s' already exists. continue (y/n)? ",outfile); if (!yes_or_no_p(msg)) { printf("ok. bye\n"); exit(0); } else { fclose(ofp); } } #ifndef MSDOS #ifndef O_BINARY #define O_BINARY 0 #endif #endif #ifdef AMIGA if ((ofp = fopen(outfile,"w")) == NULL) { printf("could not open %s\n",outfile); /* failure */ exit(0); } #else #ifdef CI86 if((ofp = fopen(outfile,"wb")) == NULL){ printf("could not open %s\n",outfile); /* failure */ exit(0); } #else f = open(outfile,O_CREAT|O_WRONLY|O_TRUNC|O_BINARY,0x1ff); if ((ofp = fdopen(f,"w")) == NULL) { /* open it */ printf("could not open %s\n",outfile); /* failure? */ exit(1); } #endif #endif printf("%s ==> %s\n",infile,outfile); /* announce our intentions */ while(fgets(inline,100,ifp) != NULL) { /* till EOF */ int index=0,outindex=0; while (index < strlen(inline) && inline[index] != '\n' && inline[index] != '\r') /* end of line? */ if (fixchr(inline[index]) == NULLCHR) { /* null compress char... */ int rptcnt; int i; index++; rptcnt = fixchr(inline[index]); /* get repeat count */ for (i=0; i