/* * Copyright (c) 2009-2021, Google LLC * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Google LLC nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "upb/text_encode.h" #include <ctype.h> #include <float.h> #include <inttypes.h> #include <stdarg.h> #include <stdio.h> #include <string.h> #include "upb/internal/upb.h" #include "upb/internal/vsnprintf_compat.h" #include "upb/reflection.h" // Must be last. #include "upb/port_def.inc" txtenc; static void txtenc_msg(txtenc* e, const upb_Message* msg, const upb_MessageDef* m); static void txtenc_putbytes(txtenc* e, const void* data, size_t len) { … } static void txtenc_putstr(txtenc* e, const char* str) { … } static void txtenc_printf(txtenc* e, const char* fmt, ...) { … } static void txtenc_indent(txtenc* e) { … } static void txtenc_endfield(txtenc* e) { … } static void txtenc_enum(int32_t val, const upb_FieldDef* f, txtenc* e) { … } static void txtenc_string(txtenc* e, upb_StringView str, bool bytes) { … } static void txtenc_field(txtenc* e, upb_MessageValue val, const upb_FieldDef* f) { … } /* * Arrays print as simple repeated elements, eg. * * foo_field: 1 * foo_field: 2 * foo_field: 3 */ static void txtenc_array(txtenc* e, const upb_Array* arr, const upb_FieldDef* f) { … } static void txtenc_mapentry(txtenc* e, upb_MessageValue key, upb_MessageValue val, const upb_FieldDef* f) { … } /* * Maps print as messages of key/value, etc. * * foo_map: { * key: "abc" * value: 123 * } * foo_map: { * key: "def" * value: 456 * } */ static void txtenc_map(txtenc* e, const upb_Map* map, const upb_FieldDef* f) { … } #define CHK … static const char* txtenc_parsevarint(const char* ptr, const char* limit, uint64_t* val) { … } /* * Unknown fields are printed by number. * * 1001: 123 * 1002: "hello" * 1006: 0xdeadbeef * 1003: { * 1: 111 * } */ static const char* txtenc_unknown(txtenc* e, const char* ptr, const char* end, int groupnum) { … } #undef CHK static void txtenc_msg(txtenc* e, const upb_Message* msg, const upb_MessageDef* m) { … } size_t txtenc_nullz(txtenc* e, size_t size) { … } size_t upb_TextEncode(const upb_Message* msg, const upb_MessageDef* m, const upb_DefPool* ext_pool, int options, char* buf, size_t size) { … }