On Wed, Mar 14, 2001 at 03:29:49PM -0600, William A. Rowe, Jr. wrote: > From: "Kevin Pilch-Bisson" <[EMAIL PROTECTED]> > Sent: Wednesday, March 14, 2001 3:08 PM > > > > > > Would there be a way to convert an incomplete path to a complete path? > > > > (change drive to c:, getpwd, append foo, in the above example) > > > > > > That is what apr_filepath_merge does for you. You can pass a partial > > > root [/ or d:] > > > apr_filepath_root over to apr_filepath_merge as the addpath (with a null > > > root). That > > > will return a true root. apr_filepath_root is as much to help > > > apr_filepath_merge > > > (and any other app) break apart the root from a name, since the root is > > > very platform > > > specific (moreso than any other part of this debate.) Look at netware > > > machine/sys:/ > > > versus win32/os2, toss in unc names and unix remote volumes and ugh, what > > > a mess. > > > > > I believe you, I am just a little confused as to the process. Say I do > > the following: > > > > C:\mywork\subversion\ > svn commit C:foo > > > > which eventually reaches the following code. > > > > char added_path[][] = { "C:foo", NULL }; > > (or should this be { "C:", "foo", NULL }; ?) > > char *newpath; > > apr_filepath_merge(&newpath, NULL, added_path, APR_FILEPATH_TRUEPATH, p); > > > > What do I get back from apr_filepath_merge? Or more to the point, how > > can I get C:\mywork\subversion\foo as newpath? > > Simply, rootpath == NULL uses CWD, therefore c:\mywork\subversion. > > > char *newpath = "foo" > char **addpath = &newpath > char **newpath; > > apr_filepath_merge(&newpath, NULL, addpath, APR_FILEPATH_TRUEPATH, p); > > If foo exists, newpath == "c:\mywork\subversion\foo", and addpath += 4 > (points to the trailing NULL of the string you passed). > > If foo is not found, newpath == "c:\mywork\subversion\" and addpath didn't > change (the path wasn't found. > > If you pass "foo/bar" as addpath, and foo exists, then ".../foo/" is retured > for newpath, and addpath += 4 (pointing at "bar") if bar was not found. > > Of course, without APR_FILEPATH_TRUEPATH, the whole thing just returns, and > doesn't care if the path names are real. With APR_FILEPATH_TRUECASE, those > parts that exist are returned with the correct case followed by the remaining > given path, since it also doesn't care if the files exist, only that the > names that exist are the proper case. Both of these would set point addpath > to it's own trailing NULL. > > The Q. remains, do we want char** addpath, or simply a char* with no feedback > of existing v.s. nonexisting path components? > > Bill > > Right. Now say the target was D:foo, but my current drive was C:, as in D:\mywork\subversion> C: C:\Program Files\Subversion> svn commit D:foo
How do I find out that D:foo is really D:\mywork\subversion\foo? On another note, I thought of another root case to be handled under UNIX. Cygwin with windows drives. I.e. / is %SYSDRIVE%:\, but //c/ is C:\ and //d/ is D:\. The double slashes are important to cygwin. What a PITA. Sometimes I don't know whether I am glad for cygwin because it makes having to use 'Doze at work less annoying, or pissed of because of the hassle it makes for real unix development! -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Kevin Pilch-Bisson http://www.pilch-bisson.net "Historically speaking, the presences of wheels in Unix has never precluded their reinvention." - Larry Wall ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~