Changeset 141
- Timestamp:
- 10/15/02 00:25:48 (21 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/j/src/org/armedbear/j/LispFormatter.java
r2 r141 3 3 * 4 4 * Copyright (C) 1998-2002 Peter Graves 5 * $Id: LispFormatter.java,v 1. 1.1.1 2002-09-24 16:09:34piso Exp $5 * $Id: LispFormatter.java,v 1.2 2002-10-15 00:25:48 piso Exp $ 6 6 * 7 7 * This program is free software; you can redistribute it and/or … … 32 32 private static final int LISP_FORMAT_NUMBER = 5; 33 33 34 private FastStringBuffer sb = new FastStringBuffer(); 35 private int tokStart; 34 private final Mode mode; 36 35 37 36 public LispFormatter(Buffer buffer) 38 37 { 39 38 this.buffer = buffer; 40 } 41 42 private void endToken(int state) 43 { 44 if (sb.length() > 0) { 39 this.mode = buffer.getMode(); 40 } 41 42 private int tokenBegin = 0; 43 44 private void endToken(String text, int tokenEnd, int state) 45 { 46 if (tokenEnd - tokenBegin > 0) { 45 47 int format = -1; 46 48 switch (state) { … … 60 62 break; 61 63 } 62 addSegment(sb.toString(), format); 63 tokStart += sb.length(); 64 sb.setLength(0); 65 } 66 } 67 68 private void parseLine(String text, int state) 69 { 70 if (Editor.tabsAreVisible()) 71 text = Utilities.makeTabsVisible(text, buffer.getTabWidth()); 72 else 73 text = Utilities.detab(text, buffer.getTabWidth()); 64 addSegment(text, tokenBegin, tokenEnd, format); 65 tokenBegin = tokenEnd; 66 } 67 } 68 69 private void parseLine(Line line) 70 { 71 final String text = getDetabbedText(line); 72 tokenBegin = 0; 73 int state = line.flags(); 74 74 clearSegmentList(); 75 sb.setLength(0);75 final int limit = text.length(); 76 76 int i = 0; 77 tokStart = 0;78 int limit = text.length();79 char c;80 77 // Skip whitespace at start of line. 81 78 while (i < limit) { 82 c = text.charAt(i); 83 if (Character.isWhitespace(c)) { 84 sb.append(c); 79 if (Character.isWhitespace(text.charAt(i))) { 85 80 ++i; 86 81 } else { 87 endToken( state);82 endToken(text, i, state); 88 83 break; 89 84 } 90 85 } 91 86 while (i < limit) { 92 c = text.charAt(i);87 char c = text.charAt(i); 93 88 if (c == '\\' && i < limit-1) { 94 sb.append(c); 95 sb.append(text.charAt(++i)); 96 ++i; 89 i += 2; 97 90 continue; 98 91 } … … 101 94 c = text.charAt(i+1); 102 95 if (c == '#') { 103 sb.append("|#"); 104 endToken(state); 96 endToken(text, i, state); 105 97 state = STATE_NEUTRAL; 106 98 i += 2; … … 108 100 } 109 101 } 110 sb.append(c);111 102 ++i; 112 103 continue; 113 104 } 114 105 if (state == STATE_QUOTE) { 115 sb.append(c);116 106 if (c == '"') { 117 endToken( state);107 endToken(text, i, state); 118 108 state = STATE_NEUTRAL; 119 109 } … … 123 113 // Reaching here, we're not in a comment or quoted string. 124 114 if (c == '"') { 125 endToken(state); 126 sb.append(c); 115 endToken(text, i, state); 127 116 state = STATE_QUOTE; 128 117 ++i; … … 130 119 } 131 120 if (c == ';') { 132 endToken(state); 133 state = STATE_COMMENT; 134 sb.append(text.substring(i)); 135 endToken(state); 121 endToken(text, i, state); 122 endToken(text, limit, STATE_COMMENT); 136 123 return; 137 124 } 138 125 if (c == '#' && i < limit-1) { 139 126 if (text.charAt(i+1) == '|') { 140 endToken( state);127 endToken(text, i, state); 141 128 state = STATE_COMMENT; 142 sb.append("#|");143 129 i += 2; 144 130 continue; … … 146 132 } 147 133 if (state == STATE_IDENTIFIER) { 148 if (buffer.mode.isIdentifierPart(c)) 149 sb.append(c); 150 else { 151 endToken(state); 152 sb.append(c); 134 if (!mode.isIdentifierPart(c)) { 135 endToken(text, i, state); 153 136 state = STATE_NEUTRAL; 154 137 } … … 158 141 if (state == STATE_NUMBER) { 159 142 if (Character.isDigit(c)) 160 sb.append(c);143 ; 161 144 else if (c == 'u' || c == 'U' || c == 'l' || c == 'L') 162 sb.append(c); // Valid suffix. 163 else if (sb.length() == 1 && c == 'x' || c == 'X') { 164 sb.append(c); 145 ; 146 else if (i - tokenBegin == 1 && c == 'x' || c == 'X') 165 147 state = STATE_HEXNUMBER; 166 } else { 167 endToken(state); 168 sb.append(c); 148 else { 149 endToken(text, i, state); 169 150 if (Character.isJavaIdentifierStart(c)) 170 151 state = STATE_IDENTIFIER; … … 177 158 if (state == STATE_HEXNUMBER) { 178 159 if (Character.isDigit(c)) 179 sb.append(c);160 ; 180 161 else if ((c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')) 181 sb.append(c);162 ; 182 163 else if (c == 'u' || c == 'U' || c == 'l' || c == 'L') 183 sb.append(c); // Valid suffix.164 ; 184 165 else { 185 endToken(state); 186 sb.append(c); 166 endToken(text, i, state); 187 167 if (Character.isJavaIdentifierStart(c)) 188 168 state = STATE_IDENTIFIER; … … 194 174 } 195 175 if (state == STATE_NEUTRAL) { 196 if (buffer.getMode().isIdentifierStart(c)) { 197 endToken(state); 198 sb.append(c); 176 if (mode.isIdentifierStart(c)) { 177 endToken(text, i, state); 199 178 state = STATE_IDENTIFIER; 200 179 } else if (Character.isDigit(c)) { 201 endToken(state); 202 sb.append(c); 180 endToken(text, i, state); 203 181 state = STATE_NUMBER; 204 182 } else // Still neutral... 205 sb.append(c);183 ; 206 184 } 207 185 ++i; 208 186 } 209 endToken( state);187 endToken(text, i, state); 210 188 } 211 189 … … 217 195 return segmentList; 218 196 } 219 parseLine(line .getText(), line.flags());197 parseLine(line); 220 198 final int size = segmentList.size(); 221 199 for (int i = 0; i < size; i++) {
Note: See TracChangeset
for help on using the changeset viewer.