2 #define isSLASH(c) ((c) == '/' || (c) == '\\')
\r
3 #define SKIP_SLASHES(s) \
\r
5 while (*(s) && isSLASH(*(s))) \
\r
8 #define COPY_NONSLASHES(d,s) \
\r
10 while (*(s) && !isSLASH(*(s))) \
\r
15 /* Find the longname of a given path. path is destructively modified.
\r
16 * It should have space for at least MAX_PATH characters. */
\r
19 LONGPATH(CHAR_T *path)
\r
21 WIN32_FIND_DATA_T fdata;
\r
23 CHAR_T tmpbuf[MAX_PATH+1];
\r
24 CHAR_T *tmpstart = tmpbuf;
\r
25 CHAR_T *start = path;
\r
31 if (isALPHA(path[0]) && path[1] == ':') {
\r
33 *tmpstart++ = toupper(path[0]);
\r
37 else if (isSLASH(path[0]) && isSLASH(path[1])) {
\r
39 *tmpstart++ = path[0];
\r
40 *tmpstart++ = path[1];
\r
41 SKIP_SLASHES(start);
\r
42 COPY_NONSLASHES(tmpstart,start); /* copy machine name */
\r
44 *tmpstart++ = *start++;
\r
45 SKIP_SLASHES(start);
\r
46 COPY_NONSLASHES(tmpstart,start); /* copy share name */
\r
51 /* copy initial slash, if any */
\r
52 if (isSLASH(*start)) {
\r
53 *tmpstart++ = *start++;
\r
55 SKIP_SLASHES(start);
\r
58 /* FindFirstFile() expands "." and "..", so we need to pass
\r
59 * those through unmolested */
\r
61 && (!start[1] || isSLASH(start[1])
\r
62 || (start[1] == '.' && (!start[2] || isSLASH(start[2])))))
\r
64 COPY_NONSLASHES(tmpstart,start); /* copy "." or ".." */
\r
69 /* if this is the end, bust outta here */
\r
73 /* now we're at a non-slash; walk up to next slash */
\r
74 while (*start && !isSLASH(*start))
\r
77 /* stop and find full name of component */
\r
80 fhand = FN_FINDFIRSTFILE(path,&fdata);
\r
82 if (fhand != INVALID_HANDLE_VALUE) {
\r
83 STRLEN len = FN_STRLEN(fdata.cFileName);
\r
84 if ((STRLEN)(tmpbuf + sizeof(tmpbuf) - tmpstart) > len) {
\r
85 FN_STRCPY(tmpstart, fdata.cFileName);
\r
96 /* failed a step, just return without side effects */
\r
97 /*PerlIO_printf(Perl_debug_log, "Failed to find %s\n", path);*/
\r
102 FN_STRCPY(path,tmpbuf);
\r
107 #undef WIN32_FIND_DATA_T
\r
108 #undef FN_FINDFIRSTFILE
\r