diff srf2fastq/io_lib-1.12.2/io_lib/files.c @ 0:d901c9f41a6a default tip

Migrated tool version 1.0.1 from old tool shed archive to new tool shed repository
author dawe
date Tue, 07 Jun 2011 17:48:05 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srf2fastq/io_lib-1.12.2/io_lib/files.c	Tue Jun 07 17:48:05 2011 -0400
@@ -0,0 +1,192 @@
+/*
+ * Copyright (c) Medical Research Council 1994. All rights reserved.
+ *
+ * Permission to use, copy, modify and distribute this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * this copyright and notice appears in all copies.
+ *
+ * This file was written by James Bonfield, Simon Dear, Rodger Staden,
+ * as part of the Staden Package at the MRC Laboratory of Molecular
+ * Biology, Hills Road, Cambridge, CB2 2QH, United Kingdom.
+ *
+ * MRC disclaims all warranties with regard to this software.
+ */
+
+#include "io_lib/misc.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Alliant's Concentrix <sys/stat.h> is hugely deficient */
+/* Define things we require in this program              */
+/* Methinks S_IFMT and S_IFDIR aren't defined in POSIX   */
+#ifndef S_ISDIR
+#define S_ISDIR(m)      (((m)&S_IFMT) == S_IFDIR)
+#endif /*!S_ISDIR*/
+#ifndef S_ISREG
+#define S_ISREG(m)      (((m)&S_IFMT) == S_IFREG)
+#endif /*!S_ISREG*/
+
+int is_directory(char * fn)
+{
+    struct stat buf;
+    if ( stat(fn,&buf) ) return 0;
+    return S_ISDIR(buf.st_mode);
+}
+
+int is_file(char * fn)
+{
+    struct stat buf;
+    if ( stat(fn,&buf) ) return 0;
+    return S_ISREG(buf.st_mode);
+}
+
+int file_exists(char * fn)
+{
+    struct stat buf;
+    return ( stat(fn,&buf) == 0);
+}
+
+int compressed_file_exists(char *fname)
+{
+    struct stat buf;
+    char fn[2048];
+
+    if (stat(fname, &buf) == 0) return 1;
+
+    sprintf(fn, "%s.gz", fname);
+    if (stat(fn, &buf) == 0) return 1;
+
+    sprintf(fn, "%s.bz", fname);
+    if (stat(fn, &buf) == 0) return 1;
+
+    sprintf(fn, "%s.bz2", fname);
+    if (stat(fn, &buf) == 0) return 1;
+
+    sprintf(fn, "%s.Z", fname);
+    if (stat(fn, &buf) == 0) return 1;
+
+    sprintf(fn, "%s.z", fname);
+    if (stat(fn, &buf) == 0) return 1;
+
+    return 0;
+}
+
+int file_size(char * fn)
+{
+    struct stat buf;
+    if ( stat(fn,&buf) != 0) return 0;
+    return buf.st_size;
+}
+
+/*
+ * ---------------------------------------------------------------------------
+ * File of filename management
+ */
+
+FILE *open_fofn(char *files) {
+  return fopen(files, "r");
+}
+
+char *read_fofn(FILE *fp) {
+  char line[256];
+  static char name[256];
+  
+  while (fgets(line, 254, fp)) {
+    if (1 == sscanf(line, "%s", name))
+      return name;
+  }
+
+  return NULL;
+}
+
+void close_fofn(FILE *fp) {
+  fclose(fp);
+}
+
+
+/*
+ * ---------------------------------------------------------------------------
+ * Temporary file handling.
+ */
+
+#ifdef _WIN32
+/*
+ * On UNIX systems we use tmpfile().
+ *
+ * On windows this is broken because it always attempts to create files in
+ * the root directory of the current drive, and fails if the user does not
+ * have write permission.
+ *
+ * We can't wrap up mkstemp() either as that doesn't exist under windows.
+ * Instead we roll our own tmpfile() using the native windows API.
+ */
+#include <windows.h>
+#include <winbase.h>
+#include <stdio.h>
+#include <io.h>
+#include <fcntl.h>
+#define _POSIX_ /* needed to get PATH_MAX */
+#include <limits.h>
+
+static void display_win_error(char *msg) {
+    LPVOID lpMsgBuf;
+    FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
+    	          FORMAT_MESSAGE_FROM_SYSTEM |
+    	          FORMAT_MESSAGE_IGNORE_INSERTS,
+    	          NULL,
+    	          GetLastError(),
+    	          0,                 /* Default language */
+    	          (LPTSTR)&lpMsgBuf, /* Got to love void* to str casts! */
+    	          0, NULL);
+    fprintf(stderr, "%s: error #%d, %s", msg, GetLastError(), lpMsgBuf);
+    LocalFree(lpMsgBuf);
+}
+
+/*
+ * Creates a temporary file and returns a FILE pointer to it.
+ * The file will be automatically deleted when it is closed or the
+ * applicaton exits.
+ *
+ * Returns NULL on failure.
+ */
+FILE *tmpfile(void) {
+    DWORD ret;
+    char tmp_path[PATH_MAX], shrt_path[PATH_MAX];
+    int fd;
+    FILE *fp;
+
+    /* The Windows Way: get the temp directory and a file within it */
+    ret = GetTempPath(PATH_MAX, tmp_path);
+    if (ret == 0 || ret > PATH_MAX) {
+	display_win_error("GetTempPath()");
+        return NULL;
+    }
+
+    if (0 == GetTempFileName(tmp_path, "fubar", 0, shrt_path)) {
+	display_win_error("GetTempFileName()");
+	return NULL;
+    }
+
+    /*
+     * O_TRUNC incase anyone has managed to inject data in the newly created
+     * file already via race-conditions.
+     *
+     * O_EXCL to (in theory) stop anyone else opening it and to die if someone
+     * beat us to it - although this appears to not actually work on Windows.
+     *
+     * O_TEMPORARY so that the file is removed on close.
+     */
+    if (-1 == (fd = _open(shrt_path, O_RDWR | O_TRUNC | O_EXCL |
+			  O_BINARY | O_TEMPORARY, 0600))) {
+	perror(shrt_path);
+    }
+
+    /* Replace fd with FILE*. No need to close fd */
+    if (NULL == (fp = _fdopen(fd, "r+b"))) {
+	perror(shrt_path);
+    }
+
+    return fp;
+}
+
+#endif /* _WIN32 */