home *** CD-ROM | disk | FTP | other *** search
- /*
- * FLFileStuff.c - file routines of general usefulness.
- */
-
-
- # include "TransSkel.h"
-
- # include "FLFileStuff.h"
- # include "FLMaca.h"
- # include "FLMapInfo.h"
- # include "FaceLift.h"
-
-
- /* ---------------------------------------------------------------- */
- /* Generic Error Message Routine */
- /* ---------------------------------------------------------------- */
-
-
- /*
- * If errNo isn't noErr, then print a message. The message is found
- * in the 'STR ' resource of the same number as the file err. If
- * no resource is found with that number, use a default message.
- */
-
- void
- FileErr (OSErr errNo)
- {
- StringHandle h;
- Str255 numStr;
- Str255 meaning;
-
- if (errNo == noErr)
- return;
-
- CopyString ("\pNo error message available", meaning); /* default */
-
- h = GetString (errNo);
- if (h != nil && HomeResFile ((Handle) h) == CurResFile ())
- {
- HLock ((Handle) h);
- CopyString (*h, meaning);
- HUnlock ((Handle) h);
- ReleaseResource ((Handle) h);
- }
-
- NumToString ((long) errNo, numStr);
- Message ("\pI/O error ", numStr, "\p: ", meaning);
- }
-
-
- /* ---------------------------------------------------------------- */
- /* Routines to get or open files for input or output */
- /* ---------------------------------------------------------------- */
-
-
- static Point dlogWhere = { 70, 100 }; /* Get/PutFile dlog location */
- static Str255 buttonTitle; /* "Open" button title */
-
-
- /*
- * GFFilter is a SFGetFile filter to set the name of the "Open"
- * button.
- */
-
- static pascal short
- GFFilter (short theItem, DialogPtr theDialog)
- {
- if (theItem == -1) /* change "Open" button name */
- SetCTitle (SkelGetDlogCtl (theDialog, 1), buttonTitle);
- return (theItem);
- }
-
-
- /*
- * Get a filename for input.
- */
-
- Boolean
- GetInputFile (StringPtr bTitle, OSType type, SFReply *inFile)
- {
- CopyString (bTitle, buttonTitle); /* set title for "Open" button */
- SFPGetFile (dlogWhere, "\p", nil, 1, &type, GFFilter, inFile,
- getDlgID, SkelDlogFilter (nil, true));
- SkelRmveDlogFilter ();
- SkelDoUpdates ();
- return (inFile->good);
- }
-
-
- /*
- * Open a filename for input.
- */
-
- Boolean
- OpenInputFile (SFReply *inFile, short *f)
- {
- OSErr result;
-
- result = FSOpen (inFile->fName, inFile->vRefNum, f);
- if (result != noErr)
- {
- FileErr (result);
- Message3 ("\pCannot open \"", inFile->fName, "\p\".");
- }
- return (result == noErr);
- }
-
-
- /*
- * Get a filename for output.
- * Pass the current name and volume reference, and whether to
- * ask for a name even if one is known. Return the information
- * in the SFReply record.
- *
- * Note: if ask is false and the name isn't "untitled", the name
- * passed is assumed to be the correct name to use and is returned.
- * This may seem odd, but eliminates making the check every place
- * from which this is called.
- */
-
- Boolean
- GetOutputFile (Boolean ask, StringPtr fName, short vRefNum, SFReply *outFile)
- {
- CopyString (fName, outFile->fName);
- outFile->vRefNum = vRefNum;
- if (ask || CompareString ("\puntitled", fName) == 0)
- {
- SFPPutFile (dlogWhere, "\pWrite to...", fName, nil, outFile,
- putDlgID, SkelDlogFilter (nil, true));
- SkelRmveDlogFilter ();
- SkelDoUpdates ();
- if (!outFile->good)
- return (false);
- }
- return (true);
- }
-
-
- /*
- * Open output file, creating if necessary. Truncate contents as well.
- */
-
- Boolean
- OpenOutputFile (SFReply *outFile, OSType creator, OSType type, short *f)
- {
- FInfo fndrInfo;
- OSErr result;
-
- if (GetFInfo (outFile->fName, outFile->vRefNum, &fndrInfo) == noErr)
- {
- if (fndrInfo.fdCreator != creator || fndrInfo.fdType != type)
- {
- Message3 ("\p\"", outFile->fName, "\p\" is not a file of the proper type");
- return (false);
- }
- }
- else /* Doesn't exist. Try to create it. */
- {
- result = Create (outFile->fName, outFile->vRefNum, creator, type);
- if (result != noErr)
- {
- FileErr (result);
- Message3 ("\pCan't create \"", outFile->fName, "\p\"");
- return (false);
- }
- else /* new file now - set Finder info */
- {
- (void) GetFInfo (outFile->fName, outFile->vRefNum, &fndrInfo);
- fndrInfo.fdFlags &= ~1; /* clear init'ed bit */
- fndrInfo.fdLocation.h = 0;
- fndrInfo.fdLocation.v = 0;
- fndrInfo.fdFldr = 0;
- (void) SetFInfo (outFile->fName, outFile->vRefNum, &fndrInfo);
- }
- }
-
- result = FSOpen (outFile->fName, outFile->vRefNum, f);
- if (result != noErr)
- {
- FileErr (result);
- Message3 ("\pCan't write to \"", outFile->fName, "\p\".");
- }
- else
- (void) SetEOF (*f, 0L); /* clear contents */
-
- return (result == noErr);
- }
-
-
- /* ---------------------------------------------------------------- */
- /* Seek, Read, Write on open files */
- /* ---------------------------------------------------------------- */
-
-
- /*
- * Seek to given position in file
- */
-
- void
- FileSeek (short f, long pos)
- {
- (void) SetFPos (f, fsFromStart, pos);
- }
-
-
- /*
- * Read the given number of bytes from a file. Return false
- * if fail.
- */
-
- Boolean
- FileRead (short f, Ptr p, long amount)
- {
- OSErr result;
- long read;
- Boolean ok = false;
-
- read = amount;
- if ((result = FSRead (f, &read, p)) != noErr && result != eofErr)
- FileErr (result);
- else
- ok = (amount == read);
- return (ok);
- }
-
-
- /*
- * Write the given number of bytes from a file. Return false
- * if fail.
- */
-
- Boolean
- FileWrite (short f, Ptr p, long amount)
- {
- OSErr result;
- long written;
- Boolean ok = false;
-
- written = amount;
- if ((result = FSWrite (f, &written, p)) != noErr)
- FileErr (result);
- else if (amount != written)
- Message1 ("\pIncomplete write operation");
- else
- ok = true;
- return (ok);
- }
-
-