Rockbox open source high quality audio player as a Music Player Daemon
mpris rockbox mpd libadwaita audio rust zig deno
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

skin engine small cleanup optimize find_tag() remove string copy

since we now have the length of tag names thru the param_pos var

we can simplify the find tag function to skip if the length doesn't match
this allows us to no longer make a string copy in order to terminate
the buffer

move some of the more frequently encountered tags to the top of the
lookup list

only SKIN_TOKEN_UNKNOWN position matters as its empty string is used
as the sentinel

Change-Id: Ib82d081a9ebedc228768845ae54a3d9466faaef1

authored by

William Wilgus and committed by
William Wilgus
ff9da127 303fc090

+88 -88
+2 -14
lib/skin_parser/skin_parser.c
··· 501 501 const char* bookmark; 502 502 const char *open_square_bracket = NULL; 503 503 504 - char tag_name[MAX_TAG_LENGTH]; 505 504 const char* tag_args; 506 505 const struct tag_info *tag; 507 506 struct skin_tag_parameter* params = NULL; ··· 513 512 int optional = 0; 514 513 515 514 /* Checking the tag name */ 516 - for (i=0; cursor[i] && i<MAX_TAG_LENGTH; i++) 517 - tag_name[i] = cursor[i]; 518 - 519 - /* First we check the two characters after the '%', then a single char */ 520 - tag = NULL; 521 - i = MAX_TAG_LENGTH; 522 - while (!tag && i > 1) 523 - { 524 - tag_name[i-1] = '\0'; 525 - tag = find_tag(tag_name); 526 - i--; 527 - } 515 + tag = find_tag(cursor); 528 516 529 517 if(!tag) 530 518 { 531 519 skin_error(ILLEGAL_TAG, cursor); 532 520 return 0; 533 521 } 534 - cursor += i; 522 + cursor += tag->param_pos - 1; /*strlen(tag->name)*/; 535 523 536 524 /* Copying basic tag info */ 537 525 if(element->type != CONDITIONAL && element->type != VIEWPORT)
+1 -18
lib/skin_parser/skin_scan.c
··· 78 78 79 79 void skip_tag(const char** document) 80 80 { 81 - char tag_name[MAX_TAG_LENGTH]; 82 - int i; 83 81 bool qmark; 84 82 const struct tag_info *tag; 85 - const char *cursor; 86 83 87 84 if(**document == TAGSYM) 88 85 (*document)++; ··· 96 93 } 97 94 else 98 95 { 99 - cursor = *document; 100 - 101 96 /* Checking the tag name */ 102 - for (i=0; cursor[i] && i<MAX_TAG_LENGTH; i++) 103 - tag_name[i] = cursor[i]; 104 - 105 - /* First we check the two characters after the '%', then a single char */ 106 - tag = NULL; 107 - i = MAX_TAG_LENGTH; 108 - while (!tag && i > 1) 109 - { 110 - tag_name[i-1] = '\0'; 111 - tag = find_tag(tag_name); 112 - i--; 113 - } 114 - 97 + tag = find_tag(*document); 115 98 if (tag) 116 99 { 117 100 *document += tag->param_pos - 1; /*strlen(tag->name)*/
+82 -53
lib/skin_parser/tag_table.c
··· 19 19 * 20 20 ****************************************************************************/ 21 21 22 + #include <string.h> 22 23 #include "tag_table.h" 24 + #include "debug.h" 23 25 24 - #include <string.h> 25 26 #define BAR_PARAMS "?[iP][iP][iP][iP]|s*" 26 27 /* The tag definition table */ 27 - static const struct tag_info legal_tags[] = 28 + static const struct tag_info legal_tags[] = 28 29 { 29 30 /*{type,namelen+1,name\0param,flags}*/ 30 31 #define TAG(type,name,param,flag) {(type),sizeof(name),(name "\0" param),(flag)} 32 + 31 33 TAG(SKIN_TOKEN_ALIGN_CENTER, "ac", "", 0), 32 34 TAG(SKIN_TOKEN_ALIGN_LEFT, "al", "", 0), 33 35 TAG(SKIN_TOKEN_ALIGN_LEFT_RTL, "aL", "", 0), ··· 39 41 TAG(SKIN_TOKEN_LOGICAL_AND, "and", "T*", SKIN_REFRESH_DYNAMIC), 40 42 TAG(SKIN_TOKEN_LOGICAL_OR, "or", "T*", SKIN_REFRESH_DYNAMIC), 41 43 44 + TAG(SKIN_TOKEN_FILE_BITRATE, "fb", "", SKIN_REFRESH_STATIC), 45 + TAG(SKIN_TOKEN_FILE_CODEC, "fc", "", SKIN_REFRESH_STATIC), 46 + TAG(SKIN_TOKEN_FILE_FREQUENCY, "ff", "", SKIN_REFRESH_STATIC), 47 + TAG(SKIN_TOKEN_FILE_FREQUENCY_KHZ, "fk", "", SKIN_REFRESH_STATIC), 48 + TAG(SKIN_TOKEN_FILE_NAME_WITH_EXTENSION, "fm", "", SKIN_REFRESH_STATIC), 49 + TAG(SKIN_TOKEN_FILE_NAME, "fn", "", SKIN_REFRESH_STATIC), 50 + TAG(SKIN_TOKEN_FILE_PATH, "fp", "", SKIN_REFRESH_STATIC), 51 + TAG(SKIN_TOKEN_FILE_SIZE, "fs", "", SKIN_REFRESH_STATIC), 52 + TAG(SKIN_TOKEN_FILE_VBR, "fv", "", SKIN_REFRESH_STATIC), 53 + TAG(SKIN_TOKEN_FILE_DIRECTORY, "d" , "I", SKIN_REFRESH_STATIC), 54 + 55 + TAG(SKIN_TOKEN_FILE_BITRATE, "Fb", "", SKIN_REFRESH_STATIC), 56 + TAG(SKIN_TOKEN_FILE_CODEC, "Fc", "", SKIN_REFRESH_STATIC), 57 + TAG(SKIN_TOKEN_FILE_FREQUENCY, "Ff", "", SKIN_REFRESH_STATIC), 58 + TAG(SKIN_TOKEN_FILE_FREQUENCY_KHZ, "Fk", "", SKIN_REFRESH_STATIC), 59 + TAG(SKIN_TOKEN_FILE_NAME_WITH_EXTENSION, "Fm", "", SKIN_REFRESH_STATIC), 60 + TAG(SKIN_TOKEN_FILE_NAME, "Fn", "", SKIN_REFRESH_STATIC), 61 + TAG(SKIN_TOKEN_FILE_PATH, "Fp", "", SKIN_REFRESH_STATIC), 62 + TAG(SKIN_TOKEN_FILE_SIZE, "Fs", "", SKIN_REFRESH_STATIC), 63 + TAG(SKIN_TOKEN_FILE_VBR, "Fv", "", SKIN_REFRESH_STATIC), 64 + TAG(SKIN_TOKEN_FILE_DIRECTORY, "D" , "I", SKIN_REFRESH_STATIC), 65 + 66 + TAG(SKIN_TOKEN_IMAGE_PRELOAD, "xl", "SF|[IP][IP]I", 0|NOBREAK), 67 + TAG(SKIN_TOKEN_IMAGE_PRELOAD_DISPLAY, "xd", "S|[IT]I", 0), 68 + TAG(SKIN_TOKEN_IMAGE_BACKDROP, "X" , "f", SKIN_REFRESH_STATIC|NOBREAK), 69 + TAG(SKIN_TOKEN_IMAGE_DISPLAY, "x", "SF|II", SKIN_REFRESH_STATIC|NOBREAK), 70 + TAG(SKIN_TOKEN_IMAGE_DISPLAY_9SEGMENT,"x9", "S", 0), 71 + 72 + TAG(SKIN_TOKEN_VIEWPORT_ENABLE, "Vd" , "S", SKIN_REFRESH_STATIC), 73 + TAG(SKIN_TOKEN_UIVIEWPORT_ENABLE, "VI" , "S", SKIN_REFRESH_STATIC), 74 + 75 + TAG(SKIN_TOKEN_VIEWPORT_CUSTOMLIST, "Vp" , "IC", SKIN_REFRESH_DYNAMIC|NOBREAK), 76 + TAG(SKIN_TOKEN_VIEWPORT_FGCOLOUR, "Vf" , "s", SKIN_REFRESH_STATIC|NOBREAK), 77 + TAG(SKIN_TOKEN_VIEWPORT_BGCOLOUR, "Vb" , "s", SKIN_REFRESH_STATIC|NOBREAK), 78 + TAG(SKIN_TOKEN_VIEWPORT_TEXTSTYLE, "Vs" , "S|s", SKIN_REFRESH_STATIC), 79 + TAG(SKIN_TOKEN_VIEWPORT_GRADIENT_SETUP,"Vg" , "SS|s", SKIN_REFRESH_STATIC|NOBREAK), 80 + TAG(SKIN_TOKEN_VIEWPORT_DRAWONBG, "VB" , "", SKIN_REFRESH_STATIC|NOBREAK), 81 + 82 + TAG(SKIN_TOKEN_VIEWPORT_CONDITIONAL, "Vl" , "S[IP][IP][ip][ip]i", 0), 83 + TAG(SKIN_TOKEN_UIVIEWPORT_LOAD, "Vi" , "s[IP][IP][ip][ip]i", 0), 84 + TAG(SKIN_TOKEN_VIEWPORT_LOAD, "V" , "[IP][IP][ip][ip]i", 0), 85 + 42 86 TAG(SKIN_TOKEN_BATTERY_PERCENT, "bl" , BAR_PARAMS, SKIN_REFRESH_DYNAMIC), 43 87 TAG(SKIN_TOKEN_BATTERY_VOLTS, "bv", "", SKIN_REFRESH_DYNAMIC), 44 88 TAG(SKIN_TOKEN_BATTERY_TIME, "bt", "", SKIN_REFRESH_DYNAMIC), ··· 67 111 TAG(SKIN_TOKEN_RTC_DAY_OF_WEEK_START_MON, "cu", "", SKIN_RTC_REFRESH), 68 112 TAG(SKIN_TOKEN_RTC_DAY_OF_WEEK_START_SUN, "cw", "", SKIN_RTC_REFRESH), 69 113 70 - TAG(SKIN_TOKEN_FILE_BITRATE, "fb", "", SKIN_REFRESH_STATIC), 71 - TAG(SKIN_TOKEN_FILE_CODEC, "fc", "", SKIN_REFRESH_STATIC), 72 - TAG(SKIN_TOKEN_FILE_FREQUENCY, "ff", "", SKIN_REFRESH_STATIC), 73 - TAG(SKIN_TOKEN_FILE_FREQUENCY_KHZ, "fk", "", SKIN_REFRESH_STATIC), 74 - TAG(SKIN_TOKEN_FILE_NAME_WITH_EXTENSION, "fm", "", SKIN_REFRESH_STATIC), 75 - TAG(SKIN_TOKEN_FILE_NAME, "fn", "", SKIN_REFRESH_STATIC), 76 - TAG(SKIN_TOKEN_FILE_PATH, "fp", "", SKIN_REFRESH_STATIC), 77 - TAG(SKIN_TOKEN_FILE_SIZE, "fs", "", SKIN_REFRESH_STATIC), 78 - TAG(SKIN_TOKEN_FILE_VBR, "fv", "", SKIN_REFRESH_STATIC), 79 - TAG(SKIN_TOKEN_FILE_DIRECTORY, "d" , "I", SKIN_REFRESH_STATIC), 80 - 81 - TAG(SKIN_TOKEN_FILE_BITRATE, "Fb", "", SKIN_REFRESH_STATIC), 82 - TAG(SKIN_TOKEN_FILE_CODEC, "Fc", "", SKIN_REFRESH_STATIC), 83 - TAG(SKIN_TOKEN_FILE_FREQUENCY, "Ff", "", SKIN_REFRESH_STATIC), 84 - TAG(SKIN_TOKEN_FILE_FREQUENCY_KHZ, "Fk", "", SKIN_REFRESH_STATIC), 85 - TAG(SKIN_TOKEN_FILE_NAME_WITH_EXTENSION, "Fm", "", SKIN_REFRESH_STATIC), 86 - TAG(SKIN_TOKEN_FILE_NAME, "Fn", "", SKIN_REFRESH_STATIC), 87 - TAG(SKIN_TOKEN_FILE_PATH, "Fp", "", SKIN_REFRESH_STATIC), 88 - TAG(SKIN_TOKEN_FILE_SIZE, "Fs", "", SKIN_REFRESH_STATIC), 89 - TAG(SKIN_TOKEN_FILE_VBR, "Fv", "", SKIN_REFRESH_STATIC), 90 - TAG(SKIN_TOKEN_FILE_DIRECTORY, "D" , "I", SKIN_REFRESH_STATIC), 91 - 92 114 TAG(SKIN_TOKEN_METADATA_ARTIST, "ia", "", SKIN_REFRESH_STATIC), 93 115 TAG(SKIN_TOKEN_METADATA_COMPOSER, "ic", "", SKIN_REFRESH_STATIC), 94 116 TAG(SKIN_TOKEN_METADATA_ALBUM, "id", "", SKIN_REFRESH_STATIC), ··· 176 198 TAG(SKIN_TOKEN_DISABLE_THEME, "wd", "", 0|NOBREAK), 177 199 TAG(SKIN_TOKEN_DRAW_INBUILTBAR, "wi", "", SKIN_REFRESH_STATIC|NOBREAK), 178 200 179 - TAG(SKIN_TOKEN_IMAGE_PRELOAD, "xl", "SF|[IP][IP]I", 0|NOBREAK), 180 - TAG(SKIN_TOKEN_IMAGE_PRELOAD_DISPLAY, "xd", "S|[IT]I", 0), 181 - TAG(SKIN_TOKEN_IMAGE_DISPLAY, "x", "SF|II", SKIN_REFRESH_STATIC|NOBREAK), 182 - TAG(SKIN_TOKEN_IMAGE_DISPLAY_9SEGMENT,"x9", "S", 0), 183 - 184 201 TAG(SKIN_TOKEN_LOAD_FONT, "Fl" , "IF|I", 0|NOBREAK), 185 202 TAG(SKIN_TOKEN_ALBUMART_LOAD, "Cl" , "[iP][iP][iP][iP]|ss", 0|NOBREAK), 186 203 TAG(SKIN_TOKEN_ALBUMART_DISPLAY, "Cd" , "", SKIN_REFRESH_STATIC), 187 204 TAG(SKIN_TOKEN_ALBUMART_FOUND, "C" , "", SKIN_REFRESH_STATIC), 188 205 189 - TAG(SKIN_TOKEN_VIEWPORT_ENABLE, "Vd" , "S", SKIN_REFRESH_STATIC), 190 - TAG(SKIN_TOKEN_UIVIEWPORT_ENABLE, "VI" , "S", SKIN_REFRESH_STATIC), 191 206 192 - TAG(SKIN_TOKEN_VIEWPORT_CUSTOMLIST, "Vp" , "IC", SKIN_REFRESH_DYNAMIC|NOBREAK), 193 207 TAG(SKIN_TOKEN_LIST_TITLE_TEXT, "Lt" , "", SKIN_REFRESH_DYNAMIC), 194 208 TAG(SKIN_TOKEN_LIST_ITEM_TEXT, "LT", "|IS", SKIN_REFRESH_DYNAMIC), 195 209 TAG(SKIN_TOKEN_LIST_ITEM_ROW, "LR", "", SKIN_REFRESH_DYNAMIC), ··· 201 215 TAG(SKIN_TOKEN_LIST_ITEM_IS_SELECTED, "Lc" , "", SKIN_REFRESH_DYNAMIC), 202 216 TAG(SKIN_TOKEN_LIST_NEEDS_SCROLLBAR, "LB", BAR_PARAMS, SKIN_REFRESH_DYNAMIC), 203 217 204 - TAG(SKIN_TOKEN_VIEWPORT_FGCOLOUR, "Vf" , "s", SKIN_REFRESH_STATIC|NOBREAK), 205 - TAG(SKIN_TOKEN_VIEWPORT_BGCOLOUR, "Vb" , "s", SKIN_REFRESH_STATIC|NOBREAK), 206 - TAG(SKIN_TOKEN_VIEWPORT_TEXTSTYLE, "Vs" , "S|s", SKIN_REFRESH_STATIC), 207 - TAG(SKIN_TOKEN_VIEWPORT_GRADIENT_SETUP,"Vg" , "SS|s", SKIN_REFRESH_STATIC|NOBREAK), 208 - TAG(SKIN_TOKEN_VIEWPORT_DRAWONBG, "VB" , "", SKIN_REFRESH_STATIC|NOBREAK), 209 - 210 - TAG(SKIN_TOKEN_VIEWPORT_CONDITIONAL, "Vl" , "S[IP][IP][ip][ip]i", 0), 211 - TAG(SKIN_TOKEN_UIVIEWPORT_LOAD, "Vi" , "s[IP][IP][ip][ip]i", 0), 212 - TAG(SKIN_TOKEN_VIEWPORT_LOAD, "V" , "[IP][IP][ip][ip]i", 0), 213 - 214 218 TAG(SKIN_TOKEN_TOP_QUICKSETTING_NAME, "QT" , "", SKIN_REFRESH_DYNAMIC), 215 219 TAG(SKIN_TOKEN_TOP_QUICKSETTING_VALUE, "Qt" , "", SKIN_REFRESH_DYNAMIC), 216 220 TAG(SKIN_TOKEN_RIGHT_QUICKSETTING_NAME, "QR" , "", SKIN_REFRESH_DYNAMIC), ··· 220 224 TAG(SKIN_TOKEN_LEFT_QUICKSETTING_NAME, "QL" , "", SKIN_REFRESH_DYNAMIC), 221 225 TAG(SKIN_TOKEN_LEFT_QUICKSETTING_VALUE, "Ql" , "", SKIN_REFRESH_DYNAMIC), 222 226 223 - TAG(SKIN_TOKEN_IMAGE_BACKDROP, "X" , "f", SKIN_REFRESH_STATIC|NOBREAK), 224 227 /* This uses the bar tag params also but the first item can be a string 225 228 * and we don't allow no params. */ 226 229 TAG(SKIN_TOKEN_SETTING, "St" , "[Sip]|[ip][ip][ip]s*", SKIN_REFRESH_DYNAMIC), ··· 230 233 /* HACK Alert (jdgordon): The next two tags have hacks so we could 231 234 * add a S param at the front without breaking old skins. 232 235 * [SD]D <- handled by the callback, allows SD or S or D params 233 - * [SI]III[SI]|SN <- SIIIIS|S or IIIIS|S 236 + * [SI]III[SI]|SN <- SIIIIS|S or IIIIS|S 234 237 * keep in sync with parse_touchregion() and parse_lasttouch() */ 235 238 TAG(SKIN_TOKEN_LASTTOUCH, "Tl" , "|[SD]D", SKIN_REFRESH_DYNAMIC), 236 239 TAG(SKIN_TOKEN_TOUCHREGION, "T" , "[Sip][ip][ip][ip][Sip]|S*", 0|NOBREAK), ··· 264 267 265 268 /* 266 269 * Just does a straight search through the tag table to find one by 267 - * the given name 270 + * the given name, n denotes command length and length name will be truncated to 268 271 */ 269 - const struct tag_info* find_tag(const char* name) 272 + static const struct tag_info* search_tag(const char* name, int n) 270 273 { 271 - 272 274 const struct tag_info* current = legal_tags; 273 - 274 - /* 275 + 276 + /* 275 277 * Continue searching so long as we have a non-empty name string 276 278 * and the name of the current element doesn't match the name 277 - * we're searching for 279 + * we're searching for, param_pos contains the length of name 280 + * including the Null \0 character 278 281 */ 279 - 280 - while(strcmp(current->name, name) && current->name[0] != '\0') 282 + 283 + while(current->param_pos > 1 284 + && (current->param_pos != n || strncmp(current->name, name, n - 1) != 0)) 285 + { 281 286 current++; 287 + } 282 288 283 - if(current->name[0] == '\0') 289 + if(current->param_pos <= 1) /*param_pos of 1 is an empty string '\0'*/ 290 + { 291 + //DEBUGF("!NOT FOUND! %s %d %.*s\n", __func__, -1, n-1, name); 284 292 return NULL; 293 + } 285 294 else 295 + { 296 + //DEBUGF("%s %d %s\n", __func__, current->type, current->name); 286 297 return current; 298 + } 287 299 288 300 } 289 301 ··· 299 311 else 300 312 return 0; 301 313 } 314 + 315 + /* 316 + * Finds a tag by name and returns its parameter list, or an empty 317 + * string if the tag is not found in the table 318 + */ 319 + const struct tag_info* find_tag(const char *name) 320 + { 321 + /* First we check three then two characters after the '%', then a single char */ 322 + const struct tag_info *tag = NULL; 323 + int i = MAX_TAG_LENGTH; 324 + while (!tag && i > 1) 325 + { 326 + tag = search_tag(name, i); 327 + i--; 328 + } 329 + return tag; 330 + }
+3 -3
lib/skin_parser/tag_table.h
··· 354 354 int flags; 355 355 }; 356 356 357 - /* 357 + /* 358 358 * Finds a tag by name and returns its parameter list, or an empty 359 359 * string if the tag is not found in the table 360 360 */ 361 - const struct tag_info* find_tag(const char* name); 361 + const struct tag_info* find_tag(const char *name); 362 362 363 363 /* 364 - * Determines whether a character is legal to escape or not. If 364 + * Determines whether a character is legal to escape or not. If 365 365 * lookup is not found in the legal escape characters string, returns 366 366 * false, otherwise returns true 367 367 */