summaryrefslogtreecommitdiff
path: root/upb_fieldmap.c
diff options
context:
space:
mode:
authorJoshua Haberman <joshua@reverberate.org>2009-05-25 18:31:27 -0700
committerJoshua Haberman <joshua@reverberate.org>2009-05-25 18:31:27 -0700
commit0c80c384756a48d5f731eeafa62b6cd5f3861749 (patch)
treec723951c40b0dd7aea5ccd24e9b55fb0167ffb48 /upb_fieldmap.c
parentfdcefd68b17a62c7129e910351f5b323044f835d (diff)
A flurry of activity. Doesn't compile yet.
- a descriptor.c that describes the data structures in descriptor.proto using the data structures in descriptor.h. - everything renamed pbstream -> upb. - modularization rethought. - Doesn't compile yet, but should once things settle back down.
Diffstat (limited to 'upb_fieldmap.c')
-rw-r--r--upb_fieldmap.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/upb_fieldmap.c b/upb_fieldmap.c
new file mode 100644
index 0000000..015b2e1
--- /dev/null
+++ b/upb_fieldmap.c
@@ -0,0 +1,50 @@
+/*
+ * upb - a minimalist implementation of protocol buffers.
+ *
+ * Copyright (c) 2009 Joshua Haberman. See LICENSE for details.
+ */
+
+#include "upb_fieldmap.h"
+
+#include <stdlib.h>
+
+void pbstream_init_fieldmap(struct pbstream_fieldmap *fieldmap,
+ struct pbstream_field *fields,
+ int num_fields)
+{
+ qsort(fields, num_fields, sizeof(*fields), compare_fields);
+
+ /* Find the largest n for which at least half the fieldnums <n are used.
+ * Start at 8 to avoid noise of small numbers. */
+ pbstream_field_number_t n = 0, maybe_n;
+ for(int i = 0; i < num_fields; i++) {
+ maybe_n = fields[i].field_number;
+ if(maybe_n > 8 && maybe_n/(i+1) >= 2) break;
+ n = maybe_n;
+ }
+
+ fieldmap->num_fields = num_fields;
+ fieldmap->fields = malloc(sizeof(*fieldmap->fields)*num_fields);
+ memcpy(fieldmap->fields, fields, sizeof(*fields)*num_fields);
+
+ fieldmap->array_size = n;
+ fieldmap->array = malloc(sizeof(*fieldmap->array)*n);
+ memset(fieldmap->array, 0, sizeof(*fieldmap->array)*n);
+
+ for (int i = 0; i < num_fields && fields[i].field_number <= n; i++)
+ fieldmap->array[fields[i].field_number-1] = &fieldmap->fields[i];
+
+ /* Until we support the hashtable part... */
+ assert(n == fields[num_fields-1].field_number);
+}
+
+void pbstream_free_fieldmap(struct pbstream_fieldmap *fieldmap)
+{
+ free(fieldmap->fields);
+ free(fieldmap->array);
+}
+
+/* Emit definition for inline function. */
+extern void *upb_fieldmap_find(struct upb_fieldmap *fm,
+ pbstream_field_number_t num,
+ size_t info_size);
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback