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.
49 #if defined(__PPCC__) || defined(__SC__) || defined(__MRC__) || defined(applec)
50 #define CtoPstr c2pstr
54 _tiffReadProc(thandle_t fd
, tdata_t buf
, tsize_t size
)
56 return (FSRead((short) fd
, (long*) &size
, (char*) buf
) == noErr
?
61 _tiffWriteProc(thandle_t fd
, tdata_t buf
, tsize_t size
)
63 return (FSWrite((short) fd
, (long*) &size
, (char*) buf
) == noErr
?
68 _tiffSeekProc(thandle_t fd
, toff_t off
, int whence
)
72 if (GetEOF((short) fd
, &size
) != noErr
)
74 (void) GetFPos((short) fd
, &fpos
);
78 if (off
+ fpos
> size
)
79 SetEOF((short) fd
, off
+ fpos
);
80 if (SetFPos((short) fd
, fsFromMark
, off
) != noErr
)
85 SetEOF((short) fd
, off
+ size
);
86 if (SetFPos((short) fd
, fsFromStart
, off
+ size
) != noErr
)
91 SetEOF((short) fd
, off
);
92 if (SetFPos((short) fd
, fsFromStart
, off
) != noErr
)
97 return (toff_t
)(GetFPos((short) fd
, &fpos
) == noErr
? fpos
: EOF
);
101 _tiffMapProc(thandle_t fd
, tdata_t
* pbase
, toff_t
* psize
)
107 _tiffUnmapProc(thandle_t fd
, tdata_t base
, toff_t size
)
112 _tiffCloseProc(thandle_t fd
)
114 return (FSClose((short) fd
));
118 _tiffSizeProc(thandle_t fd
)
122 if (GetEOF((short) fd
, &size
) != noErr
) {
123 TIFFError("_tiffSizeProc", "%s: Cannot get file size");
126 return ((toff_t
) size
);
130 * Open a TIFF file descriptor for read/writing.
133 TIFFFdOpen(int fd
, const char* name
, const char* mode
)
137 tif
= TIFFClientOpen(name
, mode
, (thandle_t
) fd
,
138 _tiffReadProc
, _tiffWriteProc
, _tiffSeekProc
, _tiffCloseProc
,
139 _tiffSizeProc
, _tiffMapProc
, _tiffUnmapProc
);
146 * Open a TIFF file for read/writing.
149 TIFFOpen(const char* name
, const char* mode
)
151 static const char module[] = "TIFFOpen";
157 strcpy((char*) pname
, name
);
158 CtoPstr((char*) pname
);
160 switch (_TIFFgetMode(mode
, module)) {
163 case O_RDWR
| O_CREAT
| O_TRUNC
:
164 if (GetFInfo(pname
, 0, &finfo
) == noErr
)
167 case O_RDWR
| O_CREAT
:
168 if ((err
= GetFInfo(pname
, 0, &finfo
)) == fnfErr
) {
169 if (Create(pname
, 0, ' ', 'TIFF') != noErr
)
171 if (FSOpen(pname
, 0, &fref
) != noErr
)
173 } else if (err
== noErr
) {
174 if (FSOpen(pname
, 0, &fref
) != noErr
)
181 if (FSOpen(pname
, 0, &fref
) != noErr
)
185 return (TIFFFdOpen((int) fref
, name
, mode
));
187 TIFFError(module, "%s: Cannot create", name
);
190 TIFFError(module, "%s: Cannot open", name
);
195 _TIFFmemset(tdata_t p
, int v
, tsize_t c
)
197 memset(p
, v
, (size_t) c
);
201 _TIFFmemcpy(tdata_t d
, const tdata_t s
, tsize_t c
)
203 memcpy(d
, s
, (size_t) c
);
207 _TIFFmemcmp(const tdata_t p1
, const tdata_t p2
, tsize_t c
)
209 return (memcmp(p1
, p2
, (size_t) c
));
213 _TIFFmalloc(tsize_t s
)
215 return (NewPtr((size_t) s
));
225 _TIFFrealloc(tdata_t p
, tsize_t s
)
229 SetPtrSize(p
, (size_t) s
);
230 if (MemError() && (n
= NewPtr((size_t) s
)) != NULL
) {
231 BlockMove(p
, n
, GetPtrSize(p
));
234 return ((tdata_t
) n
);
238 appleWarningHandler(const char* module, const char* fmt
, va_list ap
)
241 fprintf(stderr
, "%s: ", module);
242 fprintf(stderr
, "Warning, ");
243 vfprintf(stderr
, fmt
, ap
);
244 fprintf(stderr
, ".\n");
246 TIFFErrorHandler _TIFFwarningHandler
= appleWarningHandler
;
249 appleErrorHandler(const char* module, const char* fmt
, va_list ap
)
252 fprintf(stderr
, "%s: ", module);
253 vfprintf(stderr
, fmt
, ap
);
254 fprintf(stderr
, ".\n");
256 TIFFErrorHandler _TIFFerrorHandler
= appleErrorHandler
;