Changeset 10004


Ignore:
Timestamp:
09/22/05 23:16:49 (16 years ago)
Author:
piso
Message:

RENAME-FILE

File:
1 edited

Legend:

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

    r10000 r10004  
    33 *
    44 * Copyright (C) 2003-2005 Peter Graves
    5  * $Id: Pathname.java,v 1.93 2005-09-22 00:26:38 piso Exp $
     5 * $Id: Pathname.java,v 1.94 2005-09-22 23:16:49 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    5959                int index = s.indexOf("!/");
    6060                String container = s.substring(5, index);
    61                 if (Utilities.isPlatformWindows()) {
     61                if (Utilities.isPlatformWindows) {
    6262                    if (container.length() > 0 && container.charAt(0) == '/')
    6363                        container = container.substring(1);
     
    8585        if (s == null)
    8686            return;
    87         if (Utilities.isPlatformWindows())
     87        if (s.equals(".") || s.equals("./")) {
     88            directory = new Cons(Keyword.RELATIVE);
     89            return;
     90        }
     91        if (s.equals("..") || s.equals("../")) {
     92            directory = list2(Keyword.RELATIVE, Keyword.UP);
     93            return;
     94        }
     95        if (Utilities.isPlatformWindows)
    8896            s = s.replace('/', '\\');
    8997        // Jar file support.
     
    110118                s = System.getProperty("user.home").concat(s.substring(1));
    111119        }
    112         if (s.equals(".") || s.equals("./")) {
    113             directory = new Cons(Keyword.RELATIVE);
    114             return;
    115         }
    116         if (s.equals("..") || s.equals("../")) {
    117             directory = list2(Keyword.RELATIVE, Keyword.UP);
    118             return;
    119         }
    120120        namestring = s;
    121         if (Utilities.isPlatformWindows()) {
     121        if (Utilities.isPlatformWindows) {
    122122            if (s.length() >= 2 && s.charAt(1) == ':') {
    123123                device = new SimpleString(s.charAt(0));
     
    127127        String d = null;
    128128        // Find last file separator char.
    129         if (Utilities.isPlatformWindows()) {
     129        if (Utilities.isPlatformWindows) {
    130130            for (int i = s.length(); i-- > 0;) {
    131131                char c = s.charAt(i);
     
    181181        throws ConditionThrowable
    182182    {
    183         if (d.equals("/") || (Utilities.isPlatformWindows() && d.equals("\\")))
     183        if (d.equals("/") || (Utilities.isPlatformWindows && d.equals("\\")))
    184184            return new Cons(Keyword.ABSOLUTE);
    185185        LispObject result;
    186         if (d.startsWith("/") || (Utilities.isPlatformWindows() && d.startsWith("\\")))
     186        if (d.startsWith("/") || (Utilities.isPlatformWindows && d.startsWith("\\")))
    187187            result = new Cons(Keyword.ABSOLUTE);
    188188        else
     
    357357        if (obj instanceof Pathname) {
    358358            Pathname p = (Pathname) obj;
    359             if (Utilities.isPlatformWindows()) {
     359            if (Utilities.isPlatformWindows) {
    360360                if (!host.equalp(p.host))
    361361                    return false;
     
    803803            logical = true;
    804804            p.host = host;
     805            p.device = Keyword.UNSPECIFIC;
    805806        } else {
    806807            p = new Pathname();
     
    838839            if (logical && name instanceof AbstractString)
    839840                p.name = LogicalPathname.canonicalizeStringComponent((AbstractString)name);
     841            else if (name instanceof AbstractString)
     842                p.name = validateStringComponent((AbstractString)name);
    840843            else
    841844                p.name = name;
     
    849852        p.version = version;
    850853        return p;
     854    }
     855
     856    private static final AbstractString validateStringComponent(AbstractString s)
     857        throws ConditionThrowable
     858    {
     859        final int limit = s.length();
     860        for (int i = 0; i < limit; i++) {
     861            char c = s.charAt(i);
     862            if (c == '/' || c == '\\' && Utilities.isPlatformWindows) {
     863                signal(new LispError("Invalid character #\\" + c +
     864                                     " in pathname component \"" + s +
     865                                     '"'));
     866                // Not reached.
     867                return null;
     868            }
     869        }
     870        return s;
    851871    }
    852872
     
    11671187        }
    11681188        if (errorIfDoesNotExist) {
    1169             StringBuffer sb = new StringBuffer("The file ");
     1189            FastStringBuffer sb = new FastStringBuffer("The file ");
    11701190            sb.append(defaultedPathname.writeToString());
    11711191            sb.append(" does not exist.");
     
    12001220            throws ConditionThrowable
    12011221        {
    1202             final Pathname filespec = (Pathname) truename(first, true);
     1222            final Pathname original = (Pathname) truename(first, true);
     1223            final String originalNamestring = original.getNamestring();
    12031224            Pathname newName = coerceToPathname(second);
    12041225            if (newName.isWild())
    12051226                signal(new FileError("Bad place for a wild pathname.", newName));
    1206             newName = mergePathnames(newName, filespec, NIL);
    1207             File source = new File(filespec.getNamestring());
    1208             File destination = new File(newName.getNamestring());
    1209             if (Utilities.isPlatformWindows()) {
    1210                 if (destination.isFile())
    1211                     destination.delete();
    1212             }
    1213             if (!source.renameTo(destination))
    1214                 return signal(new FileError("Unable to rename " +
    1215                                             filespec.writeToString() +
    1216                                             " to " + newName.writeToString() +
    1217                                             "."));
    1218             LispThread.currentThread().setValues(newName, filespec,
    1219                                                  truename(newName, true));
    1220             return newName;
     1227            newName = mergePathnames(newName, original, NIL);
     1228            final String newNamestring;
     1229            if (newName instanceof LogicalPathname)
     1230                newNamestring = LogicalPathname.translateLogicalPathname((LogicalPathname)newName).getNamestring();
     1231            else
     1232                newNamestring = newName.getNamestring();
     1233            if (originalNamestring != null && newNamestring != null) {
     1234                final File source = new File(originalNamestring);
     1235                final File destination = new File(newNamestring);
     1236                if (Utilities.isPlatformWindows) {
     1237                    if (destination.isFile())
     1238                        destination.delete();
     1239                }
     1240                if (source.renameTo(destination))
     1241                    // Success!
     1242                    return LispThread.currentThread().setValues(newName, original,
     1243                                                                truename(newName, true));
     1244            }
     1245            return signal(new FileError("Unable to rename " +
     1246                                        original.writeToString() +
     1247                                        " to " + newName.writeToString() +
     1248                                        "."));
    12211249        }
    12221250    };
     
    12291257        {
    12301258            Pathname p = coerceToPathname(arg);
    1231             StringBuffer sb = new StringBuffer();
     1259            FastStringBuffer sb = new FastStringBuffer();
    12321260            if (p.name instanceof AbstractString)
    12331261                sb.append(p.name.getStringValue());
     
    12521280        public LispObject execute(LispObject arg) throws ConditionThrowable
    12531281        {
    1254             Pathname p = coerceToPathname(arg);
    1255             return p.host;
     1282            return coerceToPathname(arg).host;
    12561283        }
    12571284    };
Note: See TracChangeset for help on using the changeset viewer.