1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
8 * $Id: skin_parser.c 26752 2010-06-10 21:22:16Z bieber $
10 * Copyright (C) 2010 Jonathan Gordon
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 ****************************************************************************/
29 #include "skin_parser.h"
30 #include "skin_debug.h"
31 #include "tag_table.h"
33 #include "skin_scan.h"
34 #include "skin_structs.h"
38 typedef void (*skin_render_func
)(struct skin_element
* alternator
,
39 char* buf
, size_t buf_size
, int line_number
);
40 void skin_render_alternator(struct skin_element
* alternator
,
41 char* buf
, size_t buf_size
, int line_number
);
43 /* Draw a LINE element onto the display */
44 void skin_render_line(struct skin_element
* line
,
45 char* buf
, size_t buf_size
, int line_number
)
48 if (line
->children_count
== 0)
49 return; /* empty line, do nothing */
50 struct skin_element
*child
= line
->children
[0];
51 skin_render_func func
= skin_render_line
;
59 value
= 0; /* actually get it from the token :p */
60 if (value
>= child
->children_count
)
61 value
= child
->children_count
-1;
62 if (child
->children
[value
]->type
== SUBLINES
)
63 func
= skin_render_alternator
;
64 else if (child
->children
[value
]->type
== LINE
)
65 func
= skin_render_line
;
66 func(child
->children
[value
], buf
, buf_size
, line_number
);
69 snprintf(tempbuf
, sizeof(tempbuf
), "%%%s", child
->tag
->name
);
72 snprintf(tempbuf
, sizeof(tempbuf
), "%s", (char*)(child
->data
));
82 #define TIME_AFTER(a,b) 1
83 void skin_render_alternator(struct skin_element
* alternator
,
84 char* buf
, size_t buf_size
, int line_number
)
86 struct subline
*subline
= (struct subline
*)alternator
->data
;
87 if (TIME_AFTER(subline
->last_change_tick
+ subline
->timeout
, 0/*FIXME*/))
89 subline
->current_line
++;
90 if (subline
->current_line
>= alternator
->children_count
)
91 subline
->current_line
= 0;
93 skin_render_line(alternator
->children
[subline
->current_line
],
94 buf
, buf_size
, line_number
);
97 void skin_render_viewport(struct skin_element
* line
, bool draw_tags
)
100 char linebuf
[MAX_LINE
];
101 skin_render_func func
= skin_render_line
;
105 if (line
->type
== SUBLINES
)
106 func
= skin_render_alternator
;
107 else if (line
->type
== LINE
)
108 func
= skin_render_line
;
110 func (line
, linebuf
, sizeof(linebuf
), line_number
);
113 printf("%s\n", linebuf
);
120 void skin_render(struct skin_element
* root
)
122 struct skin_element
* viewport
= root
;
123 bool draw_tags
= viewport
->next
? false : true;
126 skin_render_viewport(viewport
->children
[0], draw_tags
);
128 viewport
= viewport
->next
;