Comment.java revision 608:7e06bf1dcb09
1/*
2 * Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25/*
26 * COMPONENT_NAME: idl.parser
27 *
28 * ORIGINS: 27
29 *
30 * Licensed Materials - Property of IBM
31 * 5639-D57 (C) COPYRIGHT International Business Machines Corp. 1997, 1999
32 * RMI-IIOP v1.0
33 *
34 */
35
36package com.sun.tools.corba.se.idl;
37
38// NOTES:
39
40import java.io.PrintWriter;
41import java.io.IOException;
42import java.util.StringTokenizer;
43
44public class Comment
45{
46  // Styles
47  static final int UNKNOWN  = -1;
48  static final int JAVA_DOC =  0;
49  static final int C_BLOCK  =  1;
50  static final int CPP_LINE =  2;
51
52  // System-dependent line separator
53  private static String _eol = System.getProperty ("line.separator");
54
55  private String _text  = new String ("");
56  private int    _style = UNKNOWN;
57
58  Comment () {_text = new String (""); _style = UNKNOWN;} // ctor
59
60  Comment (String text) {_text = text; _style = style (_text);} // ctor
61
62  /** Sets comment text */
63  public void text (String string) {_text = string; _style = style (_text);}
64
65  /** Returns comment text */
66  public String text () {return _text;}
67
68  /** Returns the comment style of a string. */
69  private int style (String text)
70  {
71    if (text == null)
72      return UNKNOWN;
73    else if (text.startsWith ("/**") && text.endsWith ("*/"))
74      return JAVA_DOC;
75    else if (text.startsWith ("/*") && text.endsWith ("*/"))
76      return C_BLOCK;
77    else if (text.startsWith ("//"))
78      return CPP_LINE;
79    else
80      return UNKNOWN;
81  } // style
82
83  /** Writes comment text to standard output (debug). */
84  public void write () {System.out.println (_text);}
85
86  /** Writes comment text to the specified print stream in the appropriate format. */
87  public void generate (String indent, PrintWriter printStream)
88  {
89    if (_text == null || printStream == null)
90      return;
91    if (indent == null)
92      indent = new String ("");
93    switch (_style)
94    {
95      case JAVA_DOC:
96        //printJavaDoc (indent, printStream);
97        print (indent, printStream);
98        break;
99      case C_BLOCK:
100        //printCBlock (indent, printStream);
101        print (indent, printStream);
102        break;
103      case CPP_LINE:
104        //printCppLine (indent, printStream);
105        print (indent, printStream);
106        break;
107      default:
108        break;
109    }
110  } // generate
111
112  /** Writes comment to the specified print stream without altering its format.
113      This routine does not alter vertical or horizontal spacing of comment text,
114      thus, it only works well for comments with a non-indented first line. */
115  private void print (String indent, PrintWriter stream)
116  {
117    String text = _text.trim () + _eol;
118    String line = null;
119
120    int iLineStart = 0;
121    int iLineEnd   = text.indexOf (_eol);
122    int iTextEnd   = text.length () - 1;
123
124    stream.println ();
125    while (iLineStart < iTextEnd)
126    {
127      line = text.substring (iLineStart, iLineEnd);
128      stream.println (indent + line);
129      iLineStart = iLineEnd + _eol.length ();
130      iLineEnd = iLineStart + text.substring (iLineStart).indexOf (_eol);
131    }
132  } // print
133
134  /*
135   *  The following routines print formatted comments of differing styles.
136   *  Each routine will alter the horizontal spacing of the comment text,
137   *  but not the vertical spacing.
138   */
139
140  /** Writes comment in JavaDoc-style to the specified print stream. */
141  private void printJavaDoc (String indent, PrintWriter stream)
142  {
143    // Strip surrounding "/**", "*/", and whitespace; append sentinel
144    String text = _text.substring (3, (_text.length () - 2)).trim () + _eol;
145    String line = null;
146
147    int iLineStart = 0;
148    int iLineEnd   = text.indexOf (_eol);
149    int iTextEnd   = text.length () - 1;   // index of last text character
150
151    stream.println (_eol + indent + "/**");
152    while (iLineStart < iTextEnd)
153    {
154      line = text.substring (iLineStart, iLineEnd).trim ();
155      if (line.startsWith ("*"))
156        // Strip existing "*<ws>" prefix
157        stream.println (indent + " * " + line.substring (1, line.length ()).trim ());
158      else
159        stream.println (indent + " * " + line);
160      iLineStart = iLineEnd + _eol.length ();
161      iLineEnd = iLineStart + text.substring (iLineStart).indexOf (_eol);
162    }
163    stream.println (indent + " */");
164  } // printJavaDoc
165
166  /** Writes comment in c-block-style to the specified print stream. */
167  private void printCBlock (String indent, PrintWriter stream)
168  {
169    // Strip surrounding "/*", "*/", and whitespace; append sentinel
170    String text = _text.substring (2, (_text.length () - 2)).trim () + _eol;
171    String line = null;
172
173    int iLineStart = 0;
174    int iLineEnd   = text.indexOf (_eol);
175    int iTextEnd   = text.length () - 1;   // index of last text character
176
177    stream.println (indent + "/*");
178    while (iLineStart < iTextEnd)
179    {
180      line = text.substring (iLineStart, iLineEnd).trim ();
181      if (line.startsWith ("*"))
182        // Strip existing "*[ws]" prefix
183        stream.println (indent + " * " + line.substring (1, line.length ()).trim ());
184      else
185        stream.println (indent + " * " + line);
186      iLineStart = iLineEnd + _eol.length ();
187      iLineEnd   = iLineStart + text.substring (iLineStart).indexOf (_eol);
188    }
189    stream.println (indent + " */");
190  } // printCBlock
191
192  /** Writes a line comment to the specified print stream. */
193  private void printCppLine (String indent, PrintWriter stream)
194  {
195    stream.println (indent + "//");
196    // Strip "//[ws]" prefix
197    stream.println (indent + "// " + _text.substring (2).trim ());
198    stream.println (indent + "//");
199  } // printCppLine
200} // class Comment
201
202
203/*==================================================================================
204  DATE<AUTHOR>   ACTION
205  ----------------------------------------------------------------------------------
206  11aug1997<daz> Initial version completed.
207  18aug1997<daz> Modified generate to write comment unformatted.
208  ==================================================================================*/
209