Imported from ../lua-5.0.2.tar.gz.
[lua.git] / etc / trace.c
blobc29f1c9d17a8e5b7d1e51d7119bed5f8ccd281dc
1 /*
2 * trace.c -- a simple execution tracer for Lua
3 */
5 #include <stdio.h>
6 #include <string.h>
7 #include "lua.h"
8 #include "lualib.h"
9 #include "lauxlib.h"
11 static FILE* LOG; /* log file */
12 static int I=0; /* indentation level */
14 static void hook(lua_State *L, lua_Debug *ar)
16 const char* s="";
17 switch (ar->event)
19 case LUA_HOOKTAILRET: ar->event=LUA_HOOKRET;
20 case LUA_HOOKRET: s="return"; break;
21 case LUA_HOOKCALL: s="call"; break;
22 case LUA_HOOKLINE: s="line"; break;
23 default: break;
25 fprintf(LOG,"[%d]\t%*s%s\t-- %d\n",I,I,"",s,ar->currentline);
26 if (ar->event==LUA_HOOKCALL) ++I; else if (ar->event==LUA_HOOKRET) --I;
29 static void start_trace(lua_State *L, FILE* logfile)
31 lua_sethook(L,hook,LUA_MASKCALL | LUA_MASKRET | LUA_MASKLINE, 0);
32 LOG=logfile;
35 static void stop_trace(lua_State *L)
37 lua_sethook(L,NULL,0,0);
38 fclose(LOG);
41 int main(void)
43 int rc;
44 lua_State *L=lua_open();
45 lua_baselibopen(L);
46 lua_tablibopen(L);
47 lua_iolibopen(L);
48 lua_strlibopen(L);
49 lua_mathlibopen(L);
50 lua_dblibopen(L);
51 start_trace(L,stderr);
52 rc=lua_dofile(L,NULL);
53 stop_trace(L);
54 return rc;