Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Don't memset to zero
[simgrid.git] / src / bindings / lua / lua_utils.c
1 /* Copyright (c) 2010. The SimGrid Team.
2  * All rights reserved.                                                     */
3
4 /* This program is free software; you can redistribute it and/or modify it
5  * under the terms of the license (GNU LGPL) which comes with this package. */
6
7 /* SimGrid Lua helper functions                                             */
8
9 #include "lua_utils.h"
10 #include "xbt.h"
11 #include "xbt/log.h"
12
13 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(lua_utils, bindings, "Lua helper functions");
14
15 /**
16  * @brief Returns a string representation of a value in the Lua stack.
17  *
18  * This function is for debugging purposes.
19  * It always returns the same pointer.
20  *
21  * @param L the Lua state
22  * @param index index in the stack
23  * @return a string representation of the value at this index
24  */
25 const char* sglua_tostring(lua_State* L, int index) {
26
27   static char buff[64];
28
29   switch (lua_type(L, index)) {
30
31     case LUA_TNIL:
32       sprintf(buff, "nil");
33       break;
34
35     case LUA_TNUMBER:
36       sprintf(buff, "%.3f", lua_tonumber(L, index));
37       break;
38
39     case LUA_TBOOLEAN:
40       sprintf(buff, "%s", lua_toboolean(L, index) ? "true" : "false");
41       break;
42
43     case LUA_TSTRING:
44       snprintf(buff, 63, "'%s'", lua_tostring(L, index));
45       break;
46
47     case LUA_TFUNCTION:
48       if (lua_iscfunction(L, index)) {
49         sprintf(buff, "C-function");
50       }
51       else {
52         sprintf(buff, "function");
53       }
54       break;
55
56     case LUA_TTABLE:
57       sprintf(buff, "table(%p)", lua_topointer(L, index));
58       break;
59
60     case LUA_TLIGHTUSERDATA:
61     case LUA_TUSERDATA:
62       sprintf(buff, "userdata(%p)", lua_touserdata(L, index));
63       break;
64
65     case LUA_TTHREAD:
66       sprintf(buff, "thread");
67       break;
68   }
69   return buff;
70 }
71
72 /**
73  * @brief Returns a string representation of a key-value pair.
74  *
75  * This function is for debugging purposes.
76  * It always returns the same pointer.
77  *
78  * @param L the Lua state
79  * @param key_index index of the key
80  * @param value_index index of the value
81  * @return a string representation of the key-value pair
82  */
83 const char* sglua_keyvalue_tostring(lua_State* L, int key_index, int value_index) {
84
85   static char buff[64];
86   /* value_tostring also always returns the same pointer */
87   int len = snprintf(buff, 63, "[%s] -> ", sglua_tostring(L, key_index));
88   snprintf(buff + len, 63 - len, "%s", sglua_tostring(L, value_index));
89   return buff;
90 }
91
92 /**
93  * @brief Returns a string composed of the specified number of spaces.
94  *
95  * This function can be used to indent strings for debugging purposes.
96  * It always returns the same pointer.
97  *
98  * @param length length of the string
99  * @return a string of this length with only spaces
100  */
101 const char* sglua_get_spaces(int length) {
102
103   static char spaces[128];
104
105   xbt_assert(length < 128);
106   if (length != 0) {
107     memset(spaces, ' ', length);
108   }
109   spaces[length] = '\0';
110   return spaces;
111 }
112
113 /**
114  * @brief Dumps the Lua stack if debug logs are enabled.
115  * @param msg a message to print
116  * @param L a Lua state
117  */
118 void sglua_stack_dump(const char* msg, lua_State* L)
119 {
120   if (XBT_LOG_ISENABLED(lua_utils, xbt_log_priority_debug)) {
121     char buff[2048];
122     char* p = buff;
123     int i;
124     int top = lua_gettop(L);
125
126     //if (1) return;
127
128     fflush(stdout);
129
130     p[0] = '\0';
131     for (i = 1; i <= top; i++) {  /* repeat for each level */
132
133       p += sprintf(p, "%s", sglua_tostring(L, i));
134       p += sprintf(p, " ");       /* put a separator */
135     }
136     XBT_DEBUG("%s%s", msg, buff);
137   }
138 }
139
140 /**
141  * @brief Writes the specified data into a memory buffer.
142  *
143  * This function is a valid lua_Writer that writes into a memory buffer passed
144  * as userdata.
145  *
146  * @param L a lua state
147  * @param source some data
148  * @param sz number of bytes of data
149  * @param user_data the memory buffer to write
150  */
151 int sglua_memory_writer(lua_State* L, const void* source, size_t size,
152     void* userdata) {
153
154   sglua_buffer_t buffer = (sglua_buffer_t) userdata;
155   while (buffer->capacity < buffer->size + size) {
156     buffer->capacity *= 2;
157     buffer->data = xbt_realloc(buffer->data, buffer->capacity);
158   }
159   memcpy(buffer->data + buffer->size, source, size);
160   buffer->size += size;
161
162   return 0;
163 }