src/lib/ra.c 1.15

1.15 2009/12/06 20:09:36 kent
Adding optional dyString parameter.
Index: src/lib/ra.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/lib/ra.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -b -B -U 4 -r1.14 -r1.15
--- src/lib/ra.c	23 Nov 2009 07:33:44 -0000	1.14
+++ src/lib/ra.c	6 Dec 2009 20:09:36 -0000	1.15
@@ -9,55 +9,76 @@
 #include "common.h"
 #include "linefile.h"
 #include "hash.h"
 #include "localmem.h"
+#include "dystring.h"
 #include "ra.h"
 
 static char const rcsid[] = "$Id$";
 
-boolean raSkipLeadingEmptyLines(struct lineFile *lf)
-/* Skip leading empty lines and comments.  Returns FALSE at end of file. */
+boolean raSkipLeadingEmptyLines(struct lineFile *lf, struct dyString *dy)
+/* Skip leading empty lines and comments.  Returns FALSE at end of file. 
+ * Together with raNextTagVal you can construct your own raNextRecord.... 
+ * If dy parameter is non-null, then the text parsed gets placed into dy. */
 {
 char *line;
 /* Skip leading empty lines and comments. */
+if (dy)
+    dyStringClear(dy);
 for (;;)
    {
    if (!lineFileNext(lf, &line, NULL))
        return FALSE;
-   line = skipLeadingSpaces(line);
-   if (line[0] != 0 )
+   char *tag = skipLeadingSpaces(line);
+   if (tag[0] != 0 )
        {
-       if (line[0] == '#')
+       if (tag[0] == '#')
+	   {
+	   if (dy)
+	       dyStringAppend(dy, line);
            continue;
+	   }
        else 
            break;
        }
+   else
+       {
+       if (dy)
+	   dyStringAppend(dy, line);
+       }
    }
 lineFileReuse(lf);
 return TRUE;
 }
 
-boolean raNextTagVal(struct lineFile *lf, char **retTag, char **retVal)
+boolean raNextTagVal(struct lineFile *lf, char **retTag, char **retVal, struct dyString *dy)
 /* Read next line.  Return FALSE at end of file or blank line.  Otherwise
- * fill in *retTag and *retVal and return TRUE */
+ * fill in *retTag and *retVal and return TRUE.
+ * If dy parameter is non-null, then the text parsed gets appended to dy. */
 {
 char *line;
 for (;;)
     {
     if (!lineFileNext(lf, &line, NULL))
        return FALSE;
-    line = skipLeadingSpaces(line);
-    if (line[0] == 0)
-       return FALSE;;
-    if (line[0] == '#')
+    char *tag = skipLeadingSpaces(line);
+    if (tag[0] == 0)
+       return FALSE;
+    if (tag[0] == '#')
        {
-       if (startsWith("#EOF", line))
+       if (startsWith("#EOF", tag))
 	   return FALSE;
        else
+	   {
+	    if (dy)
+	       dyStringAppend(dy, line);
 	   continue;
        }
+       }
     break;
     }
+if (dy)
+   dyStringAppend(dy, line);
 *retTag = nextWord(&line);
 *retVal = trimSpaces(line);
 return TRUE;
 }
@@ -71,11 +92,11 @@
 {
 struct hash *hash = NULL;
 char *key, *val;
 
-if (!raSkipLeadingEmptyLines(lf))
+if (!raSkipLeadingEmptyLines(lf, NULL))
     return NULL;
-while (raNextTagVal(lf, &key, &val))
+while (raNextTagVal(lf, &key, &val, NULL))
     {
     if (hash == NULL)
 	hash = newHash(7);
     val = lmCloneString(hash->lm, val);
@@ -89,11 +110,11 @@
  * Do a slPairFreeValsAndList on result when done. */
 {
 struct slPair *list = NULL;
 char *key, *val;
-if (!raSkipLeadingEmptyLines(lf))
+if (!raSkipLeadingEmptyLines(lf, NULL))
     return NULL;
-while (raNextTagVal(lf, &key, &val))
+while (raNextTagVal(lf, &key, &val, NULL))
     slPairAdd(&list, key, cloneString(val));
 slReverse(&list);
 return list;
 }