1 /*
2  * AbstractString.java
3  *
4  * Copyright (C) 2004 Peter Graves
5  * $Id$
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
20  *
21  * As a special exception, the copyright holders of this library give you
22  * permission to link this library with independent modules to produce an
23  * executable, regardless of the license terms of these independent
24  * modules, and to copy and distribute the resulting executable under
25  * terms of your choice, provided that you also meet, for each linked
26  * independent module, the terms and conditions of the license of that
27  * module.  An independent module is a module which is not derived from
28  * or based on this library.  If you modify this library, you may extend
29  * this exception to your version of the library, but you are not
30  * obligated to do so.  If you do not wish to do so, delete this
31  * exception statement from your version.
32  */
33 
34 package org.armedbear.lisp;
35 
36 import static org.armedbear.lisp.Lisp.*;
37 
38 public abstract class AbstractString extends AbstractVector
39 {
40     @Override
typep(LispObject type)41     public LispObject typep(LispObject type)
42     {
43         if (type instanceof Symbol) {
44             if (type == Symbol.STRING)
45                 return T;
46             if (type == Symbol.BASE_STRING)
47                 return T;
48         }
49         if (type == BuiltInClass.STRING)
50             return T;
51         if (type == BuiltInClass.BASE_STRING)
52             return T;
53         return super.typep(type);
54     }
55 
56     @Override
stringp()57     public final boolean stringp()
58     {
59         return true;
60     }
61 
62     @Override
getElementType()63     public LispObject getElementType()
64     {
65         return Symbol.CHARACTER;
66     }
67 
68     @Override
isSimpleVector()69     public final boolean isSimpleVector()
70     {
71         return false;
72     }
73 
74     @Override
STRING()75     public final LispObject STRING()
76     {
77         return this;
78     }
79 
fill(char c)80     public abstract void fill(char c);
81 
charAt(int index)82     public abstract char charAt(int index);
83 
setCharAt(int index, char c)84     public abstract void setCharAt(int index, char c);
85 
printObject(int beginIndex, int endIndex)86     public final String printObject(int beginIndex, int endIndex)
87 
88     {
89         if (beginIndex < 0)
90             beginIndex = 0;
91         final int limit;
92         limit = length();
93         if (endIndex > limit)
94             endIndex = limit;
95         final LispThread thread = LispThread.currentThread();
96         if (Symbol.PRINT_ESCAPE.symbolValue(thread) != NIL ||
97             Symbol.PRINT_READABLY.symbolValue(thread) != NIL)
98         {
99             StringBuilder sb = new StringBuilder("\"");
100             for (int i = beginIndex; i < endIndex; i++) {
101                 char c = charAt(i);
102                 if (c == '\"' || c == '\\')
103                     sb.append('\\');
104                 sb.append(c);
105             }
106             sb.append('"');
107             return sb.toString();
108         } else
109             return getStringValue().substring(beginIndex, endIndex);
110     }
111 
112     @Override
printObject()113     public String printObject()
114     {
115         return printObject(0, length());
116     }
117 
toString()118     public String toString() {
119 	    int length = length();
120 	    StringBuilder sb = new StringBuilder(length);
121 	    for(int i = 0; i < length; ++i) {
122 			sb.append(charAt(i));
123 	    }
124 	    return sb.toString();
125     }
126 
127 }
128