From 462b26c1cc041a8fa26deb62cf12f1f351a5b2f6 Mon Sep 17 00:00:00 2001 From: Joshua Haberman Date: Wed, 8 Jul 2009 12:06:47 -0700 Subject: Directory restructuring. --- src/upb_context.h | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 src/upb_context.h (limited to 'src/upb_context.h') diff --git a/src/upb_context.h b/src/upb_context.h new file mode 100644 index 0000000..4ddaed6 --- /dev/null +++ b/src/upb_context.h @@ -0,0 +1,106 @@ +/* + * upb - a minimalist implementation of protocol buffers. + * + * A context represents a namespace of proto definitions, sort of like an + * interpreter's symbol table. It is empty when first constructed. Clients + * add definitions to the context by supplying unserialized or serialized + * descriptors (as defined in descriptor.proto). + * + * Copyright (c) 2009 Joshua Haberman. See LICENSE for details. + */ + +#ifndef UPB_CONTEXT_H_ +#define UPB_CONTEXT_H_ + +#include "upb.h" +#include "upb_table.h" + +struct google_protobuf_FileDescriptorProto; + +#ifdef __cplusplus +extern "C" { +#endif + +/* Definitions. ***************************************************************/ + +/* The symbol table maps names to various kinds of symbols. */ +enum upb_symbol_type { + UPB_SYM_MESSAGE, + UPB_SYM_ENUM, + UPB_SYM_SERVICE, + UPB_SYM_EXTENSION +}; + +struct upb_symtab_entry { + struct upb_strtable_entry e; + enum upb_symbol_type type; + union upb_symbol_ref ref; +}; + +struct upb_context { + struct upb_strtable symtab; /* The context's symbol table. */ + struct upb_strtable psymtab; /* Private symbols, for internal use. */ + struct upb_msg *fds_msg; /* This is in psymtab, ptr here for convenience. */ + + /* A list of the FileDescriptorProtos we own (from having parsed them + * ourselves) and must free on destruction. */ + size_t fds_size, fds_len; + struct google_protobuf_FileDescriptorSet **fds; +}; + +/* Initializes and frees a upb_context, respectively. */ +bool upb_context_init(struct upb_context *c); +void upb_context_free(struct upb_context *c); + +/* Looking up symbols. ********************************************************/ + +/* Resolves the given symbol using the rules described in descriptor.proto, + * namely: + * + * If the name starts with a '.', it is fully-qualified. Otherwise, C++-like + * scoping rules are used to find the type (i.e. first the nested types + * within this message are searched, then within the parent, on up to the + * root namespace). + * + * Returns NULL if the symbol has not been defined. */ +struct upb_symtab_entry *upb_context_resolve(struct upb_context *c, + struct upb_string *base, + struct upb_string *symbol); + +/* Find an entry in the symbol table with this exact name. Returns NULL if no + * such symbol name exists. */ +struct upb_symtab_entry *upb_context_lookup(struct upb_context *c, + struct upb_string *symbol); + +INLINE struct upb_symtab_entry *upb_context_symbegin(struct upb_context *c) { + return (struct upb_symtab_entry*)upb_strtable_begin(&c->symtab); +} + +INLINE struct upb_symtab_entry *upb_context_symnext( + struct upb_context *c, struct upb_symtab_entry *cur) { + return (struct upb_symtab_entry*)upb_strtable_next(&c->symtab, &cur->e); +} + +/* Adding symbols. ************************************************************/ + +/* Adds the definitions in the given file descriptor to this context. All + * types that are referenced from fd must have previously been defined (or be + * defined in fd). fd may not attempt to define any names that are already + * defined in this context. + * + * Caller retains ownership of fd, but the context will contain references to + * it, so it must outlive the context. + * + * upb_context_addfd only returns true or false; it does not give any hint + * about what happened in the case of failure. This is because the descriptor + * is expected to have been validated at the time it was parsed/generated. */ +bool upb_context_addfd(struct upb_context *c, + struct google_protobuf_FileDescriptorProto *fd); + +bool upb_context_parsefds(struct upb_context *c, struct upb_string *fds); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* UPB_PARSE_H_ */ -- cgit v1.2.3