6082fe6467f1b6632e73ee985b024595f256f354
kent
  Wed May 28 14:49:39 2014 -0700
Librarified fq i/o
diff --git src/lib/fq.c src/lib/fq.c
new file mode 100644
index 0000000..994dab7
--- /dev/null
+++ src/lib/fq.c
@@ -0,0 +1,57 @@
+/* fq - stuff for doing i/o on fastq files. */
+
+/* Copyright (C) 2014 The Regents of the University of California 
+ * See README in this or parent directory for licensing information. */
+
+#include "common.h"
+#include "linefile.h"
+#include "fq.h"
+
+struct fq *fqReadNext(struct lineFile *lf)
+/* Read next record, return it as fq. */
+{
+struct fq *fq;
+AllocVar(fq);
+char *line;
+
+/* Deal with initial line starting with '@' */
+if (!lineFileNextReal(lf, &line))
+    return FALSE;
+if (line[0] != '@')
+    {
+    errAbort("Expecting line starting with '@' got %s line %d of %s", 
+	line, lf->lineIx, lf->fileName);
+    }
+fq->header = cloneString(line);
+
+/* Deal with line containing sequence. */
+if (!lineFileNext(lf, &line,  NULL))
+    errAbort("%s truncated in middle of record", lf->fileName);
+fq->dna = cloneString(line);
+
+/* Check for + line */
+if (!lineFileNext(lf, &line,  NULL))
+    errAbort("%s truncated in middle of record", lf->fileName);
+if (line[0] != '+')
+    errAbort("Expecting + line %d of %s", lf->lineIx, lf->fileName);
+
+/* Get quality line */
+if (!lineFileNext(lf, &line,  NULL))
+    errAbort("%s truncated in middle of record", lf->fileName);
+fq->quality = cloneString(line);
+return fq;
+}
+
+void fqFree(struct fq **pFq)
+/* Free up *pFq and set it to NULL */
+{
+struct fq *fq = *pFq;
+if (fq != NULL)
+    {
+    freeMem(fq->header);
+    freeMem(fq->dna);
+    freeMem(fq->quality);
+    freez(pFq);
+    }
+}
+