#include #include #include #define GREATER 2 #define SAME 1 #define LESSER 0 typedef struct lilyversion { gint major; gint minor; }lilyversion; int version_check(lilyversion base, lilyversion installed) { if (base.major > installed.major) return LESSER; if (base.major < installed.major) return GREATER; if (base.minor == installed.minor) return SAME; if (base.minor > installed.minor) return LESSER; if (base.minor < installed.minor) return GREATER; /* if none of the above something is wrong */ return -1; } lilyversion string_to_lilyversion(char *string) { lilyversion version; char **token; const char delimiters[] = "."; /* split string */ token = g_strsplit(string, delimiters, 2); /* get major version number */ version.major = atoi(token[0]); /* get minor version number */ version.minor = atoi(token[1]); printf("\nstring_to_lilyversion() major = %d minor = %d\n",version.major, version.minor); return version; } gchar * find_decimal_dot_double_decimal (const gchar *string) { GRegex *regex = NULL; GMatchInfo *match_info; GString *lilyversion = g_string_new (""); regex = g_regex_new("\\d.\\d\\d", 0, 0, NULL); g_regex_match(regex, string, 0, &match_info); if (g_match_info_matches (match_info)) { g_string_append(lilyversion, g_match_info_fetch (match_info, 0)); } g_match_info_free (match_info); g_regex_unref (regex); return g_string_free(lilyversion, FALSE); } int get_lily_version (void) { GError *error = NULL; gchar *version_string; double d; int standard_output; #define NUMBER_OF_PARSED_CHAR 30 gchar buf[NUMBER_OF_PARSED_CHAR]; /* characters needed to parse */ gchar *arguments[] = { "lilypond", "-v", NULL }; g_spawn_async_with_pipes (NULL, /* dir */ arguments, NULL, /* env */ G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD, NULL, /* child setup func */ NULL, /* user data */ NULL, /*pid*/ NULL, /*standard_input*/ &standard_output, /*standard output*/ NULL, /*standard error*/ &error); read(standard_output, buf, sizeof(buf)); version_string = find_decimal_dot_double_decimal(buf); lilyversion installed_version = string_to_lilyversion(version_string); lilyversion check_version = string_to_lilyversion("2.8"); return version_check(check_version, installed_version); } int main() { gint version; version = get_lily_version(); if (version == GREATER) g_print("\nInstalled Lilypond version is higher\n"); if (version == SAME) g_print("\nInstalled Lilypond version is same\n"); if (version == LESSER) g_print("\nInstalled Lilypond version is lower\n"); if (version == -1) g_print("\nerror finding lilypond version\n"); }