Changeset 5961


Ignore:
Timestamp:
02/25/04 15:44:19 (17 years ago)
Author:
piso
Message:

Work in progress.

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

Legend:

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

    r5960 r5961  
    33 *
    44 * Copyright (C) 2002-2004 Peter Graves
    5  * $Id: ComplexString.java,v 1.9 2004-02-25 15:24:20 piso Exp $
     5 * $Id: ComplexString.java,v 1.10 2004-02-25 15:44:19 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    334334                chars = newElements;
    335335            }
    336             // Initialize new elements (if any).
    337             final char c;
    338             if (initialElement != NIL)
    339                 c = LispCharacter.getValue(initialElement);
    340             else
    341                 c = 0;
    342             for (int i = capacity; i < newCapacity; i++)
    343                 chars[i] = c;
     336            if (initialElement != NIL && capacity < newCapacity) {
     337                // Initialize new elements.
     338                final char c = LispCharacter.getValue(initialElement);
     339                for (int i = capacity; i < newCapacity; i++)
     340                    chars[i] = c;
     341            }
    344342        }
    345343        capacity = newCapacity;
  • trunk/j/src/org/armedbear/lisp/SimpleString.java

    r5957 r5961  
    33 *
    44 * Copyright (C) 2004 Peter Graves
    5  * $Id: SimpleString.java,v 1.9 2004-02-25 13:50:54 piso Exp $
     5 * $Id: SimpleString.java,v 1.10 2004-02-25 15:44:19 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    5959    }
    6060
     61    private SimpleString(char[] chars)
     62    {
     63        this.chars = chars;
     64        capacity = chars.length;
     65    }
     66
    6167    public char[] chars()
    6268    {
     
    315321    }
    316322
    317     public AbstractVector adjustVector(int size, LispObject initialElement,
    318                                        LispObject initialContents)
    319         throws ConditionThrowable
    320     {
    321         SimpleString s = new SimpleString(size);
    322         if (initialContents != NIL) {
    323             if (initialContents.listp()) {
    324                 LispObject list = initialContents;
    325                 for (int i = 0; i < size; i++) {
    326                     s.chars[i] = LispCharacter.getValue(list.car());
    327                     list = list.cdr();
    328                 }
    329             } else if (initialContents.vectorp()) {
    330                 for (int i = 0; i < size; i++)
    331                     s.chars[i] = LispCharacter.getValue(initialContents.elt(i));
    332             } else
    333                 signal(new TypeError(initialContents, Symbol.SEQUENCE));
    334         } else if (initialElement != NIL) {
    335             System.arraycopy(chars, 0, s.chars, 0, Math.min(size, capacity));
    336             if (size > capacity) {
    337                 char c = LispCharacter.getValue(initialElement);
    338                 for (int i = size; i-- > capacity;)
    339                     s.chars[i] = c;
    340             }
    341         } else
    342             System.arraycopy(chars, 0, s.chars, 0, Math.min(size, capacity));
    343         return s;
    344     }
    345 
    346     public AbstractVector adjustVector(int size, AbstractArray displacedTo,
    347                                        int displacement)
    348         throws ConditionThrowable
    349     {
    350         return new ComplexString(size, displacedTo, displacement);
    351     }
    352 
    353323    public final int length()
    354324    {
     
    392362            hashCode = hashCode * 31 + chars[i];
    393363        return cachedHashCode = hashCode;
     364    }
     365
     366    public AbstractVector adjustVector(int newCapacity,
     367                                       LispObject initialElement,
     368                                       LispObject initialContents)
     369        throws ConditionThrowable
     370    {
     371        if (initialContents != NIL) {
     372            char[] newChars = new char[newCapacity];
     373            if (initialContents.listp()) {
     374                LispObject list = initialContents;
     375                for (int i = 0; i < newCapacity; i++) {
     376                    newChars[i] = LispCharacter.getValue(list.car());
     377                    list = list.cdr();
     378                }
     379            } else if (initialContents.vectorp()) {
     380                for (int i = 0; i < newCapacity; i++)
     381                    newChars[i] = LispCharacter.getValue(initialContents.elt(i));
     382            } else
     383                signal(new TypeError(initialContents, Symbol.SEQUENCE));
     384            return new SimpleString(newChars);
     385        }
     386        if (capacity != newCapacity) {
     387            char[] newChars = new char[newCapacity];
     388            System.arraycopy(chars, 0, newChars, 0, Math.min(newCapacity, capacity));
     389            if (initialElement != NIL && capacity < newCapacity) {
     390                final char c = LispCharacter.getValue(initialElement);
     391                for (int i = capacity; i < newCapacity; i++)
     392                    newChars[i] = c;
     393            }
     394            return new SimpleString(newChars);
     395        }
     396        // No change.
     397        return this;
     398    }
     399
     400    public AbstractVector adjustVector(int newCapacity,
     401                                       AbstractArray displacedTo,
     402                                       int displacement)
     403        throws ConditionThrowable
     404    {
     405        return new ComplexString(newCapacity, displacedTo, displacement);
    394406    }
    395407
Note: See TracChangeset for help on using the changeset viewer.