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;
}