summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/skin_parser/skin_parser.c22
-rw-r--r--lib/skin_parser/skin_parser.h1
-rw-r--r--lib/skin_parser/tag_table.c6
-rw-r--r--lib/skin_parser/tag_table.h3
4 files changed, 24 insertions, 8 deletions
diff --git a/lib/skin_parser/skin_parser.c b/lib/skin_parser/skin_parser.c
index 748ea5da22..1f4b87a328 100644
--- a/lib/skin_parser/skin_parser.c
+++ b/lib/skin_parser/skin_parser.c
@@ -568,7 +568,7 @@ static int skin_parse_tag(struct skin_element* element, const char** document)
568 while(*cursor != '\n' && *cursor != '\0' && *cursor != ARGLISTCLOSESYM) 568 while(*cursor != '\n' && *cursor != '\0' && *cursor != ARGLISTCLOSESYM)
569 { 569 {
570 /* Skipping over escaped characters */ 570 /* Skipping over escaped characters */
571 if(*cursor == TAGSYM) 571 if(*cursor == TAGSYM && *(cursor+1) != ARGLISTSEPARATESYM)
572 { 572 {
573 skip_tag(&cursor); 573 skip_tag(&cursor);
574 } 574 }
@@ -625,7 +625,7 @@ static int skin_parse_tag(struct skin_element* element, const char** document)
625 * default > decimal/integer > single tag/code > string 625 * default > decimal/integer > single tag/code > string
626 */ 626 */
627 int j=0; 627 int j=0;
628 bool canbedefault = false; 628 bool canbedefault = false, last_char_is_percent = false;
629 bool haspercent = false, number = true, hasdecimal = false; 629 bool haspercent = false, number = true, hasdecimal = false;
630 char temp_params[8]; 630 char temp_params[8];
631 open_square_bracket = tag_args; 631 open_square_bracket = tag_args;
@@ -644,9 +644,11 @@ static int skin_parse_tag(struct skin_element* element, const char** document)
644 hasdecimal = hasdecimal || (cursor[j] == '.'); 644 hasdecimal = hasdecimal || (cursor[j] == '.');
645 number = number && (isdigit(cursor[j]) || 645 number = number && (isdigit(cursor[j]) ||
646 (cursor[j] == '.') || 646 (cursor[j] == '.') ||
647 (cursor[j] == '-')); 647 (cursor[j] == '-') ||
648 (cursor[j] == '%'));
648 j++; 649 j++;
649 } 650 }
651 last_char_is_percent = cursor[j-1] == '%';
650 type_code = '?'; 652 type_code = '?';
651 if (canbedefault && *cursor == DEFAULTSYM && !isdigit(cursor[1])) 653 if (canbedefault && *cursor == DEFAULTSYM && !isdigit(cursor[1]))
652 { 654 {
@@ -656,6 +658,10 @@ static int skin_parse_tag(struct skin_element* element, const char** document)
656 { 658 {
657 type_code = 'd'; 659 type_code = 'd';
658 } 660 }
661 else if (number && last_char_is_percent && strchr(temp_params, 'p'))
662 {
663 type_code = 'p';
664 }
659 else if (number && 665 else if (number &&
660 (strchr(temp_params, 'i') || strchr(temp_params, 'd'))) 666 (strchr(temp_params, 'i') || strchr(temp_params, 'd')))
661 { 667 {
@@ -707,7 +713,7 @@ static int skin_parse_tag(struct skin_element* element, const char** document)
707 params[i].type = INTEGER; 713 params[i].type = INTEGER;
708 params[i].data.number = scan_int(&cursor); 714 params[i].data.number = scan_int(&cursor);
709 } 715 }
710 else if(tolower(type_code) == 'd') 716 else if(tolower(type_code) == 'd' || tolower(type_code) == 'p')
711 { 717 {
712 int val = 0; 718 int val = 0;
713 bool have_point = false; 719 bool have_point = false;
@@ -731,7 +737,13 @@ static int skin_parse_tag(struct skin_element* element, const char** document)
731 } 737 }
732 if (have_tenth == false) 738 if (have_tenth == false)
733 val *= 10; 739 val *= 10;
734 params[i].type = DECIMAL; 740 if (tolower(type_code) == 'd')
741 params[i].type = DECIMAL;
742 else
743 {
744 params[i].type = PERCENT;
745 cursor++; /* skip trailing % sign */
746 }
735 params[i].data.number = val; 747 params[i].data.number = val;
736 } 748 }
737 else if(tolower(type_code) == 's' || tolower(type_code) == 'f') 749 else if(tolower(type_code) == 's' || tolower(type_code) == 'f')
diff --git a/lib/skin_parser/skin_parser.h b/lib/skin_parser/skin_parser.h
index 120112d995..ec51b64c8b 100644
--- a/lib/skin_parser/skin_parser.h
+++ b/lib/skin_parser/skin_parser.h
@@ -89,6 +89,7 @@ struct skin_tag_parameter
89 { 89 {
90 INTEGER, 90 INTEGER,
91 DECIMAL, /* stored in data.number as (whole*10)+part */ 91 DECIMAL, /* stored in data.number as (whole*10)+part */
92 PERCENT, /* stored in data.number as (whole*10)+part */
92 STRING, 93 STRING,
93 CODE, 94 CODE,
94 DEFAULT 95 DEFAULT
diff --git a/lib/skin_parser/tag_table.c b/lib/skin_parser/tag_table.c
index 76139df04e..ec1476fb80 100644
--- a/lib/skin_parser/tag_table.c
+++ b/lib/skin_parser/tag_table.c
@@ -206,9 +206,9 @@ static const struct tag_info legal_tags[] =
206 { SKIN_TOKEN_VIEWPORT_GRADIENT_SETUP, "Vg" , "SS|s", SKIN_REFRESH_STATIC|NOBREAK }, 206 { SKIN_TOKEN_VIEWPORT_GRADIENT_SETUP, "Vg" , "SS|s", SKIN_REFRESH_STATIC|NOBREAK },
207 { SKIN_TOKEN_VIEWPORT_DRAWONBG, "VB" , "", SKIN_REFRESH_STATIC|NOBREAK }, 207 { SKIN_TOKEN_VIEWPORT_DRAWONBG, "VB" , "", SKIN_REFRESH_STATIC|NOBREAK },
208 208
209 { SKIN_TOKEN_VIEWPORT_CONDITIONAL, "Vl" , "SIIiii", 0 }, 209 { SKIN_TOKEN_VIEWPORT_CONDITIONAL, "Vl" , "S[IP][IP][ip][ip]i", 0 },
210 { SKIN_TOKEN_UIVIEWPORT_LOAD, "Vi" , "sIIiii", 0 }, 210 { SKIN_TOKEN_UIVIEWPORT_LOAD, "Vi" , "s[IP][IP][ip][ip]i", 0 },
211 { SKIN_TOKEN_VIEWPORT_LOAD, "V" , "IIiii", 0 }, 211 { SKIN_TOKEN_VIEWPORT_LOAD, "V" , "[IP][IP][ip][ip]i", 0 },
212 212
213 { SKIN_TOKEN_IMAGE_BACKDROP, "X" , "f", SKIN_REFRESH_STATIC|NOBREAK }, 213 { SKIN_TOKEN_IMAGE_BACKDROP, "X" , "f", SKIN_REFRESH_STATIC|NOBREAK },
214 /* This uses the bar tag params also but the first item can be a string 214 /* This uses the bar tag params also but the first item can be a string
diff --git a/lib/skin_parser/tag_table.h b/lib/skin_parser/tag_table.h
index b29c6d79d8..41f7d7dd86 100644
--- a/lib/skin_parser/tag_table.h
+++ b/lib/skin_parser/tag_table.h
@@ -304,6 +304,9 @@ enum skin_token_type {
304 * D - Required decimal 304 * D - Required decimal
305 * d - Nullable decimal 305 * d - Nullable decimal
306 * Decimals are stored as (whole*10)+part 306 * Decimals are stored as (whole*10)+part
307 * P - Required percentage
308 * p - Nullable percentage
309 * Percentages pestored as permilles (percent*10 + part)
307 * S - Required string 310 * S - Required string
308 * s - Nullable string 311 * s - Nullable string
309 * F - Required file name 312 * F - Required file name