jimb@amdcad.UUCP (Jim Budler) (02/14/86)
Here's the source for version 2.2 of fpack for the Macintosh. Based upon and fully compatible with the version for Unix and IBMPC by Gary Perlman. ==========================< cut here >======================== #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # FPack.C # FPack.Link # FPackR.R # SFLib.C # VolStuff.c # This archive created: Sun Feb 9 19:20:42 1986 export PATH; PATH=/bin:$PATH echo shar: extracting "'FPack.C'" '(12293 characters)' if test -f 'FPack.C' then echo shar: will not over-write existing file "'FPack.C'" else sed 's/^ X//' << \SHAR_EOF > 'FPack.C' X #Options Z X /* floating point not needed */ X X/* X * Original author of fpack, UNIX and IBM PCDOS Version: X * X * Gary Perlman X * X * X * MODIFICATIONS FOR Macintosh by Jim Budler X * X * Please note, although the functionality remains, files are selected X * after the program is run, rather than with command line options. X * X * Both versions of the program are compatible, with the exception X * that maximum line length is 255 on the Mac, and BUFSIZ is 512 or greater X * on Unix. I have no idea what it is under MSDOS. X * If the length of a line exceeds this extra newlines may be introduced. X * X * Some of the code below comes from an example program for X * MacBinary I found on Compuserve. It didn't work then, it does now. X * X * And some of it is my own. X * X * Jim Budler X */ X X X#include <stdio.h> X X#define MAGIC "fpack:!@#$%^&*(): " /* default file delimiter */ Xtypedef int Status; /* return/exit status of functions */ X#define SUCCESS ((Status) 0) X#define FAILURE ((Status) 1) X X/* Mac Stuff */ X#include "MacCdefs.h" X#include "Window.h" X#include "Dialog.h" X#include "Events.h" X#include "Menu.h" X X XMenuHandle DeskMenu; XMenuHandle FileMenu; XMenuHandle EditMenu; XMenuHandle FPackMenu; X#define NAMESTRING "\p FPack-Mac Version 2.2 February 9, 1986" X X#define Desk_ID 200 X#define File_ID 201 X#define Edit_ID 202 X#define FPack_ID 203 X X#include "Packages.h" X X/* X * IM defines fName[64] in struct SFReply X * Packages.h defines char Namelength;char Name[63] instead. X * With the define below, both compatibility and clarity X * are improved (I think); use either. The file name is a X * 63 character Pascal string (with length byte preceeding). X */ X#define fName Namelength X#include "pbDefs.h" X#include "OSIo.h" X X#define TRUE 1 X#define FALSE 0 X#define NIL 0 X XRect screenRect = {0, 0, 384, 512}; /* outer limits of screen */ X XPoint location; XDialogPtr theDialog; Xlong freebytes; Xint morefiles; Xshort defvolnum, invol, outvol; Xchar *outname, *inname, OutputV[64]; Xchar defvol[64]; /* X * for default volume name returned by GetVol(). X */ XFILE *infile, *outfile; XSFTypeList types; XSFReply RP; XFileParam FP; Xextern Str255 *tempMacStr(); X X/*FUNCTION fpack: pack files for later extraction by funpack */ XStatus Xfpack (file) Xchar *file; X { X FILE *ioptr; X char line[MAXLINE]; X char *ptr; X X if ((ioptr = fopen (file, "r")) != NULL) X { X blabber (file); X if ((freebytes -= strlen(MAGIC) + strlen(file) + 1) <= 0) X { X error( OutputV," Full!"); X fclose(ioptr); X return(FAILURE); X } X fprintf (outfile,"%s%s\n", MAGIC, file); X while (fgets (line, MAXLINE-1, ioptr)) X { X if ((freebytes -= strlen(line) + 1) <= 0) X { X error( OutputV," Full!"); X fclose(ioptr); X return(FAILURE); X } X fputs (line, outfile); X } X for (ptr = line; *ptr; ptr++); X if (ptr > line && *(ptr-1) != '\n') /* incomplete last line */ X { X putc ('\n', outfile); X freebytes -= 1; X } X fclose (ioptr); X return (SUCCESS); X } X error ("Can't open for reading: ", file); X return (FAILURE); X } X X/*FUNCTION funpack: unpack and create files packed by fpack */ XStatus Xfunpack () X { X FILE *ioptr = NULL; X char line[MAXLINE]; X int maglen = strlen (MAGIC); X char *ptr,outputname[64]; X while (fgets(line, MAXLINE-1, infile)) X { X if (line[strlen(line) -1] == '\n') X line[strlen(line) -1] = '\0'; X if (!strncmp (MAGIC, line, maglen)) X { X if (ioptr) X { X fclose (ioptr); X FlushVol(NULL,invol); /* update all volume information *//* see VolStuff.c */ X ioptr = NULL; X } X ptr = line + maglen; X if (*ptr == '\0') /* done */ X ioptr = NULL; X else if (OSFind (ptr) != 0) /* file exists */ X { X error ( ptr, " exists (not unpacked)"); X ioptr = NULL; X } X else if ((ioptr = fopen (ptr, "w")) != NULL) X { X strcpy(outputname,ptr); X blabber (ptr); X SetFileType( ptr, (long) 'TEXT'); X SetFileSignature( ptr, (long) 'EDIT'); X } X else X { X error ("Can't create ", ptr); X return (FAILURE); X } X } X else if (ioptr != NULL) X { X if ((freebytes -= strlen(line) + 1) <= 0) X { X error(OutputV," Full!"); X fclose(ioptr); X SetVol(NULL,invol); X unlink(outputname); X FlushVol(NULL,invol); /* update all volume information *//* see VolStuff.c */ X return(FAILURE); X } X fputs (line, ioptr); X putc ('\n', ioptr); X } X } X return (SUCCESS); X } X Xblabber(filename ) Xchar *filename; X{ X ParamText(tempMacStr(filename), 0, 0, 0); X DrawDialog(theDialog); X} X Xerror(string1 , string2) Xchar *string1, *string2; X{ X char temp[255]; X strcpy(temp, string1); X strcat(temp, string2); X CtoPStr(temp); X DoDialog( 1, temp); X} X X XInputFileName(count, types, reply) Xshort count; Xchar *types; XSFReply *reply; X{ X SFGetFile(&location, 0, 0, count, types, 0, reply); /* Glue code required - see SFLib.C */ X} X XOutputFileName(name, reply) Xchar *name; XSFReply *reply; X{ X SFPutFile(&location, "\pSave as:", name, 0, reply); /* Glue code required - see SFLib.C */ X} X XPackEm() X{ X theDialog = GetNewDialog(3, 0, (DialogPtr) -1); X blabber(" "); X strcpy(outname, "\pFPack Archive"); /* default archive name */ X OutputFileName(outname, &RP); X if (!RP.good) X return; X PtoCstr(outname); X outvol = RP.vRefNum; /* save for FlushVol() */ X SetVol(NULL,outvol); /* see VolStuff.c */ X GetVol(OutputV,&outvol); /* get name back */ X GetVInfo(NULL,OutputV,&outvol,&freebytes); X if ( outvol != RP.vRefNum ) X Signal("\pTwo Identical Volume names! Help!"); X PtoCStr(OutputV); X /* allow for last MAGIC marker and one line safety */ X freebytes -= strlen(MAGIC) + 1 + MAXLINE; X if(OSFind(outname)) X OSDelete(outname); X FlushVol(NULL, outvol); X if((outfile = fopen(outname, "w")) == NULL) X Signal("\pUnable to create the file."); X SetFileType( outname, (long) 'TEXT'); X SetFileSignature( outname, (long) 'EDIT'); X X while (morefiles) { X types.ftype[0]='TEXT'; X InputFileName(1, &types, &RP); X if (!RP.good) X { X morefiles = FALSE; X break; X } X strcpy(inname, &RP.fName); X SetVol(NULL,RP.vRefNum); X PtoCstr(inname); X if (fpack(inname)) X { X fclose (outfile); X SetVol(NULL, outvol); X unlink(outname); X FlushVol(NULL, outvol); X Signal("\pPack Failed"); X } X CtoPstr(inname); /* Always safer to put it back */ X } X fprintf (outfile,"%s\n", MAGIC); /* end of files */ X fclose(outfile); X FlushVol(NULL, outvol); /* update all volume information *//* see VolStuff.c */ X blabber("Finished"); X} X X XUnpackEm() X{ X theDialog = GetNewDialog(4, 0, (DialogPtr) -1); X blabber(" "); X types.ftype[0]='TEXT'; X InputFileName(1, &types, &RP); X if (!RP.good) X return; X strcpy(inname, &RP.fName); X invol = RP.vRefNum; /* save for FlushVol() */ X SetVol(NULL,invol); /* see VolStuff.c */ X GetVol(OutputV,&invol); /* get name back */ X GetVInfo(NULL,OutputV,&invol,&freebytes); X if ( invol != RP.vRefNum ) X Signal("\pTwo Identical Volume names! Help!"); X PtoCStr(OutputV); X /* allow one line safety */ X freebytes -= MAXLINE; X PtoCstr(inname); X if((infile = fopen(inname, "r")) == NULL) X Signal("\pUnable to read the input file."); X if (funpack()) X { X fclose(infile); X Signal("\pUnpack Failed"); X } X fclose(infile); X blabber("Finished"); X} X X XDoDialog(id,msg) Xshort id; XStr255 *msg; X{ X DialogPtr dialog; X short Hit; X ParamText(msg, 0, 0, 0); X dialog = GetNewDialog(id, 0, (DialogPtr) -1); X ModalDialog(0, &Hit); X DisposeDialog(dialog); X return(Hit); X} X XrestartProc() X{ X ExitToShell(); /* I really don't know why more people don't do this */ X} X XDoMenu(menuresult) Xlong menuresult; X{ X short menuID, itemNumber; X struct P_Str AccessoryName; X GrafPtr theCurrentPort; X menuID = HiWord(menuresult); X itemNumber = LoWord(menuresult); X X switch ( menuID ) X { X X case Desk_ID: X if ( itemNumber == 1) X AboutWindow(); X else { X GetItem(DeskMenu, itemNumber, &AccessoryName); X GetPort(&theCurrentPort); X OpenDeskAcc(&AccessoryName); X SetPort(theCurrentPort); X } X break; X X case File_ID: X switch ( itemNumber ) X { X case 1: /* Pack */ X morefiles = TRUE; X if (theDialog != (DialogPtr) 0) X DisposeDialog(theDialog); X PackEm(); X break; X case 2: /* Unpack */ X if (theDialog != (DialogPtr) 0) X DisposeDialog(theDialog); X UnpackEm(); X break; X case 4: /* Quit */ X SetVol(NULL, defvolnum); X /* Put it back to original default volume */ X free(inname); X free(outname); X exit(); X } X break; X X case Edit_ID: X SystemEdit(itemNumber-1); /* for Desk Accessories */ X break; X } X HiliteMenu(0); X} X XInit() X{ X InitDialogs(restartProc); X InitMenus(); X InitCursor(); X FlushEvents(0xFFFF); X X /* Desk Accessory menu */ X DeskMenu = NewMenu(Desk_ID,"\p\024"); X AppendMenu(DeskMenu, "\pAbout FPack...;(-"); X AddResMenu(DeskMenu, 'DRVR'); X InsertMenu(DeskMenu, 0); X X /* File menu */ X FileMenu = NewMenu(File_ID, "\pFile"); X AppendMenu(FileMenu, X "\pPack/P;Unpack/U;(-;Quit/Q"); X InsertMenu(FileMenu, 0); X X /* Edit menu */ X EditMenu = NewMenu(Edit_ID, "\pEdit"); X AppendMenu(EditMenu, X "\pUndo;(-;Cut/X;Copy/C;Paste/V;Clear"); /* for Desk Accessories */ X InsertMenu(EditMenu, 0); X X /* Display name of the program in menu bar */ X FPackMenu = NewMenu(FPack_ID, NAMESTRING); X InsertMenu(FPackMenu,0); X DisableItem(FPackMenu, 0); /* Put name in gray */ X DrawMenuBar(); X X/* save the original default volume */ X GetVol(defvol,defvolnum); /* see VolStuff.c */ X} X XAboutWindow() X{ X Rect theRect; X Rect aLineRect; X GrafPtr port; X WindowPtr theWindow; X EventRecord anEvent; X X char *line1 = "FPack for the Macintosh"; X char *version = "Version 2.2 February 9, 1986"; X char *line2 = "Based on FPack for Unix and MSDos"; X char *line3 = "From USENET mod.sources"; X char *line4 = "by Gary Perlman"; X char *line5 = "Ported to Macintosh by Jim Budler"; X char *line6 = "Using Consulair Mac C"; X X GetPort(&port); /* save the port */ X SetRect(&aLineRect, 5, 10, 345, 25); X SetRect(&theRect, 75, 110, 425, 265); X X theWindow = NewWindow((WindowPeek) 0, &theRect, "\pAbout FPack",TRUE, X dBoxProc, (WindowPtr) -1, TRUE, 0); X SetPort(theWindow); X TextSize(12); X TextFont(0); /* system font */ X TextBox(line1,strlen(line1), &aLineRect, teJustCenter); /* added to TextEdit.h: #define teJustCenter 1 */ X OffsetRect(&aLineRect, 0, 20); X TextBox(version,strlen(version), &aLineRect, teJustCenter); /* added to TextEdit.h: #define teJustCenter 1 */ X OffsetRect(&aLineRect, 0, 20); X TextBox(line2,strlen(line2), &aLineRect, teJustCenter); /* as suggested by "Using the Macintosh Toolkit with C" */ X OffsetRect(&aLineRect, 0, 20); X TextBox(line3,strlen(line3), &aLineRect, teJustCenter); X OffsetRect(&aLineRect, 0, 20); X TextBox(line4,strlen(line4), &aLineRect, teJustCenter); X OffsetRect(&aLineRect, 0, 20); X TextBox(line5,strlen(line5), &aLineRect, teJustCenter); X OffsetRect(&aLineRect, 0, 20); X TextBox(line6,strlen(line6), &aLineRect, teJustCenter); X OffsetRect(&aLineRect, 0, 20); X do { X GetNextEvent(everyEvent, &anEvent); X } while (anEvent.what != mouseDown); X X DisposeWindow(theWindow); X SetPort(port); X} X Xmain() X{ X SetPt(&location, 80, 190); X outname = malloc(256); X inname = malloc(256); X struct P_Str *msg, *CatchSignal(); X short windowcode; X EventRecord event; X WindowPtr whichWindow; X CouldDialog(1); /* help single disk systems */ /* Error */ X CouldDialog(3); /* keep the dialogs in memory */ /* Pack */ X CouldDialog(4); /* Unpack */ X Init(); X if(msg = CatchSignal()) X { X HiliteMenu(0); X DoDialog(1, msg); X DrawMenuBar(); X } X X while (TRUE) X { X SystemTask(); X if (GetNextEvent(everyEvent, &event)) X { X switch ( event.what ) X { X case autoKey: X case keyDown: X if ((event.modifiers & cmdKey)) X DoMenu(MenuKey(event.message)); X break; X X case mouseDown: X windowcode = FindWindow(&event.where, &whichWindow); X switch ( windowcode ) X { X case inMenuBar: X DoMenu(MenuSelect(&event.where)); X break; X case inSysWindow: X SystemClick(&event, whichWindow); X break; X case inDrag: X DragWindow(whichWindow, &event.where, &screenRect); X break; X case inGoAway: X break; X } X break; X } X } X } X} SHAR_EOF if test 12293 -ne "`wc -c < 'FPack.C'`" then echo shar: error transmitting "'FPack.C'" '(should have been 12293 characters)' fi fi # end of overwriting check echo shar: extracting "'FPack.Link'" '(108 characters)' if test -f 'FPack.Link' then echo shar: will not over-write existing file "'FPack.Link'" else sed 's/^ X//' << \SHAR_EOF > 'FPack.Link' X/Type 'APPL' 'JIMB' X/Bundle X/Start QuickStart X XStandard Library XSFLib XVolStuff XFPack X/Resources XFPackR X/End SHAR_EOF if test 108 -ne "`wc -c < 'FPack.Link'`" then echo shar: error transmitting "'FPack.Link'" '(should have been 108 characters)' fi fi # end of overwriting check echo shar: extracting "'FPackR.R'" '(1316 characters)' if test -f 'FPackR.R' then echo shar: will not over-write existing file "'FPackR.R'" else sed 's/^ X//' << \SHAR_EOF > 'FPackR.R' X* X* I prefer to output to a Rel file for linking. Thus FPack.R.Rel below. X* X XFPackR.Rel X XType BNDL X X ,128 XJIMB 0 XICN# X0 128 XFREF X0 128 X XType FREF X X ,128 XAPPL 0 X XType JIMB = STR X X ,0 XFPack Version 2.0 January 19, 1986 X XType ICN# = GNRL X X ,128 X.H X00000000 X00000000 X00000000 X00000000 X00000000 X00000000 X00000000 X00000000 X00000000 X00000000 X00000000 X00000000 X00000000 X01FFF000 X02000800 X067FC800 X06802800 X02802800 X02802800 X02802800 X02802800 X028028F8 X028028F8 X027FCD80 X02000F00 X02000E00 X0203C800 X02400800 X02000800 X03FFF800 X01001000 X01FFF000 X* X1C000000 X24018000 X24014000 X28023000 X28021000 X28042000 X28062000 X28014000 X2800C000 X28000000 X28000000 X28000000 X28000000 X25FFF000 X26000800 X18000800 X08000000 X00000000 X00000000 X00000000 X00000000 X000000F8 X000000F8 X00000180 X00000100 X00000100 X00000180 X000000F8 X000000F8 X00000000 X00000000 X00000000 X X XType DITL X X ,4 X2 X* 1 XStatText Disabled X20 50 40 300 X Unpacking File: X X* 2 XStatText X50 50 90 300 X ^0 X X ,3 X2 X* 1 XStatText Disabled X20 50 40 300 X Packing File: X X* 2 XStatText X50 50 90 300 X ^0 X X ,1 X2 X* 1 XStatText X20 10 50 380 X^0 X X* 2 XBtnItem X60 200 80 240 XOK X X XType DLOG X X ,4 XUnpacking Files X50 50 170 450 XVisible NoGoAway X1 X0 X4 X X ,3 XPacking Files X50 50 170 450 XVisible NoGoAway X1 X0 X3 X X ,1 XError Message X190 100 280 400 XVisible GoAway X1 X0 X1 SHAR_EOF if test 1316 -ne "`wc -c < 'FPackR.R'`" then echo shar: error transmitting "'FPackR.R'" '(should have been 1316 characters)' fi fi # end of overwriting check echo shar: extracting "'SFLib.C'" '(1056 characters)' if test -f 'SFLib.C' then echo shar: will not over-write existing file "'SFLib.C'" else sed 's/^ X//' << \SHAR_EOF > 'SFLib.C' X#Options M X#include "Packages.h" X#include "pbDefs.h" X#include "OSIo.h" X XSFGetFile(where,prompt,fileFilter,numTypes,typeList,dlgHook,reply) XPoint *where; XStr255 *prompt; XProcPtr fileFilter; Xshort numTypes; XSFTypeList *typeList; XProcPtr dlgHook; XSFReply *reply; X{ X#asm X MOVE.L D0,A0 ;Dereference Point since X ;structure size is smaller X ;than 33 bits X MOVE.L (A0),-(SP) ;where X MOVE.L D1,-(SP) ;prompt X MOVE.L D2,-(SP) ;fileFilter X MOVE.W D3,-(SP) ;numTypes X MOVE.L D4,-(SP) ;typeList X MOVE.L D5,-(SP) ;dlgHook X MOVE.L D6,-(SP) ;reply X MOVE #2,-(SP) ;routine selector for GetFile X DC.W $A9EA ;Pack3 X#endasm X} X XSFPutFile(where,prompt,origName,dlgHook,reply) XPoint *where; XStr255 *prompt; XStr255 *origName; XProcPtr dlgHook; XSFReply *reply; X{ X#asm X MOVE.L D0,A0 ;Dereference Point since X ;structure size is smaller X ;than 33 bits X MOVE.L (A0),-(SP) ;where X MOVE.L D1,-(SP) ;prompt X MOVE.L D2,-(SP) ;origName X MOVE.L D3,-(SP) ;dlgHook X MOVE.L D4,-(SP) ;reply X MOVE #1,-(SP) ;routine selector for PutFile X DC.W $A9EA ;Pack3 X#endasm X} SHAR_EOF if test 1056 -ne "`wc -c < 'SFLib.C'`" then echo shar: error transmitting "'SFLib.C'" '(should have been 1056 characters)' fi fi # end of overwriting check echo shar: extracting "'VolStuff.c'" '(3439 characters)' if test -f 'VolStuff.c' then echo shar: will not over-write existing file "'VolStuff.c'" else sed 's/^ X//' << \SHAR_EOF > 'VolStuff.c' X#Options M X#include "pbDefs.h" X X#define NIL 0 X Xtypedef struct PARAMBLK X { X long int qLink; // next queue entry X short int qType; // queue type X short int ioTrap; // routine trap X long int ioCmdAddr; // routine address X char *ioCompletion; // completion routine X short int ioResult; // result code X char *ioFileName; // volume or file name X short int ioVRefNum; // volume reference or drive number X short int ioRefNum; // path reference number X short int filler; // not used X short int ioVolIndex; // volume index X long int ioVCrDate; // date and time of initialization X long int ioVLsBkUp; // date & time of last backup X short int ioVAtrb; // bit 15 = 1 if volume locked X short int ioVNmFls; // number of files X short int ioVDirSt; // first block of file directory X short int ioVBlLn; // number blocks in file directory X short int ioVNmAlBlks; // number alloc blocks in volume X long int ioVAlBlkSiz; // number bytes per allocation block X long int ioVClpSiz; // bytes to allocate X short int ioAlBlSt; // first block in vol block map X long int ioVNxtFNum; // next free file number X short int ioVFrBlk; // number free alloc blocks X }; X X/* X * The trap name is _GetVolInfo but due to the 7 character limit X * in Apple's Pascal, PBGetVolInfo would evaluate to PBGetVol, so X * the names are PBGetVInfo and GetVInfo. The Sybex book assumed that X * this was an error in the Mac C header files. Because of this X * I have modified my header files to define both versions. X * and called my library module by the correct name. -- Jim Budler X */ X Xshort int GetVInfo(drvnum, vnam, vrefno, freeBytes) Xshort int drvnum; Xchar * vnam; Xshort int *vrefno; Xlong int * freeBytes; X{ X struct PARAMBLK myparamblk; X short int retval; X X myparamblk.ioCompletion = 0; X myparamblk.ioVRefNum = drvnum; X if (vnam == (char *) -1) X myparamblk.ioVolIndex = -1; X else X myparamblk.ioVolIndex = 0; X myparamblk.ioFileName = vnam; X retval = PBGetVInfo(&myparamblk, 0); X *freeBytes = (myparamblk.ioVFrBlk * myparamblk.ioVAlBlkSiz); X *vrefno = myparamblk.ioVRefNum; X vnam = myparamblk.ioFileName; X return(retval); X X} X Xshort int GetVol(vnam, vrefno) Xchar * vnam; Xshort int * vrefno; X{ X struct PARAMBLK myparamblk; X short int retval; X X myparamblk.ioCompletion = 0; X retval = PBGetVol(&myparamblk, 0); X *vrefno = myparamblk.ioVRefNum; X vnam = myparamblk.ioFileName; X return(retval); X X} X Xshort int SetVol(vnam, vrefno) Xchar * vnam; Xshort int vrefno; X{ X struct PARAMBLK myparamblk; X short int retval; X X myparamblk.ioCompletion = 0; X myparamblk.ioVRefNum = vrefno; X myparamblk.ioFileName = vnam; X return(PBSetVol(&myparamblk, 0)); X X} X Xshort int FlushVol(vnam, vrefno) Xchar * vnam; Xshort int vrefno; X{ X struct PARAMBLK myparamblk; X short int retval; X X myparamblk.ioCompletion = 0; X myparamblk.ioVRefNum = vrefno; X myparamblk.ioFileName = vnam; X return(PBFlshVol(&myparamblk, 0)); X X} X Xshort int UnmountVol(vnam, vrefno) Xchar * vnam; Xshort int vrefno; X{ X struct PARAMBLK myparamblk; X short int retval; X X myparamblk.ioCompletion = 0; X myparamblk.ioVRefNum = vrefno; X myparamblk.ioFileName = vnam; X return(PBUnmountVol(&myparamblk, 0)); X X} X Xshort int Eject(vnam, vrefno) Xchar * vnam; Xshort int vrefno; X{ X struct PARAMBLK myparamblk; X short int retval; X X myparamblk.ioCompletion = 0; X myparamblk.ioVRefNum = vrefno; X myparamblk.ioFileName = vnam; X return(PBEject(&myparamblk, 0)); X X} SHAR_EOF if test 3439 -ne "`wc -c < 'VolStuff.c'`" then echo shar: error transmitting "'VolStuff.c'" '(should have been 3439 characters)' fi fi # end of overwriting check # End of shell archive exit 0 -- Jim Budler Advanced Micro Devices, Inc. (408) 749-5806 Usenet: {ucbvax,decwrl,ihnp4,allegra,intelca}!amdcad!jimb Compuserve: 72415,1200