Revert "Introduce bsearch() and use it in tagtree.c."

It was committed by accident (it's on FS still).

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30157 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Thomas Martitz 2011-07-18 18:57:50 +00:00
parent 76b6db375a
commit 1b7ff725c6
4 changed files with 65 additions and 147 deletions

View file

@ -29,7 +29,6 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include "string-extra.h" #include "string-extra.h"
#include "bsearch.h"
#include "config.h" #include "config.h"
#include "system.h" #include "system.h"
#include "kernel.h" #include "kernel.h"
@ -161,13 +160,6 @@ struct match
int symbol; int symbol;
}; };
static int compare_match(const void* _key, const void* _elem)
{
const char* key = _key;
const struct match *elem = _elem;
return strcasecmp(key, elem->str);
}
/* Statusbar text of the current view. */ /* Statusbar text of the current view. */
static char current_title[MAX_TAGS][128]; static char current_title[MAX_TAGS][128];
@ -229,42 +221,42 @@ static int get_token_str(char *buf, int size)
static int get_tag(int *tag) static int get_tag(int *tag)
{ {
static const struct match get_tag_match[] = static const struct match get_tag_match[] =
{ /* sorted by ascii (case insensitive) for bsearch */ {
{ "%format", var_format },
{ "%include", var_include },
{ "%limit", var_limit },
{"%menu_start",var_menu_start},
{"%root_menu",var_rootmenu},
{ "%sort", var_sorttype },
{ "%strip", var_strip },
{"->",menu_next},
{ "==>", menu_load },
{"album", tag_album}, {"album", tag_album},
{ "albumartist", tag_albumartist },
{"artist", tag_artist}, {"artist", tag_artist},
{ "autoscore", tag_virt_autoscore },
{"bitrate", tag_bitrate}, {"bitrate", tag_bitrate},
{ "comment", tag_comment },
{ "commitid", tag_commitid },
{"composer", tag_composer}, {"composer", tag_composer},
{ "discnum", tag_discnumber }, {"comment", tag_comment},
{"albumartist", tag_albumartist},
{"ensemble", tag_albumartist}, {"ensemble", tag_albumartist},
{ "entryage", tag_virt_entryage },
{ "filename", tag_filename },
{ "genre", tag_genre },
{"grouping", tag_grouping}, {"grouping", tag_grouping},
{ "lastoffset", tag_lastoffset }, {"genre", tag_genre},
{ "lastplayed", tag_lastplayed },
{"length", tag_length}, {"length", tag_length},
{"Lm", tag_virt_length_min}, {"Lm", tag_virt_length_min},
{"Ls", tag_virt_length_sec}, {"Ls", tag_virt_length_sec},
{ "playcount", tag_playcount },
{"Pm", tag_virt_playtime_min}, {"Pm", tag_virt_playtime_min},
{"Ps", tag_virt_playtime_sec}, {"Ps", tag_virt_playtime_sec},
{ "rating", tag_rating },
{"title", tag_title}, {"title", tag_title},
{"filename", tag_filename},
{"tracknum", tag_tracknumber}, {"tracknum", tag_tracknumber},
{"discnum", tag_discnumber},
{"year", tag_year}, {"year", tag_year},
{"playcount", tag_playcount},
{"rating", tag_rating},
{"lastplayed", tag_lastplayed},
{"lastoffset", tag_lastoffset},
{"commitid", tag_commitid},
{"entryage", tag_virt_entryage},
{"autoscore", tag_virt_autoscore},
{"%sort", var_sorttype},
{"%limit", var_limit},
{"%strip", var_strip},
{"%menu_start", var_menu_start},
{"%include", var_include},
{"%root_menu", var_rootmenu},
{"%format", var_format},
{"->", menu_next},
{"==>", menu_load}
}; };
char buf[128]; char buf[128];
unsigned int i; unsigned int i;
@ -285,13 +277,15 @@ static int get_tag(int *tag)
} }
buf[i] = '\0'; buf[i] = '\0';
struct match *elem = bsearch(buf, get_tag_match, ARRAYLEN(get_tag_match), for (i = 0; i < ARRAYLEN(get_tag_match); i++)
sizeof(struct match), compare_match);
if (elem)
{ {
*tag = elem->symbol; if (!strcasecmp(buf, get_tag_match[i].str))
{
*tag = get_tag_match[i].symbol;
return 1; return 1;
} }
}
logf("NO MATCH: %s\n", buf); logf("NO MATCH: %s\n", buf);
if (buf[0] == '?') if (buf[0] == '?')
return 0; return 0;
@ -302,21 +296,21 @@ static int get_tag(int *tag)
static int get_clause(int *condition) static int get_clause(int *condition)
{ {
static const struct match get_clause_match[] = static const struct match get_clause_match[] =
{ /* sorted by ascii (case insensitive) for bsearch */ {
{ "!$", clause_not_ends_with },
{ "!=", clause_is_not },
{ "!^", clause_not_begins_with },
{ "!~", clause_not_contains },
{ "$", clause_ends_with },
{ "<", clause_lt },
{ "<=", clause_lteq },
{"=", clause_is}, {"=", clause_is},
{"==", clause_is}, {"==", clause_is},
{"!=", clause_is_not},
{">", clause_gt}, {">", clause_gt},
{">=", clause_gteq}, {">=", clause_gteq},
{ "@", clause_oneof }, {"<", clause_lt},
{ "^", clause_begins_with }, {"<=", clause_lteq},
{"~", clause_contains}, {"~", clause_contains},
{"!~", clause_not_contains},
{"^", clause_begins_with},
{"!^", clause_not_begins_with},
{"$", clause_ends_with},
{"!$", clause_not_ends_with},
{"@", clause_oneof}
}; };
char buf[4]; char buf[4];
@ -338,13 +332,15 @@ static int get_clause(int *condition)
} }
buf[i] = '\0'; buf[i] = '\0';
struct match *elem = bsearch(buf, get_clause_match, ARRAYLEN(get_clause_match), for (i = 0; i < ARRAYLEN(get_clause_match); i++)
sizeof(struct match), compare_match);
if (elem)
{ {
*condition = elem->symbol; if (!strcasecmp(buf, get_clause_match[i].str))
{
*condition = get_clause_match[i].symbol;
return 1; return 1;
} }
}
return 0; return 0;
} }

View file

@ -105,7 +105,6 @@ libc/mktime.c
/* Common */ /* Common */
common/version.c common/version.c
common/bsearch.c
common/config.c common/config.c
common/crc32.c common/crc32.c
#ifdef MI4_FORMAT #ifdef MI4_FORMAT

View file

@ -1,49 +0,0 @@
/* Copyright (C) 1991,92,97,2000,02 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <stdlib.h>
/* Perform a binary search for KEY in BASE which has NMEMB elements
of SIZE bytes each. The comparisons are done by (*COMPAR)(). */
void *
bsearch (const void *key, const void *base, size_t nmemb, size_t size,
int (*compar) (const void *, const void *))
{
size_t l, u, idx;
const void *p;
int comparison;
l = 0;
u = nmemb;
while (l < u)
{
idx = (l + u) / 2;
p = (void *) (((const char *) base) + (idx * size));
comparison = (*compar) (key, p);
if (comparison < 0)
u = idx;
else if (comparison > 0)
l = idx + 1;
else
return (void *) p;
}
return NULL;
}
/* libc_hidden_def (bsearch) */

View file

@ -1,28 +0,0 @@
/* Copyright (C) 1991,92,97,2000,02 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#ifndef __BSEARCH_H__
#define __BSEARCH_H__
/* Perform a binary search for KEY in BASE which has NMEMB elements
of SIZE bytes each. The comparisons are done by (*COMPAR)(). */
void *
bsearch (const void *key, const void *base, size_t nmemb, size_t size,
int (*compar) (const void *, const void *));
#endif