wxString wxRealPath(const wxString& path) { wxChar *buf1=MYcopystring(path); wxChar *buf2=wxRealPath(buf1); wxString buf(buf2); delete [] buf1; return buf; }
// Eliminate .. and . wxString wxGetRealPath(const wxString& path) { wxChar* p = new wxChar[path.Len() + 1]; wxStrcpy(p, (const wxChar*) path); wxRealPath(p); wxString str(p); delete[] p; return str; }
// Must be destroyed wxChar *wxCopyAbsolutePath(const wxString& filename) { if (filename.empty()) return NULL; if (! wxIsAbsolutePath(wxExpandPath(wxFileFunctionsBuffer, filename))) { wxString buf = ::wxGetCwd(); wxChar ch = buf.Last(); #ifdef __WINDOWS__ if (ch != wxT('\\') && ch != wxT('/')) buf << wxT("\\"); #else if (ch != wxT('/')) buf << wxT("/"); #endif buf << wxFileFunctionsBuffer; buf = wxRealPath( buf ); return MYcopystring( buf ); } return MYcopystring( wxFileFunctionsBuffer ); }
static CharType *wxDoExpandPath(CharType *buf, const wxString& name) { CharType *d, *s, *nm; CharType lnm[_MAXPATHLEN]; int q; // Some compilers don't like this line. // const CharType trimchars[] = wxT("\n \t"); CharType trimchars[4]; trimchars[0] = wxT('\n'); trimchars[1] = wxT(' '); trimchars[2] = wxT('\t'); trimchars[3] = 0; static const CharType SEP = wxFILE_SEP_PATH; #ifdef __WINDOWS__ //wxUnix2DosFilename(path); #endif buf[0] = wxT('\0'); if (name.empty()) return buf; nm = ::MYcopystring(static_cast<const CharType*>(name.c_str())); // Make a scratch copy CharType *nm_tmp = nm; /* Skip leading whitespace and cr */ while (wxStrchr(trimchars, *nm) != NULL) nm++; /* And strip off trailing whitespace and cr */ s = nm + (q = wxStrlen(nm)) - 1; while (q-- && wxStrchr(trimchars, *s) != NULL) *s = wxT('\0'); s = nm; d = lnm; #ifdef __WINDOWS__ q = FALSE; #else q = nm[0] == wxT('\\') && nm[1] == wxT('~'); #endif /* Expand inline environment variables */ while ((*d++ = *s) != 0) { # ifndef __WINDOWS__ if (*s == wxT('\\')) { if ((*(d - 1) = *++s)!=0) { s++; continue; } else break; } else # endif #ifdef __WINDOWS__ if (*s++ == wxT('$') && (*s == wxT('{') || *s == wxT(')'))) #else if (*s++ == wxT('$')) #endif { CharType *start = d; int braces = (*s == wxT('{') || *s == wxT('(')); CharType *value; while ((*d++ = *s) != 0) if (braces ? (*s == wxT('}') || *s == wxT(')')) : !(wxIsalnum(*s) || *s == wxT('_')) ) break; else s++; *--d = 0; value = wxGetenv(braces ? start + 1 : start); if (value) { for ((d = start - 1); (*d++ = *value++) != 0;) { // Empty } d--; if (braces && *s) s++; } } } /* Expand ~ and ~user */ wxString homepath; nm = lnm; if (nm[0] == wxT('~') && !q) { /* prefix ~ */ if (nm[1] == SEP || nm[1] == 0) { /* ~/filename */ homepath = wxGetUserHome(wxEmptyString); if (!homepath.empty()) { s = (CharType*)(const CharType*)homepath.c_str(); if (*++nm) nm++; } } else { /* ~user/filename */ CharType *nnm; for (s = nm; *s && *s != SEP; s++) { // Empty } int was_sep; /* MATTHEW: Was there a separator, or NULL? */ was_sep = (*s == SEP); nnm = *s ? s + 1 : s; *s = 0; homepath = wxGetUserHome(wxString(nm + 1)); if (homepath.empty()) { if (was_sep) /* replace only if it was there: */ *s = SEP; s = NULL; } else { nm = nnm; s = (CharType*)(const CharType*)homepath.c_str(); } } } d = buf; if (s && *s) { /* MATTHEW: s could be NULL if user '~' didn't exist */ /* Copy home dir */ while (wxT('\0') != (*d++ = *s++)) /* loop */; // Handle root home if (d - 1 > buf && *(d - 2) != SEP) *(d - 1) = SEP; } s = nm; while ((*d++ = *s++) != 0) { // Empty } delete[] nm_tmp; // clean up alloc /* Now clean up the buffer */ return wxRealPath(buf); }