06d7be056190c14b85e71bc12523f18ea6815b5e
markd
  Mon Dec 7 00:50:29 2020 -0800
BLAT mmap index support merge with master

diff --git src/hg/inc/protobuf.h src/hg/inc/protobuf.h
new file mode 100644
index 0000000..79f3e5a
--- /dev/null
+++ src/hg/inc/protobuf.h
@@ -0,0 +1,88 @@
+/* Lightweight partial implementation of Google's protocol buffers */
+
+/* Copyright (C) 2020 The Regents of the University of California */
+
+#ifndef _PROTOBUF_H_
+#define _PROTOBUF_H_
+
+enum pbDataType
+/* Data type of a field of a protobuf message. */
+{
+    pbdtInt32,
+    pbdtInt64,
+    pbdtUint32,
+    pbdtUint64,
+    pbdtSint32,
+    pbdtSint64,
+    pbdtBool,
+    pbdtEnum,
+    pbdtFixed32,
+    pbdtFixed64,
+    pbdtSFixed32,
+    pbdtSFixed64,
+    pbdtFloat,
+    pbdtDouble,
+    pbdtString,
+    pbdtBytes,
+    pbdtEmbedded,
+    pbdtPackedRepeated,
+    pbdtInvalid
+};
+
+struct protobufFieldDef
+/* Protobuf field definition. */
+{
+    struct protobufFieldDef *next;
+    char *name;                   // Human-readable name of field
+    bits32 fieldNum;              // Field number specified by varint in message
+    enum pbDataType dataType;     // Data type (more fine-grained than wire type)
+    struct protobufDef *embedded; // Definition of embedded message (if dataType is pbdtEmbedded)
+    boolean isRepeated;           // TRUE if we expect a sequence of values
+};
+
+struct protobufDef
+/* Protobuf message definition; fields may include other message definitions as components. */
+{
+    struct protobufDef *next;
+    char *name;
+    struct protobufFieldDef *fields;
+};
+
+union protobufFieldValue
+/* The value of a protobuf field can be one of these types: */
+{
+    int vInt32;
+    long long int vInt64;
+    bits32 vUint32;
+    bits64 vUint64;
+    boolean vBool;
+    float vFloat;
+    double vDouble;
+    char *vString;
+    bits8 *vBytes;
+    struct protobuf **vEmbedded;
+    union protobufFieldValue *vPacked;
+};
+
+struct protobufField
+/* One protobuf field (component of protobuf message; may include messages as components). */
+{
+    struct protobufField *next;
+    struct protobufFieldDef *def;
+    bits32 length;
+    union protobufFieldValue value;
+};
+
+struct protobuf
+/* One protobuf message. */
+{
+    struct protobuf *next;
+    struct protobufDef *def;
+    struct protobufField *fields;
+};
+
+struct protobuf *protobufParse(FILE *stream, struct protobufDef *proto, long long *pBytesLeft);
+/* If stream is at EOF, return NULL; otherwise parse and return the next message from stream,
+ * consuming up to *pBytesLeft bytes from stream.. */
+
+#endif /* _PROTOBUF_H_ */