windows-nt/Source/XPSP1/NT/base/crts/crtw32/misc/makepath.c

131 lines
3 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/***
*makepath.c - create path name from components
*
* Copyright (c) 1987-2001, Microsoft Corporation. All rights reserved.
*
*Purpose:
* To provide support for creation of full path names from components
*
*Revision History:
* 06-13-87 DFW initial version
* 08-05-87 JCR Changed appended directory delimeter from '/' to '\'.
* 09-24-87 JCR Removed 'const' from declarations (caused cl warnings).
* 12-11-87 JCR Added "_LOAD_DS" to declaration
* 11-20-89 GJF Fixed copyright, indents. Added const to types of
* appropriate args.
* 03-14-90 GJF Replaced _LOAD_DS with _CALLTYPE1 and added #include
* <cruntime.h>.
* 10-04-90 GJF New-style function declarator.
* 06-09-93 KRS Add _MBCS support.
* 12-07-93 CFW Wide char enable.
*
*******************************************************************************/
#include <cruntime.h>
#include <stdlib.h>
#ifdef _MBCS
#include <mbdata.h>
#include <mbstring.h>
#endif
#include <tchar.h>
/***
*void _makepath() - build path name from components
*
*Purpose:
* create a path name from its individual components
*
*Entry:
* _TSCHAR *path - pointer to buffer for constructed path
* _TSCHAR *drive - pointer to drive component, may or may not contain
* trailing ':'
* _TSCHAR *dir - pointer to subdirectory component, may or may not include
* leading and/or trailing '/' or '\' characters
* _TSCHAR *fname - pointer to file base name component
* _TSCHAR *ext - pointer to extension component, may or may not contain
* a leading '.'.
*
*Exit:
* path - pointer to constructed path name
*
*Exceptions:
*
*******************************************************************************/
void __cdecl _tmakepath (
register _TSCHAR *path,
const _TSCHAR *drive,
const _TSCHAR *dir,
const _TSCHAR *fname,
const _TSCHAR *ext
)
{
register const _TSCHAR *p;
/* we assume that the arguments are in the following form (although we
* do not diagnose invalid arguments or illegal filenames (such as
* names longer than 8.3 or with illegal characters in them)
*
* drive:
* A ; or
* A:
* dir:
* \top\next\last\ ; or
* /top/next/last/ ; or
* either of the above forms with either/both the leading
* and trailing / or \ removed. Mixed use of '/' and '\' is
* also tolerated
* fname:
* any valid file name
* ext:
* any valid extension (none if empty or null )
*/
/* copy drive */
if (drive && *drive) {
*path++ = *drive;
*path++ = _T(':');
}
/* copy dir */
if ((p = dir) && *p) {
do {
*path++ = *p++;
}
while (*p);
#ifdef _MBCS
if (*(p=_mbsdec(dir,p)) != _T('/') && *p != _T('\\')) {
#else
if (*(p-1) != _T('/') && *(p-1) != _T('\\')) {
#endif
*path++ = _T('\\');
}
}
/* copy fname */
if (p = fname) {
while (*p) {
*path++ = *p++;
}
}
/* copy ext, including 0-terminator - check to see if a '.' needs
* to be inserted.
*/
if (p = ext) {
if (*p && *p != _T('.')) {
*path++ = _T('.');
}
while (*path++ = *p++)
;
}
else {
/* better add the 0-terminator */
*path = _T('\0');
}
}