tif_acorn.c
上传用户:looem2003
上传日期:2014-07-20
资源大小:13733k
文件大小:12k
源码类别:

打印编程

开发平台:

Visual C++

  1. /* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_acorn.c,v 1.2 2005/12/21 12:23:13 joris Exp $ */
  2. /*
  3.  * Copyright (c) 1988-1997 Sam Leffler
  4.  * Copyright (c) 1991-1997 Silicon Graphics, Inc.
  5.  *
  6.  * Permission to use, copy, modify, distribute, and sell this software and
  7.  * its documentation for any purpose is hereby granted without fee, provided
  8.  * that (i) the above copyright notices and this permission notice appear in
  9.  * all copies of the software and related documentation, and (ii) the names of
  10.  * Sam Leffler and Silicon Graphics may not be used in any advertising or
  11.  * publicity relating to the software without the specific, prior written
  12.  * permission of Sam Leffler and Silicon Graphics.
  13.  *
  14.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
  15.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
  16.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
  17.  *
  18.  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
  19.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  20.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  21.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
  22.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
  23.  * OF THIS SOFTWARE.
  24.  */
  25. /*
  26.  * TIFF Library RISC OS specific Routines.
  27.  * Developed out of the Unix version.
  28.  * Peter Greenham, May 1995
  29.  */
  30. #include "tiffiop.h"
  31. #include <stdio.h>
  32. #include <stdlib.h>
  33. /*
  34. Low-level file handling
  35. ~~~~~~~~~~~~~~~~~~~~~~~
  36. The functions in osfcn.h are unavailable when compiling under C, as it's a
  37. C++ header. Therefore they have been implemented here.
  38. Now, why have I done it this way?
  39. The definitive API library for RISC OS is Jonathan Coxhead's OSLib, which
  40. uses heavily optimised ARM assembler or even plain inline SWI calls for
  41. maximum performance and minimum runtime size. However, I don't want to make
  42. LIBTIFF need that to survive. Therefore I have also emulated the functions
  43. using macros to _swi() and _swix() defined in the swis.h header, and
  44. borrowing types from kernel.h, which is less efficient but doesn't need any
  45. third-party libraries.
  46.  */
  47. #ifdef INCLUDE_OSLIB
  48. #include "osfile.h"
  49. #include "osgbpb.h"
  50. #include "osargs.h"
  51. #include "osfind.h"
  52. #else
  53. /* OSLIB EMULATION STARTS */
  54. #include "kernel.h"
  55. #include "swis.h"
  56. /* From oslib:types.h */
  57. typedef unsigned int                            bits;
  58. typedef unsigned char                           byte;
  59. #ifndef TRUE
  60. #define TRUE                                    1
  61. #endif
  62. #ifndef FALSE
  63. #define FALSE                                   0
  64. #endif
  65. #ifndef NULL
  66. #define NULL                                    0
  67. #endif
  68. #ifndef SKIP
  69. #define SKIP                                    0
  70. #endif
  71. /* From oslib:os.h */
  72. typedef _kernel_oserror os_error;
  73. typedef byte os_f;
  74. /* From oslib:osfile.h */
  75. #undef  OS_File
  76. #define OS_File                                 0x8
  77. /* From oslib:osgbpb.h */
  78. #undef  OS_GBPB
  79. #define OS_GBPB                                 0xC
  80. #undef  OSGBPB_Write
  81. #define OSGBPB_Write                            0x2
  82. #undef  OSGBPB_Read
  83. #define OSGBPB_Read                             0x4
  84. extern os_error *xosgbpb_write (os_f file,
  85.       byte *data,
  86.       int size,
  87.       int *unwritten);
  88. extern int osgbpb_write (os_f file,
  89.       byte *data,
  90.       int size);
  91. #define xosgbpb_write(file, data, size, unwritten) 
  92. (os_error*) _swix(OS_GBPB, _IN(0)|_IN(1)|_IN(2)|_IN(3)|_IN(4)|_OUT(3), 
  93. OSGBPB_WriteAt, 
  94. file, 
  95. data, 
  96. size, 
  97. unwritten)
  98. #define osgbpb_write(file, data, size) 
  99. _swi(OS_GBPB, _IN(0)|_IN(1)|_IN(2)|_IN(3)|_RETURN(3), 
  100. OSGBPB_Write, 
  101. file, 
  102. data, 
  103. size)
  104. extern os_error *xosgbpb_read (os_f file,
  105.       byte *buffer,
  106.       int size,
  107.       int *unread);
  108. extern int osgbpb_read (os_f file,
  109.       byte *buffer,
  110.       int size);
  111. #define xosgbpb_read(file, buffer, size, unread) 
  112. (os_error*) _swix(OS_GBPB, _IN(0)|_IN(1)|_IN(2)|_IN(3)|_OUT(3), 
  113. OSGBPB_Read, 
  114. file, 
  115. buffer, 
  116. size, 
  117. unread)
  118. #define osgbpb_read(file, buffer, size) 
  119. _swi(OS_GBPB, _IN(0)|_IN(1)|_IN(2)|_IN(3)|_RETURN(3), 
  120. OSGBPB_Read, 
  121. file, 
  122. buffer, 
  123. size)
  124. /* From oslib:osfind.h */
  125. #undef  OS_Find
  126. #define OS_Find                                 0xD
  127. #undef  OSFind_Openin
  128. #define OSFind_Openin                           0x40
  129. #undef  OSFind_Openout
  130. #define OSFind_Openout                          0x80
  131. #undef  OSFind_Openup
  132. #define OSFind_Openup                           0xC0
  133. #undef  OSFind_Close
  134. #define OSFind_Close                            0x0
  135. #define xosfind_open(reason, file_name, path, file) 
  136. (os_error*) _swix(OS_Find, _IN(0)|_IN(1)|_IN(2)|_OUT(0), 
  137. reason, file_name, path, file)
  138. #define osfind_open(reason, file_name, path) 
  139. (os_f) _swi(OS_Find, _IN(0)|_IN(1)|_IN(2)|_RETURN(0), 
  140. reason, file_name, path)
  141. extern os_error *xosfind_openin (bits flags,
  142.       char *file_name,
  143.       char *path,
  144.       os_f *file);
  145. extern os_f osfind_openin (bits flags,
  146.       char *file_name,
  147.       char *path);
  148. #define xosfind_openin(flags, file_name, path, file) 
  149. xosfind_open(flags | OSFind_Openin, file_name, path, file)
  150. #define osfind_openin(flags, file_name, path) 
  151. osfind_open(flags | OSFind_Openin, file_name, path)
  152. extern os_error *xosfind_openout (bits flags,
  153.       char *file_name,
  154.       char *path,
  155.       os_f *file);
  156. extern os_f osfind_openout (bits flags,
  157.       char *file_name,
  158.       char *path);
  159. #define xosfind_openout(flags, file_name, path, file) 
  160. xosfind_open(flags | OSFind_Openout, file_name, path, file)
  161. #define osfind_openout(flags, file_name, path) 
  162. osfind_open(flags | OSFind_Openout, file_name, path)
  163. extern os_error *xosfind_openup (bits flags,
  164.       char *file_name,
  165.       char *path,
  166.       os_f *file);
  167. extern os_f osfind_openup (bits flags,
  168.       char *file_name,
  169.       char *path);
  170. #define xosfind_openup(flags, file_name, path, file) 
  171. xosfind_open(flags | OSFind_Openup, file_name, path, file)
  172. #define osfind_openup(flags, file_name, path) 
  173. osfind_open(flags | OSFind_Openup, file_name, path)
  174. extern os_error *xosfind_close (os_f file);
  175. extern void osfind_close (os_f file);
  176. #define xosfind_close(file) 
  177. (os_error*) _swix(OS_Find, _IN(0)|_IN(1), 
  178. OSFind_Close, 
  179. file)
  180. #define osfind_close(file) 
  181. (void) _swi(OS_Find, _IN(0)|_IN(1), 
  182. OSFind_Close, 
  183. file)
  184. /* From oslib:osargs.h */
  185. #undef  OS_Args
  186. #define OS_Args                                 0x9
  187. #undef  OSArgs_ReadPtr
  188. #define OSArgs_ReadPtr                          0x0
  189. #undef  OSArgs_SetPtr
  190. #define OSArgs_SetPtr                           0x1
  191. #undef  OSArgs_ReadExt
  192. #define OSArgs_ReadExt                          0x2
  193. extern os_error *xosargs_read_ptr (os_f file,
  194.       int *ptr);
  195. extern int osargs_read_ptr (os_f file);
  196. #define xosargs_read_ptr(file, ptr) 
  197. (os_error*) _swix(OS_Args, _IN(0)|_IN(1)|_OUT(2), 
  198. OSArgs_ReadPtr, 
  199. file, 
  200. ptr)
  201. #define osargs_read_ptr(file) 
  202. _swi(OS_Args, _IN(0)|_IN(1)|_RETURN(2), 
  203. OSArgs_ReadPtr, 
  204. file)
  205. extern os_error *xosargs_set_ptr (os_f file,
  206.       int ptr);
  207. extern void osargs_set_ptr (os_f file,
  208.       int ptr);
  209. #define xosargs_set_ptr(file, ptr) 
  210. (os_error*) _swix(OS_Args, _IN(0)|_IN(1)|_IN(2), 
  211. OSArgs_SetPtr, 
  212. file, 
  213. ptr)
  214. #define osargs_set_ptr(file, ptr) 
  215. (void) _swi(OS_Args, _IN(0)|_IN(1)|_IN(2), 
  216. OSArgs_SetPtr, 
  217. file, 
  218. ptr)
  219. extern os_error *xosargs_read_ext (os_f file,
  220.       int *ext);
  221. extern int osargs_read_ext (os_f file);
  222. #define xosargs_read_ext(file, ext) 
  223. (os_error*) _swix(OS_Args, _IN(0)|_IN(1)|_OUT(2), 
  224. OSArgs_ReadExt, 
  225. file, 
  226. ext)
  227. #define osargs_read_ext(file) 
  228. _swi(OS_Args, _IN(0)|_IN(1)|_RETURN(2), 
  229. OSArgs_ReadExt, 
  230. file)
  231. /* OSLIB EMULATION ENDS */
  232. #endif
  233. #ifndef __osfcn_h
  234. /* Will be set or not during tiffcomp.h */
  235. /* You get this to compile under C++? Please say how! */
  236. extern int open(const char* name, int flags, int mode)
  237. {
  238. /* From what I can tell, should return <0 for failure */
  239. os_error* e = (os_error*) 1; /* Cheeky way to use a pointer eh? :-) */
  240. os_f file = (os_f) -1;
  241. flags = flags;
  242. switch(mode)
  243. {
  244. case O_RDONLY:
  245. {
  246. e = xosfind_openin(SKIP, name, SKIP, &file);
  247. break;
  248. }
  249. case O_WRONLY:
  250. case O_RDWR|O_CREAT:
  251. case O_RDWR|O_CREAT|O_TRUNC:
  252. {
  253. e = xosfind_openout(SKIP, name, SKIP, &file);
  254. break;
  255. }
  256. case O_RDWR:
  257. {
  258. e = xosfind_openup(SKIP, name, SKIP, &file);
  259. break;
  260. }
  261. }
  262. if (e)
  263. {
  264. file = (os_f) -1;
  265. }
  266. return (file);
  267. }
  268. extern int close(int fd)
  269. {
  270. return ((int) xosfind_close((os_f) fd));
  271. }
  272. extern int write(int fd, const char *buf, int nbytes)
  273. {
  274. /* Returns number of bytes written */
  275. return (nbytes - osgbpb_write((os_f) fd, (const byte*) buf, nbytes));
  276. }
  277. extern int read(int fd, char *buf, int nbytes)
  278. {
  279. /* Returns number of bytes read */
  280. return (nbytes - osgbpb_read((os_f) fd, (byte*) buf, nbytes));
  281. }
  282. extern off_t lseek(int fd, off_t offset, int whence)
  283. {
  284. int absolute = 0;
  285. switch (whence)
  286. {
  287. case SEEK_SET:
  288. {
  289. absolute = (int) offset;
  290. break;
  291. }
  292. case SEEK_CUR:
  293. {
  294. absolute = osargs_read_ptr((os_f) fd) + (int) offset;
  295. break;
  296. }
  297. case SEEK_END:
  298. {
  299. absolute = osargs_read_ext((os_f) fd) + (int) offset;
  300. break;
  301. }
  302. }
  303. osargs_set_ptr((os_f) fd, absolute);
  304. return ((off_t) osargs_read_ptr((os_f) fd));
  305. }
  306. #endif
  307. static tsize_t
  308. _tiffReadProc(thandle_t fd, tdata_t buf, tsize_t size)
  309. {
  310. return ((tsize_t) read((int) fd, buf, (size_t) size));
  311. }
  312. static tsize_t
  313. _tiffWriteProc(thandle_t fd, tdata_t buf, tsize_t size)
  314. {
  315. return ((tsize_t) write((int) fd, buf, (size_t) size));
  316. }
  317. static toff_t
  318. _tiffSeekProc(thandle_t fd, toff_t off, int whence)
  319. {
  320. return ((toff_t) lseek((int) fd, (off_t) off, whence));
  321. }
  322. static int
  323. _tiffCloseProc(thandle_t fd)
  324. {
  325. return (close((int) fd));
  326. }
  327. static toff_t
  328. _tiffSizeProc(thandle_t fd)
  329. {
  330. return (lseek((int) fd, SEEK_END, SEEK_SET));
  331. }
  332. #ifdef HAVE_MMAP
  333. #error "I didn't know Acorn had that!"
  334. #endif
  335. /* !HAVE_MMAP */
  336. static int
  337. _tiffMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize)
  338. {
  339. (void) fd; (void) pbase; (void) psize;
  340. return (0);
  341. }
  342. static void
  343. _tiffUnmapProc(thandle_t fd, tdata_t base, toff_t size)
  344. {
  345. (void) fd; (void) base; (void) size;
  346. }
  347. /*
  348.  * Open a TIFF file descriptor for read/writing.
  349.  */
  350. TIFF*
  351. TIFFFdOpen(int fd, const char* name, const char* mode)
  352. {
  353. TIFF* tif;
  354. tif = TIFFClientOpen(name, mode,
  355. (thandle_t) fd,
  356. _tiffReadProc, _tiffWriteProc,
  357. _tiffSeekProc, _tiffCloseProc, _tiffSizeProc,
  358. _tiffMapProc, _tiffUnmapProc);
  359. if (tif)
  360. {
  361. tif->tif_fd = fd;
  362. }
  363. return (tif);
  364. }
  365. /*
  366.  * Open a TIFF file for read/writing.
  367.  */
  368. TIFF*
  369. TIFFOpen(const char* name, const char* mode)
  370. {
  371. static const char module[] = "TIFFOpen";
  372. int m, fd;
  373. m = _TIFFgetMode(mode, module);
  374. if (m == -1)
  375. {
  376. return ((TIFF*) 0);
  377. }
  378. fd = open(name, 0, m);
  379. if (fd < 0)
  380. {
  381. TIFFErrorExt(0, module, "%s: Cannot open", name);
  382. return ((TIFF *)0);
  383. }
  384. return (TIFFFdOpen(fd, name, mode));
  385. }
  386. void*
  387. _TIFFmalloc(tsize_t s)
  388. {
  389. return (malloc((size_t) s));
  390. }
  391. void
  392. _TIFFfree(tdata_t p)
  393. {
  394. free(p);
  395. }
  396. void*
  397. _TIFFrealloc(tdata_t p, tsize_t s)
  398. {
  399. return (realloc(p, (size_t) s));
  400. }
  401. void
  402. _TIFFmemset(tdata_t p, int v, tsize_t c)
  403. {
  404. memset(p, v, (size_t) c);
  405. }
  406. void
  407. _TIFFmemcpy(tdata_t d, const tdata_t s, tsize_t c)
  408. {
  409. memcpy(d, s, (size_t) c);
  410. }
  411. int
  412. _TIFFmemcmp(const tdata_t p1, const tdata_t p2, tsize_t c)
  413. {
  414. return (memcmp(p1, p2, (size_t) c));
  415. }
  416. static void
  417. acornWarningHandler(const char* module, const char* fmt, va_list ap)
  418. {
  419. if (module != NULL)
  420. {
  421. fprintf(stderr, "%s: ", module);
  422. }
  423. fprintf(stderr, "Warning, ");
  424. vfprintf(stderr, fmt, ap);
  425. fprintf(stderr, ".n");
  426. }
  427. TIFFErrorHandler _TIFFwarningHandler = acornWarningHandler;
  428. static void
  429. acornErrorHandler(const char* module, const char* fmt, va_list ap)
  430. {
  431. if (module != NULL)
  432. {
  433. fprintf(stderr, "%s: ", module);
  434. }
  435. vfprintf(stderr, fmt, ap);
  436. fprintf(stderr, ".n");
  437. }
  438. TIFFErrorHandler _TIFFerrorHandler = acornErrorHandler;