Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'master' of framagit.org:Adrien.Gougeon/simgrid into master
[simgrid.git] / src / bindings / lua / lua_utils.cpp
1 /* Copyright (c) 2010-2020. 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 /*
8  * This file contains functions that aid users to debug their lua scripts; for instance,
9  * tables can be easily output and values are represented in a human-readable way. (For instance,
10  * a nullptr value becomes the string "nil").
11  *
12  */
13 /* SimGrid Lua helper functions                                             */
14 #include "lua_utils.hpp"
15 #include <lauxlib.h>
16
17 /**
18  * @brief Returns a string representation of a value in the Lua stack.
19  *
20  * This function is for debugging purposes.
21  * It always returns the same pointer.
22  *
23  * @param L the Lua state
24  * @param index index in the stack
25  * @return a string representation of the value at this index
26  */
27 const char* sglua_tostring(lua_State* L, int index)
28 {
29   static char buff[64];
30
31   switch (lua_type(L, index)) {
32     case LUA_TNIL:
33       snprintf(buff, 4, "nil");
34       break;
35
36     case LUA_TNUMBER:
37       snprintf(buff, 64, "%.3f", lua_tonumber(L, index));
38       break;
39
40     case LUA_TBOOLEAN:
41       snprintf(buff, 64, "%s", lua_toboolean(L, index) ? "true" : "false");
42       break;
43
44     case LUA_TSTRING:
45       snprintf(buff, 63, "'%s'", lua_tostring(L, index));
46       break;
47
48     case LUA_TFUNCTION:
49       if (lua_iscfunction(L, index)) {
50         snprintf(buff, 11, "C-function");
51       } else {
52         snprintf(buff, 9, "function");
53       }
54       break;
55
56     case LUA_TTABLE:
57       snprintf(buff, 64, "table(%p)", lua_topointer(L, index));
58       break;
59
60     case LUA_TLIGHTUSERDATA:
61     case LUA_TUSERDATA:
62       snprintf(buff, 64, "userdata(%p)", lua_touserdata(L, index));
63       break;
64
65     case LUA_TTHREAD:
66       snprintf(buff, 7, "thread");
67       break;
68
69     default:
70       snprintf(buff, 64, "unknown(%d)", lua_type(L, index));
71       break;
72   }
73   return buff;
74 }
75
76 /**
77  * @brief Returns a string representation of a key-value pair.
78  *
79  * It always returns the same pointer.
80  *
81  * @param L the Lua state
82  * @param key_index index of the key (in the lua stack)
83  * @param value_index index of the value (in the lua stack)
84  * @return a string representation of the key-value pair
85  */
86 const char* sglua_keyvalue_tostring(lua_State* L, int key_index, int value_index)
87 {
88   static char buff[64];
89   /* value_tostring also always returns the same pointer */
90   int len = snprintf(buff, 63, "[%s] -> ", sglua_tostring(L, key_index));
91   snprintf(buff + len, 63 - len, "%s", sglua_tostring(L, value_index));
92   return buff;
93 }