Line data Source code
1 : #pragma once
2 :
3 : // for inclusion at the start of the generated .cpp
4 :
5 2281943 : int binding_argcheck(lua_State *L, int expected_arg_count) {
6 2281943 : const int args = lua_gettop(L);
7 2281943 : if (args > expected_arg_count) {
8 0 : return luaL_argerror(L, args, "too many arguments");
9 2281943 : } else if (args < expected_arg_count) {
10 0 : return luaL_argerror(L, args, "too few arguments");
11 : }
12 : return 0;
13 : }
14 :
15 0 : int field_argerror(lua_State *L) {
16 0 : return binding_argcheck(L, -1); // force too many args error
17 : }
18 :
19 127947 : bool userdata_zero_arg_check(lua_State *L) {
20 127947 : if (lua_gettop(L) == 0) {
21 : return false;
22 : }
23 : lua_Debug ar;
24 0 : if (lua_getstack(L, 1, &ar)) {
25 0 : lua_getinfo(L, "Sl", &ar);
26 0 : if (ar.currentline != 0) {
27 0 : if (lua_getstack(L, 0, &ar)) {
28 0 : lua_getinfo(L, "n", &ar);
29 0 : if (ar.name != NULL) {
30 0 : lua_scripts::set_and_print_new_error_message(MAV_SEVERITY_WARNING, "%s:%d Warning: %s does not take arguments, will be fatal in future", ar.short_src, ar.currentline, ar.name);
31 0 : return true;
32 : }
33 : }
34 : }
35 : }
36 0 : lua_scripts::set_and_print_new_error_message(MAV_SEVERITY_WARNING, "Warning: userdata creation does not take arguments, will be fatal in future");
37 0 : return true;
38 : }
39 :
40 257322 : lua_Integer get_integer(lua_State *L, int arg_num, lua_Integer min_val, lua_Integer max_val) {
41 257322 : const lua_Integer lua_int = luaL_checkinteger(L, arg_num);
42 257322 : luaL_argcheck(L, (lua_int >= min_val) && (lua_int <= max_val), arg_num, "out of range");
43 257322 : return lua_int;
44 : }
45 :
46 : // helpers for full range types
47 17063 : int8_t get_int8_t(lua_State *L, int arg_num) {
48 17063 : return static_cast<int8_t>(get_integer(L, arg_num, INT8_MIN, INT8_MAX));
49 : }
50 :
51 0 : int16_t get_int16_t(lua_State *L, int arg_num) {
52 0 : return static_cast<int16_t>(get_integer(L, arg_num, INT16_MIN, INT16_MAX));
53 : }
54 :
55 34479 : uint8_t get_uint8_t(lua_State *L, int arg_num) {
56 34479 : return static_cast<uint8_t>(get_integer(L, arg_num, 0, UINT8_MAX));
57 : }
58 :
59 56406 : uint16_t get_uint16_t(lua_State *L, int arg_num) {
60 56406 : return static_cast<uint16_t>(get_integer(L, arg_num, 0, UINT16_MAX));
61 : }
62 :
63 6220 : float get_number(lua_State *L, int arg_num, float min_val, float max_val) {
64 6220 : const float lua_num = luaL_checknumber(L, arg_num);
65 6220 : luaL_argcheck(L, (lua_num >= min_val) && (lua_num <= max_val), arg_num, "out of range");
66 6220 : return lua_num;
67 : }
68 :
69 81 : uint32_t get_uint32(lua_State *L, int arg_num, uint32_t min_val, uint32_t max_val) {
70 81 : const uint32_t lua_unint32 = coerce_to_uint32_t(L, arg_num);
71 81 : luaL_argcheck(L, (lua_unint32 >= min_val) && (lua_unint32 <= max_val), arg_num, "out of range");
72 81 : return lua_unint32;
73 : }
74 :
75 60298 : void ** check_ap_object(lua_State *L, int arg_num, const char * name) {
76 60298 : void ** data = (void **)luaL_checkudata(L, arg_num, name);
77 60298 : if (*data == NULL) {
78 0 : luaL_error(L, "internal error: %s is null", name); // does not return
79 : }
80 60298 : return data;
81 : }
82 :
83 0 : static int not_supported_error(lua_State *L, int arg, const char* name) {
84 : char error_msg[50];
85 0 : snprintf(error_msg, sizeof(error_msg), "%s not supported on this firmware", name);
86 0 : return luaL_argerror(L, arg, error_msg);
87 : }
88 :
89 : struct userdata_enum {
90 : const char *name;
91 : int value;
92 : };
93 :
94 : struct userdata_meta {
95 : const char *name;
96 : lua_CFunction func;
97 : const luaL_Reg *operators;
98 : };
99 :
100 3111228 : static int load_function(lua_State *L, const luaL_Reg *list, const uint8_t length) {
101 3111228 : const char * name = luaL_checkstring(L, 2);
102 30802493 : for (uint8_t i = 0; i < length; i++) {
103 30802493 : if (strcmp(name,list[i].name) == 0) {
104 3111228 : lua_pushcfunction(L, list[i].func);
105 3111228 : return 1;
106 : }
107 : }
108 : return 0;
109 : }
110 :
111 : #pragma GCC diagnostic push
112 : #pragma GCC diagnostic ignored "-Wunused-function"
113 0 : static int load_enum(lua_State *L, const userdata_enum *list, const uint8_t length) {
114 0 : const char * name = luaL_checkstring(L, 2);
115 0 : for (uint8_t i = 0; i < length; i++) {
116 0 : if (strcmp(name,list[i].name) == 0) {
117 0 : lua_pushinteger(L, list[i].value);
118 0 : return 1;
119 : }
120 : }
121 : return 0;
122 : }
123 : #pragma GCC diagnostic pop
|