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