A lua library by zengrong.net
Following libraries are dependented:
For some reason in my server development, I moved some packages that my wrote in to zr package (They were in cc package before).
2. For quick-cocos2d-x
All of the dependences were included in quick-cocos2d-x.
This library has already been merged into quick-cocos2d-x framework.
In quick-cocos2d-x framework, these librares still use "cc" package name, and I won't update them.
You can import them by lib.zrong.init, it can import all of zrong's packages into a global table named zr , and also import some necessary global functions:
require("lib.zrong.init")or if you have had these necessary global functions, you can require them in your code selectively:
utils=require("lib.zrong.zr.utils.init")
net= {}
net.SocketTCP=require("lib.zrong.zr.net.SocketTCP")The necessary global functions are:
- class
- import
- iskindof
A detailed example about GNU gettext and Poedit (in chinese): https://blog.zengrong.net/post/using_gettext_in_lua/
Usage:
localGettext=require("utils.Gettext")
-- Use lua io, cannot use in Androidlocalfd,err=io.open("main.mo","rb")
ifnotfdthenreturnnil,errendlocalraw_data=fd:read("*all")
fd:close()
localmo_data=assert(Gettext.parseData(raw_data))
print(mo_data["hello"])
-- 你好print(mo_data["world"])
-- nil-- Then you'll get a kind of gettext function:localgettext=Gettext.gettext(raw_data)
print(gettext("hello"))
-- 你好print(gettext("world"))
-- world-- With a slight modification this will be ready-to-use for the xgettext tool:_=Gettext.gettext(raw_data)
print(_("hello"))
print(_("world"))It can serialize bytes stream like ActionScript flash.utils.ByteArray
It depends on lpack.
Usage:
localByteArray=zr.utils.ByteArray-- use lpack to write a packlocal__pack=string.pack("<bihP2", 0x59, 11, 1101, "", "中文")
-- create a ByteArraylocal__ba=ByteArray.new()
-- ByteArray can write a lpack buffer directly__ba:writeBuf(__pack)
-- remember, lua array started from 1__ba:setPos(1)
-- now, you can read it like actionscriptprint("ba.len:", __ba:getLen())
print("ba.readByte:", __ba:readByte())
print("ba.readInt:", __ba:readInt())
print("ba.readShort:", __ba:readShort())
print("ba.readString:", __ba:readStringUShort())
print("ba.available:", __ba:getAvailable())
-- dump itprint("ba.toString(16):", __ba:toString(16))
-- create a ByteArraylocal__ba2=ByteArray.new()
-- you can write some values like actionscript-- also, you can use chaining calls.__ba2:writeByte(0x59)
:writeInt(11)
:writeShort(1101)
-- write a empty string__ba2:writeStringUShort("")
-- write some chinese string__ba2:writeStringUShort("中文")
-- dump itprint("ba2.toString(10):", __ba2:toString(10))Above codes will print like these:
ByteArrayVarint depends on BitOP.
ByteArrayVarint implements the Varint encoding in google protocol buffer.
See following:
To understand your simple protocol buffer encoding, you first need to understand varints. Varints are a method of serializing integers using one or more bytes. Smaller numbers take a smaller number of bytes.
Each byte in a varint, except the last byte, has the most significant bit (msb) set – this indicates that there are further bytes to come. The lower 7 bits of each byte are used to store the two's complement representation of the number in groups of 7 bits, least significant group first.
Your can use these methods(and all ByteArray methods) in ByteArrayVarint:
| Method Name | Description |
|---|---|
| ByteArrayVarint.readUVInt() | read a unsigned varint int |
| ByteArrayVarint.writeUVInt() | write a unsigned varint int |
| ByteArrayVarint.readVInt() | read varint int |
| ByteArrayVarint.writeVInt() | write varint int |
| ByteArrayVarint.readStringUVInt() | read a string preceding a unsigned varint int |
| ByteArrayVarint.writeStringUVInt() | write a string preceding a unsigned varint int |
On account of a BitOP limitation, ByteArrayVarint will read a unsigned int as a minus.
The SocketTCP depends on LuaSocket
Usage:
localSocketTCP=zr.net.SocketTCPlocalByteArray=zr.utils.ByteArraysocket=SocketTCP.new("127.0.0.1", 12001, false)
socket:addEventListener(SocketTCP.EVENT_CONNECTED, onStatus)
socket:addEventListener(SocketTCP.EVENT_CLOSE, onStatus)
socket:addEventListener(SocketTCP.EVENT_CLOSED, onStatus)
socket:addEventListener(SocketTCP.EVENT_CONNECT_FAILURE, onStatus)
socket:addEventListener(SocketTCP.EVENT_DATA, onData)
socket:send(ByteArray.new():writeByte(0x59):getPack())
functiononStatus(__event)
echoInfo("socket status: %s", __event.name)
endfunctiononData(__event)
echoInfo("socket status: %s, data:%s", __event.name, ByteArray.toString(__event.data))
endzr.log package is very similar to python logging package.
locallogFilePath='log.txt'localflogh=nillocallogFileHandler=io.open(logFilePath, 'w+b')
-- FileHandler can accept a file handler or a file name.iflogFileHandlerthenflogh=zr.log.FileHandler.new(logFileHandler, nil, true, true)
flogh.filename=logFilePathelseflogh=zr.log.FileHandler.new(logFilePath, 'w+b', true, true)
endlocalecho=print-- A logger can accept one or more handler.log=zr.log.Logger.new(zr.log.Logger.NOTSET, zr.log.PrintHandler.new(echo), flogh)
log:debug('You name?', 'zrong')
log:debug('My name is %s.', 'zrong')
-- Following contents will appear in console and log.txt.-- [5.3278] You name? zrong-- [5.3279] My name is zrong.BSD 3-Clause License
Copyright (c) 2018, Jacky Tsang 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 the copyright holder 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 THE COPYRIGHT HOLDER OR CONTRIBUTORS 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.
