xref: /petsc/lib/petsc/bin/maint/generators/java.py (revision d083f849a86f1f43e18d534ee43954e2786cb29a)
1#!/usr/bin/env python
2#!/bin/env python
3# $Id: adprocess.py,v 1.12 2001/08/24 18:26:15 bsmith Exp $
4#
5# change python to whatever is needed on your system to invoke python
6#
7#  Reads classes.data and prints the language d classes
8#
9#  Crude as all hack!
10#
11#  Calling sequence:
12#      d.py
13##
14import os
15import re
16from exceptions import *
17import sys
18from string import *
19import pickle
20
21def replace(enums,senums,structs,aliases,classes,k):
22  k = k.replace("*","")
23  for l in aliases: k = k.replace(l,aliases[l])
24  k = k.replace("char[]","String").replace("char*","String").replace("char","String");
25  for l in senums: k = k.replace(l,"String")
26  k = k.replace("void","int")
27  k = k.replace("PetscBool","boolean")
28  k = k.replace("*","")
29  k = k.replace("unsigned","")
30  k = k.replace("const","")
31  k = k.replace("ushort","short")
32  k = k.replace("const ","").replace("unsigned long","ulong")
33  return k
34
35def main(args):
36  file = open('classes.data')
37  enums   = pickle.load(file)
38  senums  = pickle.load(file)
39  structs = pickle.load(file)
40  aliases = pickle.load(file)
41  classes = pickle.load(file)
42  if not os.path.isdir('src/java'): os.mkdir('src/java')
43  outfile = open('src/java/petsc.java','w')
44
45  notclasses = ['PetscMalloc','PetscStr','PetscDLLibrary','PetscFunctionList']
46  for i in enums:
47    outfile.write("enum "+i+"\n")
48    outfile.write("{\n")
49    cnt = 0
50    for j in enums[i]:
51      outfile.write("    "+j.replace("=","(")+")")
52      cnt = cnt + 1
53      if not cnt == len(enums[i]): outfile.write(",")
54      else: outfile.write(";")
55      outfile.write("\n")
56    outfile.write("    private final int value;\n")
57    outfile.write("    "+i+"(int v) { this.value = v; }\n")
58    outfile.write("}\n")
59  outfile.write("\n")
60
61  for i in structs:
62    outfile.write("class "+i+"\n")
63    outfile.write("{\n")
64    for k in structs[i]:
65      k = replace(enums,senums,structs,aliases,classes,k)
66      outfile.write("    "+k+";\n")
67    outfile.write("};\n")
68  outfile.write("\n")
69
70  for i in classes:
71    if i in notclasses: continue
72    outfile.write("class "+i+"\n")
73    outfile.write("{\n")
74    for j in classes[i]:
75      if not classes[i][j] or not classes[i][j][0] == i:
76        outfile.write("  static ")
77        outfile.write("native void _"+j+"();\n")
78      else:
79        outfile.write("native void _"+j+"(int ptr")
80        cnt = 0
81        for k in classes[i][j]:
82          if cnt > 0:
83            k = replace(enums,senums,structs,aliases,classes,k)
84            if k in classes: k = 'int'
85            outfile.write(","+k+" a"+str(cnt))
86          cnt = cnt + 1
87        outfile.write(");\n")
88
89    outfile.write("  static native int _"+i+"Create();\n")
90    outfile.write("    "+i+"() {this.ptr = _"+i+"Create();}\n")
91
92    for j in classes[i]:
93      if not classes[i][j] or not classes[i][j][0] == i:
94        outfile.write("  static ")
95      outfile.write("    void "+j+"(")
96      cnt = 0
97      for k in classes[i][j]:
98        k = replace(enums,senums,structs,aliases,classes,k)
99        if cnt > 0:
100          outfile.write(k+" a"+str(cnt))
101          if cnt < len(classes[i][j])-1: outfile.write(",")
102        cnt = cnt + 1
103      outfile.write("){_"+j+"(")
104      if classes[i][j] and classes[i][j][0] == i:
105        outfile.write("this.ptr")
106        for l in range(1,cnt):
107          if replace(enums,senums,structs,aliases,classes,classes[i][j][l]) in classes: outfile.write(",a"+str(l)+".ptr")
108          else: outfile.write(",a"+str(l))
109      outfile.write(");}\n")
110    outfile.write("    int ptr;\n")
111    if i == "Petsc":
112      outfile.write('static {System.loadLibrary("petsc");}\n')
113    outfile.write("}\n")
114  outfile.close()
115
116  os.system("cd src/java; javac petsc.java")
117  import re
118  for i in classes:
119    if i in notclasses: continue
120    os.system("cd src/java; javah "+i+";cp "+i+".h "+i+".c")
121    f = open('src/java/'+i+".c","r")
122    w = f.read()
123    f.close()
124    w = w.replace("#include <jni.h>",'#include "'+i+'.h"')
125    w = w.replace("#ifndef _Included_","#ifndef _string_that_does_not_exist_")
126    w = w.replace("#define _Included_","#define _another_string_that_does_not_exist_")
127    w = w.replace("#include <jni.h>","#include <JavaVM/jni.h>")
128    for j in classes[i]:
129      t = re.search('JNIEXPORT void JNICALL Java_'+i+'[_0-9]*'+j+'\n [ ]* \(JNIEnv \*([, A-Za-z]*)\)',w)
130      if t:
131        t = t.group(0).split('\n')[1].replace('(JNIEnv *,','').replace(')','').split(',')
132        cnt = 1
133        t1  = ''
134        t2  = 'a2'
135        for k in t:
136          t1 = t1 + ','+k+' a'+str(cnt)
137          if cnt > 2:
138            if k.strip() == 'jstring':
139              t2 = t2 +', (*a0)->GetStringUTFChars(a0, a'+str(cnt)+',0)'
140            else:
141              t2 = t2 +', a'+str(cnt)
142          cnt = cnt + 1
143        if cnt == 2:
144          w = re.sub('JNIEXPORT void JNICALL Java_'+i+'([_0-9]*)'+j+'\n [ ]* \(JNIEnv \*, ([a-z]*)\)','JNIEXPORT void JNICALL Java_'+i+'\\1'+j+' (JNIEnv *a0,\\2 a1) {'+i+j+'();}',w)
145        else:
146          w = re.sub('JNIEXPORT void JNICALL Java_'+i+'([_0-9]*)'+j+'\n [ ]* \(JNIEnv \*([, A-Za-z]*)\)','JNIEXPORT void JNICALL Java_'+i+'\\1'+j+' (JNIEnv *a0'+t1+') {'+i+j+'('+t2+');}',w)
147
148    w = re.sub('JNIEXPORT jint JNICALL Java_'+i+'([_0-9]*)'+i+'Create\n [ ]* \(JNIEnv \*, ([a-z]*)\)','JNIEXPORT jint JNICALL Java_'+i+'\\1'+i+'Create(JNIEnv *a1,\\2 a2) {int ptr; '+i+'Create(0,&ptr); return ptr;}',w)
149    f = open('src/java/'+i+".c","w")
150    f.write(w)
151    f.close()
152
153    f = open('src/java/'+i+".h","r")
154    w = f.read()
155    f.close()
156    w = w.replace("#include <jni.h>","#include <JavaVM/jni.h>")
157    f = open('src/java/'+i+".h","w")
158    f.write(w)
159    f.close()
160    os.system("cd src/java; gcc -c -fPIC "+i+".c")
161
162  os.system("cd src/java; gcc -dynamiclib -single_module -multiply_defined suppress -undefined dynamic_lookup -framework JavaVM -o libpetsc.dylib *.o ${PETSC_DIR}/${PETSC_ARCH}/lib/libpetscts.dylib")
163
164
165
166
167#
168# The classes in this file can also be used in other python-programs by using 'import'
169#
170if __name__ ==  '__main__':
171  main(sys.argv[1:])
172
173