X-Git-Url: http://git.tuebingen.mpg.de/?p=adu.git;a=blobdiff_plain;f=string.c;h=13555550efb6e1e567f66ca6f03158b79645ed7e;hp=17edffc5e9d9bef56d3f491ac12a83a01c2494cd;hb=1136bdfc82272850474eacba37cf87d01f6a1b7f;hpb=d2ce6e60cb915dff3a0920a0b48f786435bd4ec8 diff --git a/string.c b/string.c index 17edffc..1355555 100644 --- a/string.c +++ b/string.c @@ -138,7 +138,7 @@ __must_check __printf_1_2 __malloc char *make_message(const char *fmt, ...) * Append \p b to \p a. * * \return If \a a is \p NULL, return a pointer to a copy of \a b, i.e. - * para_strcat(NULL, b) is equivalent to para_strdup(b). If \a b is \p NULL, + * adu_strcat(NULL, b) is equivalent to adu_strdup(b). If \a b is \p NULL, * return \a a without making a copy of \a a. Otherwise, construct the * concatenation \a c, free \a a (but not \a b) and return \a c. * @@ -340,7 +340,7 @@ void free_argv(char **argv) * * In contrast to gengetopt's string parser, double quotes, backslash-escaped * characters and special characters like \p \\n are honored. The result - * contains pointers to copies of the words contained in \line and has to be + * contains pointers to copies of the words contained in \a line and has to be * freed by using \ref free_argv(). * * \param line The line to be split. @@ -373,3 +373,35 @@ err: free(argv); return ret; } + +char *absolute_path(const char *path) +{ + char *cwd, *ap; + long int path_max; + + if (!path || !path[0]) + return NULL; + if (path[0] == '/') + return adu_strdup(path); + +#ifdef PATH_MAX + path_max = PATH_MAX; +#else + /* + * The result of pathconf(3) may be huge and unsuitable for mallocing + * memory. OTOH pathconf(3) may return -1 to signify that PATH_MAX is + * not bounded. + */ + path_max = pathconf(name, _PC_PATH_MAX); + if (path_max <= 0 || path_max >= 4096) + path_max = 4096; +#endif + cwd = adu_malloc(path_max); + if (!getcwd(cwd, path_max)) { + free(cwd); + return NULL; + } + ap = make_message("%s/%s", cwd, path); + free(cwd); + return ap; +}