#include #include #include #include #include #include #include #include #define EXIT_LOGFILE_HANDLING 2 #define EXIT_LUAFILE_HANDLING 3 void trim(char *string) { if (strlen(string) > 0 && string[strlen(string) - 1] == '\n') { string[strlen(string) - 1] = '\0'; trim(string); } } int luaFilterCall(lua_State *L, char *line, size_t len) { int filter; lua_getglobal(L, "filter"); lua_pushlstring(L, line, len); if (lua_pcall(L, 1, 1, 0) != 0) { fprintf(stderr, "Error running LUA function 'filter': %s\n", lua_tostring(L, -1)); exit(EXIT_LUAFILE_HANDLING); } if (!lua_isboolean(L, -1)) { fprintf(stderr, "LUA function 'filter' did not return a boolean"); exit(EXIT_LUAFILE_HANDLING); } filter = lua_toboolean(L, -1); lua_pop(L, 1); return filter; } const char* luaFormatCall(lua_State *L, char *line, size_t len, size_t *formatLen) { lua_getglobal(L, "format"); lua_pushlstring(L, line, len); if (lua_pcall(L, 1, 1, 0) != 0) { fprintf(stderr, "Error running LUA function 'format': %s\n", lua_tostring(L, -1)); exit(EXIT_LUAFILE_HANDLING); } if (!lua_isstring(L, -1)) { fprintf(stderr, "LUA function 'format' did not return a string\n"); exit(EXIT_LUAFILE_HANDLING); } return lua_tolstring(L, -1 , formatLen); } static int luaColor(lua_State *L) { size_t strLen, colorLen; const char *str, *color; str = luaL_checklstring(L, 1, &strLen); color = luaL_checklstring(L, 2, &colorLen); int retLen = strLen + colorLen + 7; char ret[retLen]; sprintf(ret, "\033[%sm%s\033[0m", color, str); lua_pushlstring(L, ret, retLen); return 1; } int main(int argc, char *argv[]) { if (argc != 3) { fprintf(stderr, "Usage: %s \n", argv[0]); return 1; } int status; char *logfile = argv[2]; char *luafile = argv[1]; char *line = NULL; size_t len = 0; ssize_t bytesRead; FILE *fp; lua_State *L; L = luaL_newstate(); luaL_openlibs(L); fp = fopen(logfile, "r"); if (errno) { fprintf(stderr, "Error opening file %s: %s\n", logfile, strerror(errno)); return EXIT_LOGFILE_HANDLING; } status = luaL_dofile(L, luafile); if (status) { fprintf(stderr, "Error reading LUA file %s: %s\n", luafile, lua_tostring(L, -1)); return EXIT_LUAFILE_HANDLING; } lua_pushcfunction(L, luaColor); lua_setglobal(L, "color"); while ((bytesRead = getline(&line, &len, fp)) != -1) { size_t formatLen; const char *formatLine; trim(line); if (luaFilterCall(L, line, bytesRead)) { continue; } formatLine = luaFormatCall(L, line, bytesRead, &formatLen); printf("%s\n", formatLine); } if (errno) { fprintf(stderr, "Error reading file %s: %s\n", logfile, strerror(errno)); return EXIT_LOGFILE_HANDLING; } free(line); lua_close(L); fclose(fp); }