From e63e6cebd3e44dc46c628532ba67d1b294e703dd Mon Sep 17 00:00:00 2001
From: "p.kosyh"
Date: Mon, 5 Jul 2010 10:45:52 +0000
Subject: [PATCH] nesting fix
---
src/sdl-instead/graphics.c | 30 ++++++++++++++++++++++--------
1 file changed, 22 insertions(+), 8 deletions(-)
diff --git a/src/sdl-instead/graphics.c b/src/sdl-instead/graphics.c
index d1eb778..03801c9 100644
--- a/src/sdl-instead/graphics.c
+++ b/src/sdl-instead/graphics.c
@@ -1,4 +1,4 @@
-#include "externals.h"
+#include "externals.h"
#include "internals.h"
#include
@@ -1402,6 +1402,7 @@ struct layout {
int align;
int saved_align;
int style;
+ int cnt[4];
int lstyle;
cache_t img_cache;
};
@@ -1563,6 +1564,7 @@ struct layout *layout_new(fnt_t fn, int w, int h)
l->acol = gfx_col(255, 0, 0);
l->box = NULL;
l->img_cache = cache_init(GFX_CACHE_SIZE, gfx_free_image);
+ memset(l->cnt, 0, sizeof(l->cnt));
return l;
}
void txt_layout_size(layout_t lay, int *w, int *h)
@@ -1624,6 +1626,7 @@ void _txt_layout_free(layout_t lay)
layout->images = NULL;
layout->xrefs = NULL;
layout->lines = NULL;
+ memset(layout->cnt, 0, sizeof(layout->cnt));
}
word_t txt_layout_words(layout_t lay, word_t v)
@@ -2490,25 +2493,36 @@ char *process_token(char *ptr, struct layout *layout, struct line *line, struct
char *val = NULL;
int bit = 0;
int al = 0;
+ int *cnt = NULL;
char *eptr;
token = get_token(ptr, &eptr, &val, sp);
if (!token)
return NULL;
- if (TOKEN(token) == TOKEN_B)
+ if (TOKEN(token) == TOKEN_B) {
+ cnt = &layout->cnt[0];
bit = TTF_STYLE_BOLD;
- else if (TOKEN(token) == TOKEN_I)
+ } else if (TOKEN(token) == TOKEN_I) {
+ cnt = &layout->cnt[1];
bit = TTF_STYLE_ITALIC;
- else if (TOKEN(token) == TOKEN_U)
+ } else if (TOKEN(token) == TOKEN_U) {
+ cnt = &layout->cnt[2];
bit = TTF_STYLE_UNDERLINE;
+ }
if (bit) {
- if (token & TOKEN_CLOSE)
- layout->style &= ~bit;
- else
+ if (token & TOKEN_CLOSE) {
+ -- (*cnt);
+ if (*cnt < 0) /* fuzzy */
+ *cnt = 0;
+ if (!*cnt)
+ layout->style &= ~bit;
+ } else {
+ ++ (*cnt);
layout->style |= bit;
+ }
goto out;
- }
+ }
if (TOKEN(token) == TOKEN_L)
al = ALIGN_LEFT;