/* The boo and de-boo programs do not work, and I found them too cumbersome * and complicated to install on the DG. In their place, I have provided * a few other tools: * * uuencode and uudecode: * Convert any binary file to a non-binary file, and preserve the * DG record and file types, if done on DG systems. * sq and usq: * CP/M (and others) squeeze and unsqueeze programs. Should be * compatible with Unix and other hosts. * compress: * a more efficient compression than sq/usq. Also compatible with * many hosts. * * If anyone can get these other files working, more power to you. The * uudecode program is slow, but the squeeze programs are very fast. The * uudecode could be faster, but I did not want to wasted alot of time on * it. Anyway, the uudecode source is very simple, and should be easy to * convert to another language. If you do convert the uudecode program, * please let me know, so that it can be distributed to hosts that do not * have the C compiler. * * Phil Julian, SAS Institute, Inc., Box 8000, Cary, NC 27512-8000 * */ /* * 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 * This program runs, as is, under Microsoft C on MSDOS, and under UNIX(4.2). * * Modification history: * * 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 #endif #ifdef MSDOS #ifndef CI86 #include #endif #else #ifdef vax11c #include #else #ifdef datageneral #include #include #include /* Used for ?GNFN */ #include #include struct p_nio_ex w_io_parms; /* ?write system call structure */ P_FSTAT buf; int ac0,ac2; char name[256]; #define R_ACC 4 #ifdef putc #undef putc #endif #define putc(c,file) { char ch = (char) (c); dg_binw(fchannel(file),&ch,1); } #define write(filen,chs,len) dg_binw(filen,chs,len) #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; { #ifdef AMIGA char *infile = "CKIKER.BOO"; /* input file name, with default */ #else #ifdef datageneral char *infile = "CKDKER.BOO"; /* input file name, with default */ #else char *infile = "MSKERMIT.BOO"; /* input file name, with default */ #endif #endif 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 [inputfile]\n"); exit(1); } if (argc > 1) { /* check for input file */ infile = argv[1]; } #ifdef datageneral /* Initialize the i/o block for putc() */ zero((char *) &w_io_parms, sizeof(w_io_parms)); w_io_parms.isti = $IBIN|$RTDY|$ICRF|$OFOT; w_io_parms.isti &= ~$IPST; w_io_parms.imrs = 2048; w_io_parms.ibad = -1; w_io_parms.ircl = -1; if ((ifp = dg_open(infile,$OFIN|$RTDS|$ICRF,$FUDF)) == NULL) { #else if ((ifp = fopen(infile,"r")) == NULL) { /* open input file */ #endif 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 #ifdef datageneral if ((ofp = dg_open(outfile,$OFOT|$IBIN|$OFCR|$OFCE|$RTUN,$FUNX)) == NULL) { /* if((ofp = fopen(outfile,"k")) == NULL){ */ perror("Open outfile"); 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 #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