jimb@dopey.AMD.COM (Jim Budler) (04/03/87)
The recent posting saying I could supply unix utilities resulted in a flurry of requests (4 or 5). One of them, from a user on sysV resulted in a bug report, and I finally bit the bullet and took a trek to our local sysV machine and did some debugging. It now recognizes the truncated names created by xbin on sysV, and no longer overwrites input files. As a result, version 2.4 of macbin for unix BSD and sysV, actually tested on both systems. #!/bin/sh # to extract, remove the header and type "sh filename" if `test ! -s ./README` then echo "writing ./README" cat > ./README << '\Rogue\Monster\' A new version of Unix macbin. Changes: '% macbin *' will convert all *.{info,data,rsrc} trios in the current directory to basename.bin. '% macbin foo fee fum' will attempt to convert foo.{data,rsrc,info}, fee.{data,rsrc,info}, and fum.{data,info,rsrc}. '% macbin -v <whatever>' will be a little noisier about it. Version 2.3 3/31/87 Fixed report from sysV that long filenames could result in the output filename being truncated, and overwriting the input files. Removed bzero(), it isn't really necessary, and is still present on Berkeley systems if you define BSD. Version 2.4 4/3/87 Fixed bzero() declarations and include file instead. Fixed input filenames so the search algorithm would look for the correct truncated filenames as produced on sysV by xbin. \Rogue\Monster\ else echo "will not over write ./README" fi if `test ! -s ./makefile` then echo "writing ./makefile" cat > ./makefile << '\Rogue\Monster\' #for BSD or anyone with bzero() in a library CFLAGS=-O #for sysV # CFLAGS=-O -Drindex=strrchr -DBZERO macbin: macbin.c makefile cc $(CFLAGS) -s -o macbin macbin.c \Rogue\Monster\ else echo "will not over write ./makefile" fi if `test ! -s ./macbin.c` then echo "writing ./macbin.c" cat > ./macbin.c << '\Rogue\Monster\' /*--------------------------------------------------------------------* | Version : 2.1 | | Author : Jim Budler | | Copyright Oct 13, 1986 | | Placed in public domain Oct 14, 1986 | | Version : 2.4 April 3, 1987 | | Enjoy | *--------------------------------------------------------------------*/ #include <stdio.h> #include <errno.h> #include <sys/types.h> #include <sys/dir.h> #ifndef CHECK14 # ifdef MAXNAMLEN /* 4.2 BSD */ # define FNAMELEN MAXNAMLEN # else # define FNAMELEN DIRSIZ # endif #else # define FNAMELEN 14 #endif extern int errno; main(argc,argv) int argc; char **argv; { /* structure of the info file - from MacBin.C zero1, zero2, and zero3 are used to 'recognize' a Macbinary format file. char zero1; char nlen; char name[63]; char type[4]; 65 0101 char creator[4]; 69 char flags; 73 char zero2; 74 0112 char location[6]; 80 char protected; 81 0121 char zero3; 82 0122 char dflen[4]; char rflen[4]; char cdate[4]; char mdate[4]; */ FILE *fd, *ofd; char bname[128]; char iname[128]; char dname[128]; char rname[128]; char oname[128]; char buf[128]; char * charp, * cmd; char * rindex(); int verbose = 0; int len; if ((cmd = rindex(argv[0], '/')) != NULL) ++cmd; else cmd = argv[0]; if (argc > 1) if (!strcmp(argv[1], "-v")) { verbose = 1; --argc; ++argv; } if (argc < 2) { fprintf(stderr,"Usage:\n\t%s [-v] filename(s)\n",cmd); exit(EINVAL); } while ( argc > 1 ) { (void) bzero(buf,128); if (( charp = rindex (argv[1], '.')) == NULL) strcpy(bname, argv[1]); else { *charp = '\0'; if ( strcmp(++charp,"data") && strcmp (charp, "info") && strcmp (charp, "rsrc")) { *(--charp) = '.'; /* put it back */ strcpy(bname, argv[1]); } else { strcpy(bname,argv[1]); } } --argc; ++argv; len = strlen(bname); if ( len > FNAMELEN - 2 ) { len = FNAMELEN - 2; strncpy(oname,bname,len); strncat(oname,".bin",FNAMELEN - len); strncpy(iname,bname,len); strncat(iname,".info",FNAMELEN - len); strncpy(dname,bname,len); strncat(dname,".data",FNAMELEN - len); strncpy(rname,bname,len); strncat(rname,".rsrc",FNAMELEN - len); } else { strcpy(oname,bname); strcat(oname,".bin"); strcpy(iname,bname); strcat(iname,".info"); strcpy(dname,bname); strcat(dname,".data"); strcpy(rname,bname); strcat(rname,".rsrc"); } if (verbose) fprintf (stderr, "Converting %s\n", bname); while ( argc > 1 && (!strcmp(argv[1], iname) || !strcmp(argv[1], dname) || !strcmp(argv[1], rname))) { --argc; ++argv; } if ((ofd = fopen( oname, "w")) == NULL){ perror(oname); --argc; ++argv; continue; } if ((fd = fopen(iname,"r")) == NULL){ if ( verbose ) fprintf ( stderr, "No %s\n", iname); fclose(ofd); unlink(oname); --argc; ++argv; continue; } if (fread(buf, sizeof(*buf), 128, fd) > 0){ if (buf[74] & 0x40) buf[81] = '\1'; /* protected */ buf[74] = '\0'; /* clear zero2 */ buf[82] = '\0'; /* force zero3 clear */ fwrite(buf, sizeof(*buf),128, ofd); (void) bzero(buf,128); } fclose(fd); if ((fd = fopen(dname,"r")) == NULL){ if ( verbose ) fprintf ( stderr, "No %s\n", dname); fclose(ofd); unlink(oname); --argc; ++argv; continue; } while (fread(buf, sizeof(*buf),128, fd) > 0){ fwrite(buf, sizeof(*buf),128, ofd); (void) bzero(buf,128); } fclose(fd); if ((fd = fopen(rname,"r")) == NULL){ if ( verbose ) fprintf ( stderr, "No %s\n", rname); fclose(ofd); unlink(oname); --argc; ++argv; continue; } while (fread(buf, sizeof(*buf),128, fd) > 0){ fwrite(buf, sizeof(*buf),128, ofd); (void) bzero(buf,128); } fclose(fd); fclose(ofd); } } #ifdef BZERO /* File : bzero.c Author : Richard A. O'Keefe. Updated: 23 April 1984 Defines: bzero() bzero(dst, len) moves "len" 0 bytes to "dst". Thus to clear a disc buffer to 0s do bzero(buffer, BUFSIZ). Note: the "b" routines are there to exploit certain VAX order codes, but the MOVC5 instruction will only move 65535 characters. The asm code is presented for your interest and amusement. */ /* Note to macbin users. This is not a complete version of the original bzero.c by Richard O'Keefe. A void declaration, and an include file have been removed. */ #if VaxAsm bzero(dst, len) char *dst; int len; { asm("movc5 $0,*4(ap),$0,8(ap),*4(ap)"); } #else ~VaxAsm bzero(dst, len) register char *dst; register int len; { while (--len >= 0) *dst++ = 0; } #endif VaxAsm #endif /* BZERO */ \Rogue\Monster\ else echo "will not over write ./macbin.c" fi echo "Finished archive 1 of 1" exit -- +===== Jim Budler ==== Advanced Micro Devices, Inc. ==== (408) 749-5806 =====+ | Compuserve: 72415,1200; Delphi: JIMBUDLER; Usenet: jimb@amdcad.AMD.COM | +==== Disclaimer: My company wouldn't let ME speak for them, would they? ====+ Who needs four?