source: subversion/applications/utils/export/osm2pgsql/experimental/input.c @ 2826

Revision 2826, 3.0 KB checked in by jonb, 7 years ago (diff)

osm2pgsql: Mac OS-X and GEOS-3 compatability tweaks

Line 
1#include <stdio.h>
2#include <unistd.h>
3#include <string.h>
4#include <sys/types.h>
5#include <sys/stat.h>
6#include <fcntl.h>
7#include <zlib.h>
8#include <bzlib.h>
9
10#include "sanitizer.h"
11#include "input.h"
12
13struct Input {
14    char *name;
15    enum { plainFile, gzipFile, bzip2File } type;
16    void *fileHandle;
17    int eof;
18    char buf[4096];
19    int buf_ptr, buf_fill;
20};
21
22int readFile(void *context, char * buffer, int len)
23{
24    struct Input *ctx = context;
25    void *f = ctx->fileHandle;
26    int l = 0;
27
28    if (ctx->eof || (len == 0))
29        return 0;
30 
31    switch(ctx->type) {
32        case plainFile:
33            l = read(*(int *)f, buffer, len);
34            break;
35        case gzipFile:
36            l = gzread((gzFile)f, buffer, len);
37            break;
38        case bzip2File:
39            l = BZ2_bzread((BZFILE *)f, buffer, len);
40            break;
41        default:
42            fprintf(stderr, "Bad file type\n");
43            break;
44    }
45
46    if (l < 0) {
47        fprintf(stderr, "File reader received error %d\n", l);
48        l = 0;
49    }
50    if (!l)
51        ctx->eof = 1;
52
53    return l;
54}
55
56char inputGetChar(void *context)
57{
58    struct Input *ctx = context;
59
60    if (ctx->buf_ptr == ctx->buf_fill) {
61        ctx->buf_fill = readFile(context, &ctx->buf[0], sizeof(ctx->buf));
62        ctx->buf_ptr = 0;
63        if (ctx->buf_fill == 0)
64            return 0;
65        if (ctx->buf_fill < 0) {
66            perror("Error while reading file");
67            exit(1);
68        }
69    }
70    //readFile(context, &c, 1);
71    return ctx->buf[ctx->buf_ptr++];
72}
73
74int inputEof(void *context)
75{
76    return ((struct Input *)context)->eof;
77}
78
79
80void *inputOpen(const char *name)
81{
82    const char *ext = strrchr(name, '.');
83    struct Input *ctx = malloc (sizeof(*ctx));
84
85    if (!ctx)
86        return NULL;
87
88    memset(ctx, 0, sizeof(*ctx));
89    ctx->name = strdup(name);
90
91    if (ext && !strcmp(ext, ".gz")) {
92        ctx->fileHandle = (void *)gzopen(name, "rb");
93        ctx->type = gzipFile;
94    } else if (ext && !strcmp(ext, ".bz2")) {
95        ctx->fileHandle = (void *)BZ2_bzopen(name, "rb");
96        ctx->type = bzip2File;
97    } else {
98        int *pfd = malloc(sizeof(pfd));
99        if (pfd) {
100            *pfd = open(name, O_RDONLY);
101            if (*pfd < 0) {
102                free(pfd);
103                pfd = NULL;
104            }
105        }
106        ctx->fileHandle = (void *)pfd;
107        ctx->type = plainFile;
108    }
109    if (!ctx->fileHandle) {
110        fprintf(stderr, "error while opening file %s\n", name);
111        exit(10);
112    }
113    ctx->buf_ptr = 0;
114    ctx->buf_fill = 0;
115    return (void *)ctx;
116}
117
118int inputClose(void *context)
119{
120    struct Input *ctx = context;
121    void *f = ctx->fileHandle;
122
123    switch(ctx->type) {
124        case plainFile:
125            close(*(int *)f);
126            break;
127        case gzipFile:
128            gzclose((gzFile)f);
129            break;
130        case bzip2File:
131            BZ2_bzclose((BZFILE *)f);
132            break;
133        default:
134            fprintf(stderr, "Bad file type\n");
135            break;
136    }
137
138    free(ctx->name);
139    free(ctx);
140    return 0;
141}
Note: See TracBrowser for help on using the repository browser.