tools/gst-run.c: do piece-wise major/minor comparison so 0.9 < 0.10 also allow .exe extensions for tools

Original commit message from CVS:

* tools/gst-run.c: (compare_major_minor), (find_highest_version),
(get_candidates):
do piece-wise major/minor comparison so 0.9 < 0.10
also allow .exe extensions for tools
This commit is contained in:
Thomas Vander Stichele 2005-12-02 01:35:22 +00:00
parent b32059fdc6
commit 197bfd7bde
2 changed files with 77 additions and 13 deletions

View file

@ -1,3 +1,10 @@
2005-12-02 Thomas Vander Stichele <thomas at apestaart dot org>
* tools/gst-run.c: (compare_major_minor), (find_highest_version),
(get_candidates):
do piece-wise major/minor comparison so 0.9 < 0.10
also allow .exe extensions for tools
2005-12-02 Michael Smith <msmith@fluendo.com> 2005-12-02 Michael Smith <msmith@fluendo.com>
* gst/gst.c: * gst/gst.c:

View file

@ -52,6 +52,57 @@ hash_print_key (gchar * key, gchar * value)
g_print ("%s\n", (gchar *) key); g_print ("%s\n", (gchar *) key);
} }
/* return value like strcmp, but compares major/minor numerically */
static gint
compare_major_minor (const gchar * first, const gchar * second)
{
gchar **firsts, **seconds;
gint fmaj, fmin, smaj, smin;
gint ret = 0;
firsts = g_strsplit (first, ".", 0);
seconds = g_strsplit (second, ".", 0);
if (firsts[0] == NULL || firsts[1] == NULL) {
ret = -1;
goto beach;
}
if (seconds[0] == NULL || seconds[1] == NULL) {
ret = 1;
goto beach;
}
fmaj = atoi (firsts[0]);
fmin = atoi (firsts[1]);
smaj = atoi (seconds[0]);
smin = atoi (seconds[1]);
if (fmaj < smaj) {
ret = -1;
goto beach;
}
if (fmaj > smaj) {
ret = 1;
goto beach;
}
/* fmaj == smaj */
if (fmin < smin) {
ret = -1;
goto beach;
}
if (fmin > smin) {
ret = 1;
goto beach;
}
ret = 0;
beach:
g_strfreev (firsts);
g_strfreev (seconds);
return ret;
}
static void static void
find_highest_version (gchar * key, gchar * value, gchar ** highest) find_highest_version (gchar * key, gchar * value, gchar ** highest)
{ {
@ -59,7 +110,7 @@ find_highest_version (gchar * key, gchar * value, gchar ** highest)
/* first value, so just set it */ /* first value, so just set it */
*highest = key; *highest = key;
} }
if (strcmp (key, *highest) > 0) if (compare_major_minor (key, *highest) > 0)
*highest = key; *highest = key;
} }
@ -148,13 +199,10 @@ get_candidates (const gchar * dir, const gchar * base)
GError *error = NULL; GError *error = NULL;
const gchar *entry; const gchar *entry;
gchar *path; gchar *path;
gchar *suffix; gchar *suffix, *copy;
gchar *pattern; gchar *pattern;
GPatternSpec *spec; GPatternSpec *spec, *specexe;
gchar *test;
gchar **dirs; gchar **dirs;
gchar **cur; gchar **cur;
@ -163,10 +211,13 @@ get_candidates (const gchar * dir, const gchar * base)
candidates = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); candidates = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
/* compile our pattern spec */ /* compile our pattern specs */
pattern = g_strdup_printf ("%s-*.*", base); pattern = g_strdup_printf ("%s-*.*", base);
spec = g_pattern_spec_new (pattern); spec = g_pattern_spec_new (pattern);
g_free (pattern); g_free (pattern);
pattern = g_strdup_printf ("%s-*.*.exe", base);
specexe = g_pattern_spec_new (pattern);
g_free (pattern);
/* get all dirs from the path and prepend with given dir */ /* get all dirs from the path and prepend with given dir */
path = g_strdup_printf ("%s%c%s", path = g_strdup_printf ("%s%c%s",
@ -191,7 +242,8 @@ get_candidates (const gchar * dir, const gchar * base)
return NULL; return NULL;
} }
while ((entry = g_dir_read_name (gdir))) { while ((entry = g_dir_read_name (gdir))) {
if (g_pattern_match_string (spec, entry)) { if (g_pattern_match_string (spec, entry)
|| g_pattern_match_string (specexe, entry)) {
gchar *full; gchar *full;
/* is it executable ? */ /* is it executable ? */
@ -204,15 +256,20 @@ get_candidates (const gchar * dir, const gchar * base)
/* strip base and dash from it */ /* strip base and dash from it */
suffix = g_strdup (&(entry[strlen (base) + 1])); suffix = g_strdup (&(entry[strlen (base) + 1]));
copy = g_strdup (suffix);
/* strip possible .exe from copy */
if (g_strrstr (copy, ".exe"))
g_strrstr (copy, ".exe")[0] = '\0';
/* stricter pattern check: check if it only contains digits or dots */ /* stricter pattern check: check if it only contains digits or dots */
test = g_strdup (suffix); g_strcanon (copy, "0123456789.", 'X');
g_strcanon (test, "0123456789.", 'X'); if (strstr (copy, "X")) {
if (strstr (test, "X")) { g_free (suffix);
g_free (test); g_free (copy);
continue; continue;
} }
g_free (test); g_free (copy);
g_hash_table_insert (candidates, suffix, g_strdup (*cur)); g_hash_table_insert (candidates, suffix, g_strdup (*cur));
} }
} }