/* * @(#)LFWriter.java * * Copyright (c) 2007 The authors and contributors of JHotDraw. * You may not use, copy or modify this file, except in compliance with the * accompanying license terms. */ package org.jhotdraw.samples.teddy.io; import java.io.*; /** * A character-output stream that converts line terminators into a configurable * line separator sequence. A line is considered to be terminated by * any one of a line feed ('\n'), a carriage return ('\r'), or a carriage return * followed immediately by a linefeed. * * @author Werner Randelshofer * @version $Id$ */ public class LFWriter extends FilterWriter { /** * Line separator string. */ private String lineSeparator = "\n"; /** If the next character is a line feed, skip it */ private boolean skipLF; /** * Create a new line-numbering writer. */ public LFWriter(Writer out) { super(out); lineSeparator = System.getProperty("line.separator"); } /** * Gets the line separator of the println() methods. */ public String getLineSeparator() { return lineSeparator; } /** * Sets the line separator for the println() methods. */ public void setLineSeparator(String lineSeparator) { this.lineSeparator = lineSeparator; } /** * Write a single character. * * @exception IOException If an I/O error occurs */ @Override public void write(int c) throws IOException { switch (c) { case '\r': out.write(lineSeparator); skipLF = true; break; case '\n': if (!skipLF) out.write(lineSeparator); skipLF = false; break; default : out.write(c); skipLF = false; break; } } /** * Write a portion of an array of characters. * * @param cbuf Buffer of characters to be written * @param off Offset from which to start reading characters * @param len Number of characters to be written * * @exception IOException If an I/O error occurs */ @Override public void write(char cbuf[], int off, int len) throws IOException { int end = off + len; for (int i=off; i < end; i++) { switch (cbuf[i]) { case '\r': out.write(cbuf, off, i - off); off = i + 1; out.write(lineSeparator); skipLF = true; break; case '\n': out.write(cbuf, off, i - off); off = i + 1; if (skipLF) { skipLF = false; } else { out.write(lineSeparator); } break; default : skipLF = false; break; } } if (off < end) out.write(cbuf, off, end - off); } /** * Write a portion of a string. * * @param str String to be written * @param off Offset from which to start reading characters * @param len Number of characters to be written * * @exception IOException If an I/O error occurs */ public void write(String str, int off, int len) throws IOException { write(str.toCharArray(), off, len); } }