001: /*
002: * LogicalPathname.java
003: *
004: * Copyright (C) 2004 Peter Graves
005: * $Id: LogicalPathname.java,v 1.3 2004/02/23 14:24:47 piso Exp $
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License
009: * as published by the Free Software Foundation; either version 2
010: * of the License, or (at your option) any later version.
011: *
012: * This program is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
015: * GNU General Public License for more details.
016: *
017: * You should have received a copy of the GNU General Public License
018: * along with this program; if not, write to the Free Software
019: * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
020: */
021:
022: package org.armedbear.lisp;
023:
024: import java.util.HashMap;
025:
026: public final class LogicalPathname extends Pathname {
027: private static final HashMap map = new HashMap();
028:
029: private LogicalPathname() {
030: // "The device component of a logical pathname is always :unspecific;
031: // no other component of a logical pathname can be :unspecific."
032: device = Keyword.UNSPECIFIC;
033: }
034:
035: public LispObject typeOf() {
036: return Symbol.LOGICAL_PATHNAME;
037: }
038:
039: public LispClass classOf() {
040: return BuiltInClass.LOGICAL_PATHNAME;
041: }
042:
043: public LispObject typep(LispObject type) throws ConditionThrowable {
044: if (type == Symbol.LOGICAL_PATHNAME)
045: return T;
046: if (type == BuiltInClass.LOGICAL_PATHNAME)
047: return T;
048: return super .typep(type);
049: }
050:
051: // ### %set-logical-pathname-translations
052: // %set-logical-pathname-translations host new-translations => newval
053: private static final Primitive2 _SET_LOGICAL_PATHNAME_TRANSLATIONS = new Primitive2(
054: "%set-logical-pathname-translations", PACKAGE_SYS, false,
055: "host new-translations") {
056: public LispObject execute(LispObject first, LispObject second)
057: throws ConditionThrowable {
058: String host = first.getStringValue().toUpperCase();
059: map.put(host, NIL); // FIXME
060: return NIL;
061: }
062: };
063:
064: // ### logical-pathname-translations host => translations
065: private static final Primitive1 LOGICAL_PATHNAME_TRANSLATIONS = new Primitive1(
066: "logical-pathname-translations", "host") {
067: public LispObject execute(LispObject arg)
068: throws ConditionThrowable {
069: return NIL;
070: }
071: };
072:
073: // ### load-logical-pathname-translations host => just-loaded
074: private static final Primitive1 LOAD_LOGICAL_PATHNAME_TRANSLATIONS = new Primitive1(
075: "load-logical-pathname-translations", "host") {
076: public LispObject execute(LispObject arg)
077: throws ConditionThrowable {
078: String host = arg.getStringValue().toUpperCase();
079: if (map.get(host) != null)
080: return NIL;
081: return signal(new LispError(
082: "LOAD-LOGICAL-PATHNAME-TRANSLATIONS is not implemented."));
083: }
084: };
085:
086: // ### logical-pathname pathspec => logical-pathname
087: private static final Primitive1 LOGICAL_PATHNAME = new Primitive1(
088: "logical-pathname", "pathspec") {
089: public LispObject execute(LispObject arg)
090: throws ConditionThrowable {
091: if (arg instanceof LogicalPathname)
092: return arg;
093: if (arg instanceof AbstractString) {
094: String s = arg.getStringValue();
095: int index = s.indexOf(':');
096: if (index >= 0) {
097: String host = s.substring(0, index).toUpperCase();
098: LogicalPathname p = new LogicalPathname();
099: p.host = new SimpleString(host);
100: return p;
101: }
102: return NIL;
103: }
104: if (arg instanceof Stream)
105: return NIL;
106: return signal(new TypeError(String.valueOf(arg)
107: + " is not a string, stream, or logical pathname."));
108: }
109: };
110: }
|