GetLongPathName rewrite.
diff --git a/files/dos_fs.c b/files/dos_fs.c
index 313db95..792663a 100644
--- a/files/dos_fs.c
+++ b/files/dos_fs.c
@@ -1001,27 +1001,52 @@
DWORD longlen )
{
DOS_FULL_NAME full_name;
- char *p;
- char *longfilename;
- DWORD shortpathlen;
+ char *p, *r, *ll, *ss;
if (!DOSFS_GetFullName( shortpath, TRUE, &full_name )) return 0;
lstrcpynA( longpath, full_name.short_name, longlen );
- /* Do some hackery to get the long filename.
- * FIXME: Would be better if it returned the
- * long version of the directories too
- */
- longfilename = strrchr(full_name.long_name, '/')+1;
- if (longpath != NULL) {
- if ((p = strrchr( longpath, '\\' )) != NULL) {
- p++;
- longlen -= (p-longpath);
- lstrcpynA( p, longfilename , longlen);
- }
+
+ /* Do some hackery to get the long filename. */
+
+ if (longpath) {
+ ss=longpath+strlen(longpath);
+ ll=full_name.long_name+strlen(full_name.long_name);
+ p=NULL;
+ while (ss>=longpath)
+ {
+ /* FIXME: aren't we more paranoid, than needed? */
+ while ((ss[0]=='\\') && (ss>=longpath)) ss--;
+ p=ss;
+ while ((ss[0]!='\\') && (ss>=longpath)) ss--;
+ if (ss>=longpath)
+ {
+ /* FIXME: aren't we more paranoid, than needed? */
+ while ((ll[0]=='/') && (ll>=full_name.long_name)) ll--;
+ while ((ll[0]!='/') && (ll>=full_name.long_name)) ll--;
+ if (ll<full_name.long_name)
+ {
+ ERR("Bad longname! (ss=%s ll=%s)\n This should never happen !\n"
+ ,ss ,ll );
+ return 0;
+ }
+ }
+ }
+
+ /* FIXME: fix for names like "C:\\" (ie. with more '\'s) */
+ if (p && p[2])
+ {
+ p+=1;
+ if ((p-longpath)>0) longlen -= (p-longpath);
+ lstrcpynA( p, ll , longlen);
+
+ /* Now, change all '/' to '\' */
+ for (r=p; r<(p+longlen); r++ )
+ if (r[0]=='/') r[0]='\\';
+ return strlen(longpath) - strlen(p) + longlen;
+ }
}
- shortpathlen =
- ((strrchr( full_name.short_name, '\\' ) - full_name.short_name) + 1);
- return shortpathlen + strlen( longfilename );
+
+ return strlen(longpath);
}