1da2e3ebdSchin /***********************************************************************
2da2e3ebdSchin * *
3da2e3ebdSchin * This software is part of the ast package *
4*3e14f97fSRoger A. Faulkner * Copyright (c) 1985-2010 AT&T Intellectual Property *
5da2e3ebdSchin * and is licensed under the *
6da2e3ebdSchin * Common Public License, Version 1.0 *
77c2fbfb3SApril Chin * by AT&T Intellectual Property *
8da2e3ebdSchin * *
9da2e3ebdSchin * A copy of the License is available at *
10da2e3ebdSchin * http://www.opensource.org/licenses/cpl1.0.txt *
11da2e3ebdSchin * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
12da2e3ebdSchin * *
13da2e3ebdSchin * Information and Software Systems Research *
14da2e3ebdSchin * AT&T Research *
15da2e3ebdSchin * Florham Park NJ *
16da2e3ebdSchin * *
17da2e3ebdSchin * Glenn Fowler <gsf@research.att.com> *
18da2e3ebdSchin * David Korn <dgk@research.att.com> *
19da2e3ebdSchin * Phong Vo <kpv@research.att.com> *
20da2e3ebdSchin * *
21da2e3ebdSchin ***********************************************************************/
22da2e3ebdSchin #pragma prototyped
23da2e3ebdSchin /*
24da2e3ebdSchin * Glenn Fowler
25da2e3ebdSchin * AT&T Research
26da2e3ebdSchin *
27da2e3ebdSchin * convert native path to posix fs representation in <buf,siz>
28da2e3ebdSchin * length of converted path returned
29da2e3ebdSchin * if return length >= siz then buf is indeterminate, but another call
30da2e3ebdSchin * with siz=length+1 would work
31da2e3ebdSchin * if buf==0 then required size is returned
32da2e3ebdSchin */
33da2e3ebdSchin
34da2e3ebdSchin #include <ast.h>
35da2e3ebdSchin
36da2e3ebdSchin #if _UWIN
37da2e3ebdSchin
38da2e3ebdSchin #include <uwin.h>
39da2e3ebdSchin
40da2e3ebdSchin size_t
pathposix(const char * path,char * buf,size_t siz)41da2e3ebdSchin pathposix(const char* path, char* buf, size_t siz)
42da2e3ebdSchin {
43da2e3ebdSchin return uwin_unpath(path, buf, siz);
44da2e3ebdSchin }
45da2e3ebdSchin
46da2e3ebdSchin #else
47da2e3ebdSchin
48da2e3ebdSchin #if __CYGWIN__
49da2e3ebdSchin
50da2e3ebdSchin extern void cygwin_conv_to_posix_path(const char*, char*);
51da2e3ebdSchin
52da2e3ebdSchin size_t
pathposix(const char * path,char * buf,size_t siz)53da2e3ebdSchin pathposix(const char* path, char* buf, size_t siz)
54da2e3ebdSchin {
55da2e3ebdSchin size_t n;
56da2e3ebdSchin
57da2e3ebdSchin if (!buf || siz < PATH_MAX)
58da2e3ebdSchin {
59da2e3ebdSchin char tmp[PATH_MAX];
60da2e3ebdSchin
61da2e3ebdSchin cygwin_conv_to_posix_path(path, tmp);
62da2e3ebdSchin if ((n = strlen(tmp)) < siz && buf)
63da2e3ebdSchin memcpy(buf, tmp, n + 1);
64da2e3ebdSchin return n;
65da2e3ebdSchin }
66da2e3ebdSchin cygwin_conv_to_posix_path(path, buf);
67da2e3ebdSchin return strlen(buf);
68da2e3ebdSchin }
69da2e3ebdSchin
70da2e3ebdSchin #else
71da2e3ebdSchin
72da2e3ebdSchin #if __EMX__ && 0 /* show me the docs */
73da2e3ebdSchin
74da2e3ebdSchin size_t
pathposix(const char * path,char * buf,size_t siz)75da2e3ebdSchin pathposix(const char* path, char* buf, size_t siz)
76da2e3ebdSchin {
77da2e3ebdSchin char* s;
78da2e3ebdSchin size_t n;
79da2e3ebdSchin
80da2e3ebdSchin if (!_posixpath(buf, path, siz))
81da2e3ebdSchin {
82da2e3ebdSchin for (s = buf; *s; s++)
83da2e3ebdSchin if (*s == '/')
84da2e3ebdSchin *s = '\\';
85da2e3ebdSchin }
86da2e3ebdSchin else if ((n = strlen(path)) < siz && buf)
87da2e3ebdSchin memcpy(buf, path, n + 1);
88da2e3ebdSchin return n;
89da2e3ebdSchin }
90da2e3ebdSchin
91da2e3ebdSchin #else
92da2e3ebdSchin
93da2e3ebdSchin #if __INTERIX
94da2e3ebdSchin
95da2e3ebdSchin #include <interix/interix.h>
96da2e3ebdSchin
97da2e3ebdSchin size_t
pathposix(const char * path,char * buf,size_t siz)98da2e3ebdSchin pathposix(const char* path, char *buf, size_t siz)
99da2e3ebdSchin {
100da2e3ebdSchin static const char pfx[] = "/dev/fs";
101da2e3ebdSchin
102da2e3ebdSchin *buf = 0;
103da2e3ebdSchin if (!strncasecmp(path, pfx, sizeof(pfx) - 1))
104da2e3ebdSchin strlcpy(buf, path, siz);
105da2e3ebdSchin else
106da2e3ebdSchin winpath2unix(path, PATH_NONSTRICT, buf, siz);
107da2e3ebdSchin return strlen(buf);
108da2e3ebdSchin }
109da2e3ebdSchin
110da2e3ebdSchin #else
111da2e3ebdSchin
112da2e3ebdSchin size_t
pathposix(const char * path,char * buf,size_t siz)113da2e3ebdSchin pathposix(const char* path, char* buf, size_t siz)
114da2e3ebdSchin {
115da2e3ebdSchin size_t n;
116da2e3ebdSchin
117da2e3ebdSchin if ((n = strlen(path)) < siz && buf)
118da2e3ebdSchin memcpy(buf, path, n + 1);
119da2e3ebdSchin return n;
120da2e3ebdSchin }
121da2e3ebdSchin
122da2e3ebdSchin #endif
123da2e3ebdSchin
124da2e3ebdSchin #endif
125da2e3ebdSchin
126da2e3ebdSchin #endif
127da2e3ebdSchin
128da2e3ebdSchin #endif
129