-
Notifications
You must be signed in to change notification settings - Fork 0
/
lmjalgo.c
163 lines (149 loc) · 3.57 KB
/
lmjalgo.c
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
/*************************************************************************
FileName: lmjalgo.c
Author: turbobhh
Mail: turbobhh@gmail.com
CreatedTime: Thu 08 Jun 2017 08:38:06 PM CST
************************************************************************/
#include <stdio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <lua.h>
#include <lauxlib.h>
#include "mjalgo.h"
#if LUA_VERSION_NUM < 502
# ifndef luaL_newlib
# define luaL_newlib(L, l) (lua_newtable(L), luaL_register(L, NULL, l))
# endif
# ifndef lua_setuservalue
# define lua_setuservalue(L, n) lua_setfenv(L, n)
# endif
# ifndef lua_getuservalue
# define lua_getuservalue(L, n) lua_getfenv(L, n)
# endif
#endif
#define LUA_BASE_NUM 11
#define LUA_BASE_EYE 1
#define NUM_LUA2C(num) ((num) - LUA_BASE_NUM)
#define NUM_C2LUA(num) ((num) + LUA_BASE_NUM)
#define EYE_LUA2C(eye) ((eye) + LUA_BASE_EYE)
#define EYE_C2LUA(eye) ((eye) - LUA_BASE_EYE)
static void get_pais(lua_State *L, int index, pais_t pais)
{
luaL_checktype(L, index, LUA_TTABLE);
int cnt;
for (int i = 0; i < 4; ++i) {
lua_rawgeti(L, index, i + 1);
luaL_checktype(L, -1, LUA_TTABLE);
for (int j = 0; j < 10; ++j) {
lua_rawgeti(L, -1, j + 1);
cnt = luaL_checkinteger(L, -1);
pais[i][j] = cnt;
lua_pop(L, 1);
}
lua_pop(L, 1);
}
}
static int get_nums(lua_State*L, int index, nums_t nums)
{
if (lua_isnoneornil(L, index)) return 0;
luaL_checktype(L, index, LUA_TTABLE);
int num, n;
n = lua_rawlen(L, index);
for (int i = 0; i < n; ++i) {
lua_rawgeti(L, index, i + 1);
num = luaL_checkinteger(L, -1);
nums[i] = NUM_LUA2C(num);
lua_pop(L, 1);
}
return n;
}
static void push_tingdata(lua_State* L, tingmap_t tmap)
{
struct tingnode_s *tnode;
lua_newtable(L);
TINGMAP_FOREACH_BEGEIN(tmap, num, tnodes, n)
lua_newtable(L);
for (int i = 0; i < n; ++i) {
tnode = tnodes[i];
lua_createtable(L, 3, 0);
lua_pushinteger(L, NUM_C2LUA(tnode->num));
lua_rawseti(L, -2, 1);
lua_pushinteger(L, tnode->score);
lua_rawseti(L, -2, 2);
lua_pushinteger(L, tnode->mask);
lua_rawseti(L, -2, 3);
lua_rawseti(L, -2, i + 1);
}
lua_rawseti(L, -2, NUM_C2LUA(num));
TINGMAP_FOREACH_END
}
static int lg_gettingdata(lua_State *L)
{
tingmap_t tmap;
pais_t pais;
nums_t gnums, lnums, nums;
humask_t mask;
int gn, ln, n;
bool hu;
get_pais(L, 1, pais);
gn = get_nums(L, 2, gnums);
ln = get_nums(L, 3, lnums);
n = get_nums(L, 4, nums);
mask = luaL_optinteger(L, 5, ALL);
TINGMAP_INIT(tmap);
hu = g_gettingdata(pais,
gnums, gn,
lnums, ln,
nums, n,
mask,
tmap);
hu ? push_tingdata(L, tmap) : lua_pushnil(L);
TINGMAP_FREE(tmap);
return 1;
}
static int lg_gethumask(lua_State *L)
{
pais_t pais;
nums_t gnums, nums;
humask_t mask;
humask_t res_mask;
int gn, n;
get_pais(L, 1, pais);
gn = get_nums(L, 2, gnums);
n = get_nums(L, 3, nums);
mask = luaL_optinteger(L, 4, ALL);
res_mask = g_gethumask(pais,
gnums, gn,
nums, n,
mask);
lua_pushinteger(L, res_mask);
return 1;
}
#define REG_MASK(L, mask) (lua_pushinteger(L, mask), lua_setfield(L, -2, #mask))
int luaopen_lmjalgo(lua_State *L)
{
luaL_Reg lfuncs[] = {
{"g_gettingdata", lg_gettingdata},
{"g_gethumask", lg_gethumask},
{NULL, NULL},
};
luaL_newlib(L, lfuncs);
REG_MASK(L, JH);
REG_MASK(L, PPH);
REG_MASK(L, HYS);
REG_MASK(L, QXD);
REG_MASK(L, LQD);
REG_MASK(L, QYS);
REG_MASK(L, HYJ);
REG_MASK(L, XSY);
REG_MASK(L, XSX);
REG_MASK(L, ZYS);
REG_MASK(L, QYJ);
REG_MASK(L, SSY);
REG_MASK(L, DSY);
REG_MASK(L, DSX);
REG_MASK(L, ALL);
REG_MASK(L, NONE);
return 1;
}