/*! \relates XsFile \brief Retrieves the full path for a filename \param[in] filename The filename to expand \param[out] fullPath The filename with a fully expanded path is returned in this parameter. This parameter must be allocated by the caller. \returns XRV_OK if the fullpath could be retrieved, XRV_NULLPTR if fullPath is NULL, XRV_ERROR otherwise */ XsResultValue XsFile_fullPath(const struct XsString* filename, struct XsString* fullPath) { XsResultValue result = XRV_OK; if (fullPath == NULL) { result = XRV_NULLPTR; } else { #ifdef _WIN32 wchar_t filenamew[XS_MAX_FILENAME_LENGTH]; wchar_t fullpath[XS_MAX_FILENAME_LENGTH]; (void)XsString_copyToWCharArray(filename, filenamew, XS_MAX_FILENAME_LENGTH); if (_wfullpath(fullpath, filenamew, XS_MAX_FILENAME_LENGTH) == NULL) result = XRV_ERROR; else XsString_assignWCharArray(fullPath, fullpath); #else // based on the assumption that this doesn't concern the serial port, handle // it the same way using realpath(). Apparently realpath() doesn't require a // maximum length. One would possibly want to write a wrapper for it. char fullpath[XS_MAX_FILENAME_LENGTH*2]; if (realpath(filename->m_data, fullpath) == NULL) result = XRV_ERROR; else XsString_assignCharArray(fullPath, fullpath); #endif } return result; }
/*! \brief Get an error string after a failure occurred \param[in,out] error the string to fill with the result error */ void XsLibraryLoader_getErrorString(XsString* error) { #ifdef __GNUC__ XsString_assignCharArray(error, dlerror()); #elif defined(_MSC_VER) LPTSTR errorText = NULL; (void)FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_ALLOCATE_BUFFER |FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&errorText, 0, NULL); XsString_assignWCharArray(error, errorText); LocalFree(errorText); #endif }