Support recursive tables.
[olsrd.git] / lib / tas / src / glua_ext.c
1 /*
2  * The olsr.org Optimized Link-State Routing daemon (olsrd)
3  *
4  * Copyright (c) 2004, Thomas Lopatic (thomas@olsr.org)
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without 
8  * modification, are permitted provided that the following conditions 
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright 
12  *   notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above copyright 
14  *   notice, this list of conditions and the following disclaimer in 
15  *   the documentation and/or other materials provided with the 
16  *   distribution.
17  * * Neither the name of olsr.org, olsrd nor the names of its 
18  *   contributors may be used to endorse or promote products derived 
19  *   from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
32  * POSSIBILITY OF SUCH DAMAGE.
33  *
34  * Visit http://www.olsr.org for more information.
35  *
36  * If you find this software useful feel free to make a donation
37  * to the project. For more information see the website or contact
38  * the copyright holders.
39  *
40  * $Id: glua_ext.c,v 1.2 2005/04/12 19:57:26 tlopatic Exp $
41  */
42
43 #include "lua/lua.h"
44 #include "lua/lauxlib.h"
45 #include "lua/lualib.h"
46
47 #include "link.h"
48 #include "plugin.h"
49 #include "lib.h"
50 #include "os_unix.h"
51 #include "http.h"
52 #include "glua.h"
53 #include "glua_ext.h"
54
55 #include <string.h>
56
57 static char *getToken(char **point)
58 {
59   char *localPoint = *point;
60   char *start;
61
62   start = localPoint;
63
64   while (*localPoint != '~' && *localPoint != 0)
65     localPoint++;
66
67   if (*localPoint == 0)
68     return NULL;
69
70   *localPoint++ = 0;
71
72   *point = localPoint;
73
74   return start;
75 }
76
77 int tasOlsrSendMessage(lua_State *lua)
78 {
79   const char *service;
80   const char *string;
81
82   service = luaL_checkstring(lua, 1);
83   string = luaL_checkstring(lua, 2);
84
85   sendMessage(service, string);
86   httpAddTasMessage(service, string, "localhost");
87
88   return 0;
89 }
90
91 int tasOlsrGetMessage(lua_State *lua)
92 {
93   const char *service;
94   char *string;
95   char *from;
96
97   service = luaL_checkstring(lua, 1);
98
99   if (httpGetTasMessage(service, &string, &from) < 0)
100   {
101     lua_pushnil(lua);
102     lua_pushnil(lua);
103   }
104
105   else
106   {
107     lua_pushstring(lua, string);
108     lua_pushstring(lua, from);
109
110     freeMem(string);
111     freeMem(from);
112   }
113
114   return 2;
115 }
116
117 static void addSubTable(lua_State *lua, char **walker)
118 {
119   char *token;
120   unsigned int val;
121
122   token = getToken(walker);
123
124   if (token == NULL)
125   {
126     error("premature end of buffer\n");
127     return;
128   }
129
130   lua_pushstring(lua, token);
131   lua_newtable(lua);
132
133   while (**walker != 0)
134   {
135     token = getToken(walker);
136
137     if (token == NULL)
138     {
139       error("premature end of buffer\n");
140       return;
141     }
142
143     if (strcmp(token, "]") == 0)
144       return;
145
146     if (strcmp(token, "[") == 0)
147       addSubTable(lua, walker);
148
149     else
150     {
151       if (stringToInt(&val, token) < 0)
152         lua_pushstring(lua, token);
153
154       else
155         lua_pushnumber(lua, val);
156
157       token = getToken(walker);
158
159       if (token == NULL)
160       {
161         error("premature end of buffer\n");
162         return;
163       }
164
165       lua_pushstring(lua, token);
166     }
167
168     lua_settable(lua, -3);
169   }
170 }
171
172 static void addTable(lua_State *lua, char *name, void (*init)(void),
173                      int (*next)(char *buff, int len))
174 {
175   int i;
176   char buff[1024], *walker, *token;
177
178   lua_pushstring(lua, name);
179   lua_newtable(lua);
180
181   init();
182
183   i = 0;
184
185   while (next(buff, sizeof (buff)) >= 0)
186   {
187     walker = buff;
188
189     lua_pushnumber(lua, i++);
190     lua_newtable(lua);
191
192     while (*walker != 0)
193     {
194       token = getToken(&walker);
195
196       if (token == NULL)
197       {
198         error("premature end of buffer\n");
199         return;
200       }
201
202       if (strcmp(token, "[") == 0)
203         addSubTable(lua, &walker);
204
205       else
206       {
207         lua_pushstring(lua, token);
208
209         token = getToken(&walker);
210
211         if (token == NULL)
212         {
213           error("premature end of buffer\n");
214           return;
215         }
216
217         lua_pushstring(lua, token);
218       }
219
220       lua_settable(lua, -3);
221     }
222
223     lua_settable(lua, -3);
224   }
225
226   lua_settable(lua, -3);
227 }
228
229 int tasOlsrGetInfo(lua_State *lua)
230 {
231   lua_newtable(lua);
232
233   addTable(lua, "routes", iterRouteTabInit, iterRouteTabNext);
234   addTable(lua, "links", iterLinkTabInit, iterLinkTabNext);
235   addTable(lua, "neighbors", iterNeighTabInit, iterNeighTabNext);
236
237   return 1;
238 }