blob: 120112d995868be22922e53939602f86ce60ddd6 [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#ifndef GENERIC_PARSER_H
23#define GENERIC_PARSER_H
24
Robert Bieberc5e14b52010-05-31 17:39:58 +000025#ifdef __cplusplus
26extern "C"
27{
28#endif
Robert Bieber64321ad2010-06-10 21:02:44 +000029#include <stdlib.h>
Jonathan Gordon1e0a0102010-08-03 12:14:50 +000030#include <stdbool.h>
Robert Bieberd5b24dd2010-05-25 15:19:52 +000031
Jonathan Gordon9e07ef22011-11-15 14:11:08 +000032#if defined(ROCKBOX) && !defined(__PCTOOL__)
33/* Use this type and macro to convert a pointer from the
34 * skin buffer to a useable pointer */
35typedef long skinoffset_t;
36#define SKINOFFSETTOPTR(base, offset) ((offset) < 0 ? NULL : ((void*)&base[offset]))
37#define PTRTOSKINOFFSET(base, pointer) ((pointer) ? ((void*)pointer-(void*)base) : -1)
38/* Use this macro when declaring a variable to self-document the code.
39 * type is the actual type being pointed to (i.e OFFSETTYPE(char*) foo )
40 *
41 * WARNING: Don't use the PTRTOSKINOFFSET() around a function call as it wont
42 * do what you expect.
43 */
44#define OFFSETTYPE(type) skinoffset_t
45#else
46#define SKINOFFSETTOPTR(base, offset) offset
47#define PTRTOSKINOFFSET(base, pointer) pointer
48#define OFFSETTYPE(type) type
49#endif
50
Robert Bieberd5b24dd2010-05-25 15:19:52 +000051/********************************************************************
52 ****** Data Structures *********************************************
53 *******************************************************************/
54
55/* Possible types of element in a WPS file */
56enum skin_element_type
57{
Jonathan Gordon35b09cb2010-06-13 03:13:01 +000058 UNKNOWN = -1,
Robert Bieberd1659d62010-06-01 07:11:23 +000059 VIEWPORT,
Jonathan Gordondc347852010-07-04 02:04:14 +000060 LINE_ALTERNATOR,
Jonathan Gordon78c9a192010-07-04 02:05:42 +000061 LINE,
Robert Bieber6980c1e2010-05-29 00:04:04 +000062 CONDITIONAL,
63 TAG,
Robert Bieber6980c1e2010-05-29 00:04:04 +000064 TEXT,
65 COMMENT,
Robert Bieberd5b24dd2010-05-25 15:19:52 +000066};
67
68enum skin_errorcode
69{
70 MEMORY_LIMIT_EXCEEDED,
71 NEWLINE_EXPECTED,
72 ILLEGAL_TAG,
73 ARGLIST_EXPECTED,
74 TOO_MANY_ARGS,
75 DEFAULT_NOT_ALLOWED,
76 UNEXPECTED_NEWLINE,
77 INSUFFICIENT_ARGS,
78 INT_EXPECTED,
Robert Bieber15488a02010-07-15 06:24:11 +000079 DECIMAL_EXPECTED,
Bertrik Sikkenfffbdcc2010-11-05 09:51:19 +000080 SEPARATOR_EXPECTED,
Robert Bieberd5b24dd2010-05-25 15:19:52 +000081 CLOSE_EXPECTED,
82 MULTILINE_EXPECTED
83};
84
85/* Holds a tag parameter, either numeric or text */
86struct skin_tag_parameter
87{
88 enum
89 {
Robert Bieber15488a02010-07-15 06:24:11 +000090 INTEGER,
91 DECIMAL, /* stored in data.number as (whole*10)+part */
Robert Bieberd5b24dd2010-05-25 15:19:52 +000092 STRING,
93 CODE,
94 DEFAULT
95 } type;
96
97 union
98 {
Robert Bieber15488a02010-07-15 06:24:11 +000099 int number;
Jonathan Gordon9e07ef22011-11-15 14:11:08 +0000100 OFFSETTYPE(char*) text;
101 OFFSETTYPE(struct skin_element*) code;
Robert Bieberd5b24dd2010-05-25 15:19:52 +0000102 } data;
Robert Bieber5943f4c2010-06-01 19:55:20 +0000103
104 char type_code;
Robert Bieberd5b24dd2010-05-25 15:19:52 +0000105
106};
107
Thomas Martitz4f3e1d62011-10-16 15:55:12 +0000108/* Defines an element of a SKIN file,
109 *
110 * This is allocated a lot, so it's optimized for size */
Robert Bieberd5b24dd2010-05-25 15:19:52 +0000111struct skin_element
112{
Thomas Martitz4f3e1d62011-10-16 15:55:12 +0000113 /* Link to the next element */
Jonathan Gordon9e07ef22011-11-15 14:11:08 +0000114 OFFSETTYPE(struct skin_element*) next;
Thomas Martitz4f3e1d62011-10-16 15:55:12 +0000115 /* Pointer to an array of children */
Jonathan Gordon9e07ef22011-11-15 14:11:08 +0000116 OFFSETTYPE(struct skin_element**) children;
Robert Bieber64321ad2010-06-10 21:02:44 +0000117 /* Placeholder for element data
118 * TEXT and COMMENT uses it for the text string
119 * TAG, VIEWPORT, LINE, etc may use it for post parse extra storage
120 */
Jonathan Gordon9e07ef22011-11-15 14:11:08 +0000121 OFFSETTYPE(void*) data;
Robert Bieberd5b24dd2010-05-25 15:19:52 +0000122
123 /* The tag or conditional name */
Nils Wallméniusc2529c32010-07-31 11:28:37 +0000124 const struct tag_info *tag;
Robert Bieberd5b24dd2010-05-25 15:19:52 +0000125
Thomas Martitz4f3e1d62011-10-16 15:55:12 +0000126 /* Pointer to an array of parameters */
Jonathan Gordon9e07ef22011-11-15 14:11:08 +0000127 OFFSETTYPE(struct skin_tag_parameter*) params;
Robert Bieberd5b24dd2010-05-25 15:19:52 +0000128
Thomas Martitz4f3e1d62011-10-16 15:55:12 +0000129 /* Number of elements in the children array */
130 short children_count;
131 /* The line on which it's defined in the source file */
132 short line;
133 /* Defines what type of element it is */
134 enum skin_element_type type;
135 /* Number of elements in the params array */
136 char params_count;
Robert Bieberd5b24dd2010-05-25 15:19:52 +0000137};
138
Jonathan Gordon2d31d772010-07-29 12:37:48 +0000139enum skin_cb_returnvalue
140{
141 CALLBACK_ERROR = -666,
142 FEATURE_NOT_AVAILABLE,
143 CALLBACK_OK = 0,
144 /* > 0 reserved for future use */
145};
146typedef int (*skin_callback)(struct skin_element* element, void* data);
147
Robert Bieberd5b24dd2010-05-25 15:19:52 +0000148/***********************************************************************
149 ***** Functions *******************************************************
150 **********************************************************************/
151
152/* Parses a WPS document and returns a list of skin_element
153 structures. */
Jonathan Gordon2d31d772010-07-29 12:37:48 +0000154#ifdef ROCKBOX
155struct skin_element* skin_parse(const char* document,
156 skin_callback callback, void* callback_data);
157#else
Robert Biebera9848ce2010-06-01 21:25:02 +0000158struct skin_element* skin_parse(const char* document);
Jonathan Gordon2d31d772010-07-29 12:37:48 +0000159#endif
Robert Bieberd5b24dd2010-05-25 15:19:52 +0000160/* Memory management functions */
Björn Stenbergf1a144a2010-06-17 11:04:32 +0000161struct skin_element* skin_alloc_element(void);
Jonathan Gordon9e07ef22011-11-15 14:11:08 +0000162OFFSETTYPE(struct skin_element*)* skin_alloc_children(int count);
163struct skin_tag_parameter* skin_alloc_params(int count);
Robert Bieberd5b24dd2010-05-25 15:19:52 +0000164char* skin_alloc_string(int length);
165
Robert Bieber0769fc52010-05-25 22:24:08 +0000166void skin_free_tree(struct skin_element* root);
167
Robert Bieber64321ad2010-06-10 21:02:44 +0000168
Robert Bieberc5e14b52010-05-31 17:39:58 +0000169#ifdef __cplusplus
170}
171#endif
172
Robert Bieberd5b24dd2010-05-25 15:19:52 +0000173#endif /* GENERIC_PARSER_H */