Mozilla/mozilla/grendel/sources/dog/mail/util/CRLFInputStream.java
talisman%anamorphic.com 762db4f9f4 REORG of source tree. Hierarchy is much cleaner now. Makefiles will likely be broken until next checkin. You've been warned.
git-svn-id: svn://10.0.0.236/trunk@90362 18797224-902f-48f8-a5cc-f745e15eee43
2001-03-25 07:51:47 +00:00

118 lines
2.9 KiB
Java

/*
* CRLFInputStream.java
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is Knife.
*
* The Initial Developer of the Original Code is dog.
* Portions created by dog are
* Copyright (C) 1998 dog <dog@dog.net.uk>. All
* Rights Reserved.
*
* Contributor(s): n/a.
*/
package dog.mail.util;
import java.io.*;
/**
* An input stream that filters out CR/LF pairs into LFs.
*
* @author dog@dog.net.uk
* @version 0.1
*/
public class CRLFInputStream extends PushbackInputStream {
/**
* The CR octet.
*/
public static final int CR = 13;
/**
* The LF octet.
*/
public static final int LF = 10;
/**
* Constructs a CR/LF input stream connected to the specified input stream.
*/
public CRLFInputStream(InputStream in) {
super(in);
}
/**
* Reads the next byte of data from this input stream.
* Returns -1 if the end of the stream has been reached.
* @exception IOException if an I/O error occurs
*/
public int read() throws IOException {
int c = super.read();
if (c==CR) // skip CR
return super.read();
return c;
}
/**
* Reads up to b.length bytes of data from this input stream into
* an array of bytes.
* Returns -1 if the end of the stream has been reached.
* @exception IOException if an I/O error occurs
*/
public int read(byte[] b) throws IOException {
return read(b, 0, b.length);
}
/**
* Reads up to len bytes of data from this input stream into an
* array of bytes, starting at the specified offset.
* Returns -1 if the end of the stream has been reached.
* @exception IOException if an I/O error occurs
*/
public int read(byte[] b, int off, int len) throws IOException {
int l = super.read(b, off, len);
return removeCRs(b, off, l);
}
/**
* Reads a line of input terminated by LF.
* @exception IOException if an I/O error occurs
*/
public String readLine() throws IOException {
byte[] acc = new byte[4096];
int count = 0;
for (byte b=(byte)read(); b!=LF && b!=-1; b=(byte)read())
acc[count++] = b;
if (count>0) {
byte[] bytes = new byte[count];
System.arraycopy(acc, 0, bytes, 0, count);
return new String(bytes);
} else
return null;
}
int removeCRs(byte[] b, int off, int len) {
for (int index = indexOfCR(b, off, len); index>-1; index = indexOfCR(b, off, len)) {
for (int i=index; i<b.length-1; i++)
b[i] = b[i+1];
len--;
}
return len;
}
int indexOfCR(byte[] b, int off, int len) {
for (int i=off; i<off+len; i++)
if (b[i]==CR) return i;
return -1;
}
}