void _makepath( char *path, const char *node, const char *dir, const char *fname, const char *ext ) /*************************************************************************************************/ { *path = '\0'; if( node != NULL ) { if( *node != '\0' ) { strcpy( path, node ); path = strchr( path, '\0' ); /* if node did not end in '/' then put in a provisional one */ if( path[-1] == PC ) path--; else *path = PC; } } if( dir != NULL ) { if( *dir != '\0' ) { /* if dir does not start with a '/' and we had a node then stick in a separator */ if( ( ! ISPC(*dir) ) && ( ISPC(*path) ) ) path++; strcpy( path, dir ); path = strchr( path, '\0' ); /* if dir did not end in '/' then put in a provisional one */ if( path[-1] == PC ) path--; else *path = PC; } } if( fname != NULL ) { if( ( !ISPC(*fname) ) && ( ISPC(*path) ) ) path++; strcpy( path, fname ); path = strchr( path, '\0' ); } else { if( ISPC(*path) ) path++; } if( ext != NULL ) { if( *ext != '\0' ) { if( *ext != '.' ) *path++ = '.'; strcpy( path, ext ); path = strchr( path, '\0' ); } } *path = '\0'; }
const char *GetFNamePart( const char *fname ) /*******************************************/ { const char *rc; for ( rc = fname; *fname; fname++ ) if ( ISPC( *fname ) ) rc = fname + 1; return( rc ); }
char *GetExtPart( const char *fname ) /***********************************/ { char *rc; for( rc = NULL; *fname; fname++ ) { if( *fname == '.' ) { rc = (char *)fname; } else if( ISPC( *fname ) ) { rc = NULL; } } return( rc ? rc : (char *)fname ); }
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); }
static char *_sys_fullpath( char *buff, const char *path, size_t size ) /*********************************************************************/ { const char *p; char *q; size_t len; char curr_dir[_MAX_PATH]; p = path; q = buff; if( ! ISPC( p[0] ) ) { if( getcwd( curr_dir, sizeof(curr_dir) ) == NULL ) { __set_errno( ENOENT ); return( NULL ); } len = strlen( curr_dir ); _WILL_FIT( len ); strcpy( q, curr_dir ); q += len; if( q[-1] != '/' ) { _WILL_FIT( 1 ); *(q++) = '/'; } for(;;) { if( p[0] == '\0' ) break; if( p[0] != '.' ) { _WILL_FIT( 1 ); *(q++) = *(p++); continue; } ++p; if( ISPC( p[0] ) ) { /* ignore "./" in directory specs */ if( ! ISPC( q[-1] ) ) { *q++ = '/'; } ++p; continue; } if( p[0] == '\0' ) break; if( p[0] == '.' && ISPC( p[1] ) ) { /* go up a directory for a "../" */ p += 2; if( ! ISPC( q[-1] ) ) { return( NULL ); } q -= 2; for(;;) { if( q < buff ) { return( NULL ); } if( ISPC( *q ) ) break; --q; } ++q; *q = '\0'; continue; } _WILL_FIT( 1 ); *(q++) = '.'; } *q = '\0'; } else { len = strlen( p ); _WILL_FIT( len ); strcpy( q, p ); } return( buff ); }