1 /*
2  * Copyright (c) 1998, 2013, 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 package build.tools.jdwpgen;
27 
28 import java.util.*;
29 import java.io.*;
30 
31 class RepeatNode extends AbstractTypeNode {
32 
33     Node member = null;
34 
constrain(Context ctx)35     void constrain(Context ctx) {
36         super.constrain(ctx);
37         if (components.size() != 1) {
38             error("Repeat must have exactly one member, use Group for more");
39         }
40         member = components.get(0);
41         if (!(member instanceof TypeNode)) {
42             error("Repeat member must be type specifier");
43         }
44     }
45 
document(PrintWriter writer)46     void document(PrintWriter writer) {
47         docRowStart(writer);
48         writer.println("<td colspan=" +
49                        (maxStructIndent - structIndent) + ">");
50         writer.println("int<td><i>" + name + "</i><td>" +
51                        comment() + "&nbsp;");
52         docRowStart(writer);
53         writer.println("<td colspan=" +
54                        (maxStructIndent - structIndent + 2) + ">");
55         writer.println("Repeated <i>" + name + "</i> times:");
56         ++structIndent;
57         member.document(writer);
58         --structIndent;
59     }
60 
docType()61     String docType() {
62         return "-BOGUS-"; // should never call this
63     }
64 
javaType()65     String javaType() {
66         return member.javaType() + "[]";
67     }
68 
genJavaWrite(PrintWriter writer, int depth, String writeLabel)69     public void genJavaWrite(PrintWriter writer, int depth,
70                              String writeLabel) {
71         genJavaDebugWrite(writer, depth, writeLabel, "\"\"");
72         indent(writer, depth);
73         writer.println("ps.writeInt(" + writeLabel + ".length);");
74         indent(writer, depth);
75         writer.println("for (int i = 0; i < " + writeLabel + ".length; i++) {;");
76         ((TypeNode)member).genJavaWrite(writer, depth+1, writeLabel + "[i]");
77         indent(writer, depth);
78         writer.println("}");
79     }
80 
javaRead()81     String javaRead() {
82         error("Internal - Should not call RepeatNode.javaRead()");
83         return "";
84     }
85 
genJavaRead(PrintWriter writer, int depth, String readLabel)86     public void genJavaRead(PrintWriter writer, int depth,
87                             String readLabel) {
88         genJavaDebugRead(writer, depth, readLabel, "\"\"");
89         String cntLbl = readLabel + "Count";
90         indent(writer, depth);
91         writer.println("int " + cntLbl + " = ps.readInt();");
92         indent(writer, depth);
93         writer.println(readLabel + " = new " + member.javaType() +
94                        "[" + cntLbl + "];");
95         indent(writer, depth);
96         writer.println("for (int i = 0; i < " + cntLbl + "; i++) {;");
97         member.genJavaRead(writer, depth+1, readLabel + "[i]");
98         indent(writer, depth);
99         writer.println("}");
100     }
101 }
102