4  * Copyright (c) 1988-1997 Sam Leffler 
   5  * Copyright (c) 1991-1997 Silicon Graphics, Inc. 
   7  * Permission to use, copy, modify, distribute, and sell this software and  
   8  * its documentation for any purpose is hereby granted without fee, provided 
   9  * that (i) the above copyright notices and this permission notice appear in 
  10  * all copies of the software and related documentation, and (ii) the names of 
  11  * Sam Leffler and Silicon Graphics may not be used in any advertising or 
  12  * publicity relating to the software without the specific, prior written 
  13  * permission of Sam Leffler and Silicon Graphics. 
  15  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,  
  16  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY  
  17  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.   
  19  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR 
  20  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, 
  21  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 
  22  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF  
  23  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE  
  28  * TIFF Library Macintosh-specific routines. 
  30  * These routines use only Toolbox and high-level File Manager traps. 
  31  * They make no calls to the THINK C "unix" compatibility library.  Also, 
  32  * malloc is not used directly but it is still referenced internally by 
  33  * the ANSI library in rare cases.  Heap fragmentation by the malloc ring 
  34  * buffer is therefore minimized. 
  36  * O_RDONLY and O_RDWR are treated identically here.  The tif_mode flag is 
  37  * checked in TIFFWriteCheck(). 
  39  * Create below fills in a blank creator signature and sets the file type 
  40  * to 'TIFF'.  It is much better for the application to do this by Create'ing 
  41  * the file first and TIFFOpen'ing it later. 
  43  * This code has been "Carbonized", and may not work with older MacOS versions. 
  44  * If so, grab the tif_apple.c out of an older libtiff distribution, like 
  45  * 3.5.5 from www.libtiff.org. 
  49 #include <MacErrors.h> 
  54 #if defined(__PPCC__) || defined(__SC__) || defined(__MRC__) || defined(applec) 
  55 #define CtoPstr c2pstr 
  59 _tiffReadProc(thandle_t fd
, tdata_t buf
, tsize_t size
) 
  61         return (FSRead((short) fd
, (long*) &size
, (char*) buf
) == noErr 
? 
  66 _tiffWriteProc(thandle_t fd
, tdata_t buf
, tsize_t size
) 
  68         return (FSWrite((short) fd
, (long*) &size
, (char*) buf
) == noErr 
? 
  73 _tiffSeekProc(thandle_t fd
, toff_t off
, int whence
) 
  77         if (GetEOF((short) fd
, &size
) != noErr
) 
  79         (void) GetFPos((short) fd
, &fpos
); 
  83                 if (off 
+ fpos 
> size
) 
  84                         SetEOF((short) fd
, off 
+ fpos
); 
  85                 if (SetFPos((short) fd
, fsFromMark
, off
) != noErr
) 
  90                         SetEOF((short) fd
, off 
+ size
); 
  91                 if (SetFPos((short) fd
, fsFromStart
, off 
+ size
) != noErr
) 
  96                         SetEOF((short) fd
, off
); 
  97                 if (SetFPos((short) fd
, fsFromStart
, off
) != noErr
) 
 102         return (toff_t
)(GetFPos((short) fd
, &fpos
) == noErr 
? fpos 
: EOF
); 
 106 _tiffMapProc(thandle_t fd
, tdata_t
* pbase
, toff_t
* psize
) 
 112 _tiffUnmapProc(thandle_t fd
, tdata_t base
, toff_t size
) 
 117 _tiffCloseProc(thandle_t fd
) 
 119         return (FSClose((short) fd
)); 
 123 _tiffSizeProc(thandle_t fd
) 
 127         if (GetEOF((short) fd
, &size
) != noErr
) { 
 128                 TIFFError("_tiffSizeProc", "%s: Cannot get file size"); 
 131         return ((toff_t
) size
); 
 135  * Open a TIFF file descriptor for read/writing. 
 138 TIFFFdOpen(int fd
, const char* name
, const char* mode
) 
 142         tif 
= TIFFClientOpen(name
, mode
, (thandle_t
) fd
, 
 143             _tiffReadProc
, _tiffWriteProc
, _tiffSeekProc
, _tiffCloseProc
, 
 144             _tiffSizeProc
, _tiffMapProc
, _tiffUnmapProc
); 
 150 static void ourc2pstr( char* inString 
) 
 152         int     sLen 
= strlen( inString 
); 
 153         BlockMoveData( inString
, &inString
[1], sLen 
); 
 158  * Open a TIFF file for read/writing. 
 161 TIFFOpen(const char* name
, const char* mode
) 
 163         static const char module[] = "TIFFOpen"; 
 170         strcpy((char*) pname
, name
); 
 171         ourc2pstr((char*) pname
); 
 173         err 
= FSMakeFSSpec( 0, 0, pname
, &fSpec 
); 
 175         switch (_TIFFgetMode(mode
, module)) { 
 178         case O_RDWR 
| O_CREAT 
| O_TRUNC
: 
 179                 if (FSpGetFInfo(&fSpec
, &finfo
) == noErr
) 
 182         case O_RDWR 
| O_CREAT
: 
 183                 if ((err 
= FSpGetFInfo(&fSpec
, &finfo
)) == fnfErr
) { 
 184                         if (FSpCreate(&fSpec
, '    ', 'TIFF', smSystemScript
) != noErr
) 
 186                         if (FSpOpenDF(&fSpec
, fsRdWrPerm
, &fref
) != noErr
) 
 188                 } else if (err 
== noErr
) { 
 189                         if (FSpOpenDF(&fSpec
, fsRdWrPerm
, &fref
) != noErr
) 
 195                 if (FSpOpenDF(&fSpec
, fsRdPerm
, &fref
) != noErr
) 
 199                 if (FSpOpenDF(&fSpec
, fsRdWrPerm
, &fref
) != noErr
) 
 203         return (TIFFFdOpen((int) fref
, name
, mode
)); 
 205         TIFFError(module, "%s: Cannot create", name
); 
 208         TIFFError(module, "%s: Cannot open", name
); 
 213 _TIFFmemset(tdata_t p
, int v
, tsize_t c
) 
 215         memset(p
, v
, (size_t) c
); 
 219 _TIFFmemcpy(tdata_t d
, const tdata_t s
, tsize_t c
) 
 221         memcpy(d
, s
, (size_t) c
); 
 225 _TIFFmemcmp(const tdata_t p1
, const tdata_t p2
, tsize_t c
) 
 227         return (memcmp(p1
, p2
, (size_t) c
)); 
 231 _TIFFmalloc(tsize_t s
) 
 233         return (NewPtr((size_t) s
)); 
 243 _TIFFrealloc(tdata_t p
, tsize_t s
) 
 247         SetPtrSize(p
, (size_t) s
); 
 248         if (MemError() && (n 
= NewPtr((size_t) s
)) != NULL
) { 
 249                 BlockMove(p
, n
, GetPtrSize(p
)); 
 252         return ((tdata_t
) n
); 
 256 appleWarningHandler(const char* module, const char* fmt
, va_list ap
) 
 259                 fprintf(stderr
, "%s: ", module); 
 260         fprintf(stderr
, "Warning, "); 
 261         vfprintf(stderr
, fmt
, ap
); 
 262         fprintf(stderr
, ".\n"); 
 264 TIFFErrorHandler _TIFFwarningHandler 
= appleWarningHandler
; 
 267 appleErrorHandler(const char* module, const char* fmt
, va_list ap
) 
 270                 fprintf(stderr
, "%s: ", module); 
 271         vfprintf(stderr
, fmt
, ap
); 
 272         fprintf(stderr
, ".\n"); 
 274 TIFFErrorHandler _TIFFerrorHandler 
= appleErrorHandler
;