blob: 00d09aea7e153b56a1d916cc6891e0c2c3b252b4 [file] [log] [blame]
Robert Bieberd5b24dd2010-05-25 15:19:52 +00001/***************************************************************************
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"
Robert Bieber0a054b22010-06-01 16:44:52 +000028#include "tag_table.h"
Robert Bieberd5b24dd2010-05-25 15:19:52 +000029
30/* Global variables for debug output */
31int debug_indent_level = 0;
32extern int skin_line;
33
Robert Bieber0e44ce92010-06-07 20:29:46 +000034/* Global error variables */
35int error_line;
36char* error_message;
37
Robert Bieberd5b24dd2010-05-25 15:19:52 +000038/* Debugging functions */
39void skin_error(enum skin_errorcode error)
40{
41
Robert Bieber0e44ce92010-06-07 20:29:46 +000042 error_line = skin_line;
Robert Bieberd5b24dd2010-05-25 15:19:52 +000043
44 switch(error)
45 {
46 case MEMORY_LIMIT_EXCEEDED:
Robert Bieber0e44ce92010-06-07 20:29:46 +000047 error_message = "Memory limit exceeded";
Robert Bieberd5b24dd2010-05-25 15:19:52 +000048 break;
49 case NEWLINE_EXPECTED:
Robert Bieber0e44ce92010-06-07 20:29:46 +000050 error_message = "Newline expected";
Robert Bieberd5b24dd2010-05-25 15:19:52 +000051 break;
52 case ILLEGAL_TAG:
Robert Bieber0e44ce92010-06-07 20:29:46 +000053 error_message = "Illegal tag";
Robert Bieberd5b24dd2010-05-25 15:19:52 +000054 break;
55 case ARGLIST_EXPECTED:
Robert Bieber0e44ce92010-06-07 20:29:46 +000056 error_message = "Argument list expected";
Robert Bieberd5b24dd2010-05-25 15:19:52 +000057 break;
58 case TOO_MANY_ARGS:
Robert Bieber0e44ce92010-06-07 20:29:46 +000059 error_message = "Too many arguments given";
Robert Bieberd5b24dd2010-05-25 15:19:52 +000060 break;
61 case DEFAULT_NOT_ALLOWED:
Robert Bieber0e44ce92010-06-07 20:29:46 +000062 error_message = "Argument can not be set to default";
Robert Bieberd5b24dd2010-05-25 15:19:52 +000063 break;
64 case UNEXPECTED_NEWLINE:
Robert Bieber0e44ce92010-06-07 20:29:46 +000065 error_message = "Unexpected newline";
Robert Bieberd5b24dd2010-05-25 15:19:52 +000066 break;
67 case INSUFFICIENT_ARGS:
Robert Bieber0e44ce92010-06-07 20:29:46 +000068 error_message = "Not enough arguments";
Robert Bieberd5b24dd2010-05-25 15:19:52 +000069 break;
70 case INT_EXPECTED:
Robert Bieber0e44ce92010-06-07 20:29:46 +000071 error_message = "Expected integer";
Robert Bieberd5b24dd2010-05-25 15:19:52 +000072 break;
73 case SEPERATOR_EXPECTED:
Robert Bieber0e44ce92010-06-07 20:29:46 +000074 error_message = "Expected argument seperator";
Robert Bieberd5b24dd2010-05-25 15:19:52 +000075 break;
76 case CLOSE_EXPECTED:
Robert Bieber0e44ce92010-06-07 20:29:46 +000077 error_message = "Expected list close";
Robert Bieberd5b24dd2010-05-25 15:19:52 +000078 break;
79 case MULTILINE_EXPECTED:
Robert Bieber0e44ce92010-06-07 20:29:46 +000080 error_message = "Expected subline seperator";
Robert Bieberd5b24dd2010-05-25 15:19:52 +000081 break;
82 };
83
84}
85
Robert Bieber0e44ce92010-06-07 20:29:46 +000086int skin_error_line()
87{
88 return error_line;
89}
90
91char* skin_error_message()
92{
93 return error_message;
94}
95
Robert Bieber594d7342010-06-07 21:09:13 +000096void skin_clear_errors()
97{
98 error_line = 0;
99 error_message = NULL;
100}
101
Björn Stenbergf1a144a2010-06-17 11:04:32 +0000102#ifndef ROCKBOX
Robert Bieberd5b24dd2010-05-25 15:19:52 +0000103void skin_debug_tree(struct skin_element* root)
104{
105 int i;
Robert Bieber64321ad2010-06-10 21:02:44 +0000106 char *text;
Robert Bieberd5b24dd2010-05-25 15:19:52 +0000107
108 struct skin_element* current = root;
109
110 while(current)
111 {
112 skin_debug_indent();
113
114 switch(current->type)
115 {
Jonathan Gordon35b09cb2010-06-13 03:13:01 +0000116 case UNKNOWN:
117 printf("[ Unknown element.. error\n]");
118 break;
Robert Bieberd5b24dd2010-05-25 15:19:52 +0000119
Robert Bieberd1659d62010-06-01 07:11:23 +0000120 case VIEWPORT:
121 printf("[ Viewport \n");
122
123 debug_indent_level++;
124 skin_debug_tree(current->children[0]);
125 debug_indent_level--;
126
127 printf("]");
128 break;
129
Robert Bieberd5b24dd2010-05-25 15:19:52 +0000130 case TEXT:
Robert Bieber64321ad2010-06-10 21:02:44 +0000131 text = current->data;
132 printf("[ Plain text on line %d : %s ]\n", current->line, text);
Robert Bieberd5b24dd2010-05-25 15:19:52 +0000133 break;
134
Robert Bieberd5b24dd2010-05-25 15:19:52 +0000135 case COMMENT:
Robert Bieber64321ad2010-06-10 21:02:44 +0000136 text = current->data;
Robert Bieberd5b24dd2010-05-25 15:19:52 +0000137 printf("[ Comment on line %d: ", current->line);
Robert Bieber64321ad2010-06-10 21:02:44 +0000138 for(i = 0; i < (int)strlen(text); i++)
Robert Bieberd5b24dd2010-05-25 15:19:52 +0000139 {
Robert Bieber64321ad2010-06-10 21:02:44 +0000140 if(text[i] == '\n')
Robert Bieberd5b24dd2010-05-25 15:19:52 +0000141 printf("\\n");
142 else
Robert Bieber64321ad2010-06-10 21:02:44 +0000143 printf("%c", text[i]);
Robert Bieberd5b24dd2010-05-25 15:19:52 +0000144 }
145 printf(" ]\n");
146 break;
147
148 case TAG:
Robert Bieber0a054b22010-06-01 16:44:52 +0000149 printf("[ %s tag on line %d with %d arguments\n",
150 current->tag->name,
Robert Bieberd5b24dd2010-05-25 15:19:52 +0000151 current->line, current->params_count);
152 debug_indent_level++;
153 skin_debug_params(current->params_count, current->params);
154 debug_indent_level--;
155 skin_debug_indent();
156 printf("]\n");
157
158 break;
159
Jonathan Gordondc347852010-07-04 02:04:14 +0000160 case LINE_ALTERNATOR:
Robert Bieberd5b24dd2010-05-25 15:19:52 +0000161 printf("[ Alternator on line %d with %d sublines \n", current->line,
162 current->children_count);
163 debug_indent_level++;
164 for(i = 0; i < current->children_count; i++)
165 {
Robert Bieberd5b24dd2010-05-25 15:19:52 +0000166 skin_debug_tree(current->children[i]);
Robert Bieberd5b24dd2010-05-25 15:19:52 +0000167 }
168 debug_indent_level--;
Robert Bieber8ea056d2010-05-27 19:57:15 +0000169
Robert Bieberd5b24dd2010-05-25 15:19:52 +0000170 skin_debug_indent();
171 printf("]\n");
172 break;
173
174 case CONDITIONAL:
175 printf("[ Conditional tag on line %d with %d enumerations \n",
176 current->line, current->children_count - 1);
177 debug_indent_level++;
178
179 skin_debug_indent();
180 printf("[ Condition tag \n");
181 debug_indent_level++;
182 skin_debug_tree(current->children[0]);
183 debug_indent_level--;
184 skin_debug_indent();
185 printf("]\n");
186
187 for(i = 1; i < current->children_count; i++)
188 {
189 skin_debug_indent();
190 printf("[ Enumeration %d\n", i - 1);
191 debug_indent_level++;
192 skin_debug_tree(current->children[i]);
193 debug_indent_level--;
194 skin_debug_indent();
195 printf("]\n");
196 }
197
198 debug_indent_level--;
199 skin_debug_indent();
200 printf("]\n");
201
202
203 break;
204
Robert Bieber8ea056d2010-05-27 19:57:15 +0000205 case LINE:
206 printf("[ Logical line on line %d\n", current->line);
207
208 debug_indent_level++;
209 skin_debug_tree(current->children[0]);
210 debug_indent_level--;
211
212 skin_debug_indent();
213 printf("]\n");
214 break;
Robert Bieberd5b24dd2010-05-25 15:19:52 +0000215 }
216
217 current = current->next;
218 }
219
220}
221
222void skin_debug_params(int count, struct skin_tag_parameter params[])
223{
224 int i;
225 for(i = 0; i < count; i++)
226 {
227
228 skin_debug_indent();
229 switch(params[i].type)
230 {
231 case DEFAULT:
232 printf("[-]");
233 break;
234
235 case STRING:
236 printf("[%s]", params[i].data.text);
237 break;
238
239 case NUMERIC:
240 printf("[%d]", params[i].data.numeric);
241 break;
242
243 case CODE:
244 printf("[ WPS Code: \n");
245 debug_indent_level++;
246 skin_debug_tree(params[i].data.code);
247 debug_indent_level--;
248 skin_debug_indent();
249 printf("]");
250 break;
251 }
252
253 printf("\n");
254
255 }
256}
257
258void skin_debug_indent()
259{
260 int i;
261 for(i = 0; i < debug_indent_level; i++)
262 printf(" ");
263}
Björn Stenbergf1a144a2010-06-17 11:04:32 +0000264#endif