Fixed bug #1404228: Crash on <?php // comment ?>
[phpeclipse.git] / archive / net.sourceforge.phpeclipse.jtidy / src / net / sourceforge / phpdt / tidy / w3c / OutImpl.java
1 /*
2  * @(#)OutImpl.java   1.11 2000/08/16
3  *
4  */
5
6 package net.sourceforge.phpdt.tidy.w3c;
7
8 /**
9  *
10  * Output Stream Implementation
11  *
12  * (c) 1998-2000 (W3C) MIT, INRIA, Keio University
13  * See Tidy.java for the copyright notice.
14  * Derived from <a href="http://www.w3.org/People/Raggett/tidy">
15  * HTML Tidy Release 4 Aug 2000</a>
16  *
17  * @author  Dave Raggett <dsr@w3.org>
18  * @author  Andy Quick <ac.quick@sympatico.ca> (translation to Java)
19  * @version 1.0, 1999/05/22
20  * @version 1.0.1, 1999/05/29
21  * @version 1.1, 1999/06/18 Java Bean
22  * @version 1.2, 1999/07/10 Tidy Release 7 Jul 1999
23  * @version 1.3, 1999/07/30 Tidy Release 26 Jul 1999
24  * @version 1.4, 1999/09/04 DOM support
25  * @version 1.5, 1999/10/23 Tidy Release 27 Sep 1999
26  * @version 1.6, 1999/11/01 Tidy Release 22 Oct 1999
27  * @version 1.7, 1999/12/06 Tidy Release 30 Nov 1999
28  * @version 1.8, 2000/01/22 Tidy Release 13 Jan 2000
29  * @version 1.9, 2000/06/03 Tidy Release 30 Apr 2000
30  * @version 1.10, 2000/07/22 Tidy Release 8 Jul 2000
31  * @version 1.11, 2000/08/16 Tidy Release 4 Aug 2000
32  */
33
34 import java.io.IOException;
35
36 public class OutImpl extends Out
37 {
38
39     public OutImpl()
40     {
41         this.out = null;
42     }
43
44     public void outc(byte c) {
45         outc(((int)c) & 0xFF);  // Convert to unsigned.
46     }
47
48     /* For mac users, should we map Unicode back to MacRoman? */
49     public void outc(int c)
50     {
51         int ch;
52
53         try {
54             if (this.encoding == Configuration.UTF8)
55             {
56                 if (c < 128)
57                     this.out.write(c);
58                 else if (c <= 0x7FF)
59                 {
60                     ch = (0xC0 | (c >> 6)); this.out.write(ch);
61                     ch = (0x80 | (c & 0x3F)); this.out.write(ch);
62                 }
63                 else if (c <= 0xFFFF)
64                 {
65                     ch = (0xE0 | (c >> 12)); this.out.write(ch);
66                     ch = (0x80 | ((c >> 6) & 0x3F)); this.out.write(ch);
67                     ch = (0x80 | (c & 0x3F)); this.out.write(ch);
68                 }
69                 else if (c <= 0x1FFFFF)
70                 {
71                     ch = (0xF0 | (c >> 18)); this.out.write(ch);
72                     ch = (0x80 | ((c >> 12) & 0x3F)); this.out.write(ch);
73                     ch = (0x80 | ((c >> 6) & 0x3F)); this.out.write(ch);
74                     ch = (0x80 | (c & 0x3F)); this.out.write(ch);
75                 }
76                 else
77                 {
78                     ch = (0xF8 | (c >> 24)); this.out.write(ch);
79                     ch = (0x80 | ((c >> 18) & 0x3F)); this.out.write(ch);
80                     ch = (0x80 | ((c >> 12) & 0x3F)); this.out.write(ch);
81                     ch = (0x80 | ((c >> 6) & 0x3F)); this.out.write(ch);
82                     ch = (0x80 | (c & 0x3F)); this.out.write(ch);
83                 }
84             }
85             else if (this.encoding == Configuration.ISO2022)
86             {
87                 if (c == 0x1b)  /* ESC */
88                     this.state = StreamIn.FSM_ESC;
89                 else
90                 {
91                     switch (this.state)
92                     {
93                     case StreamIn.FSM_ESC:
94                         if (c == '$')
95                             this.state = StreamIn.FSM_ESCD;
96                         else if (c == '(')
97                             this.state = StreamIn.FSM_ESCP;
98                         else
99                             this.state = StreamIn.FSM_ASCII;
100                         break;
101
102                     case StreamIn.FSM_ESCD:
103                         if (c == '(')
104                             this.state = StreamIn.FSM_ESCDP;
105                         else
106                             this.state = StreamIn.FSM_NONASCII;
107                         break;
108
109                     case StreamIn.FSM_ESCDP:
110                         this.state = StreamIn.FSM_NONASCII;
111                         break;
112
113                     case StreamIn.FSM_ESCP:
114                         this.state = StreamIn.FSM_ASCII;
115                         break;
116
117                     case StreamIn.FSM_NONASCII:
118                         c &= 0x7F;
119                         break;
120                     }
121                 }
122
123                 this.out.write(c);
124             }
125             else
126                 this.out.write(c);
127         }
128         catch (IOException e) {
129             System.err.println("OutImpl.outc: " + e.toString());
130         }
131     }
132
133     public void newline()
134     {
135         try {
136             this.out.write(nlBytes);
137             this.out.flush();
138         }
139         catch (IOException e) {
140             System.err.println("OutImpl.newline: " + e.toString());
141         }
142     }
143
144     private static final byte[] nlBytes =
145         (System.getProperty("line.separator")).getBytes();
146
147 };
148