summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/gui/skin_engine/skin_parser.c21
-rw-r--r--apps/gui/skin_engine/skin_tokens.c29
-rw-r--r--apps/gui/skin_engine/wps_internals.h6
-rw-r--r--lib/skin_parser/tag_table.c3
-rw-r--r--lib/skin_parser/tag_table.h2
5 files changed, 59 insertions, 2 deletions
diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c
index a866101c1c..0db19645bc 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;
+ ss->token = element->params[2].data.code->data;
+ 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 ed72241d34..371db46017 100644
--- a/apps/gui/skin_engine/skin_tokens.c
+++ b/apps/gui/skin_engine/skin_tokens.c
@@ -868,7 +868,34 @@ 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;
+ const char *token_val = get_token_value(gwps, ss->token, 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 e996c96613..7d7afe95b1 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 wps_token *token;
+};
+
#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 849e1d92dd..b93aa28c32 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", "IiT", 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 5a93e36866..82ee4757be 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,
};
/*