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
;