001: /*
002: * Copyright (c) 1998-2007 Caucho Technology -- all rights reserved
003: *
004: * This file is part of Resin(R) Open Source
005: *
006: * Each copy or derived work must preserve the copyright notice and this
007: * notice unmodified.
008: *
009: * Resin Open Source is free software; you can redistribute it and/or modify
010: * it under the terms of the GNU General Public License as published by
011: * the Free Software Foundation; either version 2 of the License, or
012: * (at your option) any later version.
013: *
014: * Resin Open Source is distributed in the hope that it will be useful,
015: * but WITHOUT ANY WARRANTY; without even the implied warranty of
016: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
017: * of NON-INFRINGEMENT. See the GNU General Public License for more
018: * details.
019: *
020: * You should have received a copy of the GNU General Public License
021: * along with Resin Open Source; if not, write to the
022: *
023: * Free Software Foundation, Inc.
024: * 59 Temple Place, Suite 330
025: * Boston, MA 02111-1307 USA
026: *
027: * @author Sam
028: */
029:
030: package com.caucho.quercus.lib.file;
031:
032: import com.caucho.quercus.env.Env;
033: import com.caucho.quercus.env.StringValue;
034:
035: import java.io.IOException;
036:
037: /**
038: * A helper class that handles line endings when reading from a BinaryInput.
039: */
040: public class LineReader {
041: private Boolean _isMacLineEnding;
042:
043: public LineReader(Env env) {
044: this (FileModule.INI_AUTO_DETECT_LINE_ENDINGS.getAsBoolean(env));
045: }
046:
047: private LineReader(boolean isAutoDetectLineEndings) {
048: if (!isAutoDetectLineEndings)
049: _isMacLineEnding = Boolean.FALSE;
050: }
051:
052: /**
053: * Reads a line from the BinaryInput, returning null on EOF.
054: */
055: public StringValue readLine(Env env, BinaryInput input, long length)
056: throws IOException {
057: StringValue sb = env.createBinaryBuilder();
058:
059: int ch;
060:
061: for (; length > 0 && (ch = input.read()) >= 0; length--) {
062:
063: // php/161[pq] newlines
064: if (ch == '\n') {
065: sb.appendByte((byte) ch);
066:
067: if (_isMacLineEnding == null)
068: _isMacLineEnding = false;
069:
070: if (!_isMacLineEnding)
071: break;
072: } else if (ch == '\r') {
073: sb.appendByte((byte) '\r');
074:
075: int ch2 = input.read();
076:
077: if (ch2 == '\n') {
078: if (_isMacLineEnding == null)
079: _isMacLineEnding = false;
080:
081: if (_isMacLineEnding) {
082: input.unread();
083: break;
084: } else {
085: sb.appendByte((byte) '\n');
086: break;
087: }
088: } else {
089: input.unread();
090:
091: if (_isMacLineEnding == null)
092: _isMacLineEnding = true;
093:
094: if (_isMacLineEnding)
095: return sb;
096: }
097:
098: } else
099: sb.appendByte((byte) ch);
100: }
101:
102: if (sb.length() == 0)
103: return null;
104: else
105: return sb;
106:
107: }
108: }
|