/******************************************************************************* * Copyright (c) 2009-2013 CWI * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * * Arnold Lankamp - Arnold.Lankamp@cwi.nl *******************************************************************************/ package org.rascalmpl.parser.gtd.io; import java.io.IOException; import java.io.InputStream; import java.io.Reader; import java.nio.charset.Charset; import org.rascalmpl.parser.gtd.util.ArrayList; import org.rascalmpl.unicode.UnicodeInputStreamReader; public class InputConverter{ private final static int STREAM_READ_SEGMENT_SIZE = 8192; private InputConverter(){ super(); } public static char[] toChar(String s){ return s.toCharArray(); } // NOTE: The user has to close the stream. public static char[] toChar(InputStream inputStream, Charset charset) throws IOException{ return toChar(new UnicodeInputStreamReader(inputStream, charset)); } // NOTE: The user has to close the stream. public static char[] toChar(Reader reader) throws IOException { ArrayList<char[]> segments = new ArrayList<char[]>(); ArrayList<Integer> segmentLengths = new ArrayList<Integer>(); // Gather segments. int charsRead = 0; int totalNrOfChars = 0; do{ char[] segment = new char[STREAM_READ_SEGMENT_SIZE]; charsRead = reader.read(segment, 0, STREAM_READ_SEGMENT_SIZE); if(charsRead > 0) { segments.add(segment); segmentLengths.add(charsRead); totalNrOfChars += charsRead; } }while(charsRead != -1); assert reader.read() == -1; // Glue the segments together. char[] input = new char[totalNrOfChars]; int pos = 0; for(int i = 0; i < segments.size(); i++) { char segment[] = segments.get(i); int length = segmentLengths.get(i); System.arraycopy(segment, 0, input, pos, length); pos += length; } assert pos == totalNrOfChars; return input; } }