diff options
author | marha <marha@users.sourceforge.net> | 2013-10-18 13:29:37 +0200 |
---|---|---|
committer | marha <marha@users.sourceforge.net> | 2013-10-18 13:29:37 +0200 |
commit | 72483d25d0f41d48a8e6bdc83ab57c971cfb47b4 (patch) | |
tree | c8aa56f1e7dc24ce93287592c07a5f354eb6f86d /expat/xmlwf/readfilemap.c | |
parent | b821fe861f33d7e8a39fe4c7d885b7ff379dc476 (diff) | |
parent | 5880b059e9a156336daf32a73bed72def6ba90f2 (diff) | |
download | vcxsrv-72483d25d0f41d48a8e6bdc83ab57c971cfb47b4.tar.gz vcxsrv-72483d25d0f41d48a8e6bdc83ab57c971cfb47b4.tar.bz2 vcxsrv-72483d25d0f41d48a8e6bdc83ab57c971cfb47b4.zip |
Merge remote-tracking branch 'origin/released'
* origin/released:
Added expat-2.1.0
Diffstat (limited to 'expat/xmlwf/readfilemap.c')
-rw-r--r-- | expat/xmlwf/readfilemap.c | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/expat/xmlwf/readfilemap.c b/expat/xmlwf/readfilemap.c new file mode 100644 index 000000000..bd32b9341 --- /dev/null +++ b/expat/xmlwf/readfilemap.c @@ -0,0 +1,100 @@ +/* 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> + +#ifdef __WATCOMC__ +#ifndef __LINUX__ +#include <io.h> +#else +#include <unistd.h> +#endif +#endif + +#ifdef __BEOS__ +#include <unistd.h> +#endif + +#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); + close(fd); + return 0; + } + if (!S_ISREG(sb.st_mode)) { + fprintf(stderr, "%s: not a regular file\n", name); + close(fd); + return 0; + } + nbytes = sb.st_size; + /* malloc will return NULL with nbytes == 0, handle files with size 0 */ + if (nbytes == 0) { + static const char c = '\0'; + processor(&c, 0, name, arg); + close(fd); + return 1; + } + p = malloc(nbytes); + if (!p) { + fprintf(stderr, "%s: out of memory\n", name); + close(fd); + return 0; + } + n = read(fd, p, nbytes); + if (n < 0) { + perror(name); + free(p); + close(fd); + return 0; + } + if (n != nbytes) { + fprintf(stderr, "%s: read unexpected number of bytes\n", name); + free(p); + close(fd); + return 0; + } + processor(p, nbytes, name, arg); + free(p); + close(fd); + return 1; +} |