char *gapp_exe_path(GraceApp *gapp, const char *fn) { static char buf[GR_MAXPATHLEN], *epath; char *cp; if (fn == NULL) { return NULL; } else { cp = strchr(fn, ' '); if (cp == NULL) { epath = grace_path(gapp->grace, fn); strcpy(buf, exe_path_translate(epath)); xfree(epath); return buf; } else { strcpy(buf, fn); buf[cp - fn] = '\0'; epath = grace_path(gapp->grace, buf); strcpy(buf, epath); xfree(epath); strcat(buf, " "); strcat(buf, cp); return exe_path_translate(buf); } } }
/* open a file for read */ FILE *gapp_openr(GraceApp *gapp, const char *fn, int src) { struct stat statb; char *tfn; char buf[GR_MAXPATHLEN + 50]; FILE *fp; if (!fn || !fn[0]) { errmsg("No file name given"); return NULL; } switch (src) { case SOURCE_DISK: tfn = grace_path(gapp->grace, fn); if (strcmp(tfn, "-") == 0 || strcmp(tfn, "stdin") == 0) { xfree(tfn); return stdin; } else if (stat(tfn, &statb)) { sprintf(buf, "Can't stat file %s", tfn); errmsg(buf); xfree(tfn); return NULL; /* check to make sure this is a file and not a dir */ } else if (!S_ISREG(statb.st_mode)) { sprintf(buf, "%s is not a regular file", tfn); errmsg(buf); xfree(tfn); return NULL; } else { fp = filter_read(gapp, tfn); xfree(tfn); return fp; } break; case SOURCE_PIPE: tfn = gapp_exe_path(gapp, fn); fp = popen(tfn, "r"); xfree(tfn); return fp; break; default: errmsg("Wrong call to gapp_openr()"); return NULL; } }
GProject *load_xgr_project(GraceApp *gapp, const char *fn) { GrFILE *grf; GProject *gp; char *epath; epath = grace_path(gapp->grace, fn); grf = grfile_openr(epath); xfree(epath); if (grf == NULL) { return NULL; } gp = gproject_load(gapp->grace, grf, AMEM_MODEL_LIBUNDO); grfile_free(grf); return gp; }
int set_workingdir(GraceApp *gapp, const char *wd) { char *epath; int retval; epath = grace_path(gapp->grace, wd); if (chdir(epath) >= 0) { gapp->rt->workingdir = copy_string(gapp->rt->workingdir, epath); if (gapp->rt->workingdir[strlen(gapp->rt->workingdir) - 1] != '/') { gapp->rt->workingdir = concat_strings(gapp->rt->workingdir, "/"); } retval = RETURN_SUCCESS; } else { retval = RETURN_FAILURE; } xfree(epath); return retval; }