/** * Splits @p prefix to an array of strings in @var image_prefixes */ void scan_image_prefix_changed(char *prefix) { int count = 1; char *p, **p2; if (image_prefixes) { for (p2 = image_prefixes; *p2 != NULL; ++p2) { free(*p2); } free(image_prefixes); } if (!prefix) { return; } for (p = prefix; *p != '\0'; ++p) { if (*p == ',') { ++count; } } image_prefixes = p2 = malloc((count + 1) * sizeof(char *)); for (p = prefix + 1; *(p - 1) != '\0'; ++p) { if (*p == ',' || *p == '\0') { *(p2++) = strextract(prefix, p); prefix = p + 1; } } *p2 = NULL; }
static char *find_lyrics_page_name(const char *page, const char *title) { const char *p, *end; char *result; char *search_title = stringf("%s\n", title); /* Exact match */ p = strstr(page, search_title); if (!p) { /* Case-insensitive match */ p = strcasestr(page, search_title); if (!p) { free(search_title); return NULL; } } free(search_title); for (; p != page && *p != '\n'; --p) { } ++p; end = strchr(p, '\n'); if (!end) { end = p + strlen(p); } result = strextract(p, end); return result; }
int query_sort_from_string(query_t *query, const char *sort) { const char *end; char *name; bool descending; query_field_t field; while (*sort != '\0') { if (*sort == '-') { descending = true; ++sort; } else { descending = false; } for (end = sort; *end != ',' && *end != '\0'; ++end) { } name = strextract(sort, end); field = query_field_from_string(name); free(name); if (field == QUERY_FIELD_NONE) { /* Not a valid field name */ return -1; } query_sort(query, field, descending); sort = end; if (*sort == ',') { ++sort; } } return 0; }
static bool update_albumimg_cb(library_image_t *image, void *opaque) { char *name; int level, diff; bool better = false; struct albumimg_comparison *comparison = opaque; /* Extract what's between last '/' and last '.' in the path */ const char *p1 = image->path + strlen(image->path), *p2 = NULL; for (; p1 > image->path && *(p1 - 1) != '/'; --p1) { if (*p1 == '.' && !p2) { p2 = p1; } } if (!p2) { p2 = image->path + strlen(image->path); } name = strextract(p1, p2); if (image_prefixes) { for (level = 0; image_prefixes[level]; ++level) { if (!strncasecmp(image_prefixes[level], name, strlen(image_prefixes[level]))) { /* Matches current level */ break; } } } else { level = 0; } /* First entry */ if (!comparison->id) { better = true; goto skip; } /* Lower level than previous best, must be better */ if (level < comparison->level) { better = true; goto skip; } /* Higher level than previous best, can't be better */ if (level > comparison->level) { goto skip; } diff = strcasecmp(name, comparison->name); if (diff < 0) { /* "Smaller" means better */ better = true; } skip: if (better) { comparison->id = image->id; free(comparison->name); comparison->name = name; comparison->level = level; } else { free(name); } return true; }