80 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Lua
		
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Lua
		
	
--
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
--  FILE:  text_format.lua
 | 
						|
--  DESCRIPTION:  protoc-gen-lua
 | 
						|
--      Google's Protocol Buffers project, ported to lua.
 | 
						|
--      https://code.google.com/p/protoc-gen-lua/
 | 
						|
--
 | 
						|
--      Copyright (c) 2010 , 林卓毅 (Zhuoyi Lin) netsnail@gmail.com
 | 
						|
--      All rights reserved.
 | 
						|
--
 | 
						|
--      Use, modification and distribution are subject to the "New BSD License"
 | 
						|
--      as listed at <url: http://www.opensource.org/licenses/bsd-license.php >.
 | 
						|
--  COMPANY:  NetEase
 | 
						|
--  CREATED:  2010年08月05日 15时14分13秒 CST
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
--
 | 
						|
local string = string
 | 
						|
local math = math
 | 
						|
local print = print
 | 
						|
local getmetatable = getmetatable
 | 
						|
local table = table
 | 
						|
local ipairs = ipairs
 | 
						|
local tostring = tostring
 | 
						|
 | 
						|
local descriptor = require "protobuf.descriptor"
 | 
						|
 | 
						|
module "protobuf.text_format"
 | 
						|
 | 
						|
function format(buffer)
 | 
						|
    local len = string.len( buffer )	
 | 
						|
    for i = 1, len, 16 do		
 | 
						|
        local text = ""	
 | 
						|
        for j = i, math.min( i + 16 - 1, len ) do	
 | 
						|
            text = string.format( "%s  %02x", text, string.byte( buffer, j ) )			
 | 
						|
        end			
 | 
						|
        print( text )	
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
local FieldDescriptor = descriptor.FieldDescriptor
 | 
						|
 | 
						|
msg_format_indent = function(write, msg, indent)
 | 
						|
    for field, value in msg:ListFields() do
 | 
						|
        local print_field = function(field_value)
 | 
						|
            local name = field.name
 | 
						|
            write(string.rep(" ", indent))
 | 
						|
            if field.type == FieldDescriptor.TYPE_MESSAGE then
 | 
						|
                local extensions = getmetatable(msg)._extensions_by_name
 | 
						|
                if extensions[field.full_name] then
 | 
						|
                    write("[" .. name .. "] {\n")
 | 
						|
                else
 | 
						|
                    write(name .. " {\n")
 | 
						|
                end
 | 
						|
                msg_format_indent(write, field_value, indent + 4)
 | 
						|
                write(string.rep(" ", indent))
 | 
						|
                write("}\n")
 | 
						|
            else
 | 
						|
                write(string.format("%s: %s\n", name, tostring(field_value)))
 | 
						|
            end
 | 
						|
        end
 | 
						|
        if field.label == FieldDescriptor.LABEL_REPEATED then
 | 
						|
            for _, k in ipairs(value) do
 | 
						|
                print_field(k)
 | 
						|
            end
 | 
						|
        else
 | 
						|
            print_field(value)
 | 
						|
        end
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
function msg_format(msg)
 | 
						|
    local out = {}
 | 
						|
    local write = function(value)
 | 
						|
        out[#out + 1] = value
 | 
						|
    end
 | 
						|
    msg_format_indent(write, msg, 0)
 | 
						|
    return table.concat(out)
 | 
						|
end
 | 
						|
 |