/*
 * Copyright 2000 Martin Fuchs
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#include "winefile.h"

#ifdef UNICODE

void _wsplitpath(const WCHAR* path, WCHAR* drv, WCHAR* dir, WCHAR* name, WCHAR* ext)
{
	const WCHAR* end; // end of processed string
	const WCHAR* p;	  // search pointer
	const WCHAR* s;	  // copy pointer

	 // extract drive name
	if (path[0] && path[1]==':') {
		if (drv) {
			*drv++ = *path++;
			*drv++ = *path++;
			*drv = L'\0';
		}
	} else if (drv)
		*drv = L'\0';

	 // search for end of string or stream separator
	for(end=path; *end && *end!=L':'; )
		end++;

	 // search for begin of file extension
	for(p=end; p>path && *--p!=L'\\' && *p!=L'/'; )
		if (*p == L'.') {
			end = p;
			break;
		}

	if (ext)
		for(s=end; *ext=*s++; )
			ext++;

	 // search for end of directory name
	for(p=end; p>path; )
		if (*--p=='\\' || *p=='/') {
			p++;
			break;
		}

	if (name) {
		for(s=p; s<end; )
			*name++ = *s++;

		*name = L'\0';
	}

	if (dir) {
		for(s=path; s<p; )
			*dir++ = *s++;

		*dir = L'\0';
	}
}

#else

void _splitpath(const CHAR* path, CHAR* drv, CHAR* dir, CHAR* name, CHAR* ext)
{
	const CHAR* end; // end of processed string
	const CHAR* p;	 // search pointer
	const CHAR* s;	 // copy pointer

	 // extract drive name
	if (path[0] && path[1]==':') {
		if (drv) {
			*drv++ = *path++;
			*drv++ = *path++;
			*drv = '\0';
		}
	} else if (drv)
		*drv = '\0';

	 // search for end of string or stream separator
	for(end=path; *end && *end!=':'; )
		end++;

	 // search for begin of file extension
	for(p=end; p>path && *--p!='\\' && *p!='/'; )
		if (*p == '.') {
			end = p;
			break;
		}

	if (ext)
		for(s=end; (*ext=*s++); )
			ext++;

	 // search for end of directory name
	for(p=end; p>path; )
		if (*--p=='\\' || *p=='/') {
			p++;
			break;
		}

	if (name) {
		for(s=p; s<end; )
			*name++ = *s++;

		*name = '\0';
	}

	if (dir) {
		for(s=path; s<p; )
			*dir++ = *s++;

		*dir = '\0';
	}
}

#endif

/*
void main()	// test splipath()
{
	TCHAR drv[_MAX_DRIVE+1], dir[_MAX_DIR], name[_MAX_FNAME], ext[_MAX_EXT];

	_tsplitpath(L"x\\y", drv, dir, name, ext);
	_tsplitpath(L"x\\", drv, dir, name, ext);
	_tsplitpath(L"\\x", drv, dir, name, ext);
	_tsplitpath(L"x", drv, dir, name, ext);
	_tsplitpath(L"", drv, dir, name, ext);
	_tsplitpath(L".x", drv, dir, name, ext);
	_tsplitpath(L":x", drv, dir, name, ext);
	_tsplitpath(L"a:x", drv, dir, name, ext);
	_tsplitpath(L"a.b:x", drv, dir, name, ext);
	_tsplitpath(L"W:\\/\\abc/Z:~", drv, dir, name, ext);
	_tsplitpath(L"abc.EFGH:12345", drv, dir, name, ext);
	_tsplitpath(L"C:/dos/command.com", drv, dir, name, ext);
}
*/
