Source code: com/diaam/lgpl/ts/MinReader.java
1 /*
2 * $Log: MinReader.java,v $
3 * Revision 1.1 2000/11/10 15:31:30 vonarnim
4 * - deplacement (et nouvelle version) de TerminalStandard dans ctulu
5 *
6 * Revision 1.1 1999/11/04 20:02:06 Herve_AGNOUX
7 * Initial revision
8 *
9 */
10 /*
11 -- TerminalStandard v111999
12
13 Fichier : MinReader.java
14 Auteur : Hervé AGNOUX, hagnoux@mail.club-internet.fr
15 License LGPL.
16 */
17 package com.diaam.lgpl.ts;
18
19 import java.io.InputStream;
20 import java.io.IOException;
21 import java.io.Reader;
22
23 /**
24 * <code>MinReader</code> est une sorte de "workeuround" au fait que je ne
25 * sois pas @?!\@@ parvenu à faire fonctionner des "pipe" java avec
26 * Pnuts. Elle stoque les caractères qu'on lui envoi avec <code>
27 * aj</code> pour les délivrer lors d'un <code>read</code> : c'est
28 * un <em>Reader</em>, tout de même...
29 * Quelles sont les modifs depuis la dernière version ? Juste la méthode
30 * "asStream", où je dois à
31 * <a href="http://www.memoire.com/guillaume-desnoix/alma/">
32 * l'équipe d'Alma</a> quelques judicieuses contributions.
33 * <p>Cette classe est en diffusion LGPL, et elle est téléchargeable à
34 * <a href="http://perso.club-internet.fr/hagnoux/java/TerminalStandard">
35 * http://perso.club-internet.fr/hagnoux/java/TerminalStandard</a>.<br>
36 * @author <a href="h_agnoux.html">Hervé AGNOUX</a>,
37 * hagnoux@mail.club-internet.fr
38 * @version 111999
39 */
40 public class MinReader extends Reader
41 {
42 private final static int TAILLE_BUF_IN = 1023;
43
44 private boolean ouvert = true;
45 private char readerBuf[] = new char[TAILLE_BUF_IN];
46 private int début = 0;
47 private int fin = 0;
48
49 /**
50 * R.A.S.
51 */
52 public MinReader()
53 {
54 lock = new Object();
55 }
56
57 /**
58 * R.A.S.
59 * @exception IOException R.A.S.
60 */
61 public int read(char cbuf[], int off, int len) throws IOException
62 {
63 int nbLu = 0;
64
65 if (!ouvert)
66 throw new IOException("Lecteur fermé.");
67 try
68 {
69 if (début == fin)
70 {
71 synchronized (lock)
72 {
73 lock.wait();
74 }
75 }
76 cbuf[off] = readerBuf[début];
77 début++;
78 if (début == TAILLE_BUF_IN)
79 début = 0;
80 nbLu = 1;
81 }
82 catch (Exception e)
83 {
84 // rien... (du moins, il me semble...)
85 }
86 return nbLu;
87 }
88
89 /**
90 * R.A.S.
91 */
92 public void close()
93 {
94 ouvert = false;
95 }
96
97 /**
98 * Ajoute des caractères à lire par <code>read</code>.
99 * @param clef le caractère.
100 */
101 public void aj(char clef)
102 {
103 int memoFin;
104 boolean àDébloquer;
105
106 memoFin = fin;
107 àDébloquer = fin == début;
108 readerBuf[fin] = clef;
109 fin++;
110 if (fin == TAILLE_BUF_IN)
111 fin = 0;
112 if (fin == début)
113 {
114 System.err.println
115 ("Buffer d'entrée de MinReader trop petit !");
116 fin = memoFin;
117 }
118 if (àDébloquer)
119 {
120 synchronized (lock)
121 {
122 lock.notifyAll();
123 }
124 }
125 }
126
127 /**
128 * R.A.S.
129 */
130 public boolean ready()
131 {
132 return début != fin;
133 }
134
135 /**
136 * Renvoit un InputStream intermédiaire.
137 * @return ... voir ligne au dessus.
138 */
139 public InputStream asStream()
140 {
141 return new Stream();
142 }
143
144 private class Stream extends java.io.InputStream
145 {
146 char buf[] = new char[1];
147
148 public int read() throws IOException
149 {
150 int l;
151
152 l = MinReader.this.read(buf, 0, 1);
153 if (l == -1)
154 return l;
155 return (int)buf[0];
156 }
157
158 public int available()
159 {
160 int c;
161
162 if (début >= fin)
163 c = début - fin;
164 else
165 c = readerBuf.length - fin + début;
166 return c;
167 }
168
169 /**
170 * Merci a l'équipe d'Alma ! Pour des raisons qui m'échappent, il faut
171 * surcharger cette méthode.
172 */
173 public int read(byte[] _b, int _d, int _l) throws IOException
174 {
175 if(_l==0) return 0;
176 _b[_d]=(byte)read();
177 return 1;
178 }
179 }
180 }
181
182
183