8a0946dd6870f10cde056ba243f1fb4ec1fd16b4
angie
  Thu Feb 27 11:58:33 2014 -0800
Adding support for plain VCF custom tracks (as opposed to VCF+tabix),since users seem to want to upload VCF, and as long as the file is
not too big it will work OK.  This means adding a new track type
vcf (as opposed to vcfTabix) and supporting it in hgTracks, hgTrackUi,
hgc, hgTables and hgVai.  (and others I've forgotten?)
refs #12416

diff --git src/hg/inc/customPp.h src/hg/inc/customPp.h
index 879a4d7..9d224fb 100644
--- src/hg/inc/customPp.h
+++ src/hg/inc/customPp.h
@@ -6,49 +6,54 @@
  * Also this allows unlimited "pushBack" of lines, which is handy, since
  * the system will analyse a number of lines of a track to see what format
  * it's in. */
 
 #ifndef CUSTOMPP_H
 #define CUSTOMPP_H
 
 struct customPp
 /* Custom track preprocessor. */
     {
     struct customPp *next;	 /* Next customPp in list */
     struct lineFile *fileStack;  /* Keep track of files we're included from */
     struct slName *browserLines; /* Lines seen so far that start w/ browser */
     struct slName *reusedLines;  /* Lines pushed back by customPpReuse. */
     struct slName *inReuse;	 /* Line in process of being reused. */
+    struct slName *skippedLines; /* Nonempty lines skipped by most recent customPpNextReal */
     boolean ignoreBrowserLines;  /* Flag to suppress removal of browser lines */
                                  /*   so preprocessor can be used with docs */
 #ifdef PROGRESS_METER
     off_t remoteFileSize;	/* reported size from URL */
 #endif
     };
 
 struct customPp *customPpNew(struct lineFile *lf);
 /* Return customPp on lineFile */
 
 void customPpFree(struct customPp **pCpp);
 /* Close files and free up customPp. */
 
 char *customPpNext(struct customPp *cpp);
 /* Return next line. */
 
 char *customPpNextReal(struct customPp *cpp);
 /* Return next line that's nonempty and non-space. */
 
 void customPpReuse(struct customPp *cpp, char *line);
 /* Reuse line.  May be called many times before next customPpNext/NextReal.
  * Should be called with last line to be reused first if called multiply. */
 
 struct slName *customPpTakeBrowserLines(struct customPp *cpp);
 /* Grab browser lines from cpp, which will no longer have them. */
 
+struct slName *customPpCloneSkippedLines(struct customPp *cpp);
+/* Return a clone of most recent nonempty skipped (comment/header) lines from cpp,
+ * which will still have them.  slFreeList when done. */
+
 struct customPp *customDocPpNew(struct lineFile *lf);
 /* Return customPp for doc file that leaves browser lines */
 
 char *customPpFileName(struct customPp *cpp);
 /* Return the name of the current file being parsed (top of fileStack).  Free when done. */
 
 #endif /* CUSTOMPP_H */