001: /* -*- Mode: java; tab-width: 4; indent-tabs-mode: 1; c-basic-offset: 4 -*-
002: *
003: * ***** BEGIN LICENSE BLOCK *****
004: * Version: MPL 1.1/GPL 2.0
005: *
006: * The contents of this file are subject to the Mozilla Public License Version
007: * 1.1 (the "License"); you may not use this file except in compliance with
008: * the License. You may obtain a copy of the License at
009: * http://www.mozilla.org/MPL/
010: *
011: * Software distributed under the License is distributed on an "AS IS" basis,
012: * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
013: * for the specific language governing rights and limitations under the
014: * License.
015: *
016: * The Original Code is Rhino code, released
017: * May 6, 1999.
018: *
019: * The Initial Developer of the Original Code is
020: * Netscape Communications Corporation.
021: * Portions created by the Initial Developer are Copyright (C) 1997-1999
022: * the Initial Developer. All Rights Reserved.
023: *
024: * Contributor(s):
025: * Igor Bukanov
026: *
027: * Alternatively, the contents of this file may be used under the terms of
028: * the GNU General Public License Version 2 or later (the "GPL"), in which
029: * case the provisions of the GPL are applicable instead of those above. If
030: * you wish to allow use of your version of this file only under the terms of
031: * the GPL and not to allow others to use your version of this file under the
032: * MPL, indicate your decision by deleting the provisions above and replacing
033: * them with the notice and other provisions required by the GPL. If you do
034: * not delete the provisions above, a recipient may use your version of this
035: * file under either the MPL or the GPL.
036: *
037: * ***** END LICENSE BLOCK ***** */
038: package org.mozilla.javascript.tools.idswitch;
039:
040: import java.io.IOException;
041: import java.io.Reader;
042: import java.io.Writer;
043:
044: public class FileBody {
045:
046: private static class ReplaceItem {
047: ReplaceItem next;
048: int begin;
049: int end;
050: String replacement;
051:
052: ReplaceItem(int begin, int end, String text) {
053: this .begin = begin;
054: this .end = end;
055: this .replacement = text;
056: }
057: }
058:
059: private char[] buffer = new char[1 << 14]; // 16K
060: private int bufferEnd;
061: private int lineBegin;
062: private int lineEnd;
063: private int nextLineStart;
064:
065: private int lineNumber;
066:
067: ReplaceItem firstReplace;
068: ReplaceItem lastReplace;
069:
070: public char[] getBuffer() {
071: return buffer;
072: }
073:
074: public void readData(Reader r) throws IOException {
075: int capacity = buffer.length;
076: int offset = 0;
077: for (;;) {
078: int n_read = r.read(buffer, offset, capacity - offset);
079: if (n_read < 0) {
080: break;
081: }
082: offset += n_read;
083: if (capacity == offset) {
084: capacity *= 2;
085: char[] tmp = new char[capacity];
086: System.arraycopy(buffer, 0, tmp, 0, offset);
087: buffer = tmp;
088: }
089: }
090: bufferEnd = offset;
091: }
092:
093: public void writeInitialData(Writer w) throws IOException {
094: w.write(buffer, 0, bufferEnd);
095: }
096:
097: public void writeData(Writer w) throws IOException {
098: int offset = 0;
099: for (ReplaceItem x = firstReplace; x != null; x = x.next) {
100: int before_replace = x.begin - offset;
101: if (before_replace > 0) {
102: w.write(buffer, offset, before_replace);
103: }
104: w.write(x.replacement);
105: offset = x.end;
106: }
107: int tail = bufferEnd - offset;
108: if (tail != 0) {
109: w.write(buffer, offset, tail);
110: }
111: }
112:
113: public boolean wasModified() {
114: return firstReplace != null;
115: }
116:
117: public boolean setReplacement(int begin, int end, String text) {
118: if (equals(text, buffer, begin, end)) {
119: return false;
120: }
121:
122: ReplaceItem item = new ReplaceItem(begin, end, text);
123: if (firstReplace == null) {
124: firstReplace = lastReplace = item;
125: } else if (begin < firstReplace.begin) {
126: item.next = firstReplace;
127: firstReplace = item;
128: } else {
129: ReplaceItem cursor = firstReplace;
130: ReplaceItem next = cursor.next;
131: while (next != null) {
132: if (begin < next.begin) {
133: item.next = next;
134: cursor.next = item;
135: break;
136: }
137: cursor = next;
138: next = next.next;
139: }
140: if (next == null) {
141: lastReplace.next = item;
142: }
143: }
144:
145: return true;
146: }
147:
148: public int getLineNumber() {
149: return lineNumber;
150: }
151:
152: public int getLineBegin() {
153: return lineBegin;
154: }
155:
156: public int getLineEnd() {
157: return lineEnd;
158: }
159:
160: public void startLineLoop() {
161: lineNumber = 0;
162: lineBegin = lineEnd = nextLineStart = 0;
163: }
164:
165: public boolean nextLine() {
166: if (nextLineStart == bufferEnd) {
167: lineNumber = 0;
168: return false;
169: }
170: int i;
171: int c = 0;
172: for (i = nextLineStart; i != bufferEnd; ++i) {
173: c = buffer[i];
174: if (c == '\n' || c == '\r') {
175: break;
176: }
177: }
178: lineBegin = nextLineStart;
179: lineEnd = i;
180: if (i == bufferEnd) {
181: nextLineStart = i;
182: } else if (c == '\r' && i + 1 != bufferEnd
183: && buffer[i + 1] == '\n') {
184: nextLineStart = i + 2;
185: } else {
186: nextLineStart = i + 1;
187: }
188: ++lineNumber;
189: return true;
190: }
191:
192: private static boolean equals(String str, char[] array, int begin,
193: int end) {
194: if (str.length() == end - begin) {
195: for (int i = begin, j = 0; i != end; ++i, ++j) {
196: if (array[i] != str.charAt(j)) {
197: return false;
198: }
199: }
200: return true;
201: }
202: return false;
203: }
204:
205: }
|