On 8/17/05, Linus Torvalds <[EMAIL PROTECTED]> wrote:
> NOTE! This does _not_ handle ".." or "." in the _middle_ of a pathspec. If
> you have people who do
BTW, could this (below) be useful for something?
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
// an analog of "cd path" from a directory "cwd".
char* pathexpand(const char* cwd, const char* path)
{
static const char SEP[] = "/";
if ( !*path ) // empty path -> "." (don't move)
path = ".";
if ( !*cwd || *SEP == *path ) // no cwd, or path begins with "/"
cwd = SEP;
int len = strlen(cwd);
char* out = (char*)malloc(len + 1 + strlen(path) + 1);
char* p = strcpy(out, cwd) + len;
if ( *SEP != p[-1] )
*p++ = *SEP;
for ( ; *path; ++path )
{
char * pl = p;
while ( *path && *SEP != *path )
*p++ = *path++;
*p = '\0';
if ( p == pl ) /* ..."//"... */
; // just ignore
/* ..."/./"... */
else if ( p - pl == 1 && '.' == *pl )
--p; // just ignore
/* ..."/../"... */
else if ( p - pl == 2 && '.' == pl[0] && '.' == pl[1] )
{
// drop last element of the resulting path
if ( --pl > out )
for ( --pl; pl > out && *SEP != *pl; --pl );
p = ++pl;
}
/* ..."/path/"... */
else if ( *path )
*p++ = *path; // just add the separator
if ( !*path )
break;
}
if ( p > out+1 && *SEP == p[-1] )
--p;
*p = '\0';
return out;
}
#ifdef CHECK_PATHEXPAND
static void check(const char * cwd, const char * path, const char * good)
{
static int n = 0;
printf("%-2d: %s$ cd %s", ++n, cwd, path);
char* t = pathexpand(cwd, path);
if ( strcmp(t, good) )
printf(" failed(%s)\n", t);
else
printf(" \t\t%s\n", t);
free(t);
}
int main(int argc, char** argv)
{
/* 1 */ check("/onelevel", "aa", "/onelevel/aa");
/* 2 */ check("/", "..", "/");
/* 3 */ check("/", "../..", "/");
/* 4 */ check("/one", "aa/../bb", "/one/bb");
/* 5 */ check("/one/two", "aa//bb", "/one/two/aa/bb");
/* 6 */ check("", "/aa//bb", "/aa/bb");
/* 7 */ check("/one/two", "", "/one/two");
/* 8 */ check("/one/two", "aa/..bb/x/../cc/", "/one/two/aa/..bb/cc");
/* 9 */ check("/one/two", "aa/x/././cc////", "/one/two/aa/x/cc");
/* 10 */ check("/one/two", "../../../../aa", "/aa");
return 0;
}
#endif
-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html