Hi becker, /* * Argv0 will be a full vms file specification, like * node$dka100:[utils.gnumake]make.exe;47 * the vms progname should be ^^^^, the filename without * file type .exe and ;version (and there are some checks, * just in case something unexpected is passed and then the * progname is set to "make"). */ char * vms_progname(const char* argv0) { int len; char *progname; char *p; p = strrchr(argv0, ']'); if (p) { p++; if (*p) { progname = malloc(strlen(p) + 1);
Can malloc fail on VMS? strcpy(progname, p); p = strrchr(progname, ';'); if (p) *p = '\0'; len = strlen(progname); if (0 == strcasecmp(&progname[len - 4], ".exe")) What if len is less than 4? progname[len - 4] = '\0'; if (!*progname) progname = "make"; } else progname = "make"; } else progname = "make"; return progname; } I found it was a bit tedious to keep track of state in my head just so we end up at a single return statement; checking malloc will make that worse. This, untested, seems clearer to me; return ASAP. const char *vms_progname(const char *argv0) { static char const fallback[] = "make"; static char const suffix[] = ".exe"; const size_t suflen = sizeof suffix - 1; char *s, *e; char *name; /* Return \1 of /^.*](.+)(?:\.exe)?(?:;[^;]*)?$/. */ s = strrchr(argv0, ']'); if (!s || !*++s) return fallback; e = strrchr(s, ';'); if (!e) e = s + strlen(s); if (e - s >= suflen && !strncasecmp(e - suflen, suffix, suflen)) e -= suflen; if (e == s) return fallback; name = malloc(e - s + 1); if (!name) return fallback; strncpy(name, s, e - s); name[e - s] = '\0'; return name; } Cheers, Ralph. _______________________________________________ Bug-make mailing list Bug-make@gnu.org https://lists.gnu.org/mailman/listinfo/bug-make