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