aboutsummaryrefslogtreecommitdiff
path: root/libjava/java/io/CharArrayWriter.java
blob: 7bec5558a01bce04ee7ce113d69b3068de2583a7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
// CharArrayWriter.java - Character array output stream.

/* Copyright (C) 1998, 1999, 2001  Free Software Foundation

   This file is part of libgcj.

This software is copyrighted work licensed under the terms of the
Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
details.  */

package java.io;

/**
 * @author Tom Tromey <tromey@cygnus.com>
 * @date September 25, 1998 
 */

/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
 * "The Java Language Specification", ISBN 0-201-63451-1
 * Status:  Complete to 1.1.
 */

public class CharArrayWriter extends Writer
{
  public CharArrayWriter ()
  {
    this (32);
  }

  public CharArrayWriter (int size)
  {
    super ();
    buf = new char[size];
  }

  public void close ()
  {
    closed = true;
  }

  public void flush () throws IOException
  {
    synchronized (lock)
      {
	if (closed)
	  throw new IOException ("Stream closed");
      }
  }

  public void reset ()
  {
    synchronized (lock)
      {
	count = 0;
	// Allow this to reopen the stream.
	// FIXME - what does the JDK do?
	closed = false;
      }
  }

  public int size ()
  {
    return count;
  }

  public char[] toCharArray ()
  {
    synchronized (lock)
      {      
	char[] nc = new char[count];
	System.arraycopy(buf, 0, nc, 0, count);
	return nc;
      }
  }

  public String toString ()
  {
    synchronized (lock)
      {
	return new String (buf, 0, count);
      }
  }

  public void write (int oneChar) throws IOException
  {
    synchronized (lock)
      {
	if (closed)
	  throw new IOException ("Stream closed");

	resize (1);
	buf[count++] = (char) oneChar;
      }
  }

  public void write (char[] buffer, int offset, int len) throws IOException
  {
    synchronized (lock)
      {
	if (closed)
	  throw new IOException ("Stream closed");

	if (len >= 0)
	  resize (len);
	System.arraycopy(buffer, offset, buf, count, len);
	count += len;
      }
  }

  public void write (String str, int offset, int len) throws IOException
  {
    synchronized (lock)
      {
	if (closed)
	  throw new IOException ("Stream closed");

	if (len >= 0)
	  resize (len);
	str.getChars(offset, offset + len, buf, count);
	count += len;
      }
  }

  public void writeTo (Writer out) throws IOException
  {
    synchronized (lock)
      {
	out.write(buf, 0, count);
      }
  }

  private final void resize (int len)
  {
    if (count + len >= buf.length)
      {
	int newlen = buf.length * 2;
	if (count + len > newlen)
	  newlen = count + len;
	char[] newbuf = new char[newlen];
	System.arraycopy(buf, 0, newbuf, 0, count);
	buf = newbuf;
      }
  }

  // The character buffer.
  protected char[] buf;
  // Number of valid characters in buffer.
  protected int count;
  // True if stream is closed.
  private boolean closed;
}