/*********************************************************************** * * * This software is part of the ast package * * Copyright (c) 1985-2009 AT&T Intellectual Property * * and is licensed under the * * Common Public License, Version 1.0 * * by AT&T Intellectual Property * * * * A copy of the License is available at * * http://www.opensource.org/licenses/cpl1.0.txt * * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * * * * Information and Software Systems Research * * AT&T Research * * Florham Park NJ * * * * Glenn Fowler * * David Korn * * Phong Vo * * * ***********************************************************************/ #pragma prototyped /* * Glenn Fowler * AT&T Research * * convert native path to posix fs representation in * length of converted path returned * if return length >= siz then buf is indeterminate, but another call * with siz=length+1 would work * if buf==0 then required size is returned */ #include #if _UWIN #include size_t pathposix(const char* path, char* buf, size_t siz) { return uwin_unpath(path, buf, siz); } #else #if __CYGWIN__ extern void cygwin_conv_to_posix_path(const char*, char*); size_t pathposix(const char* path, char* buf, size_t siz) { size_t n; if (!buf || siz < PATH_MAX) { char tmp[PATH_MAX]; cygwin_conv_to_posix_path(path, tmp); if ((n = strlen(tmp)) < siz && buf) memcpy(buf, tmp, n + 1); return n; } cygwin_conv_to_posix_path(path, buf); return strlen(buf); } #else #if __EMX__ && 0 /* show me the docs */ size_t pathposix(const char* path, char* buf, size_t siz) { char* s; size_t n; if (!_posixpath(buf, path, siz)) { for (s = buf; *s; s++) if (*s == '/') *s = '\\'; } else if ((n = strlen(path)) < siz && buf) memcpy(buf, path, n + 1); return n; } #else #if __INTERIX #include size_t pathposix(const char* path, char *buf, size_t siz) { static const char pfx[] = "/dev/fs"; *buf = 0; if (!strncasecmp(path, pfx, sizeof(pfx) - 1)) strlcpy(buf, path, siz); else winpath2unix(path, PATH_NONSTRICT, buf, siz); return strlen(buf); } #else size_t pathposix(const char* path, char* buf, size_t siz) { size_t n; if ((n = strlen(path)) < siz && buf) memcpy(buf, path, n + 1); return n; } #endif #endif #endif #endif