Milán Major

netscape-revival

1 branch
Code

sun-java/classsrc/netscape/tools/jmc/CImplHeaderGen.java

// Copyright (c) 1995 Netscape Communications Corporation. All rights reserved. 

package netscape.tools.jmc;

import netscape.tools.jmc.*;
import netscape.tools.jric.*;
import netscape.tools.ClassFileParser.*;
import java.io.*;
import java.util.Vector;

public 
class CImplHeaderGen extends JMCGenerator {

    public CImplHeaderGen(netscape.tools.jmc.Main global, ClassDef clazz) {
	super(global, clazz);
    }

    protected String getFileName() {
	return "M" + getImplName() + ".h";
    }

    protected String getHeaderString() {
	return clazz.name + " module C-language header file\n * Generated by jmc";
    }

    protected void generateOutput() throws IOException {
	int i;
	    
	Vector interfaces = getInterfaces(clazz);
	String prefix = getImplName();

	out.println("#ifndef _M" + prefix + "_H_");
	out.println("#define _M" + prefix + "_H_\n");

	out.println("#include \"M" + clazz.getPrefix() + ".h\"");
	out.println("typedef struct " + getImplName()
                    + "\t" + getImplName() + ";\n");

	out.println("#ifdef __cplusplus");
	out.println("extern \"C\" {");
	out.println("#endif /* __cplusplus */\n");

	for (i = interfaces.size() - 1; i >= 0; i--) {
	    ClassDef intf = (ClassDef)interfaces.elementAt(i);
	    for (int j = 0; j < intf.methods.length; j++) {
		MethodDef method = intf.methods[j];
		forwardDeclare(method);
	    }
	}
	out.println();

	printBlockComment("Operations you must implement");

	// GetInterface
	out.println("JRI_PUBLIC_API(void*)");
	out.println(prefix + "_GetInterface("
		    + prefix + "* self, jint op, jint iid);\n");

	// AddRef
	out.println("JRI_PUBLIC_API(void)");
	out.println(prefix + "_AddRef("
		    + prefix + "* self, jint op);\n");

	// Release
	out.println("JRI_PUBLIC_API(void)");
	out.println(prefix + "_Release("
		    + prefix + "* self, jint op);\n");

	// Description
	out.println("JRI_PUBLIC_API(const char**)");
	out.println(prefix + "_Description("
		    + prefix + "* self, jint op);\n");

	// Generate a prototype for each method
	for (i = interfaces.size() - 1; i >= 0; i--) {
	    ClassDef intf = (ClassDef)interfaces.elementAt(i);
	    int j;
	    for (j = 0; j < intf.methods.length; j++) {
		MethodDef method = intf.methods[j];
		printMethodFunctionSig(prefix, method, j);
		out.println(";\n");
	    }
	}

	printBlockComment("Factory Operations");

	out.println("JRI_PUBLIC_API(" + prefix + "*)");
	out.println(prefix + "Factory_Create(jint size);\n");

	out.println("#ifdef __cplusplus");
	out.println("} /* extern \"C\" */");
	out.println("#endif /* __cplusplus */\n");

	out.println("#endif /* _M" + prefix + "_H_ */");
    }

    //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//
    
}