Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c
- index a866101..b65d409 100644
- --- a/apps/gui/skin_engine/skin_parser.c
- +++ b/apps/gui/skin_engine/skin_parser.c
- @@ -720,6 +720,24 @@ static int parse_timeout_tag(struct skin_element *element,
- return 0;
- }
- +static int parse_substring_tag(struct skin_element* element,
- + struct wps_token *token,
- + struct wps_data *wps_data)
- +{
- + (void)wps_data;
- + struct substring *ss = (struct substring*)skin_buffer_alloc(sizeof(struct substring));
- + if (!ss)
- + return 1;
- + ss->start = element->params[0].data.number;
- + if (element->params[1].type == DEFAULT)
- + ss->length = -1;
- + else
- + ss->length = element->params[1].data.number;
- + memcpy(&ss->tag, &element->params[2], sizeof(ss->tag));
- + token->value.data = ss;
- + return 0;
- +}
- +
- static int parse_progressbar_tag(struct skin_element* element,
- struct wps_token *token,
- struct wps_data *wps_data)
- @@ -1788,6 +1806,9 @@ static int skin_element_callback(struct skin_element* element, void* data)
- case SKIN_TOKEN_LOGICAL_IF:
- function = parse_logical_if;
- break;
- + case SKIN_TOKEN_SUBSTRING:
- + function = parse_substring_tag;
- + break;
- case SKIN_TOKEN_PROGRESSBAR:
- case SKIN_TOKEN_VOLUME:
- case SKIN_TOKEN_BATTERY_PERCENT:
- diff --git a/apps/gui/skin_engine/skin_tokens.c b/apps/gui/skin_engine/skin_tokens.c
- index ed72241..30721bb 100644
- --- a/apps/gui/skin_engine/skin_tokens.c
- +++ b/apps/gui/skin_engine/skin_tokens.c
- @@ -868,7 +868,35 @@ const char *get_token_value(struct gui_wps *gwps,
- struct logical_if *lif = token->value.data;
- return get_lif_token_value(gwps, lif, offset, buf, buf_size);
- }
- - break;
- + break;
- + case SKIN_TOKEN_SUBSTRING:
- + {
- + struct substring *ss = token->value.data;
- + struct wps_token *source = ss->tag.data.code->children[0]->data;
- + const char *token_val = get_token_value(gwps, source, offset,
- + buf, buf_size, intval);
- + int ret_len = ss->length;
- + if (token_val)
- + {
- + int len = strlen(token_val);
- + if (len < ss->start)
- + return NULL;
- + if (ret_len < 0)
- + ret_len = strlen(token_val) - ss->start;
- + if (token_val != buf)
- + {
- + memcpy(buf, &token_val[ss->start], ret_len);
- + }
- + else
- + {
- + buf = &buf[ss->start];
- + }
- + buf[ret_len] = '\0';
- + return buf;
- + }
- + return NULL;
- + }
- + break;
- case SKIN_TOKEN_CHARACTER:
- if (token->value.c == '\n')
- diff --git a/apps/gui/skin_engine/wps_internals.h b/apps/gui/skin_engine/wps_internals.h
- index e996c96..c2d2c1d 100644
- --- a/apps/gui/skin_engine/wps_internals.h
- +++ b/apps/gui/skin_engine/wps_internals.h
- @@ -288,6 +288,12 @@ struct logical_if {
- int num_options;
- };
- +struct substring {
- + int start;
- + int length;
- + struct skin_tag_parameter tag;
- +};
- +
- #ifdef HAVE_SKIN_VARIABLES
- struct skin_var {
- const char *label;
- diff --git a/lib/skin_parser/tag_table.c b/lib/skin_parser/tag_table.c
- index 849e1d9..f60b031 100644
- --- a/lib/skin_parser/tag_table.c
- +++ b/lib/skin_parser/tag_table.c
- @@ -236,7 +236,8 @@ static const struct tag_info legal_tags[] =
- { SKIN_TOKEN_VAR_SET, "vs", "SSI|I", SKIN_REFRESH_STATIC },
- { SKIN_TOKEN_VAR_GETVAL, "vg", "S", SKIN_REFRESH_DYNAMIC },
- { SKIN_TOKEN_VAR_TIMEOUT, "vl", "S|D", SKIN_REFRESH_DYNAMIC },
- -
- +
- + { SKIN_TOKEN_SUBSTRING, "ss", "IiC", SKIN_REFRESH_DYNAMIC },
- { SKIN_TOKEN_UNKNOWN, "" , "", 0 }
- /* Keep this here to mark the end of the table */
- };
- diff --git a/lib/skin_parser/tag_table.h b/lib/skin_parser/tag_table.h
- index 5a93e36..82ee475 100644
- --- a/lib/skin_parser/tag_table.h
- +++ b/lib/skin_parser/tag_table.h
- @@ -279,6 +279,8 @@ enum skin_token_type {
- SKIN_TOKEN_VAR_SET,
- SKIN_TOKEN_VAR_GETVAL,
- SKIN_TOKEN_VAR_TIMEOUT,
- +
- + SKIN_TOKEN_SUBSTRING,
- };
- /*
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement