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