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(__SC__) || 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
;