summaryrefslogtreecommitdiff
path: root/lib/skin_parser/skin_debug.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/skin_parser/skin_debug.c')
-rw-r--r--lib/skin_parser/skin_debug.c262
1 files changed, 262 insertions, 0 deletions
diff --git a/lib/skin_parser/skin_debug.c b/lib/skin_parser/skin_debug.c
new file mode 100644
index 0000000000..549f7b9e6c
--- /dev/null
+++ b/lib/skin_parser/skin_debug.c
@@ -0,0 +1,262 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2010 Robert Bieber
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21
22#include <stdio.h>
23#include <stdlib.h>
24#include <string.h>
25
26#include "skin_parser.h"
27#include "skin_debug.h"
28#include "tag_table.h"
29
30/* Global variables for debug output */
31int debug_indent_level = 0;
32extern int skin_line;
33
34/* Global error variables */
35int error_line;
36char* error_message;
37
38/* Debugging functions */
39void skin_error(enum skin_errorcode error)
40{
41
42 error_line = skin_line;
43
44 switch(error)
45 {
46 case MEMORY_LIMIT_EXCEEDED:
47 error_message = "Memory limit exceeded";
48 break;
49 case NEWLINE_EXPECTED:
50 error_message = "Newline expected";
51 break;
52 case ILLEGAL_TAG:
53 error_message = "Illegal tag";
54 break;
55 case ARGLIST_EXPECTED:
56 error_message = "Argument list expected";
57 break;
58 case TOO_MANY_ARGS:
59 error_message = "Too many arguments given";
60 break;
61 case DEFAULT_NOT_ALLOWED:
62 error_message = "Argument can not be set to default";
63 break;
64 case UNEXPECTED_NEWLINE:
65 error_message = "Unexpected newline";
66 break;
67 case INSUFFICIENT_ARGS:
68 error_message = "Not enough arguments";
69 break;
70 case INT_EXPECTED:
71 error_message = "Expected integer";
72 break;
73 case SEPERATOR_EXPECTED:
74 error_message = "Expected argument seperator";
75 break;
76 case CLOSE_EXPECTED:
77 error_message = "Expected list close";
78 break;
79 case MULTILINE_EXPECTED:
80 error_message = "Expected subline seperator";
81 break;
82 };
83
84}
85
86int skin_error_line()
87{
88 return error_line;
89}
90
91char* skin_error_message()
92{
93 return error_message;
94}
95
96void skin_clear_errors()
97{
98 error_line = 0;
99 error_message = NULL;
100}
101
102void skin_debug_tree(struct skin_element* root)
103{
104 int i;
105 char *text;
106
107 struct skin_element* current = root;
108
109 while(current)
110 {
111 skin_debug_indent();
112
113 switch(current->type)
114 {
115 case UNKNOWN:
116 printf("[ Unknown element.. error\n]");
117 break;
118
119 case VIEWPORT:
120 printf("[ Viewport \n");
121
122 debug_indent_level++;
123 skin_debug_tree(current->children[0]);
124 debug_indent_level--;
125
126 printf("]");
127 break;
128
129 case TEXT:
130 text = current->data;
131 printf("[ Plain text on line %d : %s ]\n", current->line, text);
132 break;
133
134 case COMMENT:
135 text = current->data;
136 printf("[ Comment on line %d: ", current->line);
137 for(i = 0; i < (int)strlen(text); i++)
138 {
139 if(text[i] == '\n')
140 printf("\\n");
141 else
142 printf("%c", text[i]);
143 }
144 printf(" ]\n");
145 break;
146
147 case TAG:
148 printf("[ %s tag on line %d with %d arguments\n",
149 current->tag->name,
150 current->line, current->params_count);
151 debug_indent_level++;
152 skin_debug_params(current->params_count, current->params);
153 debug_indent_level--;
154 skin_debug_indent();
155 printf("]\n");
156
157 break;
158
159 case SUBLINES:
160 printf("[ Alternator on line %d with %d sublines \n", current->line,
161 current->children_count);
162 debug_indent_level++;
163 for(i = 0; i < current->children_count; i++)
164 {
165 skin_debug_tree(current->children[i]);
166 }
167 debug_indent_level--;
168
169 skin_debug_indent();
170 printf("]\n");
171 break;
172
173 case CONDITIONAL:
174 printf("[ Conditional tag on line %d with %d enumerations \n",
175 current->line, current->children_count - 1);
176 debug_indent_level++;
177
178 skin_debug_indent();
179 printf("[ Condition tag \n");
180 debug_indent_level++;
181 skin_debug_tree(current->children[0]);
182 debug_indent_level--;
183 skin_debug_indent();
184 printf("]\n");
185
186 for(i = 1; i < current->children_count; i++)
187 {
188 skin_debug_indent();
189 printf("[ Enumeration %d\n", i - 1);
190 debug_indent_level++;
191 skin_debug_tree(current->children[i]);
192 debug_indent_level--;
193 skin_debug_indent();
194 printf("]\n");
195 }
196
197 debug_indent_level--;
198 skin_debug_indent();
199 printf("]\n");
200
201
202 break;
203
204 case LINE:
205 printf("[ Logical line on line %d\n", current->line);
206
207 debug_indent_level++;
208 skin_debug_tree(current->children[0]);
209 debug_indent_level--;
210
211 skin_debug_indent();
212 printf("]\n");
213 break;
214 }
215
216 current = current->next;
217 }
218
219}
220
221void skin_debug_params(int count, struct skin_tag_parameter params[])
222{
223 int i;
224 for(i = 0; i < count; i++)
225 {
226
227 skin_debug_indent();
228 switch(params[i].type)
229 {
230 case DEFAULT:
231 printf("[-]");
232 break;
233
234 case STRING:
235 printf("[%s]", params[i].data.text);
236 break;
237
238 case NUMERIC:
239 printf("[%d]", params[i].data.numeric);
240 break;
241
242 case CODE:
243 printf("[ WPS Code: \n");
244 debug_indent_level++;
245 skin_debug_tree(params[i].data.code);
246 debug_indent_level--;
247 skin_debug_indent();
248 printf("]");
249 break;
250 }
251
252 printf("\n");
253
254 }
255}
256
257void skin_debug_indent()
258{
259 int i;
260 for(i = 0; i < debug_indent_level; i++)
261 printf(" ");
262}