void LFA_Truncate ( LFA_FileRef file, XMP_Int64 length ) { long refNum = (long)file; // ! Use long to avoid size warnings for SInt16 cast. OSErr err = FSSetForkSize ( refNum, fsFromStart, length ); if ( err != noErr ) LFA_Throw ( "LFA_Truncate: FSSetForkSize failure", kLFAErr_ExternalFailure ); } // LFA_Truncate
int psf_ftruncate (int fd, sf_count_t len) { /* Returns 0 on success, non-zero on failure. */ if (len < 0) return 1 ; if ((sizeof (off_t) < sizeof (sf_count_t)) && len > 0x7FFFFFFF) return 1 ; #if (defined(__MWERKS__) && defined (macintosh)) return FSSetForkSize (fd, fsFromStart, len) ; #else return ftruncate (fd, len) ; #endif } /* psf_ftruncate */
XMP_Int64 LFA_Seek ( LFA_FileRef file, XMP_Int64 offset, int mode, bool * okPtr ) { long refNum = (long)file; // ! Use long to avoid size warnings for SInt16 cast. UInt16 posMode; switch ( mode ) { case SEEK_SET : posMode = fsFromStart; break; case SEEK_CUR : posMode = fsFromMark; break; case SEEK_END : posMode = fsFromLEOF; break; default : LFA_Throw ( "LFA_Seek: Invalid seek mode", kLFAErr_InternalFailure ); break; } OSErr err; XMP_Int64 newPos; err = FSSetForkPosition ( refNum, posMode, offset ); if ( err == eofErr ) { // FSSetForkPosition does not implicitly grow the file. Grow then seek to the new EOF. err = FSSetForkSize ( refNum, posMode, offset ); if ( err == noErr ) err = FSSetForkPosition ( refNum, fsFromLEOF, 0 ); } if ( err == noErr ) err = FSGetForkPosition ( refNum, &newPos ); if ( okPtr != 0 ) { *okPtr = (err == noErr); } else { if ( err != noErr ) LFA_Throw ( "LFA_Seek: FSSetForkPosition failure", kLFAErr_ExternalFailure ); } return newPos; } // LFA_Seek
int psf_ftruncate (SF_PRIVATE *psf, sf_count_t len) { int retval ; /* Returns 0 on success, non-zero on failure. */ if (len < 0) return -1 ; if ((sizeof (off_t) < sizeof (sf_count_t)) && len > 0x7FFFFFFF) return -1 ; #if (defined(__MWERKS__) && defined (macintosh)) retval = FSSetForkSize (psf->filedes, fsFromStart, len) ; #else retval = ftruncate (psf->filedes, len) ; #endif if (retval == -1) psf_log_syserr (psf, errno) ; return retval ; } /* psf_ftruncate */