From 0b263bfd1eefcb7cf6156825c842b679cdd5342c Mon Sep 17 00:00:00 2001 From: Johannes Hofmann Date: Wed, 8 Apr 2009 09:32:01 +0200 Subject: factor out file_installed_or_local() --- src/gipfel.cxx | 59 ++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 37 insertions(+), 22 deletions(-) diff --git a/src/gipfel.cxx b/src/gipfel.cxx index 8fbe536..bd605a8 100644 --- a/src/gipfel.cxx +++ b/src/gipfel.cxx @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -43,8 +44,10 @@ #define GIPFEL_DATADIR "/usr/local/share" #endif -#define DEFAULT_DATAFILE GIPFEL_DATADIR "/" PACKAGE_NAME "/gipfel.dat" +#define DATAFILE "gipfel.dat" +#define DEFAULT_DATADIR GIPFEL_DATADIR "/" PACKAGE_NAME +char *run_dir = NULL; char *img_file = NULL; char *data_file = NULL; @@ -79,6 +82,26 @@ confirm_overwrite(const char *f) { return 1; } +static char * +file_installed_or_local(const char *inst_dir, const char *name) { + assert(run_dir); + + struct stat sb; + int buflen = strlen(inst_dir) + strlen(run_dir) + strlen(name) + 1; + char *buf = (char *) malloc (buflen); + + snprintf(buf, buflen, "%s/%s", inst_dir, name); + if (stat(buf, &sb) == 0) + return buf; + + snprintf(buf, buflen, "%s/../%s", run_dir, name); + if (stat(buf, &sb) == 0) + return buf; + + free(buf); + return NULL; +} + void set_values() { double k0 = 0.0, k1 = 0.0, x0 = 0.0; @@ -265,16 +288,20 @@ void about_cb() { } void readme_cb() { + char *readme = file_installed_or_local(DOCDIR, "README"); + if (!readme) { + fprintf(stderr, "README file not found\n"); + return; + } Fl_Window *win = new Fl_Window(800, 600, "README"); Fl_Text_Buffer *textBuf = new Fl_Text_Buffer(); Fl_Text_Display *textDisp = new Fl_Text_Display(0, 0, win->w(), win->h()); - char buf[PATH_MAX]; textDisp->textfont(FL_COURIER); textDisp->buffer(textBuf); win->resizable(textDisp); - snprintf(buf, PATH_MAX, "%s/README", DOCDIR); - textBuf->appendfile(buf); + textBuf->appendfile(readme); + free(readme); win->end(); win->show(); } @@ -545,27 +572,15 @@ int main(int argc, char** argv) { my_argc = argc - optind; my_argv = argv + optind; + char *exec_file = strdup(argv[0]); + run_dir = strdup(dirname(exec_file)); + free(exec_file); + if (my_argc >= 1) img_file = strdup(my_argv[0]); - if (data_file == NULL) { - struct stat sb; - - if (stat(DEFAULT_DATAFILE, &sb) == 0) { - data_file = DEFAULT_DATAFILE; - } else { - // check for gipfel.dat in local tarball - char *exec_file = strdup(argv[0]); - data_file = (char *) malloc (strlen (exec_file) + 64); - snprintf(data_file, strlen (exec_file) + 64, "%s/../gipfel.dat", - dirname(exec_file)); - free(exec_file); - if (stat(data_file, &sb) != 0) { - free(data_file); - data_file = NULL; - } - } - } + if (data_file == NULL) + data_file = file_installed_or_local(DEFAULT_DATADIR, "gipfel.dat"); if (data_file == NULL || err) { usage(); -- cgit v1.2.3