MPEGPlayer playlist should as well support all viewer-handled file extensions...indeed.
[kugel-rb.git] / lib / skin_parser / skin_debug.c
blobbcf43ab5e4a23c0e36bb64d71fbbbdf9fcb4dd05
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Copyright (C) 2010 Robert Bieber
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.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
26 #include "skin_parser.h"
27 #include "skin_debug.h"
28 #include "tag_table.h"
30 /* Global variables for debug output */
31 int debug_indent_level = 0;
32 extern int skin_line;
33 extern char* skin_start;
35 /* Global error variables */
36 int error_line;
37 int error_col;
38 const char *error_line_start;
39 char* error_message;
41 /* Debugging functions */
42 void skin_error(enum skin_errorcode error, const char* cursor)
45 error_col = 0;
47 while(cursor > skin_start && *cursor != '\n')
49 cursor--;
50 error_col++;
52 error_line_start = cursor+1;
54 error_line = skin_line;
56 switch(error)
58 case MEMORY_LIMIT_EXCEEDED:
59 error_message = "Memory limit exceeded";
60 break;
61 case NEWLINE_EXPECTED:
62 error_message = "Newline expected";
63 break;
64 case ILLEGAL_TAG:
65 error_message = "Illegal tag";
66 break;
67 case ARGLIST_EXPECTED:
68 error_message = "Argument list expected";
69 break;
70 case TOO_MANY_ARGS:
71 error_message = "Too many arguments given";
72 break;
73 case DEFAULT_NOT_ALLOWED:
74 error_message = "Argument can not be set to default";
75 break;
76 case UNEXPECTED_NEWLINE:
77 error_message = "Unexpected newline";
78 break;
79 case INSUFFICIENT_ARGS:
80 error_message = "Not enough arguments";
81 break;
82 case INT_EXPECTED:
83 error_message = "Expected integer";
84 break;
85 case DECIMAL_EXPECTED:
86 error_message = "Expected decimal";
87 break;
88 case SEPARATOR_EXPECTED:
89 error_message = "Expected argument separator";
90 break;
91 case CLOSE_EXPECTED:
92 error_message = "Expected list close";
93 break;
94 case MULTILINE_EXPECTED:
95 error_message = "Expected subline separator";
96 break;
101 int skin_error_line()
103 return error_line;
106 int skin_error_col()
108 return error_col;
111 char* skin_error_message()
113 return error_message;
116 void skin_clear_errors()
118 error_line = 0;
119 error_col = 0;
120 error_message = NULL;
123 #if !defined(ROCKBOX) || defined(__PCTOOL__)
124 void skin_debug_tree(struct skin_element* root)
126 int i;
127 char *text;
129 struct skin_element* current = root;
131 while(current)
133 skin_debug_indent();
135 switch(current->type)
137 case UNKNOWN:
138 printf("* Unknown element.. error *\n");
139 break;
141 case VIEWPORT:
142 printf("{ Viewport \n");
144 debug_indent_level++;
145 skin_debug_tree(current->children[0]);
146 debug_indent_level--;
148 printf("}");
149 break;
151 case TEXT:
152 text = current->data;
153 printf("* Plain text on line %d: \"%s\"\n", current->line, text);
154 break;
156 case COMMENT:
157 printf("# Comment on line %d\n ", current->line);
158 break;
160 case TAG:
161 if (current->params_count)
163 printf("( %%%s tag on line %d with %d arguments\n",
164 current->tag->name,
165 current->line, current->params_count);
166 debug_indent_level++;
167 skin_debug_params(current->params_count, current->params);
168 debug_indent_level--;
169 skin_debug_indent();
170 printf(")\n");
172 else
174 printf("[ %%%s tag on line %d ]\n",
175 current->tag->name, current->line);
178 break;
180 case LINE_ALTERNATOR:
181 printf("[ Alternator on line %d with %d sublines \n", current->line,
182 current->children_count);
183 debug_indent_level++;
184 for(i = 0; i < current->children_count; i++)
186 skin_debug_tree(current->children[i]);
188 debug_indent_level--;
190 skin_debug_indent();
191 printf("]\n");
192 break;
194 case CONDITIONAL:
195 printf("< Conditional tag %%?%s on line %d with %d enumerations \n",
196 current->tag->name, current->line, current->children_count);
197 debug_indent_level++;
199 for(i = 0; i < current->children_count; i++)
201 skin_debug_indent();
202 printf("[ Enumeration %d\n", i);
203 debug_indent_level++;
204 skin_debug_tree(current->children[i]);
205 debug_indent_level--;
206 skin_debug_indent();
207 printf("]\n");
210 debug_indent_level--;
211 skin_debug_indent();
212 printf(">\n");
215 break;
217 case LINE:
218 printf("[ Logical line on line %d\n", current->line);
220 debug_indent_level++;
221 if (current->children)
222 skin_debug_tree(current->children[0]);
223 debug_indent_level--;
225 skin_debug_indent();
226 printf("]\n");
227 break;
230 current = current->next;
235 void skin_debug_params(int count, struct skin_tag_parameter params[])
237 int i;
238 for(i = 0; i < count; i++)
241 skin_debug_indent();
242 switch(params[i].type)
244 case DEFAULT:
245 printf("-");
246 break;
248 case STRING:
249 printf("string: \"%s\"", params[i].data.text);
250 break;
252 case INTEGER:
253 printf("integer: %d", params[i].data.number);
254 break;
256 case DECIMAL:
257 printf("decimal: %d.%d", params[i].data.number/10,
258 params[i].data.number%10);
259 break;
261 case CODE:
262 printf("Skin Code: \n");
263 debug_indent_level++;
264 skin_debug_tree(params[i].data.code);
265 debug_indent_level--;
266 skin_debug_indent();
267 break;
270 printf("\n");
275 void skin_debug_indent()
277 int i;
278 for(i = 0; i < debug_indent_level; i++)
279 printf(" ");
282 #endif
284 #define MIN(a,b) ((a<b)?(a):(b))
285 void skin_error_format_message()
287 int i;
288 char text[128];
289 if (!error_line_start)
290 return;
291 char* line_end = strchr(error_line_start, '\n');
292 int len = MIN(line_end - error_line_start, 80);
293 if (!line_end)
294 len = strlen(error_line_start);
295 printf("Error on line %d.\n", error_line);
296 error_col--;
297 if (error_col <= 10)
299 strncpy(text, error_line_start, len);
300 text[len] = '\0';
302 else
304 int j;
305 /* make it fit nicely.. "<start few chars>...<10 chars><error>" */
306 strncpy(text, error_line_start, 6);
307 i = 5;
308 text[i++] = '.';
309 text[i++] = '.';
310 text[i++] = '.';
311 for (j=error_col-10; error_line_start[j] && error_line_start[j] != '\n'; j++)
312 text[i++] = error_line_start[j];
313 text[i] = '\0';
314 error_col = 18;
316 printf("%s\n", text);
317 for (i=0; i<error_col; i++)
318 text[i] = ' ';
319 snprintf(&text[i],64, "^ \'%s\' Here", error_message);
320 printf("%s\n", text);