get the renderer working more better! "handle" sublines correctly, dont "draw" in...
[kugel-rb.git] / utils / newparser / skin_render.c
blob03324665a1e93dffdcf1617cbdf2bcc439470bd2
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
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 ****************************************************************************/
22 #include <stdlib.h>
23 #include <stdio.h>
24 #include <string.h>
25 #include <stdbool.h>
26 #include <ctype.h>
27 #include <string.h>
29 #include "skin_parser.h"
30 #include "skin_debug.h"
31 #include "tag_table.h"
32 #include "symbols.h"
33 #include "skin_scan.h"
34 #include "skin_structs.h"
36 #define MAX_LINE 1024
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)
47 int value;
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;
52 char tempbuf[128];
53 while (child)
55 tempbuf[0] = '\0';
56 switch (child->type)
58 case CONDITIONAL:
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);
67 break;
68 case TAG:
69 snprintf(tempbuf, sizeof(tempbuf), "%%%s", child->tag->name);
70 break;
71 case TEXT:
72 snprintf(tempbuf, sizeof(tempbuf), "%s", (char*)(child->data));
73 break;
74 case COMMENT:
75 default:
76 break;
78 strcat(buf, tempbuf);
79 child = child->next;
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)
99 int line_number = 0;
100 char linebuf[MAX_LINE];
101 skin_render_func func = skin_render_line;
102 while (line)
104 linebuf[0] = '\0';
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);
111 if (draw_tags)
113 printf("%s\n", linebuf);
115 line_number++;
116 line = line->next;
120 void skin_render(struct skin_element* root)
122 struct skin_element* viewport = root;
123 bool draw_tags = viewport->next ? false : true;
124 while (viewport)
126 skin_render_viewport(viewport->children[0], draw_tags);
127 draw_tags = true;
128 viewport = viewport->next;