Ignore:
Timestamp:
07/10/10 20:22:36 (12 years ago)
Author:
Mark Evenson
Message:

[HEADS UP] Break Pathname to normalize cross-platform serializations.

Convert to forward slash '/' as directory separator in namestring
output.

FIXME: Breaks UNC paths, as the sequence "" in
"
mount$share/dir/file" gets stripped, whereas the HOST should be
interpreted in this case. But who uses these? Please test.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abcl/src/org/armedbear/lisp/Pathname.java

    r12797 r12798  
    6262    protected LispObject version = NIL;
    6363
    64     private String namestring;
     64    private volatile String namestring;
    6565
    6666    /** The protocol for changing any instance field (i.e. 'host', 'type', etc.)
     
    243243        }
    244244        if (Utilities.isPlatformWindows) {
    245             if (s.startsWith("\\\\")) {
     245            if (s.startsWith("\\\\")) { // XXX What if string starts with '//'?
    246246                //UNC path support
    247247                // match \\<server>\<share>\[directories-and-files]
     
    402402
    403403        if (Utilities.isPlatformWindows) {
    404             if (!s.contains(jarSeparator)) {
    405                 s = s.replace("/", "\\");
    406             } else {
    407               StringBuilder result = new StringBuilder();
    408               for (int i = 0; i < s.length(); i++) {
    409                   char c = s.charAt(i);
    410                   if ( c != '/') {
    411                       result.append(c);
    412                   } else {
    413                       if (i != 0 && s.charAt(i-1) != '!') {
    414                           result.append("\\");
    415                       } else {
    416                           result.append(c);
    417                       }
    418                   }
    419               }
    420               s = result.toString();
    421             }
     404            if (s.contains("\\")) {
     405                s = s.replace("\\", "/");
     406            }
    422407        }
    423408
     
    439424        String d = null;
    440425        // Find last file separator char.
    441         if (Utilities.isPlatformWindows) {
    442             for (int i = s.length(); i-- > 0;) {
    443                 char c = s.charAt(i);
    444                 if (c == '/' || c == '\\') {
    445                     d = s.substring(0, i + 1);
    446                     s = s.substring(i + 1);
    447                     break;
    448                 }
    449             }
    450         } else {
    451             for (int i = s.length(); i-- > 0;) {
    452                 if (s.charAt(i) == '/') {
    453                     d = s.substring(0, i + 1);
    454                     s = s.substring(i + 1);
    455                     break;
    456                 }
     426        for (int i = s.length(); i-- > 0;) {
     427            if (s.charAt(i) == '/') {
     428                d = s.substring(0, i + 1);
     429                s = s.substring(i + 1);
     430                break;
    457431            }
    458432        }
     
    668642        if (name instanceof AbstractString) {
    669643            String n = name.getStringValue();
    670             if (n.indexOf(File.separatorChar) >= 0) {
     644            if (n.indexOf('/') >= 0) {
    671645                Debug.assertTrue(namestring == null);
    672646                return null;
     
    739713        // the namestring." 19.2.2.2.3.1
    740714        if (directory != NIL) {
    741             final char separatorChar;
    742             if (isJar() || isURL()) {
    743                 separatorChar = '/';
    744             } else {
    745                 separatorChar = File.separatorChar;
    746             }
     715            final char separatorChar = '/';
    747716            LispObject temp = directory;
    748717            LispObject part = temp.car();
     
    792761        String path = p.getNamestring();
    793762        StringBuilder result = new StringBuilder();
    794         if (Utilities.isPlatformWindows) {
    795       for (int i = 0; i < path.length(); i++) {
    796     char c = path.charAt(i);
    797     if (c == '\\') {
    798         result.append('/');
    799     } else {
    800         result.append(c);
    801     }
    802       }
    803         } else  {
    804             result.append(path);
    805         }
     763        result.append(path);
     764
    806765        // Entries in jar files are always relative, but Pathname
    807766        // directories are :ABSOLUTE.
     
    905864                }
    906865            }
    907         } else {
     866        } else { 
    908867            useNamestring = false;
    909868        }
     
    927886            }
    928887        } else {
    929             sb.append("#P(");
     888            final boolean ANSI_COMPATIBLE = true;
     889            final String separator;
     890            if (ANSI_COMPATIBLE) {
     891                sb.append("#P(");
     892                separator = "\"";
     893            } else {
     894                sb.append("#P(");
     895                separator = " ";
     896            }
    930897            if (host != NIL) {
    931898                sb.append(":HOST ");
    932899                sb.append(host.writeToString());
    933                 sb.append(' ');
     900                sb.append(separator);
    934901            }
    935902            if (device != NIL) {
    936903                sb.append(":DEVICE ");
    937904                sb.append(device.writeToString());
    938                 sb.append(' ');
     905                sb.append(separator);
    939906            }
    940907            if (directory != NIL) {
    941908                sb.append(":DIRECTORY ");
    942909                sb.append(directory.writeToString());
    943                 sb.append(" ");
     910                sb.append(separator);
    944911            }
    945912            if (name != NIL) {
    946913                sb.append(":NAME ");
    947914                sb.append(name.writeToString());
    948                 sb.append(' ');
     915                sb.append(separator);
    949916            }
    950917            if (type != NIL) {
    951918                sb.append(":TYPE ");
    952919                sb.append(type.writeToString());
    953                 sb.append(' ');
     920                sb.append(separator);
    954921            }
    955922            if (version != NIL) {
    956923                sb.append(":VERSION ");
    957924                sb.append(version.writeToString());
    958                 sb.append(' ');
    959             }
    960             if (sb.charAt(sb.length() - 1) == ' ') {
     925                sb.append(separator);
     926            }
     927            if (sb.charAt(sb.length() - 1) == ' ') { // XXX
    961928                sb.setLength(sb.length() - 1);
    962929            }
    963             sb.append(')');
     930            if (ANSI_COMPATIBLE) {
     931                sb.append(')' + separator);
     932            } else {
     933                sb.append(')');
     934            }
    964935        }
    965936        return sb.toString();
     
    13791350        for (int i = 0; i < limit; i++) {
    13801351            char c = s.charAt(i);
     1352            // XXX '\\' should be illegal in all Pathnames at this point?
    13811353            if (c == '/' || c == '\\' && Utilities.isPlatformWindows) {
    13821354                error(new LispError("Invalid character #\\" + c
Note: See TracChangeset for help on using the changeset viewer.