#include "src/include/pmix_config.h"
#include <string.h>
#include "src/mca/pinstalldirs/base/base.h"
#include "src/mca/pinstalldirs/pinstalldirs.h"
#include "src/util/pmix_os_path.h"
#define EXPAND_STRING(name) EXPAND_STRING2(name, name)
#define EXPAND_STRING2(ompiname, fieldname) \
do { \
if (NULL != (start_pos = strstr(retval, "${" #fieldname "}"))) { \
tmp = retval; \
*start_pos = '\0'; \
end_pos = start_pos + strlen("${" #fieldname "}"); \
if (0 > asprintf(&retval, "%s%s%s", tmp, pmix_pinstall_dirs.ompiname + destdir_offset, \
end_pos)) { \
pmix_output(0, "NOMEM"); \
} \
free(tmp); \
changed = true; \
} else if (NULL != (start_pos = strstr(retval, "@{" #fieldname "}"))) { \
tmp = retval; \
*start_pos = '\0'; \
end_pos = start_pos + strlen("@{" #fieldname "}"); \
if (0 > asprintf(&retval, "%s%s%s", tmp, pmix_pinstall_dirs.ompiname + destdir_offset, \
end_pos)) { \
pmix_output(0, "NOMEM"); \
} \
free(tmp); \
changed = true; \
} \
} while (0)
static char *pmix_pinstall_dirs_expand_internal(const char *input, bool is_setup)
{
size_t len, i;
bool needs_expand = false;
char *retval = NULL;
char *destdir = NULL;
size_t destdir_offset = 0;
if (is_setup) {
destdir = getenv("PMIX_DESTDIR");
if (NULL != destdir && strlen(destdir) > 0) {
destdir_offset = strlen(destdir);
}
}
len = strlen(input);
for (i = 0; i < len; ++i) {
if ('$' == input[i] || '@' == input[i]) {
needs_expand = true;
break;
}
}
retval = strdup(input);
if (NULL == retval)
return NULL;
if (needs_expand) {
bool changed = false;
char *start_pos, *end_pos, *tmp;
do {
changed = false;
EXPAND_STRING(prefix);
EXPAND_STRING(exec_prefix);
EXPAND_STRING(bindir);
EXPAND_STRING(sbindir);
EXPAND_STRING(libexecdir);
EXPAND_STRING(datarootdir);
EXPAND_STRING(datadir);
EXPAND_STRING(sysconfdir);
EXPAND_STRING(sharedstatedir);
EXPAND_STRING(localstatedir);
EXPAND_STRING(libdir);
EXPAND_STRING(includedir);
EXPAND_STRING(infodir);
EXPAND_STRING(mandir);
EXPAND_STRING2(pmixdatadir, pkgdatadir);
EXPAND_STRING2(pmixlibdir, pkglibdir);
EXPAND_STRING2(pmixincludedir, pkgincludedir);
} while (changed);
}
if (NULL != destdir) {
char *tmp = retval;
retval = pmix_os_path(false, destdir, tmp, NULL);
free(tmp);
}
return retval;
}
char *pmix_pinstall_dirs_expand(const char *input)
{
return pmix_pinstall_dirs_expand_internal(input, false);
}
char *pmix_pinstall_dirs_expand_setup(const char *input)
{
return pmix_pinstall_dirs_expand_internal(input, true);
}