summaryrefslogtreecommitdiffstats
path: root/contrib/expat/xmlwf/readfilemap.c
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2002-10-02 07:16:04 +0000
committerphk <phk@FreeBSD.org>2002-10-02 07:16:04 +0000
commit676528b41eb1d7ef205f19c99dcb9585d9105d85 (patch)
tree6f80919d64493c94380986e636d4731dddeeea12 /contrib/expat/xmlwf/readfilemap.c
downloadFreeBSD-src-676528b41eb1d7ef205f19c99dcb9585d9105d85.zip
FreeBSD-src-676528b41eb1d7ef205f19c99dcb9585d9105d85.tar.gz
Virgin import (trimmed) of eXpat version 1.95.5
Diffstat (limited to 'contrib/expat/xmlwf/readfilemap.c')
-rwxr-xr-xcontrib/expat/xmlwf/readfilemap.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/contrib/expat/xmlwf/readfilemap.c b/contrib/expat/xmlwf/readfilemap.c
new file mode 100755
index 0000000..b68b2ce
--- /dev/null
+++ b/contrib/expat/xmlwf/readfilemap.c
@@ -0,0 +1,76 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
+ See the file COPYING for copying permission.
+*/
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#ifndef S_ISREG
+#ifndef S_IFREG
+#define S_IFREG _S_IFREG
+#endif
+#ifndef S_IFMT
+#define S_IFMT _S_IFMT
+#endif
+#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
+#endif /* not S_ISREG */
+
+#ifndef O_BINARY
+#ifdef _O_BINARY
+#define O_BINARY _O_BINARY
+#else
+#define O_BINARY 0
+#endif
+#endif
+
+#include "filemap.h"
+
+int
+filemap(const char *name,
+ void (*processor)(const void *, size_t, const char *, void *arg),
+ void *arg)
+{
+ size_t nbytes;
+ int fd;
+ int n;
+ struct stat sb;
+ void *p;
+
+ fd = open(name, O_RDONLY|O_BINARY);
+ if (fd < 0) {
+ perror(name);
+ return 0;
+ }
+ if (fstat(fd, &sb) < 0) {
+ perror(name);
+ return 0;
+ }
+ if (!S_ISREG(sb.st_mode)) {
+ fprintf(stderr, "%s: not a regular file\n", name);
+ return 0;
+ }
+ nbytes = sb.st_size;
+ p = malloc(nbytes);
+ if (!p) {
+ fprintf(stderr, "%s: out of memory\n", name);
+ return 0;
+ }
+ n = read(fd, p, nbytes);
+ if (n < 0) {
+ perror(name);
+ close(fd);
+ return 0;
+ }
+ if (n != nbytes) {
+ fprintf(stderr, "%s: read unexpected number of bytes\n", name);
+ close(fd);
+ return 0;
+ }
+ processor(p, nbytes, name, arg);
+ free(p);
+ close(fd);
+ return 1;
+}
OpenPOWER on IntegriCloud