101c33cf32e9ce191cad2a8b333d473f2059fa7a
kent
  Tue Sep 3 16:09:46 2013 -0700
Adding support for arrays, and also extraH option to raToStructGen.
diff --git src/lib/raToStruct.c src/lib/raToStruct.c
index 530efb7..42d805e 100644
--- src/lib/raToStruct.c
+++ src/lib/raToStruct.c
@@ -1,71 +1,175 @@
 /* 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);
 	}
     }
 }
 
+void raToStructArraySignedSizer(struct lineFile *lf, int curSize, int *pSize, char *fieldName)
+/* If *pSize is zero,  set it to curSize,  othersize check that it is the same as curSize.
+ * The lf and fieldName are for error reporting. */
+{
+int oldSize = *pSize;
+if (oldSize == 0)
+    *pSize = curSize;
+else if (curSize != oldSize)
+    errAbort("Array dimension mismatch between %s and another field in stanza ending line %d of %s",
+	fieldName, lf->lineIx, lf->fileName);
+}
+
+void raToStructArrayUnsignedSizer(struct lineFile *lf, unsigned curSize, 
+    unsigned *pSize, char *fieldName)
+/* If *pSize is zero,  set it to curSize,  othersize check that it is the same as curSize.
+ * The lf and fieldName are for error reporting. */
+{
+unsigned oldSize = *pSize;
+if (oldSize == 0)
+    *pSize = curSize;
+else if (curSize != oldSize)
+    errAbort("Array dimension mismatch between %s and another field in stanza ending line %d of %s",
+	fieldName, lf->lineIx, lf->fileName);
+}
+
+void raToStructArrayShortSizer(struct lineFile *lf, short curSize, 
+    short *pSize, char *fieldName)
+/* If *pSize is zero,  set it to curSize,  othersize check that it is the same as curSize.
+ * The lf and fieldName are for error reporting. */
+{
+short oldSize = *pSize;
+if (oldSize == 0)
+    *pSize = curSize;
+else if (curSize != oldSize)
+    errAbort("Array dimension mismatch between %s and another field in stanza ending line %d of %s",
+	fieldName, lf->lineIx, lf->fileName);
+}
+
+void raToStructArrayUshortSizer(struct lineFile *lf, unsigned short curSize, 
+    unsigned short *pSize, char *fieldName)
+/* If *pSize is zero,  set it to curSize,  othersize check that it is the same as curSize.
+ * The lf and fieldName are for error reporting. */
+{
+unsigned short oldSize = *pSize;
+if (oldSize == 0)
+    *pSize = curSize;
+else if (curSize != oldSize)
+    errAbort("Array dimension mismatch between %s and another field in stanza ending line %d of %s",
+	fieldName, lf->lineIx, lf->fileName);
+}
+
+void raToStructArrayByteSizer(struct lineFile *lf, signed char curSize, 
+    signed char *pSize, char *fieldName)
+/* If *pSize is zero,  set it to curSize,  othersize check that it is the same as curSize.
+ * The lf and fieldName are for error reporting. */
+{
+signed char oldSize = *pSize;
+if (oldSize == 0)
+    *pSize = curSize;
+else if (curSize != oldSize)
+    errAbort("Array dimension mismatch between %s and another field in stanza ending line %d of %s",
+	fieldName, lf->lineIx, lf->fileName);
+}
+
+void raToStructArrayUbyteSizer(struct lineFile *lf, unsigned char curSize, 
+    unsigned char *pSize, char *fieldName)
+/* If *pSize is zero,  set it to curSize,  othersize check that it is the same as curSize.
+ * The lf and fieldName are for error reporting. */
+{
+unsigned char oldSize = *pSize;
+if (oldSize == 0)
+    *pSize = curSize;
+else if (curSize != oldSize)
+    errAbort("Array dimension mismatch between %s and another field in stanza ending line %d of %s",
+	fieldName, lf->lineIx, lf->fileName);
+}
+
+void raToStructArrayLongLongSizer(struct lineFile *lf, long long curSize, 
+    long long *pSize, char *fieldName)
+/* If *pSize is zero,  set it to curSize,  othersize check that it is the same as curSize.
+ * The lf and fieldName are for error reporting. */
+{
+long long oldSize = *pSize;
+if (oldSize == 0)
+    *pSize = curSize;
+else if (curSize != oldSize)
+    errAbort("Array dimension mismatch between %s and another field in stanza ending line %d of %s",
+	fieldName, lf->lineIx, lf->fileName);
+}
+
+#ifdef NEVER
+void raToStructArrayXyzSizer(struct lineFile *lf, xyz curSize, 
+    xyz *pSize, char *fieldName)
+/* If *pSize is zero,  set it to curSize,  othersize check that it is the same as curSize.
+ * The lf and fieldName are for error reporting. */
+{
+xyz oldSize = *pSize;
+if (oldSize == 0)
+    *pSize = curSize;
+else if (curSize != oldSize)
+    errAbort("Array dimension mismatch between %s and another field in stanza ending line %d of %s",
+	fieldName, lf->lineIx, lf->fileName);
+}
+#endif /* NEVER */