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. 
  45           #include <ansi_prefix.mach.h> 
  46           #include <msl_c_version.h> 
  49           #include <machine/ansi.h> 
  52 #include <MacErrors.h> 
  56 #if defined(__PPCC__) || defined(__SYMANTEC__) || defined(__MRC__) || defined(applec) 
  57 #define CtoPstr c2pstr 
  61 _tiffReadProc(thandle_t fd
, tdata_t buf
, tsize_t size
) 
  63         return (FSRead((short) fd
, (long*) &size
, (char*) buf
) == noErr 
? 
  68 _tiffWriteProc(thandle_t fd
, tdata_t buf
, tsize_t size
) 
  70         return (FSWrite((short) fd
, (long*) &size
, (char*) buf
) == noErr 
? 
  75 _tiffSeekProc(thandle_t fd
, toff_t off
, int whence
) 
  79         if (GetEOF((short) fd
, &size
) != noErr
) 
  81         (void) GetFPos((short) fd
, &fpos
); 
  85                 if (off 
+ fpos 
> size
) 
  86                         SetEOF((short) fd
, off 
+ fpos
); 
  87                 if (SetFPos((short) fd
, fsFromMark
, off
) != noErr
) 
  92                         SetEOF((short) fd
, off 
+ size
); 
  93                 if (SetFPos((short) fd
, fsFromStart
, off 
+ size
) != noErr
) 
  98                         SetEOF((short) fd
, off
); 
  99                 if (SetFPos((short) fd
, fsFromStart
, off
) != noErr
) 
 104         return (toff_t
)(GetFPos((short) fd
, &fpos
) == noErr 
? fpos 
: EOF
); 
 108 _tiffMapProc(thandle_t fd
, tdata_t
* pbase
, toff_t
* psize
) 
 114 _tiffUnmapProc(thandle_t fd
, tdata_t base
, toff_t size
) 
 119 _tiffCloseProc(thandle_t fd
) 
 121         return (FSClose((short) fd
)); 
 125 _tiffSizeProc(thandle_t fd
) 
 129         if (GetEOF((short) fd
, &size
) != noErr
) { 
 130                 TIFFError("_tiffSizeProc", "%s: Cannot get file size"); 
 133         return ((toff_t
) size
); 
 137  * Open a TIFF file descriptor for read/writing. 
 140 TIFFFdOpen(int fd
, const char* name
, const char* mode
) 
 144         tif 
= TIFFClientOpen(name
, mode
, (thandle_t
) fd
, 
 145             _tiffReadProc
, _tiffWriteProc
, _tiffSeekProc
, _tiffCloseProc
, 
 146             _tiffSizeProc
, _tiffMapProc
, _tiffUnmapProc
); 
 153  * Open a TIFF file for read/writing. 
 156 TIFFOpen(const char* name
, const char* mode
) 
 158         static const char module[] = "TIFFOpen"; 
 164         strcpy((char*) pname
, name
); 
 165         CtoPstr((char*) pname
); 
 167         switch (_TIFFgetMode(mode
, module)) { 
 170         case O_RDWR 
| O_CREAT 
| O_TRUNC
: 
 171                 if (GetFInfo(pname
, 0, &finfo
) == noErr
) 
 174         case O_RDWR 
| O_CREAT
: 
 175                 if ((err 
= GetFInfo(pname
, 0, &finfo
)) == fnfErr
) { 
 176                         if (Create(pname
, 0, '    ', 'TIFF') != noErr
) 
 178                         if (FSOpen(pname
, 0, &fref
) != noErr
) 
 180                 } else if (err 
== noErr
) { 
 181                         if (FSOpen(pname
, 0, &fref
) != noErr
) 
 188                 if (FSOpen(pname
, 0, &fref
) != noErr
) 
 192         return (TIFFFdOpen((int) fref
, name
, mode
)); 
 194         TIFFError(module, "%s: Cannot create", name
); 
 197         TIFFError(module, "%s: Cannot open", name
); 
 202 _TIFFmemset(tdata_t p
, int v
, tsize_t c
) 
 204         memset(p
, v
, (size_t) c
); 
 208 _TIFFmemcpy(tdata_t d
, const tdata_t s
, tsize_t c
) 
 210         memcpy(d
, s
, (size_t) c
); 
 214 _TIFFmemcmp(const tdata_t p1
, const tdata_t p2
, tsize_t c
) 
 216         return (memcmp(p1
, p2
, (size_t) c
)); 
 220 _TIFFmalloc(tsize_t s
) 
 222         return (NewPtr((size_t) s
)); 
 232 _TIFFrealloc(tdata_t p
, tsize_t s
) 
 236         SetPtrSize(p
, (size_t) s
); 
 237         if (MemError() && (n 
= NewPtr((size_t) s
)) != NULL
) { 
 238                 BlockMove(p
, n
, GetPtrSize(p
)); 
 241         return ((tdata_t
) n
); 
 245 appleWarningHandler(const char* module, const char* fmt
, va_list ap
) 
 248                 fprintf(stderr
, "%s: ", module); 
 249         fprintf(stderr
, "Warning, "); 
 250         vfprintf(stderr
, fmt
, ap
); 
 251         fprintf(stderr
, ".\n"); 
 253 TIFFErrorHandler _TIFFwarningHandler 
= appleWarningHandler
; 
 256 appleErrorHandler(const char* module, const char* fmt
, va_list ap
) 
 259                 fprintf(stderr
, "%s: ", module); 
 260         vfprintf(stderr
, fmt
, ap
); 
 261         fprintf(stderr
, ".\n"); 
 263 TIFFErrorHandler _TIFFerrorHandler 
= appleErrorHandler
;