Changeset 9948


Ignore:
Timestamp:
09/08/05 18:33:00 (16 years ago)
Author:
piso
Message:

Logical pathnames: work in progress (tested).

Location:
trunk/j/src/org/armedbear/lisp
Files:
2 edited

Legend:

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

    r9946 r9948  
    33 *
    44 * Copyright (C) 2004-2005 Peter Graves
    5  * $Id: LogicalPathname.java,v 1.8 2005-09-08 16:03:01 piso Exp $
     5 * $Id: LogicalPathname.java,v 1.9 2005-09-08 18:33:00 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    2323
    2424import java.util.HashMap;
     25import java.util.StringTokenizer;
    2526
    2627public final class LogicalPathname extends Pathname
     
    3839        int semi = rest.lastIndexOf(';');
    3940        if (semi >= 0) {
    40             // FIXME directory
     41            // Directory.
     42            String d = rest.substring(0, semi + 1);
     43            directory = parseDirectory(d);
    4144            rest = rest.substring(semi + 1);
    4245        }
     
    8184    }
    8285
     86    private static final LispObject parseDirectory(String d)
     87        throws ConditionThrowable
     88    {
     89        LispObject result;
     90        if (d.charAt(0) == ';') {
     91            result = new Cons(Keyword.RELATIVE);
     92            d = d.substring(1);
     93        } else
     94            result = new Cons(Keyword.ABSOLUTE);
     95        StringTokenizer st = new StringTokenizer(d, ";");
     96        while (st.hasMoreTokens()) {
     97            String token = st.nextToken();
     98            LispObject obj;
     99            if (token.equals("*"))
     100                obj = Keyword.WILD;
     101            else if (token.equals("**"))
     102                obj = Keyword.WILD_INFERIORS;
     103            else if (token.equals("..")) {
     104                if (result.car() instanceof AbstractString) {
     105                    result = result.cdr();
     106                    continue;
     107                }
     108                obj= Keyword.UP;
     109            } else
     110                obj = new SimpleString(token.toUpperCase());
     111            result = new Cons(obj, result);
     112        }
     113        return result.nreverse();
     114    }
     115
    83116    public LispObject typeOf()
    84117    {
     
    98131            return T;
    99132        return super.typep(type);
     133    }
     134
     135    protected String getDirectoryNamestring() throws ConditionThrowable
     136    {
     137        FastStringBuffer sb = new FastStringBuffer();
     138        // "If a pathname is converted to a namestring, the symbols NIL and
     139        // :UNSPECIFIC cause the field to be treated as if it were empty. That
     140        // is, both NIL and :UNSPECIFIC cause the component not to appear in
     141        // the namestring." 19.2.2.2.3.1
     142        if (directory != NIL) {
     143            LispObject temp = directory;
     144            LispObject part = temp.car();
     145            if (part == Keyword.ABSOLUTE)
     146                ;
     147            else if (part == Keyword.RELATIVE)
     148                sb.append(';');
     149            else
     150                signal(new FileError("Unsupported directory component " + part.writeToString() + ".",
     151                                     this));
     152            temp = temp.cdr();
     153            while (temp != NIL) {
     154                part = temp.car();
     155                if (part instanceof AbstractString)
     156                    sb.append(part.getStringValue());
     157                else if (part == Keyword.WILD)
     158                    sb.append('*');
     159                else if (part == Keyword.UP)
     160                    sb.append("..");
     161                else
     162                    signal(new FileError("Unsupported directory component " + part.writeToString() + ".",
     163                                         this));
     164                sb.append(';');
     165                temp = temp.cdr();
     166            }
     167        }
     168        return sb.toString();
    100169    }
    101170
     
    110179        sb.append(host.getStringValue());
    111180        sb.append(':');
    112         // FIXME directory
     181        if (directory != NIL)
     182            sb.append(getDirectoryNamestring());
    113183        sb.append(name.getStringValue());
    114184        if (type != NIL) {
  • trunk/j/src/org/armedbear/lisp/Pathname.java

    r9946 r9948  
    33 *
    44 * Copyright (C) 2003-2005 Peter Graves
    5  * $Id: Pathname.java,v 1.82 2005-09-08 16:02:29 piso Exp $
     5 * $Id: Pathname.java,v 1.83 2005-09-08 18:31:25 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    178178    }
    179179
    180     protected static final LispObject parseDirectory(String d)
     180    private static final LispObject parseDirectory(String d)
    181181        throws ConditionThrowable
    182182    {
     
    280280    }
    281281
    282     private String getDirectoryNamestring() throws ConditionThrowable
    283     {
    284         StringBuffer sb = new StringBuffer();
     282    protected String getDirectoryNamestring() throws ConditionThrowable
     283    {
     284        FastStringBuffer sb = new FastStringBuffer();
    285285        // "If a pathname is converted to a namestring, the symbols NIL and
    286286        // :UNSPECIFIC cause the field to be treated as if it were empty. That
     
    320320                    sb.append(part.getStringValue());
    321321                else if (part == Keyword.WILD)
    322                     sb.append("*");
     322                    sb.append('*');
    323323                else if (part == Keyword.UP)
    324324                    sb.append("..");
     
    722722                if (second == Keyword.UP || second == Keyword.BACK) {
    723723                    if (signalError) {
    724                         StringBuffer sb = new StringBuffer();
     724                        FastStringBuffer sb = new FastStringBuffer();
    725725                        sb.append(first.writeToString());
    726726                        sb.append(" may not be followed immediately by ");
     
    826826    // ### list-directory
    827827    private static final Primitive LIST_DIRECTORY =
    828         new Primitive("list-directory", PACKAGE_SYS, false)
     828        new Primitive("list-directory", PACKAGE_SYS, true)
    829829    {
    830830        public LispObject execute(LispObject arg) throws ConditionThrowable
Note: See TracChangeset for help on using the changeset viewer.