// Return full path of current program static string myFile() { const char *my_name = saved_argv()[0]; if (my_name == 0) my_name = ddd_NAME; return cmd_file(my_name); }
static bool have_cmd(const string& cmd) { return cmd_file(cmd).contains('/', 0); }
// Fetch the X library directory, using xmkmf(1) static const _XtString xlibdir(Display *display, bool verbose = false) { static bool tried = false; static const _XtString dir = 0; if (tried) return dir; tried = true; if (!is_cmd_file(cmd_file("xmkmf"))) return dir; // No `xmkmf' in PATH if (!is_cmd_file(cmd_file("make"))) return dir; // No `make' in PATH static const char *shell_command = "" #include "xlibdir.C" ""; String me, my_class; XtGetApplicationNameAndClass(display, &me, &my_class); if (verbose) { std::cout << "Checking for X11 library directory... "; std::cout.flush(); } const string s1 = "/bin/sh -c " + sh_quote(shell_command); FILE *fp = popen(s1.chars(), "r"); if (fp == 0) { if (verbose) { std::cout << strerror(errno) << "\n"; std::cout.flush(); } return dir; } char buffer[PATH_MAX]; buffer[0] = '\0'; fgets(buffer, sizeof(buffer), fp); pclose(fp); int len = strlen(buffer); if (len > 0 && buffer[len - 1] == '\n') buffer[len - 1] = '\0'; if (buffer[0] == '/') // Sanity check dir = (String)XtNewString(buffer); if (verbose) { if (dir) std::cout << dir << "\n"; else std::cout << "(not found)\n"; std::cout.flush(); } return dir; }