0646a0429b105006527bd313129cd6bcbb05643f
kent
  Tue Aug 6 17:41:57 2013 -0700
Making raToStruct.c module compile.
diff --git src/lib/raToStruct.c src/lib/raToStruct.c
index dd8d579..530efb7 100644
--- src/lib/raToStruct.c
+++ src/lib/raToStruct.c
@@ -1,63 +1,71 @@
+/* raToStruct - stuff to help read ra files into C structures.  Works with raToStructGen
+ * which makes parsers based on .as files. */
+
+#include "common.h"
+#include "hash.h"
+#include "linefile.h"
+#include "raToStruct.h"
+#include "obscure.h"
 
 struct raToStructReader *raToStructReaderNew(char *name,  int fieldCount, char **fields,  
     int requiredFieldCount, char **requiredFields)
 /* Create a helper object for parsing an ra file into a C structure.  This structure will
  * contain */
 {
 struct raToStructReader *reader;
 AllocVar(reader);
 reader->name = cloneString(name);
 reader->fieldCount = fieldCount;
 reader->fields = fields;
 reader->requiredFieldCount = requiredFieldCount;
 reader->requiredFields = requiredFields;
 struct hash *fieldIds = reader->fieldIds = hashNew(4);
 int i;
 for (i=0; i<fieldCount; ++i)
     hashAddInt(fieldIds, fields[i], i);
 if (requiredFieldCount > 0)
     {
     AllocArray(reader->requiredFieldIds, requiredFieldCount);
     for (i=0; i<requiredFieldCount; ++i)
         {
 	char *required = requiredFields[i];
 	struct hashEl *hel = hashLookup(fieldIds, required);
 	if (hel == NULL)
 	    errAbort("Required field %s is not in field list", required);
 	reader->requiredFieldIds[i] = ptToInt(hel->val);
 	}
     }
 AllocArray(reader->fieldsObserved, fieldCount);
 return reader;
 }
 
 void raToStructReaderFree(struct raToStructReader **pReader)
 /* Free up memory associated with reader. */
 {
 struct raToStructReader *reader = *pReader;
 if (reader != NULL)
     {
     freeMem(reader->name);
     freeHash(&reader->fieldIds);
     freeMem(reader->fieldIds);
     freeMem(reader->fieldsObserved);
     freez(pReader);
     }
 }
 
 void raToStructReaderCheckRequiredFields(struct raToStructReader *reader, struct lineFile *lf)
 /* Make sure that all required files have been seen in the stanza we just parsed. */
 {
 int *requiredFieldIds = reader->requiredFieldIds;
 bool *fieldsObserved = reader->fieldsObserved;
 int i;
 for (i=0; i<reader->requiredFieldCount; ++i)
     {
     if (!fieldsObserved[requiredFieldIds[i]])
 	{
 	errAbort("Required field %s not found line %d of %s", reader->requiredFields[i],
 	    lf->lineIx, lf->fileName);
 	}
     }
 }