]> git.openstreetmap.org Git - nominatim.git/blobdiff - nominatim/input.c
correctly handle comma-only exclude_place_ids
[nominatim.git] / nominatim / input.c
index 5152f520ae7c9087942da76134586740cb5b6e0b..1d53b4918d0aba984b0cab681201010ca149b72e 100644 (file)
 
 #include "input.h"
 
 
 #include "input.h"
 
-struct Input {
-  char *name;
-  enum { plainFile, gzipFile, bzip2File } type;
-  void *fileHandle;
-  // needed by bzip2 when decompressing from multiple streams. other
-  // decompressors must ignore it.
-  FILE *systemHandle; 
-  int eof;
-  char buf[4096];
-  int buf_ptr, buf_fill;
+struct Input
+{
+    char *name;
+    enum { plainFile, gzipFile, bzip2File } type;
+    void *fileHandle;
+    // needed by bzip2 when decompressing from multiple streams. other
+    // decompressors must ignore it.
+    FILE *systemHandle;
+    int eof;
+    char buf[4096];
+    int buf_ptr, buf_fill;
 };
 
 // tries to re-open the bz stream at the next stream start.
 // returns 0 on success, -1 on failure.
 };
 
 // tries to re-open the bz stream at the next stream start.
 // returns 0 on success, -1 on failure.
-int bzReOpen(struct Input *ctx, int *error) {
-  // for copying out the last unused part of the block which
-  // has an EOS token in it. needed for re-initialising the
-  // next stream.
-  unsigned char unused[BZ_MAX_UNUSED];
-  void *unused_tmp_ptr = NULL;
-  int nUnused, i;
-
-  BZ2_bzReadGetUnused(error, (BZFILE *)(ctx->fileHandle), &unused_tmp_ptr, &nUnused);
-  if (*error != BZ_OK) return -1;
-             
-  // when bzReadClose is called the unused buffer is deallocated, 
-  // so it needs to be copied somewhere safe first.
-  for (i = 0; i < nUnused; ++i)
-    unused[i] = ((unsigned char *)unused_tmp_ptr)[i];
-  
-  BZ2_bzReadClose(error, (BZFILE *)(ctx->fileHandle));
-  if (*error != BZ_OK) return -1;
-
-  // reassign the file handle
-  ctx->fileHandle = BZ2_bzReadOpen(error, ctx->systemHandle, 0, 0, unused, nUnused);
-  if (ctx->fileHandle == NULL || *error != BZ_OK) return -1;
-
-  return 0;
+int bzReOpen(struct Input *ctx, int *error)
+{
+    // for copying out the last unused part of the block which
+    // has an EOS token in it. needed for re-initialising the
+    // next stream.
+    unsigned char unused[BZ_MAX_UNUSED];
+    void *unused_tmp_ptr = NULL;
+    int nUnused, i;
+
+    BZ2_bzReadGetUnused(error, (BZFILE *)(ctx->fileHandle), &unused_tmp_ptr, &nUnused);
+    if (*error != BZ_OK) return -1;
+
+    // when bzReadClose is called the unused buffer is deallocated,
+    // so it needs to be copied somewhere safe first.
+    for (i = 0; i < nUnused; ++i)
+        unused[i] = ((unsigned char *)unused_tmp_ptr)[i];
+
+    BZ2_bzReadClose(error, (BZFILE *)(ctx->fileHandle));
+    if (*error != BZ_OK) return -1;
+
+    // reassign the file handle
+    ctx->fileHandle = BZ2_bzReadOpen(error, ctx->systemHandle, 0, 0, unused, nUnused);
+    if (ctx->fileHandle == NULL || *error != BZ_OK) return -1;
+
+    return 0;
 }
 
 int readFile(void *context, char * buffer, int len)
 }
 
 int readFile(void *context, char * buffer, int len)
@@ -67,36 +69,40 @@ int readFile(void *context, char * buffer, int len)
 
     if (ctx->eof || (len == 0))
         return 0;
 
     if (ctx->eof || (len == 0))
         return 0;
-    switch(ctx->type) {
-        case plainFile:
-            l = read(*(int *)f, buffer, len);
-           if (l <= 0) ctx->eof = 1;
-            break;
-        case gzipFile:
-            l = gzread((gzFile)f, buffer, len);
-           if (l <= 0) ctx->eof = 1;
-            break;
-        case bzip2File:
-         l = BZ2_bzRead(&error, (BZFILE *)f, buffer, len);
-
-         // error codes BZ_OK and BZ_STREAM_END are both "OK", but the stream 
-         // end means the reader needs to be reset from the original handle.
-         if (error != BZ_OK) {
-           // for stream errors, try re-opening the stream before admitting defeat.
-           if (error != BZ_STREAM_END || bzReOpen(ctx, &error) != 0) {
-             l = 0;
-             ctx->eof = 1;
-           }
-         }
-         break;
-        default:
-            fprintf(stderr, "Bad file type\n");
-            break;
+
+    switch (ctx->type)
+    {
+    case plainFile:
+        l = read(*(int *)f, buffer, len);
+        if (l <= 0) ctx->eof = 1;
+        break;
+    case gzipFile:
+        l = gzread((gzFile)f, buffer, len);
+        if (l <= 0) ctx->eof = 1;
+        break;
+    case bzip2File:
+        l = BZ2_bzRead(&error, (BZFILE *)f, buffer, len);
+
+        // error codes BZ_OK and BZ_STREAM_END are both "OK", but the stream
+        // end means the reader needs to be reset from the original handle.
+        if (error != BZ_OK)
+        {
+            // for stream errors, try re-opening the stream before admitting defeat.
+            if (error != BZ_STREAM_END || bzReOpen(ctx, &error) != 0)
+            {
+                l = 0;
+                ctx->eof = 1;
+            }
+        }
+        break;
+    default:
+        fprintf(stderr, "Bad file type\n");
+        break;
     }
 
     }
 
-    if (l < 0) {
-      fprintf(stderr, "File reader received error %d (%d)\n", l, error);
+    if (l < 0)
+    {
+        fprintf(stderr, "File reader received error %d (%d)\n", l, error);
         l = 0;
     }
 
         l = 0;
     }
 
@@ -107,12 +113,14 @@ char inputGetChar(void *context)
 {
     struct Input *ctx = context;
 
 {
     struct Input *ctx = context;
 
-    if (ctx->buf_ptr == ctx->buf_fill) {
+    if (ctx->buf_ptr == ctx->buf_fill)
+    {
         ctx->buf_fill = readFile(context, &ctx->buf[0], sizeof(ctx->buf));
         ctx->buf_ptr = 0;
         if (ctx->buf_fill == 0)
             return 0;
         ctx->buf_fill = readFile(context, &ctx->buf[0], sizeof(ctx->buf));
         ctx->buf_ptr = 0;
         if (ctx->buf_fill == 0)
             return 0;
-        if (ctx->buf_fill < 0) {
+        if (ctx->buf_fill < 0)
+        {
             perror("Error while reading file");
             exit(1);
         }
             perror("Error while reading file");
             exit(1);
         }
@@ -138,32 +146,43 @@ void *inputOpen(const char *name)
 
     ctx->name = strdup(name);
 
 
     ctx->name = strdup(name);
 
-    if (ext && !strcmp(ext, ".gz")) {
+    if (ext && !strcmp(ext, ".gz"))
+    {
         ctx->fileHandle = (void *)gzopen(name, "rb");
         ctx->type = gzipFile;
         ctx->fileHandle = (void *)gzopen(name, "rb");
         ctx->type = gzipFile;
-    } else if (ext && !strcmp(ext, ".bz2")) {
-      int error = 0;
-      ctx->systemHandle = fopen(name, "rb");
-      if (!ctx->systemHandle) {
-        fprintf(stderr, "error while opening file %s\n", name);
-        exit(10);
-      }
+    }
+    else if (ext && !strcmp(ext, ".bz2"))
+    {
+        int error = 0;
+        ctx->systemHandle = fopen(name, "rb");
+        if (!ctx->systemHandle)
+        {
+            fprintf(stderr, "error while opening file %s\n", name);
+            exit(10);
+        }
 
 
-      ctx->fileHandle = (void *)BZ2_bzReadOpen(&error, ctx->systemHandle, 0, 0, NULL, 0);
-      ctx->type = bzip2File;
-      
-    } else {
+        ctx->fileHandle = (void *)BZ2_bzReadOpen(&error, ctx->systemHandle, 0, 0, NULL, 0);
+        ctx->type = bzip2File;
+
+    }
+    else
+    {
         int *pfd = malloc(sizeof(pfd));
         int *pfd = malloc(sizeof(pfd));
-        if (pfd) {
-            if (!strcmp(name, "-")) {
+        if (pfd)
+        {
+            if (!strcmp(name, "-"))
+            {
                 *pfd = STDIN_FILENO;
                 *pfd = STDIN_FILENO;
-            } else {
+            }
+            else
+            {
                 int flags = O_RDONLY;
 #ifdef O_LARGEFILE
                 flags |= O_LARGEFILE;
 #endif
                 *pfd = open(name, flags);
                 int flags = O_RDONLY;
 #ifdef O_LARGEFILE
                 flags |= O_LARGEFILE;
 #endif
                 *pfd = open(name, flags);
-                if (*pfd < 0) {
+                if (*pfd < 0)
+                {
                     free(pfd);
                     pfd = NULL;
                 }
                     free(pfd);
                     pfd = NULL;
                 }
@@ -172,7 +191,8 @@ void *inputOpen(const char *name)
         ctx->fileHandle = (void *)pfd;
         ctx->type = plainFile;
     }
         ctx->fileHandle = (void *)pfd;
         ctx->type = plainFile;
     }
-    if (!ctx->fileHandle) {
+    if (!ctx->fileHandle)
+    {
         fprintf(stderr, "error while opening file %s\n", name);
         exit(10);
     }
         fprintf(stderr, "error while opening file %s\n", name);
         exit(10);
     }
@@ -186,20 +206,21 @@ int inputClose(void *context)
     struct Input *ctx = context;
     void *f = ctx->fileHandle;
 
     struct Input *ctx = context;
     void *f = ctx->fileHandle;
 
-    switch(ctx->type) {
-        case plainFile:
-            close(*(int *)f);
-            free(f);
-            break;
-        case gzipFile:
-            gzclose((gzFile)f);
-            break;
-        case bzip2File:
-            BZ2_bzclose((BZFILE *)f);
-            break;
-        default:
-            fprintf(stderr, "Bad file type\n");
-            break;
+    switch (ctx->type)
+    {
+    case plainFile:
+        close(*(int *)f);
+        free(f);
+        break;
+    case gzipFile:
+        gzclose((gzFile)f);
+        break;
+    case bzip2File:
+        BZ2_bzclose((BZFILE *)f);
+        break;
+    default:
+        fprintf(stderr, "Bad file type\n");
+        break;
     }
 
     free(ctx->name);
     }
 
     free(ctx->name);
@@ -211,7 +232,8 @@ xmlTextReaderPtr inputUTF8(const char *name)
 {
     void *ctx = inputOpen(name);
 
 {
     void *ctx = inputOpen(name);
 
-    if (!ctx) {
+    if (!ctx)
+    {
         fprintf(stderr, "Input reader create failed for: %s\n", name);
         return NULL;
     }
         fprintf(stderr, "Input reader create failed for: %s\n", name);
         return NULL;
     }