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