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