001: /*
002: * Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
003: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004: *
005: * This code is free software; you can redistribute it and/or modify it
006: * under the terms of the GNU General Public License version 2 only, as
007: * published by the Free Software Foundation. Sun designates this
008: * particular file as subject to the "Classpath" exception as provided
009: * by Sun in the LICENSE file that accompanied this code.
010: *
011: * This code is distributed in the hope that it will be useful, but WITHOUT
012: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
013: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
014: * version 2 for more details (a copy is included in the LICENSE file that
015: * accompanied this code).
016: *
017: * You should have received a copy of the GNU General Public License version
018: * 2 along with this work; if not, write to the Free Software Foundation,
019: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
020: *
021: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
022: * CA 95054 USA or visit www.sun.com if you need additional information or
023: * have any questions.
024: */
025: /*
026: * COMPONENT_NAME: idl.toJava
027: *
028: * ORIGINS: 27
029: *
030: * Licensed Materials - Property of IBM
031: * 5639-D57 (C) COPYRIGHT International Business Machines Corp. 1997, 1999
032: * RMI-IIOP v1.0
033: *
034: * @(#)TCOffsets.java 1.20 07/05/05
035: */
036:
037: package com.sun.tools.corba.se.idl.toJavaPortable;
038:
039: // NOTES:
040:
041: import java.util.Enumeration;
042: import java.util.Hashtable;
043:
044: import com.sun.tools.corba.se.idl.*;
045:
046: // This class is passed through the JavaGenerator.HelperType methods.
047: // It is ONLY used when a recursive sequence is detected. ie.
048: //
049: // struct S1
050: // {
051: // sequence <S1> others;
052: // };
053:
054: /**
055: *
056: **/
057: public class TCOffsets {
058: /**
059: * Return -1 if the given name is not in the list of types.
060: **/
061: public int offset(String name) {
062: Integer value = (Integer) tcs.get(name);
063: return value == null ? -1 : value.intValue();
064: } // offset
065:
066: /**
067: *
068: **/
069: public void set(SymtabEntry entry) {
070: if (entry == null)
071: offset += 8;
072: else {
073: tcs.put(entry.fullName(), new Integer(offset));
074: offset += 4;
075: String repID = Util.stripLeadingUnderscoresFromID(entry
076: .repositoryID().ID());
077: if (entry instanceof InterfaceEntry)
078: offset += alignStrLen(repID)
079: + alignStrLen(entry.name());
080: else if (entry instanceof StructEntry)
081: offset += alignStrLen(repID)
082: + alignStrLen(entry.name()) + 4;
083: else if (entry instanceof UnionEntry)
084: offset += alignStrLen(repID)
085: + alignStrLen(entry.name()) + 12;
086: else if (entry instanceof EnumEntry) {
087: offset += alignStrLen(repID)
088: + alignStrLen(entry.name()) + 4;
089: Enumeration e = ((EnumEntry) entry).elements()
090: .elements();
091: while (e.hasMoreElements())
092: offset += alignStrLen((String) e.nextElement());
093: } else if (entry instanceof StringEntry)
094: offset += 4;
095: else if (entry instanceof TypedefEntry) {
096: offset += alignStrLen(repID)
097: + alignStrLen(entry.name());
098: if (((TypedefEntry) entry).arrayInfo().size() != 0)
099: offset += 8;
100: }
101: }
102: } // set
103:
104: /**
105: * Return the full length of the string type: 4 byte length, x bytes for
106: * string + 1 for the null terminator, align it so it ends on a 4-byte
107: * boundary. This method assumes the string starts at a 4-byte boundary
108: * since it doesn't do any leading alignment.
109: **/
110: public int alignStrLen(String string) {
111: int len = string.length() + 1;
112: int align = 4 - (len % 4);
113: if (align == 4)
114: align = 0;
115: return len + align + 4;
116: } // alignStrLen
117:
118: /**
119: *
120: **/
121: public void setMember(SymtabEntry entry) {
122: offset += alignStrLen(entry.name());
123: if (((TypedefEntry) entry).arrayInfo().size() != 0)
124: offset += 4;
125: } // setMember
126:
127: /**
128: *
129: **/
130: public int currentOffset() {
131: return offset;
132: } // currentOffset
133:
134: /**
135: *
136: **/
137: public void bumpCurrentOffset(int value) {
138: offset += value;
139: } // bumpCurrentOffset
140:
141: private Hashtable tcs = new Hashtable();
142: private int offset = 0;
143: } // class TCOffsets
|