/** * Create a new path string by appending a 'leaf' to 'base'. * * On Unixes, we convert a tidle at the beginning of a basename to mean the * directory, complicating things a little, but better now than later. * * Remember to free the return value. */ size_t path_build(char *buf, size_t len, const char *base, const char *leaf) { size_t cur_len = 0; int starts_with_separator; buf[0] = '\0'; if (!leaf || !leaf[0]) { if (base && base[0]) path_process(buf, len, &cur_len, base); return cur_len; } /* * If the leafname starts with the seperator, * or with the tilde (on Unix), * or there's no base path, * We use the leafname only. */ starts_with_separator = (!base || !base[0]) || prefix(leaf, PATH_SEP); #if defined(UNIX) starts_with_separator = starts_with_separator || leaf[0] == '~'; #endif if (starts_with_separator) { path_process(buf, len, &cur_len, leaf); return cur_len; } /* There is both a relative leafname and a base path from which it is * relative */ path_process(buf, len, &cur_len, base); strnfcat(buf, len, &cur_len, "%s", PATH_SEP); path_process(buf, len, &cur_len, leaf); return cur_len; }
/* * Create a new path string by appending a 'leaf' to 'base'. * * On Unixes, we convert a tidle at the beginning of a basename to mean the * directory, complicating things a little, but better now than later. * * Remember to free the return value. */ size_t path_build(char *buf, size_t len, const char *base, const char *leaf) { size_t cur_len = 0; buf[0] = '\0'; if (!leaf || !leaf[0]) { if (base && base[0]) path_process(buf, len, &cur_len, base); return cur_len; } /* * If the leafname starts with the seperator, * or with the tilde (on Unix), * or there's no base path, * We use the leafname only. */ #if defined(SET_UID) || defined(USE_PRIVATE_PATHS) if ((!base || !base[0]) || prefix(leaf, PATH_SEP) || leaf[0] == '~') #else if ((!base || !base[0]) || prefix(leaf, PATH_SEP)) #endif { path_process(buf, len, &cur_len, leaf); return cur_len; } /* There is both a relative leafname and a base path from which it is relative */ path_process(buf, len, &cur_len, base); strnfcat(buf, len, &cur_len, "%s", PATH_SEP); path_process(buf, len, &cur_len, leaf); return cur_len; }