implement SOLVER_FLAG_BREAK_ORPHANS
[platform/upstream/libsolv.git] / ext / solv_xfopen.c
index 4de122a..b0421bf 100644 (file)
 #include "util.h"
 
 
+/* Evil hack for Haiku: fopencookie() is implemented internally, but not
+   exported by a header. */
+#ifdef __HAIKU__
+
+typedef struct {
+       ssize_t (*read)(void*, char*, size_t);
+       ssize_t (*write)(void*, const char*, size_t);
+       int (*seek)(off_t*, int);
+       int (*close)(void*);
+} cookie_io_functions_t;
+
+
+FILE *fopencookie(void*, const char*, cookie_io_functions_t);
+
+#endif /* __HAIKU__ */
+
+
 static FILE *cookieopen(void *cookie, const char *mode,
-       ssize_t (*cread)(void *, char *, size_t), 
-       ssize_t (*cwrite)(void *, const char *, size_t), 
+       ssize_t (*cread)(void *, char *, size_t),
+       ssize_t (*cwrite)(void *, const char *, size_t),
        int (*cclose)(void *))
 {
+#ifdef HAVE_FUNOPEN
   if (!cookie)
     return 0;
-#ifdef HAVE_FUNOPEN
-  return funopen(cookie, 
-      (int (*)(void *, char *, int))(*mode == 'r' ? cread: NULL),/* readfn */
-      (int (*)(void *, const char *, int))(*mode == 'w' ? cwrite : NULL), /* writefn */
-      (fpos_t (*)(void *, fpos_t, int))NULL, /* seekfn */
+  return funopen(cookie,
+      (int (*)(void *, char *, int))(*mode == 'r' ? cread : NULL),             /* readfn */
+      (int (*)(void *, const char *, int))(*mode == 'w' ? cwrite : NULL),      /* writefn */
+      (fpos_t (*)(void *, fpos_t, int))NULL,                                   /* seekfn */
       cclose
       );
 #elif defined(HAVE_FOPENCOOKIE)
   cookie_io_functions_t cio;
+
+  if (!cookie)
+    return 0;
   memset(&cio, 0, sizeof(cio));
   if (*mode == 'r')
     cio.read = cread;
@@ -325,10 +345,18 @@ solv_xfopen(const char *fn, const char *mode)
     return myxzfopen(fn, mode);
   if (suf && !strcmp(suf, ".lzma"))
     return mylzfopen(fn, mode);
+#else
+  if (suf && !strcmp(suf, ".xz"))
+    return 0;
+  if (suf && !strcmp(suf, ".lzma"))
+    return 0;
 #endif
 #ifdef ENABLE_BZIP2_COMPRESSION
   if (suf && !strcmp(suf, ".bz2"))
     return mybzfopen(fn, mode);
+#else
+  if (suf && !strcmp(suf, ".bz2"))
+    return 0;
 #endif
   return fopen(fn, mode);
 }
@@ -363,14 +391,45 @@ solv_xfopen_fd(const char *fn, int fd, const char *mode)
     return myxzfdopen(fd, simplemode);
   if (suf && !strcmp(suf, ".lzma"))
     return mylzfdopen(fd, simplemode);
+#else
+  if (suf && !strcmp(suf, ".xz"))
+    return 0;
+  if (suf && !strcmp(suf, ".lzma"))
+    return 0;
 #endif
 #ifdef ENABLE_BZIP2_COMPRESSION
   if (suf && !strcmp(suf, ".bz2"))
     return mybzfdopen(fd, simplemode);
+#else
+  if (suf && !strcmp(suf, ".bz2"))
+    return 0;
 #endif
   return fdopen(fd, mode);
 }
 
+int
+solv_xfopen_iscompressed(const char *fn)
+{
+  const char *suf = fn ? strrchr(fn, '.') : 0;
+  if (!suf)
+    return 0;
+  if (!strcmp(suf, ".gz"))
+    return 1;
+  if (!strcmp(suf, ".xz") || !strcmp(suf, ".lzma"))
+#ifdef ENABLE_LZMA_COMPRESSION
+    return 1;
+#else
+    return -1;
+#endif
+  if (!strcmp(suf, ".bz2"))
+#ifdef ENABLE_BZIP2_COMPRESSION
+    return 1;
+#else
+    return -1;
+#endif
+  return 0;
+}
+
 struct bufcookie {
   char **bufp;
   size_t *buflp;
@@ -441,8 +500,8 @@ solv_xfopen_buf(const char *fn, char **bufp, size_t *buflp, const char *mode)
     bc->freemem = *bufp;
   if (!fp)
     {
-      *bc->bufp = solv_free(*bc->bufp);
-      *bc->buflp = 0;
+      if (*mode == 'w')
+       *bc->bufp = solv_free(*bc->bufp);
       cookie_bufclose(bc);
     }
   return fp;