blob: ca2d7bc54bcea009637dd00686aef9bbf341314f [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
29
30
Robert Bieberd5b24dd2010-05-25 15:19:52 +000031#define SKIN_MAX_MEMORY 1048576
32
33/********************************************************************
34 ****** A global buffer will be used to store the parse tree *******
35 *******************************************************************/
36extern char skin_parse_tree[];
37
38/********************************************************************
39 ****** Data Structures *********************************************
40 *******************************************************************/
41
42/* Possible types of element in a WPS file */
43enum skin_element_type
44{
Robert Bieberd1659d62010-06-01 07:11:23 +000045 VIEWPORT,
Robert Bieber6980c1e2010-05-29 00:04:04 +000046 LINE,
Robert Bieber8ea056d2010-05-27 19:57:15 +000047 SUBLINES,
Robert Bieber6980c1e2010-05-29 00:04:04 +000048 CONDITIONAL,
49 TAG,
50 NEWLINE,
51 TEXT,
52 COMMENT,
Robert Bieberd5b24dd2010-05-25 15:19:52 +000053};
54
55enum skin_errorcode
56{
57 MEMORY_LIMIT_EXCEEDED,
58 NEWLINE_EXPECTED,
59 ILLEGAL_TAG,
60 ARGLIST_EXPECTED,
61 TOO_MANY_ARGS,
62 DEFAULT_NOT_ALLOWED,
63 UNEXPECTED_NEWLINE,
64 INSUFFICIENT_ARGS,
65 INT_EXPECTED,
66 SEPERATOR_EXPECTED,
67 CLOSE_EXPECTED,
68 MULTILINE_EXPECTED
69};
70
71/* Holds a tag parameter, either numeric or text */
72struct skin_tag_parameter
73{
74 enum
75 {
76 NUMERIC,
77 STRING,
78 CODE,
79 DEFAULT
80 } type;
81
82 union
83 {
84 int numeric;
85 char* text;
86 struct skin_element* code;
87 } data;
Robert Bieber5943f4c2010-06-01 19:55:20 +000088
89 char type_code;
Robert Bieberd5b24dd2010-05-25 15:19:52 +000090
91};
92
93/* Defines an element of a SKIN file */
94struct skin_element
95{
96 /* Defines what type of element it is */
97 enum skin_element_type type;
98
99 /* The line on which it's defined in the source file */
100 int line;
101
102 /* Text for comments and plaintext */
103 char* text;
104
105 /* The tag or conditional name */
Robert Bieber0a054b22010-06-01 16:44:52 +0000106 struct tag_info *tag;
Robert Bieberd5b24dd2010-05-25 15:19:52 +0000107
108 /* Pointer to and size of an array of parameters */
109 int params_count;
110 struct skin_tag_parameter* params;
111
112 /* Pointer to and size of an array of children */
113 int children_count;
114 struct skin_element** children;
115
116 /* Link to the next element */
117 struct skin_element* next;
118};
119
120/***********************************************************************
121 ***** Functions *******************************************************
122 **********************************************************************/
123
124/* Parses a WPS document and returns a list of skin_element
125 structures. */
Robert Biebera9848ce2010-06-01 21:25:02 +0000126struct skin_element* skin_parse(const char* document);
Robert Bieberd5b24dd2010-05-25 15:19:52 +0000127
128/* Memory management functions */
129struct skin_element* skin_alloc_element();
130struct skin_element** skin_alloc_children(int count);
131struct skin_tag_parameter* skin_alloc_params(int count);
132char* skin_alloc_string(int length);
133
Robert Bieber0769fc52010-05-25 22:24:08 +0000134void skin_free_tree(struct skin_element* root);
135
Robert Bieberc5e14b52010-05-31 17:39:58 +0000136#ifdef __cplusplus
137}
138#endif
139
Robert Bieberd5b24dd2010-05-25 15:19:52 +0000140#endif /* GENERIC_PARSER_H */