]> git.lizzy.rs Git - protogen.git/blobdiff - protogen.lua
Add converters
[protogen.git] / protogen.lua
index 3a503fe010ff718c43b7757f9e836018bd4609ae..270ee1785de036dda5bc4c7c5c9098cfcb963cea 100755 (executable)
@@ -19,6 +19,7 @@ local function emit(fun, code)
 end
 
 -- fn prefixes
+local struct_prefix = "__attribute__((packed)) "
 local export_prefix = ""
 local local_prefix = "__attribute__((unused)) static inline "
 
@@ -50,7 +51,7 @@ typedef char *String;
 typedef struct {
        size_t siz;
        unsigned char *data;
-} Blob;
+} ]] .. struct_prefix .. [[Blob;
 
 ]]
 )
@@ -121,6 +122,8 @@ end
 
 -- numeric types
 
+local numeric_types = {}
+
 local function emit_vector(type, l)
        local name = "v" .. l .. type
        local box = "aabb" .. l .. type
@@ -131,16 +134,8 @@ local function emit_vector(type, l)
        existing_types[box] = true
        has_deallocator[box] = false
 
-       local typedef, equals, add, clamp, cmp, scale, mix, write, read, send, recv =
-                  "",     "",  "",    "",  "",    "",  "",    "",   "",   "",   ""
-
-       typedef = typedef .. "\t" .. type .. " "
-       equals  = equals  .. "\treturn "
-       add     = add     .. "\treturn (" .. name .. ") {"
-       clamp   = clamp   .. "\treturn (" .. name .. ") {"
-       cmp     = cmp     .. "\tint i;\n"
-       scale   = scale   .. "\treturn (" .. name .. ") {"
-       mix     = mix     .. "\treturn (" .. name .. ") {"
+       local typedef, equals, add, sub, clamp, cmp, scale, mix, write, read, send, recv =
+                  "",     "",  "",  "",    "",  "",    "",  "",    "",   "",   "",   ""
 
        for i, c in ipairs(vector_components[l]) do
                local last = i == l
@@ -168,6 +163,14 @@ local function emit_vector(type, l)
                                or ", "
                        )
 
+               sub = sub
+                       .. "a." .. c .. " - "
+                       .. "b." .. c ..
+                       (last
+                               and "};\n"
+                               or ", "
+                       )
+
                clamp = clamp
                        .. type .. "_clamp("
                        .. "val." .. c .. ", "
@@ -214,16 +217,17 @@ local function emit_vector(type, l)
                        .. "\tif (!" .. type .. "_recv(peer, &val->" .. c .. "))\n\t\treturn false;\n"
        end
 
-       emit_h("typedef struct {\n" .. typedef ..  "} " .. name .. ";\n")
+       emit_h("typedef struct {\n\t" .. type .. " " .. typedef ..  "} " .. struct_prefix .. name .. ";\n")
 
-       emit(export_prefix .. "bool " .. name .. "_equals(" .. name .. " a, " .. name .. " b)", "{\n" .. equals .. "}\n\n")
-       emit(export_prefix .. name .. " " .. name .. "_add(" .. name .. " a, " .. name .. " b)", "{\n" .. add .. "}\n\n")
-       emit(export_prefix .. name .. " " .. name .. "_clamp(" .. name .. " val, " .. name .. " min, " .. name .. " max)", "{\n" .. clamp .. "}\n\n")
-       emit(export_prefix .. "int " .. name .. "_cmp(const void *a, const void *b)", "{\n" .. cmp .. "\treturn 0;\n}\n\n")
-       emit(export_prefix .. name .. " " .. name .. "_scale(" .. name .. " v, " .. type .. " s)", "{\n" .. scale .. "}\n\n")
+       emit(export_prefix .. "bool " .. name .. "_equals(" .. name .. " a, " .. name .. " b)", "{\n\treturn " .. equals .. "}\n\n")
+       emit(export_prefix .. name .. " " .. name .. "_add(" .. name .. " a, " .. name .. " b)", "{\n\treturn (" .. name .. ") {" .. add .. "}\n\n")
+       emit(export_prefix .. name .. " " .. name .. "_sub(" .. name .. " a, " .. name .. " b)", "{\n\treturn (" .. name .. ") {" .. add .. "}\n\n")
+       emit(export_prefix .. name .. " " .. name .. "_clamp(" .. name .. " val, " .. name .. " min, " .. name .. " max)", "{\n\treturn (" .. name .. ") {" .. clamp .. "}\n\n")
+       emit(export_prefix .. "int " .. name .. "_cmp(const void *a, const void *b)", "{\n\tint i;\n" .. cmp .. "\treturn 0;\n}\n\n")
+       emit(export_prefix .. name .. " " .. name .. "_scale(" .. name .. " v, " .. type .. " s)", "{\n\treturn (" .. name .. ") {" .. scale .. "}\n\n")
 
        if type:sub(1, 1) == "f" then
-               emit(export_prefix .. name .. " " .. name .. "_mix(" .. name .. " a, " .. name .. " b, " .. type .. " f)", "{\n" .. mix .. "}\n\n")
+               emit(export_prefix .. name .. " " .. name .. "_mix(" .. name .. " a, " .. name .. " b, " .. type .. " f)", "{\n\treturn (" .. name .. ") {" .. mix .. "}\n\n")
        end
 
        emit(export_prefix .. "void " .. name .. "_write(Blob *buffer, " .. name .. " *val)", "{\n" .. write .. "}\n\n")
@@ -236,7 +240,7 @@ local function emit_vector(type, l)
 
        emit_h("\n")
 
-       emit_h("typedef struct {\n\t" .. name .. " min, max;\n} " .. box .. ";\n")
+       emit_h("typedef struct {\n\t" .. name .. " min, max;\n} " .. struct_prefix .. box .. ";\n")
 
        emit(export_prefix .. "void " .. box .. "_write(Blob *buffer, " .. box .. " *val)", "{\n\t" .. name .. "_write(buffer, &val->min);\n\t" .. name .. "_write(buffer, &val->max);\n}\n\n")
        emit(export_prefix .. "bool " .. box .. "_read(Blob *buffer, " .. box .. " *val)", "{\n\tif (!" .. name .. "_read(buffer, &val->min))\n\t\treturn false;\n\tif (!" .. name .. "_read(buffer, &val->max))\n\t\treturn false;\n\treturn true;\n}\n\n")
@@ -251,6 +255,7 @@ end
 
 local function emit_numeric(class, bits, alias)
        local name = class .. bits
+       table.insert(numeric_types, name)
 
        existing_types[name] = true
        has_deallocator[name] = false
@@ -305,6 +310,36 @@ for i = 0, 3 do
        end
 end
 
+local converters = {}
+
+for l = 2, 4 do
+       converters[l] = ""
+
+       for i, c in ipairs(vector_components[l]) do
+               converters[l] = converters[l]
+                       .. "v." .. c ..
+                       ((i == l)
+                               and "};\n"
+                               or ", "
+                       )
+       end
+end
+
+for _, from in ipairs(numeric_types) do
+       for _, to in ipairs(numeric_types) do
+               if from ~= to then
+                       for i = 2, 4 do
+                               local v_from = "v" .. i .. from
+                               local v_to   = "v" .. i .. to
+
+                               emit(export_prefix .. v_to .. " " .. v_from .. "_to_" .. to  .. "(" .. v_from .. " v)", "{\n\treturn (" .. v_to .. ") {" .. converters[i] .. "}\n\n")
+                       end
+               end
+       end
+end
+
+emit_h("\n")
+
 -- string
 
 existing_types.String = true
@@ -798,7 +833,7 @@ for _, t in ipairs(custom_types) do
                        ) .. ")\n" .. indent .. "\treturn false;\n"
        end
 
-       emit_h("typedef struct {\n" .. typedef .. "} " .. t.name .. ";\n")
+       emit_h("typedef struct {\n" .. typedef .. "} " .. struct_prefix .. t.name .. ";\n")
 
        if has_deallocator[t.name] then
                emit(export_prefix .. "void " .. t.name .. "_free(" .. t.name .. " *val)", "{\n" .. free .. "}\n\n")