diff srf2fastq/io_lib-1.12.2/io_lib/Read.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/Read.c	Tue Jun 07 17:48:05 2011 -0400
@@ -0,0 +1,555 @@
+/*
+ * 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.
+ */
+
+/* 
+ * File: 	Read.c
+ * Purpose:	Performs read/write IO on the Read data stucture.
+ * Last update: 01/09/94
+ */
+
+
+/*
+    The Read data type is designed so that it can hold a varying degree
+    of information about sequences, yet have a single set of calls
+    to access the data.
+
+    There are plenty of assumptions around that both the number of
+    bases and the number of points will fit into an int_2, a short.
+
+*/
+
+/* ---- Includes ---- */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <fcntl.h> /* Only need on windows for _O_BINARY */
+#include <unistd.h>
+
+#include "io_lib/Read.h"
+#include "io_lib/mFILE.h"
+
+#ifdef IOLIB_ABI
+# include "io_lib/abi.h"
+#endif
+#ifdef IOLIB_SCF
+# include "io_lib/scf.h"
+#endif
+#ifdef IOLIB_ALF
+# include "io_lib/alf.h"
+#endif
+#ifdef IOLIB_PLN
+# include "io_lib/plain.h"
+#endif
+#ifdef IOLIB_ZTR
+# include "io_lib/ztr.h"
+#endif
+#ifdef IOLIB_CTF
+# include "io_lib/seqIOCTF.h"
+#endif
+#ifdef IOLIB_SFF
+# include "io_lib/sff.h"
+#endif
+#ifdef IOLIB_EXP
+# include "io_lib/expFileIO.h"
+#endif
+#ifdef USE_BIOLIMS
+# include "spBiolims.h"
+#endif
+
+#include "io_lib/xalloc.h"
+#include "io_lib/translate.h"
+#include "io_lib/traceType.h"
+#include "io_lib/misc.h"
+#include "io_lib/open_trace_file.h"
+
+/*
+ * Read a sequence from a file "fnin" of format "format". If "format" is 0
+ * (ANY_FORMAT), we automatically determine the correct format.
+ * Returns:
+ *   Read *   for success
+ *   NULLRead for failure
+ */
+Read *read_reading(char *fn, int format) {
+    Read *read;
+    mFILE *fp;
+
+#ifdef USE_BIOLIMS
+    if( !strncmp(fn,BIOLIMS_TAG,strlen(BIOLIMS_TAG))){
+	return spReadBiolimsReading(fn);
+   }
+#endif
+
+    /*
+     * If we're asking for an Experiment file, read it.
+     * If the format is ANY then attempt EXP first following by trace.
+     * Otherwise use the trace search mechanism.
+     *
+     * Note this is purely for locating files and not for forcing the file
+     * format. It's here so that experiment files and trace files may be
+     * given identical names but accessed through different search paths
+     * (as is the case with the trace server).
+     */
+    if (format == TT_EXP) {
+	if (NULL == (fp = open_exp_mfile(fn, NULL))) {
+	    errout("'%s': couldn't open\n", fn);
+	    return NULL;
+	}
+    } else {
+	fp = NULL;
+	if (format == TT_ANY)
+	    fp = open_exp_mfile(fn, NULL);
+
+	if (!fp && NULL == (fp = open_trace_mfile(fn, NULL))) {
+	    errout("'%s': couldn't open\n", fn);
+	    return NULL;
+	}
+    }
+
+    read = mfread_reading(fp, fn, format);
+    mfclose(fp);
+
+    return read;
+}
+
+/*
+ * Read a sequence from a FILE *fp of format "format". If "format" is 0
+ * (ANY_FORMAT), we automatically determine the correct format.
+ * We still pass a filename 'fn' although this isn't used other than for
+ * filling in the read->trace_name field.
+ *
+ * NB this function should NOT be used when Biolims support is required
+ * (as biolims readings are not stored in a file)
+ *
+ * Returns:
+ *   Read *   for success
+ *   NULLRead for failure
+ */
+Read *mfread_reading(mFILE *fp, char *fn, int format) {
+    Read *read;
+    mFILE *newfp;
+
+    if (!fn)
+	fn = "(unknown)";
+
+    newfp = freopen_compressed(fp, NULL);
+    if (newfp != fp) {
+	fp = newfp;
+    } else {
+	newfp = NULL;
+    }
+
+#ifdef _WIN32
+    /*
+     * jkb 16/05/00 comment below
+     *
+     * On windows "prog < file.abi" will work wrongly (compared to
+     * "prog file.abi") because windows is rather stupid. It treats ascii
+     * and binary streams differently, it considers stdin to be ascii unless
+     * told otherwise, and it can only be told otherwise by using non-ansi
+     * windows-specific function calls.
+     */
+    if (format != TT_EXP && format != TT_PLN && fp->fp)
+	_setmode(_fileno(fp->fp), _O_BINARY);
+#endif
+
+    if (format == TT_ANY || format == TT_ANYTR) {
+	format = fdetermine_trace_type(fp);
+	mrewind(fp);
+    }
+
+    switch (format) {
+    case TT_UNK:
+    case TT_ERR:
+	errout("File '%s' has unknown trace type\n", fn);
+	read = NULLRead;
+	break;
+
+#ifdef IOLIB_SCF
+    case TT_SCF: {
+        Scf *scf;
+	scf = mfread_scf(fp);
+
+	if (scf) {
+	    read = scf2read(scf);
+	    scf_deallocate(scf);
+	} else
+	    read = NULLRead;
+
+	break;
+    }
+#endif
+
+#ifdef IOLIB_CTF
+    case TT_CTF:
+	read = mfread_ctf(fp);
+	break;
+#endif
+
+#ifdef IOLIB_SFF
+    case TT_SFF:
+	read = mfread_sff(fp);
+	break;
+#endif
+
+#ifdef IOLIB_ZTR
+    case TT_ZTR:
+    case TT_ZTR1:
+    case TT_ZTR2:
+    case TT_ZTR3: {
+        ztr_t *ztr;
+
+	if ((ztr = mfread_ztr(fp))) {
+	    uncompress_ztr(ztr);
+	    read = ztr2read(ztr);
+	    delete_ztr(ztr);
+	} else {
+	    read = NULLRead;
+	}
+	break;
+    }
+#endif
+
+#ifdef IOLIB_ABI
+    case TT_ABI:
+	read = mfread_abi(fp);
+	break;
+#endif
+
+#ifdef IOLIB_ALF
+    case TT_ALF:
+	read = mfread_alf(fp);
+	break;
+#endif
+
+#ifdef IOLIB_EXP
+    case TT_EXP: {
+	/* FIXME: we shouldn't redirect like this */
+	Exp_info *e = exp_mfread_info(fp);
+	
+	read = e ? exp2read(e,fn) : NULLRead;
+	break;
+    }
+#endif
+
+#ifdef IOLIB_PLN
+    case TT_PLN:
+	read = mfread_pln(fp);
+	break;
+#endif
+
+    default:
+	errout("Unknown format %d specified to read_reading()\n", format);
+	read = NULLRead;
+    }
+
+    if (read != NULLRead && (read->trace_name = (char *)xmalloc(strlen(fn)+1)))
+	strcpy(read->trace_name, fn);
+
+    if (newfp) mfclose(newfp);
+
+    return read;
+}
+
+Read *fread_reading(FILE *fp, char *fn, int format) {
+    return mfread_reading(mfreopen(fn, "rb", fp), fn, format);
+}
+
+/*
+ * Write a sequence to a FILE *fp of format "format". If "format" is 0,
+ * we choose our favourite - SCF.
+ *
+ * Returns:
+ *   0 for success
+ *  -1 for failure
+ */
+int mfwrite_reading(mFILE *fp, Read *read, int format) {
+    int r = -1;
+    int no_compress = 0;
+
+#ifdef _WIN32
+    /*
+     * jkb 09/06/00 comment below
+     *
+     * On windows "prog > file.scf" will work wrongly (compared to
+     * "prog file.scf") because windows is rather stupid. It treats ascii
+     * and binary streams differently, it considers stdout to be ascii unless
+     * told otherwise, and it can only be told otherwise by using non-ansi
+     * windows-specific function calls.
+     */
+    if (format != TT_EXP && format != TT_PLN && fp->fp)
+	_setmode(_fileno(fp->fp), _O_BINARY);
+#endif
+
+    switch (format) {
+    default:
+	/* Defaults to ZTR type */
+
+#ifdef IOLIB_ZTR
+    case TT_ZTR:
+    case TT_ZTR2: {
+        ztr_t *ztr;
+	ztr = read2ztr(read);
+	compress_ztr(ztr, 2);
+	r = mfwrite_ztr(fp, ztr); 
+	delete_ztr(ztr);
+	no_compress = 1;
+	break;
+    }
+    case TT_ZTR1: {
+        ztr_t *ztr;
+	ztr = read2ztr(read);
+	compress_ztr(ztr, 1);
+	r = mfwrite_ztr(fp, ztr); 
+	delete_ztr(ztr);
+	break;
+    }
+    case TT_ZTR3: {
+        ztr_t *ztr;
+	ztr = read2ztr(read);
+	compress_ztr(ztr, 3);
+	r = mfwrite_ztr(fp, ztr); 
+	delete_ztr(ztr);
+	no_compress = 1;
+	break;
+    }
+#endif
+
+#ifdef IOLIB_SCF
+    case TT_SCF: {
+        Scf *scf;
+	scf = read2scf(read);
+	r = mfwrite_scf(scf, fp);
+	scf_deallocate(scf);
+	break;
+    }
+#endif
+
+#ifdef IOLIB_CTF
+    case TT_CTF:
+	r = mfwrite_ctf(fp, read); 
+	break;
+#endif
+
+#ifdef IOLIB_ABI
+    case TT_ABI:
+	/*return mfwrite_abi(fp, read); */
+	break;
+#endif
+
+#ifdef IOLIB_SFF
+    case TT_SFF:
+	/*return mfwrite_sff(fp, read); */
+	break;
+#endif
+
+#ifdef IOLIB_ALF
+    case TT_ALF:
+	/* return mfwrite_alf(fp, read); */
+	break;
+#endif
+
+#ifdef IOLIB_EXP
+    case TT_EXP: {
+	Exp_info *e = read2exp(read, read->ident ? read->ident : "unknown");
+	
+	if (NULL == e) {
+	    fprintf(stderr, "Failed to create experiment file.\n");
+	    r = -1;
+	} else {
+	    exp_print_mfile(fp, e);
+	    exp_destroy_info(e);
+	    r = 0;
+	}
+	break;
+    }
+#endif
+
+#ifdef IOLIB_PLN
+    case TT_PLN:
+	r = mfwrite_pln(fp, read);
+	break;
+#endif
+    }
+
+    mftruncate(fp, -1);
+    if (r == 0 && !no_compress) {
+	fcompress_file(fp);
+    }
+    mfflush(fp);
+
+    return r;
+}
+
+int fwrite_reading(FILE *fp, Read *read, int format) {
+    int ret;
+    mFILE *mf = mfreopen(NULL, "wbx", fp);
+    if (mf) {
+	ret = mfwrite_reading(mf, read, format);
+	mfflush(mf);
+	mf->fp = NULL; /* Don't want this closed here */
+	mfclose(mf);
+    } else {
+	return -1;
+    }
+
+    return ret;
+}
+
+/*
+ * Write a sequence to a file "fn" of format "format". If "format" is 0,
+ * we choose our favourite - SCF.
+ *
+ * Returns:
+ *   0 for success
+ *  -1 for failure
+ */
+int write_reading(char *fn, Read *read, int format) {
+    int ret;
+    mFILE *fp = mfopen(fn, "wb");
+    if (!fp)
+	return -1;
+    
+    ret = mfwrite_reading(fp, read, format);
+    mfclose(fp);
+    return ret;
+}
+
+/*
+ * Old style stub interfaces implemented simply as redirection through
+ * fread_reading and frwrite_reading.
+ */
+#ifdef IOLIB_ABI
+Read *fread_abi(FILE *fp) {
+    return fread_reading(fp, NULL, TT_ABI);
+}
+
+int fwrite_abi(FILE *fp, Read *read) {
+    return fwrite_reading(fp, read, TT_ABI);
+}
+#endif
+
+#ifdef IOLIB_ALF
+Read *fread_alf(FILE *fp) {
+    return fread_reading(fp, NULL, TT_ALF);
+}
+
+int fwrite_alf(FILE *fp, Read *read) {
+    return fwrite_reading(fp, read, TT_ALF);
+}
+#endif
+
+#ifdef IOLIB_CTF
+Read *fread_ctf(FILE *fp) {
+    return fread_reading(fp, NULL, TT_CTF);
+}
+
+int fwrite_ctf(FILE *fp, Read *read) {
+    return fwrite_reading(fp, read, TT_CTF);
+}
+#endif
+
+#ifdef IOLIB_PLN
+Read *fread_pln(FILE *fp) {
+    return fread_reading(fp, NULL, TT_PLN);
+}
+
+int fwrite_pln(FILE *fp, Read *read) {
+    return fwrite_reading(fp, read, TT_PLN);
+}
+#endif
+
+#ifdef IOLIB_ZTR
+ztr_t *fread_ztr(FILE *fp) {
+    ztr_t *z;
+    mFILE *mf;
+
+    if (NULL == (mf = mfreopen(NULL, "rb", fp)))
+	return NULL;
+
+    z = mfread_ztr(mf);
+    mfclose(mf);
+    return z;
+}
+
+int fwrite_ztr(FILE *fp, ztr_t *z) {
+    mFILE *mf;
+    int r;
+
+    if (NULL == (mf = mfreopen(NULL, "wbx", fp)))
+	return -1;
+
+    r = mfwrite_ztr(mf, z);
+    mfflush(mf);
+    mf->fp = NULL; /* Don't want this closed here */
+    mfclose(mf);
+    return r;
+}
+#endif
+
+#ifdef IOLIB_SCF
+Scf *fread_scf(FILE *fp) {
+    Scf *s;
+    mFILE *mf;
+
+    if (NULL == (mf = mfreopen(NULL, "rb", fp)))
+	return NULL;
+
+    s = mfread_scf(mf);
+    mf->fp = NULL; /* Don't want this closed here */
+    mfclose(mf);
+    return s;
+}
+
+int fwrite_scf(Scf *s, FILE *fp) {
+    mFILE *mf;
+    int r;
+
+    if (NULL == (mf = mfreopen(NULL, "wbx", fp)))
+	return -1;
+
+    r = mfwrite_scf(s, mf);
+    mfflush(mf);
+    mf->fp = NULL; /* Don't want this closed here */
+    mfclose(mf);
+    return r;
+}
+#endif
+
+#ifdef IOLIB_EXP
+Exp_info *exp_fread_info(FILE *fp) {
+    Exp_info *e;
+    mFILE *mf;
+
+    if (NULL == (mf = mfreopen(NULL, "rb", fp)))
+	return NULL;
+
+    e = exp_mfread_info(mf);
+    mf->fp = NULL; /* Don't want this closed here */
+    mfclose(mf);
+    return e;
+}
+
+void exp_print_file(FILE *fp, Exp_info *e) {
+    mFILE *mf;
+
+    if (NULL == (mf = mfreopen(NULL, "wbx", fp)))
+	return;
+
+    exp_print_mfile(mf, e);
+    mfflush(mf);
+    mf->fp = NULL; /* Don't want this closed here */
+    mfclose(mf);
+}
+#endif