-
Notifications
You must be signed in to change notification settings - Fork 0
/
arduino.cpp
62 lines (42 loc) · 1.61 KB
/
arduino.cpp
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
#include <stdlib.h>
#include "arduino.h"
////////////////////////////////////////////////////////////////////////////////
//LINKED LIST WITH A STRING BUFFER ATTACHED
////////////////////////////////////////////////////////////////////////////////
typedef struct lua_flash_string {
lua_flash_string *next;
char buffer[];
} lua_flash_string;
////////////////////////////////////////////////////////////////////////////////
//REFERENCE TO THE FIRST STRING IN RAM
////////////////////////////////////////////////////////////////////////////////
static lua_flash_string *lua_flash_first = nullptr;
////////////////////////////////////////////////////////////////////////////////
//COPY A STRING FROM FLASH INTO RAM
////////////////////////////////////////////////////////////////////////////////
LUA_API const char *lua_flash_allocate(const char *string) {
auto len = strlen_P(string);
auto item = (lua_flash_string*) malloc(len + sizeof(lua_flash_string) + 1);
if (!item) return "";
item->next = nullptr;
memcpy_P(item->buffer, string, len);
item->buffer[len] = '\0';
if (lua_flash_first) {
lua_flash_string *tmp = lua_flash_first;
while (tmp->next) tmp = tmp->next;
tmp->next = item;
} else {
lua_flash_first = item;
}
return item->buffer;
}
////////////////////////////////////////////////////////////////////////////////
//FREE ALL COPIED STRINGS FROM RAM
////////////////////////////////////////////////////////////////////////////////
LUA_API void lua_flash_free() {
while (lua_flash_first) {
lua_flash_string *next = lua_flash_first->next;
free(lua_flash_first);
lua_flash_first = next;
}
}