xmlreaderimpl/support/expat-2.0.1/xmlwf/readfilemap.c
changeset 300 b6d834208d33
parent 299 f06c5eba524d
child 301 1bfe4ecc6c10
equal deleted inserted replaced
299:f06c5eba524d 300:b6d834208d33
     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 }