SkillAgentSearch skills...

Stslua

Various Lua modules written in C

Install / Use

/learn @kieselsteini/Stslua
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

Various Lua Modules

Overview

  • written in C99 (can be compiled with ANSI-C compilers as well, as long as they have stdint.h)
  • public domain license (UNLICENSE)
  • just copy the C-file to your Lua project

| File | Version | Description | | --- | :---: | --- | | sts_base64.c | 1.0.0 | Base64 encoder/decoder | | sts_json.c | WIP | JSON encoder/decoder | | sts_msgpack.c | 1.0.2 | MessagePack encoder/decoder | | test.c | - | Creates a Lua state, load all the modules and execute test.lua |

How to include into your project

  • copy the C-file to you project
  • add it to the compilation process
  • add a "prototype" like LUALIB_API int luaopen_xxx(lua_State *L) to your code
  • load the library with luaL_requiref(L, "xxx", luaopen_xxx, 1)

sts_base64.c

Base64 encoder / decoder.

Example

local base64 = require('base64')
print(base64.encode('light work')) -- > bGlnaHQgd29yaw==
print(assert(base64.decode('bGlnaHQgd29yaw=='))) -- > light work

API

base64.encode(data)

Encode the given Lua string data to proper Base64.

Returns a Lua string containing Base64 encoded data. This will never fail except if Lua cannot allocate enough memory.

base64.decode(data)

Decode the given Lua string data to binary.

Returns the decoded Base64 data as a string or nil plus an error message if decoding failed. This can happen if the given data string is not a valid Base64 string.

Implementation Details

Nothing special. Heavy use of luaL_Buffer.

History

  • 1.0.0
    • initial version

sts_json.c

JSON format encoder/decoder. This is still work in progress.

| Lua type | JSON type | Notes | | --- | --- | --- | | nil | null | - | | boolean | true / false | - | | number | number | - | | string | string | will quote several characters | | table | array | when it is a proper Lua array | | table | object | JSON supports only string keys |

Example

local json = require('json')

local body = assert(json.encode({ integer = 100, number = math.pi, string = 'Hello World!', array = [1, 2, 3], obj = { foo = 'bar' }}))
local data = assert(json.decode(body))

API

json.encode(value)

Encode the given Lua value to a JSON string.

Returns the JSON string on success or nil plus an error message when failed.

Note that the resulting JSON string is not prettified and has no whitespaces.

json.decode(json_string)

Decode the given json_string to a Lua value.

Return the Lua value or nil plus an error message when failed.

Implementation Details

Number conversion uses Lua functions. As JSON number format is similar to Lua it was the easiest option. This causes some memory overhead as temporary Lua strings will be generated.

History

  • 0.2.0
    • fixed output buffer size
  • 0.1.0
    • WIP version, not much tested

sts_msgpack.c

A very simple but performant MessagePack encoder / decoder written in plain C (uses stdint.h so it might require a proper C99 compiler).

Example

local msgpack = require('msgpack')

-- packs all arguments to a valid messagepack binary
local binary = assert(msgpack.encode(1, math.pi, 2.5, 'Hello World', { 1, 2, 3 }, { foo = 'bar', bar = 'foo'}))

-- unpack all values from the binary
print(msgpack.decode(binary))

API

msgpack.encode(...)

Encodes all given arguments to a single messagepack binary string.

Returns a Lua string containing the messagepack or nil plus an error message if encoding failed.

The following Lua types will be encoded:

  • nil
  • boolean
  • number
    • if it is an integer value, the implementation will choose the appropriate uint / int encoding
    • for numbers it will check if the number can be represented as 32-bit / 64-bit IEEE float value
    • 64-bit integers cannot be encoded as unsigned as there is no proper way to determine if the value is really unsigned from Lua :(
  • string
    • will do a basic UTF-8 check and encode it as strX objects in messagepack when valid
    • other (non UTF-8 strings) will be encoded as binX objects
  • table
    • when a "proper" Lua array (index starting at 1 etc.) it will be encoded as an array object otherwise as a map
    • empty tables will be encoded as empty arrays
  • other Lua types cause an error

msgpack.decode(binary [, start, count])

Decode the given messagepack binary string to Lua values. If start is given it will start at this position (starting at 1). When count is given, it will only decode that amount of values. Per default the decoder will start at position 1 and decode all values from the given binary.

Returns all decoded values plus the position. This can be used to decode values in a loop. In case of an error it will return nil plus an error message.

Notes:

  • arrays containing nil values will render the Lua array "broken" as the index will not "continue". This is how Lua works :/
-- a simple loop decoding all values
local binary = msgpack.encode(1, 2, 3, 4, 5, 6)
local position = 1
while position < #binary do
    local value
    value, position = msgpack.decode(binary, position, 1)
    print(value)
end

Implementation Details

The decoder works pretty straight forward and ensures by calling luaL_checkstack that there's always enough "space" to unpack values.

The encoder uses an internal buffer of 16KiB to store the binary values. If this internal buffer is full, it will append the contents as a Lua string to a table. At the end it will use the luaL_Buffer mechanics to "concat" the table of binary strings.

History

  • 1.0.2
    • removed superflous code line in encoder (flushing the buffer)
  • 1.0.1
    • improved UTF-8 validation (overlong encodings are still not recognized)
  • 1.0.0
    • initial version
View on GitHub
GitHub Stars8
CategoryDevelopment
Updated1y ago
Forks0

Languages

C

Security Score

70/100

Audited on Nov 23, 2024

No findings