1 /* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_acorn.c,v 1.2 2005/12/21 12:23:13 joris Exp $ */
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 RISC OS specific Routines.
29 * Developed out of the Unix version.
30 * Peter Greenham, May 1995
37 Low-level file handling
38 ~~~~~~~~~~~~~~~~~~~~~~~
39 The functions in osfcn.h are unavailable when compiling under C, as it's a
40 C++ header. Therefore they have been implemented here.
42 Now, why have I done it this way?
44 The definitive API library for RISC OS is Jonathan Coxhead's OSLib, which
45 uses heavily optimised ARM assembler or even plain inline SWI calls for
46 maximum performance and minimum runtime size. However, I don't want to make
47 LIBTIFF need that to survive. Therefore I have also emulated the functions
48 using macros to _swi() and _swix() defined in the swis.h header, and
49 borrowing types from kernel.h, which is less efficient but doesn't need any
50 third-party libraries.
62 /* OSLIB EMULATION STARTS */
67 /* From oslib:types.h */
68 typedef unsigned int bits
;
69 typedef unsigned char byte
;
84 typedef _kernel_oserror os_error
;
87 /* From oslib:osfile.h */
91 /* From oslib:osgbpb.h */
95 #define OSGBPB_Write 0x2
97 #define OSGBPB_Read 0x4
99 extern os_error
*xosgbpb_write (os_f file
,
103 extern int osgbpb_write (os_f file
,
107 #define xosgbpb_write(file, data, size, unwritten) \
108 (os_error*) _swix(OS_GBPB, _IN(0)|_IN(1)|_IN(2)|_IN(3)|_IN(4)|_OUT(3), \
115 #define osgbpb_write(file, data, size) \
116 _swi(OS_GBPB, _IN(0)|_IN(1)|_IN(2)|_IN(3)|_RETURN(3), \
122 extern os_error
*xosgbpb_read (os_f file
,
126 extern int osgbpb_read (os_f file
,
130 #define xosgbpb_read(file, buffer, size, unread) \
131 (os_error*) _swix(OS_GBPB, _IN(0)|_IN(1)|_IN(2)|_IN(3)|_OUT(3), \
138 #define osgbpb_read(file, buffer, size) \
139 _swi(OS_GBPB, _IN(0)|_IN(1)|_IN(2)|_IN(3)|_RETURN(3), \
145 /* From oslib:osfind.h */
149 #define OSFind_Openin 0x40
150 #undef OSFind_Openout
151 #define OSFind_Openout 0x80
153 #define OSFind_Openup 0xC0
155 #define OSFind_Close 0x0
157 #define xosfind_open(reason, file_name, path, file) \
158 (os_error*) _swix(OS_Find, _IN(0)|_IN(1)|_IN(2)|_OUT(0), \
159 reason, file_name, path, file)
161 #define osfind_open(reason, file_name, path) \
162 (os_f) _swi(OS_Find, _IN(0)|_IN(1)|_IN(2)|_RETURN(0), \
163 reason, file_name, path)
165 extern os_error
*xosfind_openin (bits flags
,
169 extern os_f
osfind_openin (bits flags
,
173 #define xosfind_openin(flags, file_name, path, file) \
174 xosfind_open(flags | OSFind_Openin, file_name, path, file)
176 #define osfind_openin(flags, file_name, path) \
177 osfind_open(flags | OSFind_Openin, file_name, path)
179 extern os_error
*xosfind_openout (bits flags
,
183 extern os_f
osfind_openout (bits flags
,
187 #define xosfind_openout(flags, file_name, path, file) \
188 xosfind_open(flags | OSFind_Openout, file_name, path, file)
190 #define osfind_openout(flags, file_name, path) \
191 osfind_open(flags | OSFind_Openout, file_name, path)
193 extern os_error
*xosfind_openup (bits flags
,
197 extern os_f
osfind_openup (bits flags
,
201 #define xosfind_openup(flags, file_name, path, file) \
202 xosfind_open(flags | OSFind_Openup, file_name, path, file)
204 #define osfind_openup(flags, file_name, path) \
205 osfind_open(flags | OSFind_Openup, file_name, path)
207 extern os_error
*xosfind_close (os_f file
);
208 extern void osfind_close (os_f file
);
210 #define xosfind_close(file) \
211 (os_error*) _swix(OS_Find, _IN(0)|_IN(1), \
215 #define osfind_close(file) \
216 (void) _swi(OS_Find, _IN(0)|_IN(1), \
220 /* From oslib:osargs.h */
223 #undef OSArgs_ReadPtr
224 #define OSArgs_ReadPtr 0x0
226 #define OSArgs_SetPtr 0x1
227 #undef OSArgs_ReadExt
228 #define OSArgs_ReadExt 0x2
230 extern os_error
*xosargs_read_ptr (os_f file
,
232 extern int osargs_read_ptr (os_f file
);
234 #define xosargs_read_ptr(file, ptr) \
235 (os_error*) _swix(OS_Args, _IN(0)|_IN(1)|_OUT(2), \
240 #define osargs_read_ptr(file) \
241 _swi(OS_Args, _IN(0)|_IN(1)|_RETURN(2), \
245 extern os_error
*xosargs_set_ptr (os_f file
,
247 extern void osargs_set_ptr (os_f file
,
250 #define xosargs_set_ptr(file, ptr) \
251 (os_error*) _swix(OS_Args, _IN(0)|_IN(1)|_IN(2), \
256 #define osargs_set_ptr(file, ptr) \
257 (void) _swi(OS_Args, _IN(0)|_IN(1)|_IN(2), \
262 extern os_error
*xosargs_read_ext (os_f file
,
264 extern int osargs_read_ext (os_f file
);
266 #define xosargs_read_ext(file, ext) \
267 (os_error*) _swix(OS_Args, _IN(0)|_IN(1)|_OUT(2), \
272 #define osargs_read_ext(file) \
273 _swi(OS_Args, _IN(0)|_IN(1)|_RETURN(2), \
277 /* OSLIB EMULATION ENDS */
282 /* Will be set or not during tiffcomp.h */
283 /* You get this to compile under C++? Please say how! */
285 extern int open(const char* name
, int flags
, int mode
)
287 /* From what I can tell, should return <0 for failure */
288 os_error
* e
= (os_error
*) 1; /* Cheeky way to use a pointer eh? :-) */
289 os_f file
= (os_f
) -1;
297 e
= xosfind_openin(SKIP
, name
, SKIP
, &file
);
302 case O_RDWR
|O_CREAT
|O_TRUNC
:
304 e
= xosfind_openout(SKIP
, name
, SKIP
, &file
);
309 e
= xosfind_openup(SKIP
, name
, SKIP
, &file
);
320 extern int close(int fd
)
322 return ((int) xosfind_close((os_f
) fd
));
325 extern int write(int fd
, const char *buf
, int nbytes
)
327 /* Returns number of bytes written */
328 return (nbytes
- osgbpb_write((os_f
) fd
, (const byte
*) buf
, nbytes
));
331 extern int read(int fd
, char *buf
, int nbytes
)
333 /* Returns number of bytes read */
334 return (nbytes
- osgbpb_read((os_f
) fd
, (byte
*) buf
, nbytes
));
337 extern off_t
lseek(int fd
, off_t offset
, int whence
)
345 absolute
= (int) offset
;
350 absolute
= osargs_read_ptr((os_f
) fd
) + (int) offset
;
355 absolute
= osargs_read_ext((os_f
) fd
) + (int) offset
;
360 osargs_set_ptr((os_f
) fd
, absolute
);
362 return ((off_t
) osargs_read_ptr((os_f
) fd
));
367 _tiffReadProc(thandle_t fd
, tdata_t buf
, tsize_t size
)
369 return ((tsize_t
) read((int) fd
, buf
, (size_t) size
));
373 _tiffWriteProc(thandle_t fd
, tdata_t buf
, tsize_t size
)
375 return ((tsize_t
) write((int) fd
, buf
, (size_t) size
));
379 _tiffSeekProc(thandle_t fd
, toff_t off
, int whence
)
381 return ((toff_t
) lseek((int) fd
, (off_t
) off
, whence
));
385 _tiffCloseProc(thandle_t fd
)
387 return (close((int) fd
));
391 _tiffSizeProc(thandle_t fd
)
393 return (lseek((int) fd
, SEEK_END
, SEEK_SET
));
397 #error "I didn't know Acorn had that!"
402 _tiffMapProc(thandle_t fd
, tdata_t
* pbase
, toff_t
* psize
)
404 (void) fd
; (void) pbase
; (void) psize
;
409 _tiffUnmapProc(thandle_t fd
, tdata_t base
, toff_t size
)
411 (void) fd
; (void) base
; (void) size
;
415 * Open a TIFF file descriptor for read/writing.
418 TIFFFdOpen(int fd
, const char* name
, const char* mode
)
422 tif
= TIFFClientOpen(name
, mode
,
424 _tiffReadProc
, _tiffWriteProc
,
425 _tiffSeekProc
, _tiffCloseProc
, _tiffSizeProc
,
426 _tiffMapProc
, _tiffUnmapProc
);
435 * Open a TIFF file for read/writing.
438 TIFFOpen(const char* name
, const char* mode
)
440 static const char module[] = "TIFFOpen";
443 m
= _TIFFgetMode(mode
, module);
450 fd
= open(name
, 0, m
);
454 TIFFErrorExt(0, module, "%s: Cannot open", name
);
457 return (TIFFFdOpen(fd
, name
, mode
));
461 _TIFFmalloc(tsize_t s
)
463 return (malloc((size_t) s
));
473 _TIFFrealloc(tdata_t p
, tsize_t s
)
475 return (realloc(p
, (size_t) s
));
479 _TIFFmemset(tdata_t p
, int v
, tsize_t c
)
481 memset(p
, v
, (size_t) c
);
485 _TIFFmemcpy(tdata_t d
, const tdata_t s
, tsize_t c
)
487 memcpy(d
, s
, (size_t) c
);
491 _TIFFmemcmp(const tdata_t p1
, const tdata_t p2
, tsize_t c
)
493 return (memcmp(p1
, p2
, (size_t) c
));
497 acornWarningHandler(const char* module, const char* fmt
, va_list ap
)
501 fprintf(stderr
, "%s: ", module);
503 fprintf(stderr
, "Warning, ");
504 vfprintf(stderr
, fmt
, ap
);
505 fprintf(stderr
, ".\n");
507 TIFFErrorHandler _TIFFwarningHandler
= acornWarningHandler
;
510 acornErrorHandler(const char* module, const char* fmt
, va_list ap
)
514 fprintf(stderr
, "%s: ", module);
516 vfprintf(stderr
, fmt
, ap
);
517 fprintf(stderr
, ".\n");
519 TIFFErrorHandler _TIFFerrorHandler
= acornErrorHandler
;