summaryrefslogtreecommitdiff
path: root/utils/themeeditor/parser/skin_debug.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/themeeditor/parser/skin_debug.c')
-rw-r--r--utils/themeeditor/parser/skin_debug.c262
1 files changed, 262 insertions, 0 deletions
diff --git a/utils/themeeditor/parser/skin_debug.c b/utils/themeeditor/parser/skin_debug.c
new file mode 100644
index 0000000..549f7b9
--- /dev/null
+++ b/utils/themeeditor/parser/skin_debug.c
@@ -0,0 +1,262 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2010 Robert Bieber
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "skin_parser.h"
+#include "skin_debug.h"
+#include "tag_table.h"
+
+/* Global variables for debug output */
+int debug_indent_level = 0;
+extern int skin_line;
+
+/* Global error variables */
+int error_line;
+char* error_message;
+
+/* Debugging functions */
+void skin_error(enum skin_errorcode error)
+{
+
+ error_line = skin_line;
+
+ switch(error)
+ {
+ case MEMORY_LIMIT_EXCEEDED:
+ error_message = "Memory limit exceeded";
+ break;
+ case NEWLINE_EXPECTED:
+ error_message = "Newline expected";
+ break;
+ case ILLEGAL_TAG:
+ error_message = "Illegal tag";
+ break;
+ case ARGLIST_EXPECTED:
+ error_message = "Argument list expected";
+ break;
+ case TOO_MANY_ARGS:
+ error_message = "Too many arguments given";
+ break;
+ case DEFAULT_NOT_ALLOWED:
+ error_message = "Argument can not be set to default";
+ break;
+ case UNEXPECTED_NEWLINE:
+ error_message = "Unexpected newline";
+ break;
+ case INSUFFICIENT_ARGS:
+ error_message = "Not enough arguments";
+ break;
+ case INT_EXPECTED:
+ error_message = "Expected integer";
+ break;
+ case SEPERATOR_EXPECTED:
+ error_message = "Expected argument seperator";
+ break;
+ case CLOSE_EXPECTED:
+ error_message = "Expected list close";
+ break;
+ case MULTILINE_EXPECTED:
+ error_message = "Expected subline seperator";
+ break;
+ };
+
+}
+
+int skin_error_line()
+{
+ return error_line;
+}
+
+char* skin_error_message()
+{
+ return error_message;
+}
+
+void skin_clear_errors()
+{
+ error_line = 0;
+ error_message = NULL;
+}
+
+void skin_debug_tree(struct skin_element* root)
+{
+ int i;
+ char *text;
+
+ struct skin_element* current = root;
+
+ while(current)
+ {
+ skin_debug_indent();
+
+ switch(current->type)
+ {
+ case UNKNOWN:
+ printf("[ Unknown element.. error\n]");
+ break;
+
+ case VIEWPORT:
+ printf("[ Viewport \n");
+
+ debug_indent_level++;
+ skin_debug_tree(current->children[0]);
+ debug_indent_level--;
+
+ printf("]");
+ break;
+
+ case TEXT:
+ text = current->data;
+ printf("[ Plain text on line %d : %s ]\n", current->line, text);
+ break;
+
+ case COMMENT:
+ text = current->data;
+ printf("[ Comment on line %d: ", current->line);
+ for(i = 0; i < (int)strlen(text); i++)
+ {
+ if(text[i] == '\n')
+ printf("\\n");
+ else
+ printf("%c", text[i]);
+ }
+ printf(" ]\n");
+ break;
+
+ case TAG:
+ printf("[ %s tag on line %d with %d arguments\n",
+ current->tag->name,
+ current->line, current->params_count);
+ debug_indent_level++;
+ skin_debug_params(current->params_count, current->params);
+ debug_indent_level--;
+ skin_debug_indent();
+ printf("]\n");
+
+ break;
+
+ case SUBLINES:
+ printf("[ Alternator on line %d with %d sublines \n", current->line,
+ current->children_count);
+ debug_indent_level++;
+ for(i = 0; i < current->children_count; i++)
+ {
+ skin_debug_tree(current->children[i]);
+ }
+ debug_indent_level--;
+
+ skin_debug_indent();
+ printf("]\n");
+ break;
+
+ case CONDITIONAL:
+ printf("[ Conditional tag on line %d with %d enumerations \n",
+ current->line, current->children_count - 1);
+ debug_indent_level++;
+
+ skin_debug_indent();
+ printf("[ Condition tag \n");
+ debug_indent_level++;
+ skin_debug_tree(current->children[0]);
+ debug_indent_level--;
+ skin_debug_indent();
+ printf("]\n");
+
+ for(i = 1; i < current->children_count; i++)
+ {
+ skin_debug_indent();
+ printf("[ Enumeration %d\n", i - 1);
+ debug_indent_level++;
+ skin_debug_tree(current->children[i]);
+ debug_indent_level--;
+ skin_debug_indent();
+ printf("]\n");
+ }
+
+ debug_indent_level--;
+ skin_debug_indent();
+ printf("]\n");
+
+
+ break;
+
+ case LINE:
+ printf("[ Logical line on line %d\n", current->line);
+
+ debug_indent_level++;
+ skin_debug_tree(current->children[0]);
+ debug_indent_level--;
+
+ skin_debug_indent();
+ printf("]\n");
+ break;
+ }
+
+ current = current->next;
+ }
+
+}
+
+void skin_debug_params(int count, struct skin_tag_parameter params[])
+{
+ int i;
+ for(i = 0; i < count; i++)
+ {
+
+ skin_debug_indent();
+ switch(params[i].type)
+ {
+ case DEFAULT:
+ printf("[-]");
+ break;
+
+ case STRING:
+ printf("[%s]", params[i].data.text);
+ break;
+
+ case NUMERIC:
+ printf("[%d]", params[i].data.numeric);
+ break;
+
+ case CODE:
+ printf("[ WPS Code: \n");
+ debug_indent_level++;
+ skin_debug_tree(params[i].data.code);
+ debug_indent_level--;
+ skin_debug_indent();
+ printf("]");
+ break;
+ }
+
+ printf("\n");
+
+ }
+}
+
+void skin_debug_indent()
+{
+ int i;
+ for(i = 0; i < debug_indent_level; i++)
+ printf(" ");
+}