Esempio n. 1
0
void _splitpath( const char *path, char *drive, char *dir, char *fname, char *ext )
/*********************************************************************************/
{
    const char *dotp;
    const char *fnamep;
    const char *startp;
    unsigned    ch;

    /* take apart specification like -> //0/hd/user/fred/filename.ext for QNX */
    /* take apart specification like -> c:\fred\filename.ext for DOS, OS/2 */

    /* process node/drive specification */
    startp = path;
    if( path[0] == PC  &&  path[1] == PC ) {
        path += 2;
        for( ;; ) {
            if( *path == '\0' ) break;
            if( *path == PC ) break;
            if( *path == '.' ) break;
            path++;
        }
    }
    copypart( drive, startp, path - startp, _MAX_NODE );

    /* process /user/fred/filename.ext for QNX */
    /* process /fred/filename.ext for DOS, OS/2 */
    dotp = NULL;
    fnamep = path;
    startp = path;

    for(;;) {           /* 07-jul-91 DJG -- save *path in ch for speed */
        if( *path == '\0' )  break;
        ch = *path;
        if( ch == '.' ) {
            dotp = path;
            ++path;
            continue;
        }
        path++;
        if( ISPC(ch) ) {
            fnamep = path;
            dotp = NULL;
        }
    }
    copypart( dir, startp, fnamep - startp, _MAX_DIR - 1 );
    if( dotp == NULL ) dotp = path;
    copypart( fname, fnamep, dotp - fnamep, _MAX_FNAME - 1 );
    copypart( ext,   dotp,   path - dotp,   _MAX_EXT - 1);
}
Esempio n. 2
0
_WCRTLINK void __F_NAME(_splitpath,_wsplitpath)( const CHAR_TYPE *path,
    CHAR_TYPE *drive, CHAR_TYPE *dir, CHAR_TYPE *fname, CHAR_TYPE *ext )
{
    const CHAR_TYPE *dotp;
    const CHAR_TYPE *fnamep;
    const CHAR_TYPE *startp;
    UINT_WC_TYPE    ch;
#ifdef __NETWARE__
    const CHAR_TYPE *ptr;
#endif

    /* take apart specification like -> //0/hd/user/fred/filename.ext for QNX */
    /* take apart specification like -> c:\fred\filename.ext for DOS, OS/2 */

#if defined(__UNIX__)

    /* process node/drive specification */
    startp = path;
    if( path[0] == DIR_SEP && path[1] == DIR_SEP ) {
        path += 2;
        for( ;; ) {
            if( *path == NULLCHAR )
                break;
            if( *path == DIR_SEP )
                break;
            if( *path == STRING( '.' ) )
                break;
            ++path;
        }
    }
    copypart( drive, startp, path - startp, _MAX_NODE );

#elif defined(__NETWARE__)

  #ifdef __WIDECHAR__
        ptr = wcschr( path, DRV_SEP );
  #else
        ptr = _mbschr( (unsigned char *)path, DRV_SEP );
  #endif
    if( ptr != NULL ) {
        if( drive != NULL ) {
            copypart( drive, path, ptr - path + 1, _MAX_SERVER + _MAX_VOLUME + 1 );
        }
  #if defined( __WIDECHAR__ )
        path = ptr + 1;
  #else
        path = _mbsinc( ptr );
  #endif
    } else if( drive != NULL ) {
        *drive = NULLCHAR;
    }

#else

    /* processs drive specification */
    if( path[0] != NULLCHAR && path[1] == DRV_SEP ) {
        if( drive != NULL ) {
            drive[0] = path[0];
            drive[1] = DRV_SEP;
            drive[2] = NULLCHAR;
        }
        path += 2;
    } else if( drive != NULL ) {
        drive[0] = NULLCHAR;
    }

#endif

    /* process /user/fred/filename.ext for QNX */
    /* process /fred/filename.ext for DOS, OS/2 */
    dotp = NULL;
    fnamep = path;
    startp = path;

    for( ;; ) {         /* 07-jul-91 DJG -- save *path in ch for speed */
        if( *path == NULLCHAR )
            break;
#if defined( __WIDECHAR__ ) || defined( __UNIX__ ) || defined( __RDOS__ ) || defined( __RDOSDEV__ )
        ch = *path;
#else
        ch = _mbsnextc( (unsigned char *)path );
#endif
        if( ch == EXT_SEP ) {
            dotp = path;
            ++path;
            continue;
        }
#if defined( __WIDECHAR__ ) || defined( __UNIX__ ) || defined( __RDOS__ ) || defined( __RDOSDEV__ )
        ++path;
#else
        path = (char *)_mbsinc( (unsigned char *)path );
#endif
        if( IS_DIR_SEP( ch ) ) {
            fnamep = path;
            dotp = NULL;
        }
    }
    copypart( dir, startp, fnamep - startp, _MAX_DIR - 1 );
    if( dotp == NULL )
        dotp = path;
    copypart( fname, fnamep, dotp - fnamep, _MAX_FNAME - 1 );
    copypart( ext,   dotp,   path - dotp,   _MAX_EXT - 1);
}
Esempio n. 3
0
_WCRTLINK void __F_NAME(_splitpath,_wsplitpath)( const CHAR_TYPE *path,
    CHAR_TYPE *drive, CHAR_TYPE *dir, CHAR_TYPE *fname, CHAR_TYPE *ext )
{
    const CHAR_TYPE *dotp;
    const CHAR_TYPE *fnamep;
    const CHAR_TYPE *startp;
#ifndef __WIDECHAR__
    unsigned    ch;
#else
    CHAR_TYPE   ch;
#endif
#ifdef __NETWARE__
    const CHAR_TYPE *ptr;
#endif

    /* take apart specification like -> //0/hd/user/fred/filename.ext for QNX */
    /* take apart specification like -> c:\fred\filename.ext for DOS, OS/2 */

#if defined(__UNIX__)

    /* process node/drive specification */
    startp = path;
    if( path[ 0 ] == PC && path[ 1 ] == PC ) {
        path += 2;
        for( ;; ) {
            if( *path == NULLCHAR )
                break;
            if( *path == PC )
                break;
            if( *path == '.' )
                break;
  #ifdef __WIDECHAR__
            ++path;
  #else
    #ifdef __UNIX__
            path++;
    #else
            path = _mbsinc( path );
    #endif
  #endif
        }
    }
    copypart( drive, startp, path - startp, _MAX_NODE );

#elif defined(__NETWARE__)

  #ifdef __WIDECHAR__
        ptr = wcschr( path, ':' );
  #else
    #ifdef __UNIX__
        ptr = strchr( path, ':' );
    #else
        ptr = _mbschr( path, ':' );
    #endif
  #endif
    if( ptr != NULL ) {
        if( drive != NULL ) {
            copypart( drive, path, ptr - path + 1, _MAX_SERVER +
                      _MAX_VOLUME + 1 );
        }
  #ifdef __WIDECHAR__
        path = ptr + 1;
  #else
    #ifdef __UNIX__
        path = ptr + 1;
    #else
        path = _mbsinc( ptr );
    #endif
  #endif
    } else if( drive != NULL ) {
        *drive = '\0';
    }

#else

    /* processs drive specification */
    if( path[ 0 ] != NULLCHAR  &&  path[ 1 ] == ':' ) {
        if( drive != NULL ) {
            drive[ 0 ] = path[ 0 ];
            drive[ 1 ] = ':';
            drive[ 2 ] = NULLCHAR;
        }
        path += 2;
    } else if( drive != NULL ) {
        drive[ 0 ] = NULLCHAR;
    }

#endif

    /* process /user/fred/filename.ext for QNX */
    /* process /fred/filename.ext for DOS, OS/2 */
    dotp = NULL;
    fnamep = path;
    startp = path;

    for( ;; ) {         /* 07-jul-91 DJG -- save *path in ch for speed */
        if( *path == NULLCHAR )
            break;
#ifdef __WIDECHAR__
        ch = *path;
#else
  #ifdef __UNIX__
        ch = *path;
  #else
        ch = _mbsnextc( path );
  #endif
#endif
        if( ch == '.' ) {
            dotp = path;
            ++path;
            continue;
        }
#ifdef __WIDECHAR__
        ++path;
#else
  #ifdef __UNIX__
        path++;
  #else
        path = _mbsinc( path );
  #endif
#endif
#if defined(__UNIX__)
        if( ch == PC ) {
#else /* DOS, OS/2, Windows, Netware */
        if( ch == PC || ch == ALT_PC ) {
#endif
            fnamep = path;
            dotp = NULL;
        }
    }
    copypart( dir, startp, fnamep - startp, _MAX_DIR - 1 );
    if( dotp == NULL )
        dotp = path;
    copypart( fname, fnamep, dotp - fnamep, _MAX_FNAME - 1 );
    copypart( ext,   dotp,   path - dotp,   _MAX_EXT - 1);
}