forked from UCB-IoET/ioet_contrib
-
Notifications
You must be signed in to change notification settings - Fork 0
/
native.c
113 lines (100 loc) · 3.02 KB
/
native.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
/**
* This file defines the contrib native C functions. You can access these as
* storm.n.<function>
* for example storm.n.hello()
*/
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
#include "lrotable.h"
#include "auxmods.h"
#include <platform_generic.h>
#include <string.h>
#include <stdint.h>
#include <interface.h>
#include <stdlib.h>
#include <libstorm.h>
/**
* This is required for the LTR patch that puts module tables
* in ROM
*/
#define MIN_OPT_LEVEL 2
#include "lrodefs.h"
//Include some libs as C files into this file
#include "natlib/util.c"
////////////////// BEGIN FUNCTIONS /////////////////////////////
/**
* Prints out hello world
*
* Lua signature: hello() -> nil
* Maintainer: Michael Andersen <[email protected]>
*/
static int contrib_hello(lua_State *L)
{
printf("Hello world\n");
// The number of return values
return 0;
}
/**
* Prints out hello world N times, X ticks apart
*
* N >= 1
* Lua signature: helloX(N,X) -> 42
* Maintainer: Michael Andersen <[email protected]>
*/
static int contrib_helloX_tail(lua_State *L);
static int contrib_helloX_entry(lua_State *L)
{
//First run of the loop, lets configure N and X
int N = luaL_checknumber(L, 1);
int X = luaL_checknumber(L, 2);
int loopcounter = 0;
//Do our job
printf ("Hello world\n");
//We already have these on the top of the stack, but this is
//how you would push variables you want access to in the continuation
//Also counting down would be more efficient, but this is an example
lua_pushnumber(L, loopcounter + 1);
lua_pushnumber(L, N);
lua_pushnumber(L, X);
//Now we want to sleep, and when we are done, invoke helloX_tail with
//the top 3 values of the stack available as upvalues
cord_set_continuation(L, contrib_helloX_tail, 3);
return nc_invoke_sleep(L, X);
//We can't do anything after a cord_invoke_* call, ever!
}
static int contrib_helloX_tail(lua_State *L)
{
//Grab our upvalues (state passed to us from the previous func)
int loopcounter = lua_tonumber(L, lua_upvalueindex(1));
int N = lua_tonumber(L, lua_upvalueindex(2));
int X = lua_tonumber(L, lua_upvalueindex(3));
//Do our job with them
if (loopcounter < N)
{
printf ("Hello world\n");
//Again, an example, these are already at the top of
//the stack
lua_pushnumber(L, loopcounter + 1);
lua_pushnumber(L, N);
lua_pushnumber(L, X);
cord_set_continuation(L, contrib_helloX_tail, 3);
return nc_invoke_sleep(L, X);
}
else
{
//Base case, now we do our return
//We promised to return the number 42
lua_pushnumber(L, 42);
lua_pushnumber(L, 43);
return cord_return(L, 2);
}
}
////////////////// BEGIN MODULE MAP /////////////////////////////
const LUA_REG_TYPE contrib_native_map[] =
{
{ LSTRKEY( "hello" ), LFUNCVAL ( contrib_hello ) },
{ LSTRKEY( "helloX" ), LFUNCVAL ( contrib_helloX_entry ) },
//The list must end with this
{ LNILKEY, LNILVAL }
};