Проблема, с которой я столкнулся при использовании этой функции, заключается в том, что она получает следующую ошибку, если в файле ключа gtk есть ошибка.Он буквально выпрыгивает из функции, возвращающейся обратно в командную строку.
СООБЩЕНИЕ ОБ ОШИБКЕ Файл ключа содержит строку "" ./icon.ico "", которая не является парой ключ-значение, группой или комментарием
iconFile =
"./ icon.ico"
Но это нормально и работает без ошибок
iconFile = "./ icon.ico"
Я искал в интернете, но не смог найти что-либо, связанное с этой ошибкой.Я попытался запустить его через gdb и valgrind, но не смог обнаружить ошибку.
Может кто-нибудь пролить свет на то, что я делаю неправильно?
// *** config.c ***
// gcc -Wall -Wextra -o config config.c `pkg-config --cflags --libs gtk+-3.0`
#include <gtk/gtk.h>
#include <glib.h>
//#include <stdio.h>
#include <errno.h>
#include <sys/stat.h>
extern gchar *__progname;
int myErrorCheck(gchar **myData);
// create / get CONFIG file configuration
int main(int argc, gchar *argv[])
{
// THESE ARE CONFIG FILE DEFAULT SETTINGS
// MPD HOST SETTINGS
gchar *mpdHostname = "localhost";
gint mpdPortnumber = 6600;
gint mpdTimeout = 30000;
// PLAYLIST SETTINGS
gchar *rowFont = "\"Bold 16\"";
gchar *viewColor = "\"medium slate blue\"";
gchar *textColor = "\"black\"";
// OTHER SETTINGS
gchar *windowTitle = "Selecet MPD Playlist";
gchar *iconFile = "\"./icon.ico\"";
// COMMENTS
// this comment goes above MpdHostSettings group header
gconstpointer HostSettingsComment = " These are the MPD Host parameters for this executable.";
// this comment goes above PlayListSettings group header
gconstpointer PlayListSettingsComment = " These are the MPD Playlist executable parameters.\n Enclose each parameter in quotes (\"\")";
// this comment goes above windowTitle in Other group header
gconstpointer windowTitleComment = " This is the window title.";
// this comment goes above iconFile in Other group header
gconstpointer iconFileComment = " This is the window icon.";
// *** End of THESE ARE CONFIG FILE DEFAULT SETTINGS ***
GKeyFile *key_file;
GError *error;
key_file = g_key_file_new();
error = NULL;
gchar *cfgFile;
gchar *confPath;
// *** COPY LOWER CASE __progname AS UPPER CASE into upper__progname
gchar *upper__progname = g_ascii_strup(__progname, strlen(__progname));
// *** TEST or CREATE (if needed) the user config file PATHNAME (should be ~/.config/PROGNAME)
// build the config path string
confPath = g_strconcat(g_get_user_config_dir(),"/", upper__progname,NULL);
cfgFile = g_strconcat(confPath,"/", __progname,".conf",NULL);
// Does the config path exist? This IS a CRITICAL error.
if(access(confPath,F_OK | R_OK)) {
fprintf (stderr, "WARNING: Error opening config path %s : %s. Line number %d\n", confPath, strerror(errno), __LINE__);
// if possible create PATH directory if it does not exist
if(mkdir (confPath,S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) == -1) {
g_print("Line %d\n", __LINE__);
// should it for some reason not be created
fprintf (stderr, "Critical: Error creating config path %s : %s. Line number %d\n", confPath, strerror(errno), __LINE__);
exit(errno);
}
// WRITE THE DEFAULT CONFIGURATION TO FILE IF CONF FILE HAS TO BE CREATED
// MPD HOST SETTINGS
g_key_file_set_string(key_file, "MpdHostSettings", "mpdHostname", mpdHostname);
g_key_file_set_integer(key_file, "MpdHostSettings", "mpdPortnumber", mpdPortnumber);
g_key_file_set_integer(key_file, "MpdHostSettings", "mpdTimeout", mpdTimeout);
// PLAYLIST SETTINGS
g_key_file_set_string(key_file, "PlayListSettings", "rowFont", rowFont);
g_key_file_set_string(key_file, "PlayListSettings", "viewColor", viewColor);
g_key_file_set_string(key_file, "PlayListSettings", "textColor", textColor);
// OTHER PARAMETERS
g_key_file_set_string(key_file, "OtherSettings", "windowTitle", windowTitle);
g_key_file_set_string(key_file, "OtherSettings", "iconFile", iconFile);
// COMMENTS
g_key_file_set_comment(key_file, "PlayListSettings", NULL, PlayListSettingsComment, NULL);
g_key_file_set_comment(key_file, "MpdHostSettings", NULL, HostSettingsComment, NULL);
g_key_file_set_comment(key_file, "OtherSettings", "windowTitle", windowTitleComment, NULL);
g_key_file_set_comment(key_file, "OtherSettings", "iconFile", iconFileComment, NULL);
//*********************************************************************
// SAVE them to to file
g_key_file_save_to_file (key_file, cfgFile, &error);
} // End of CREATE CFG FILE
// LOAD THE KEYS FROM CONF FILE IF THEIR IS NO ERROR
if(!g_key_file_load_from_file(key_file, cfgFile, G_KEY_FILE_KEEP_COMMENTS, &error))
{
printf("ERROR MESSAGE %s\n", error->message);
g_debug("%s", error->message);
g_key_file_free (key_file);
return 1;
}
// MPD HOST PARAMETERS
mpdHostname = g_key_file_get_string(key_file, "MpdHostSettings", "mpdHostname", &error);
mpdPortnumber = g_key_file_get_integer(key_file, "MpdHostSettings", "mpdPortnumber", &error);
mpdTimeout = g_key_file_get_integer(key_file, "MpdHostSettings", "mpdTimeout", &error);
// MPD PLAYLIST PARAMETERS
rowFont = g_key_file_get_string(key_file, "PlayListSettings", "rowFont", &error);
viewColor = g_key_file_get_string(key_file, "PlayListSettings", "viewColor", &error);
textColor = g_key_file_get_string(key_file, "PlayListSettings", "textColor", &error);
windowTitle = g_key_file_get_string(key_file, "OtherSettings", "windowTitle", &error);
iconFile = g_key_file_get_string(key_file, "OtherSettings", "iconFile", &error);
// *** PRINT THESE VARIABLES ***
// MPD HOST SETTINGS
g_print("mpdHostname %s\n",mpdHostname);
g_print("mpdPortnumber %d\n", mpdPortnumber) ;
g_print("mpdTimeout %d\n", mpdTimeout);
// PLAYLIST SETTINGS
g_print("rowFont %s\n", rowFont);
g_print("viewColor %s\n", viewColor);
g_print("textColor %s\n", textColor);
g_print("windowTitle %s\n", windowTitle);
g_print("iconFile %s\n", iconFile);
g_key_file_free (key_file);
g_free(error);
g_free(cfgFile);
g_free(mpdHostname );
//g_free(mpdPortnumber );
//g_free(mpdTimeout );
g_free(rowFont );
g_free(viewColor );
g_free(textColor );
g_free(windowTitle );
g_free(iconFile );
return 0;
}