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