File: LuaEnum.cpp

package info (click to toggle)
freespace2 24.2.0%2Brepack-1
  • links: PTS, VCS
  • area: non-free
  • in suites: forky, sid
  • size: 43,716 kB
  • sloc: cpp: 595,001; ansic: 21,741; python: 1,174; sh: 457; makefile: 248; xml: 181
file content (141 lines) | stat: -rw-r--r-- 3,438 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
//
//

#include "LuaEnum.h"

namespace scripting {
namespace api {

lua_enum_h::lua_enum_h() : lua_enum(-1) {}

lua_enum_h::lua_enum_h(int idx) : lua_enum(idx) {}

dynamic_sexp_enum_list* lua_enum_h::getEnum() const
{
	return &Dynamic_enums[lua_enum];
}

bool lua_enum_h::isValid() const
{
	return SCP_vector_inbounds(Dynamic_enums, lua_enum);
}

ADE_OBJ(l_LuaEnum, lua_enum_h, "LuaEnum", "Lua Enum handle");

ADE_VIRTVAR(Name, l_LuaEnum, "string", "The enum name", "string", "The enum name or nil if handle is invalid")
{
	lua_enum_h lua_enum;
	const char* enum_name;
	if (!ade_get_args(L, "o|s", l_LuaEnum.Get(&lua_enum), &enum_name))
		return ade_set_error(L, "o", l_LuaEnum.Set(lua_enum_h()));

	if (!lua_enum.isValid()) {
		return ADE_RETURN_NIL;
	}

	if (ADE_SETTING_VAR) {
		LuaError(L, "This property is read only.");
	}

	return ade_set_args(L, "s", lua_enum.getEnum()->name.c_str());
}

ADE_INDEXER(l_LuaEnum, "number Index", "Array of enum items", "string", "enum item string, or nil if index or enum handle is invalid")
{
	lua_enum_h lua_enum;
	int idx = -1;
	if (!ade_get_args(L, "o|i", l_LuaEnum.Get(&lua_enum), &idx))
		return ADE_RETURN_NIL;

	if (!lua_enum.isValid()) {
		return ADE_RETURN_NIL;
	}

	idx--; //Convert from lua 1 based index
	if ((idx < 0) || (idx >= static_cast<int>(lua_enum.getEnum()->list.size())))
		return ADE_RETURN_NIL;

	return ade_set_args(L, "s", lua_enum.getEnum()->list[idx].c_str());
}

ADE_FUNC(__len, l_LuaEnum, nullptr, "The number of Lua enum items", "number", "The number of Lua enums item or nil if handle is invalid")
{
	lua_enum_h lua_enum;
	if (!ade_get_args(L, "o", l_LuaEnum.Get(&lua_enum)))
		return ade_set_error(L, "i", 0);

	if (!lua_enum.isValid()) {
		return ADE_RETURN_NIL;
	}

	return ade_set_args(L, "i", static_cast<int>(lua_enum.getEnum()->list.size()));
}

ADE_FUNC(addEnumItem,
	l_LuaEnum,
	"string itemname",
	"Adds an enum item with the given string.",
	"boolean",
	"Returns true if successful, false otherwise")
{
	lua_enum_h lua_enum;
	const char* item_name;
	if (!ade_get_args(L, "os", l_LuaEnum.Get(&lua_enum) , &item_name))
		return ADE_RETURN_FALSE;

	if (!lua_enum.isValid()) {
		return ADE_RETURN_FALSE;
	}

	for (size_t i = 0; i < lua_enum.getEnum()->list.size(); i++) {
		if (!stricmp(item_name, lua_enum.getEnum()->list[i].c_str())) {
			return ADE_RETURN_FALSE;
		}
	}

	lua_enum.getEnum()->list.push_back(item_name);

	return ADE_RETURN_TRUE;
}

ADE_FUNC(removeEnumItem,
	l_LuaEnum,
	"string itemname",
	"Removes an enum item with the given string.",
	"boolean",
	"Returns true if successful, false otherwise")
{
	lua_enum_h lua_enum;
	const char* item_name;
	if (!ade_get_args(L, "os", l_LuaEnum.Get(&lua_enum), &item_name))
		return ADE_RETURN_FALSE;

	if (!lua_enum.isValid()) {
		return ADE_RETURN_FALSE;
	}

	size_t i;

	for (i = 0; i < lua_enum.getEnum()->list.size(); i++) {
		if (!stricmp(item_name, lua_enum.getEnum()->list[i].c_str())) {
			lua_enum.getEnum()->list.erase(lua_enum.getEnum()->list.begin() + i);
			return ADE_RETURN_TRUE;
		}
	}

	

	return ADE_RETURN_FALSE;
}

ADE_FUNC(isValid, l_LuaEnum, nullptr, "Detects whether handle is valid", "boolean", "true if valid, false if handle is invalid, nil if a syntax/type error occurs")
{
	lua_enum_h lua_enum;
	if (!ade_get_args(L, "o", l_LuaEnum.Get(&lua_enum)))
		return ADE_RETURN_NIL;

	return ade_set_args(L, "b", lua_enum.isValid());
}

} // namespace api
} // namespace scripting