Ejemplo n.º 1
0
Archivo: scan.c Proyecto: EQ4/musicd
/**
 * 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;
}
Ejemplo n.º 2
0
Archivo: lyrics.c Proyecto: EQ4/musicd
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
Archivo: scan.c Proyecto: EQ4/musicd
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;
}