diff --git a/lib/skin_parser/skin_scan.c b/lib/skin_parser/skin_scan.c index bdc8434736..50aa41b391 100644 --- a/lib/skin_parser/skin_scan.c +++ b/lib/skin_parser/skin_scan.c @@ -166,53 +166,42 @@ char* scan_string(const char** document) int scan_int(const char** document) { - const char *cursor = *document, *end; - int length = 0; - char buffer[16]; - int retval; - int i; + const char *cursor = *document; + int retval = 0; + int sign = 1; - while(isdigit(*cursor) || *cursor == COMMENTSYM || *cursor == '-') + while(true) { if(*cursor == COMMENTSYM) { skip_comment(&cursor); + if (retval > 0) /* || sign < 0 already read a number */ + { + break; + } continue; } - - length++; - cursor++; - } - if (length > 15) - length = 15; - end = cursor; - /* Copying to the buffer while avoiding comments */ - cursor = *document; - buffer[length] = '\0'; - for(i = 0; i < length; i++) - { - if(*cursor == COMMENTSYM) + else if (*cursor == '-') { - skip_comment(&cursor); - i--; - continue; + if (retval != 0) /* only allow negative prior to numbers */ + break; + sign = -1; } - - buffer[i] = *cursor; + else if (isdigit(*cursor)) /* is digit*/ + { + retval = (retval * 10) + (*cursor - '0'); + } + else + break; cursor++; - } - retval = atoi(buffer); + *document = cursor; - *document = end; - return retval; + return sign * retval; } int check_viewport(const char* document) { - if(strlen(document) < 3) - return 0; - if(document[0] != TAGSYM) return 0; @@ -224,5 +213,8 @@ int check_viewport(const char* document) && document[2] != 'i') return 0; + if (document[3] == '\0') + return 0; + return 1; }