Annotation of embedaddon/expat/xmlwf/readfilemap.c, revision 1.1.1.1
1.1 misho 1: /* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
2: See the file COPYING for copying permission.
3: */
4:
5: #include <sys/types.h>
6: #include <sys/stat.h>
7: #include <fcntl.h>
8: #include <stdlib.h>
9: #include <stdio.h>
10:
11: #ifdef __WATCOMC__
12: #ifndef __LINUX__
13: #include <io.h>
14: #else
15: #include <unistd.h>
16: #endif
17: #endif
18:
19: #ifdef __BEOS__
20: #include <unistd.h>
21: #endif
22:
23: #ifndef S_ISREG
24: #ifndef S_IFREG
25: #define S_IFREG _S_IFREG
26: #endif
27: #ifndef S_IFMT
28: #define S_IFMT _S_IFMT
29: #endif
30: #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
31: #endif /* not S_ISREG */
32:
33: #ifndef O_BINARY
34: #ifdef _O_BINARY
35: #define O_BINARY _O_BINARY
36: #else
37: #define O_BINARY 0
38: #endif
39: #endif
40:
41: #include "filemap.h"
42:
43: int
44: filemap(const char *name,
45: void (*processor)(const void *, size_t, const char *, void *arg),
46: void *arg)
47: {
48: size_t nbytes;
49: int fd;
50: int n;
51: struct stat sb;
52: void *p;
53:
54: fd = open(name, O_RDONLY|O_BINARY);
55: if (fd < 0) {
56: perror(name);
57: return 0;
58: }
59: if (fstat(fd, &sb) < 0) {
60: perror(name);
61: return 0;
62: }
63: if (!S_ISREG(sb.st_mode)) {
64: fprintf(stderr, "%s: not a regular file\n", name);
65: return 0;
66: }
67: nbytes = sb.st_size;
68: /* malloc will return NULL with nbytes == 0, handle files with size 0 */
69: if (nbytes == 0) {
70: static const char c = '\0';
71: processor(&c, 0, name, arg);
72: close(fd);
73: return 1;
74: }
75: p = malloc(nbytes);
76: if (!p) {
77: fprintf(stderr, "%s: out of memory\n", name);
78: close(fd);
79: return 0;
80: }
81: n = read(fd, p, nbytes);
82: if (n < 0) {
83: perror(name);
84: free(p);
85: close(fd);
86: return 0;
87: }
88: if (n != nbytes) {
89: fprintf(stderr, "%s: read unexpected number of bytes\n", name);
90: free(p);
91: close(fd);
92: return 0;
93: }
94: processor(p, nbytes, name, arg);
95: free(p);
96: close(fd);
97: return 1;
98: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>