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

Last change on this file since 3210 was 3052, checked in by jonb, 13 years ago

osm2pgsql: improve help text, allow - to be used again

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