109 lines
3.0 KiB
C
109 lines
3.0 KiB
C
/***
|
|
*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
|
|
*
|
|
*******************************************************************************/
|
|
|
|
//ASH: Need this on xbox for pre-compiled headers.
|
|
//#include "stdafx.h"
|
|
#include "makepath.h"
|
|
/***
|
|
*void _makepath() - build path name from components
|
|
*
|
|
*Purpose:
|
|
* create a path name from its individual components
|
|
*
|
|
*Entry:
|
|
* char *path - pointer to buffer for constructed path
|
|
* char *drive - pointer to drive component, may or may not contain
|
|
* trailing ':'
|
|
* char *dir - pointer to subdirectory component, may or may not include
|
|
* leading and/or trailing '/' or '\' characters
|
|
* char *fname - pointer to file base name component
|
|
* char *ext - pointer to extension component, may or may not contain
|
|
* a leading '.'.
|
|
*
|
|
*Exit:
|
|
* path - pointer to constructed path name
|
|
*
|
|
*Exceptions:
|
|
*
|
|
*******************************************************************************/
|
|
#ifndef WIN32
|
|
void portable_makepath (
|
|
char *path,
|
|
const char *drive,
|
|
const char *dir,
|
|
const char *fname,
|
|
const char *ext
|
|
)
|
|
{
|
|
const char *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++ = (':');
|
|
}
|
|
|
|
/* copy dir */
|
|
|
|
if ((p = dir) && *p) {
|
|
do {
|
|
*path++ = *p++;
|
|
}
|
|
while (*p);
|
|
if (*(p-1) != '/' && *(p-1) != ('\\')) {
|
|
*path++ = ('\\');
|
|
}
|
|
}
|
|
|
|
/* 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 != ('.')) {
|
|
*path++ = ('.');
|
|
}
|
|
while (*path++ = *p++)
|
|
;
|
|
}
|
|
else {
|
|
/* better add the 0-terminator */
|
|
*path = ('\0');
|
|
}
|
|
}
|
|
#endif |