166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer/* 266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer * Copyright 2012 The Android Open Source Project 366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer * 466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer * Licensed under the Apache License, Version 2.0 (the "License"); 566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer * you may not use this file except in compliance with the License. 666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer * You may obtain a copy of the License at 766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer * 866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer * http://www.apache.org/licenses/LICENSE-2.0 966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer * 1066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer * Unless required by applicable law or agreed to in writing, software 1166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer * distributed under the License is distributed on an "AS IS" BASIS, 1266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer * See the License for the specific language governing permissions and 1466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer * limitations under the License. 1566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer */ 1666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 1766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshoferimport java.io.BufferedReader; 1866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshoferimport java.io.File; 1966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshoferimport java.io.FileOutputStream; 2066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshoferimport java.io.FileReader; 2166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshoferimport java.io.IOException; 2266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshoferimport java.io.PrintStream; 2366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 2466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshoferpublic class GenerateEGL { 2566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 2666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer private static void copy(String filename, PrintStream out) throws IOException { 2766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer BufferedReader br = new BufferedReader(new FileReader(filename)); 2866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String s; 2966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer while ((s = br.readLine()) != null) { 3066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(s); 3166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 3266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 3366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 3466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer private static void emit(EGLCodeEmitter emitter, 3566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer BufferedReader specReader, 3666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer PrintStream glStream, 3766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer PrintStream cStream) throws Exception { 3866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String s = null; 3966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer while ((s = specReader.readLine()) != null) { 4066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (s.trim().startsWith("//")) { 4166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer continue; 4266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 4366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 4466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer CFunc cfunc = CFunc.parseCFunc(s); 4566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 4666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String fname = cfunc.getName(); 4766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String stubRoot = "stubs/egl/" + fname; 4866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String javaPath = stubRoot + ".java"; 4966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer File f = new File(javaPath); 5066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (f.exists()) { 5166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer System.out.println("Special-casing function " + fname); 5266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer copy(javaPath, glStream); 5366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer copy(stubRoot + ".cpp", cStream); 5466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 5566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // Register native function names 5666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // This should be improved to require fewer discrete files 5766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String filename = stubRoot + ".nativeReg"; 5866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer BufferedReader br = 5966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer new BufferedReader(new FileReader(filename)); 6066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String nfunc; 6166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer while ((nfunc = br.readLine()) != null) { 6266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer emitter.addNativeRegistration(nfunc); 6366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 6466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else { 6566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer emitter.emitCode(cfunc, s); 6666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 6766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 6866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 6966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 7066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer public static void main(String[] args) throws Exception { 7166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer int aidx = 0; 7266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer while ((aidx < args.length) && (args[aidx].charAt(0) == '-')) { 7366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer switch (args[aidx].charAt(1)) { 7466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer default: 7566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer System.err.println("Unknown flag: " + args[aidx]); 7666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer System.exit(1); 7766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 7866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 7966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer aidx++; 8066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 8166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 8266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer BufferedReader checksReader = 8366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer new BufferedReader(new FileReader("specs/egl/checks.spec")); 8466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer ParameterChecker checker = new ParameterChecker(checksReader); 8566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 8666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 8766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer BufferedReader specReader = 8866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer new BufferedReader(new FileReader("specs/egl/EGL14.spec")); 8966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 9066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String egljFilename = "android/opengl/EGL14.java"; 9166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String eglcFilename = "android_opengl_EGL14.cpp"; 9266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer PrintStream egljStream = 9366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer new PrintStream(new FileOutputStream("out/" + egljFilename)); 9466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer PrintStream eglcStream = 9566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer new PrintStream(new FileOutputStream("out/" + eglcFilename)); 9666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer egljStream.println("/*"); 9766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer eglcStream.println("/*"); 9866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer copy("stubs/egl/EGL14Header.java-if", egljStream); 9966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer copy("stubs/egl/EGL14cHeader.cpp", eglcStream); 10066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer EGLCodeEmitter emitter = new EGLCodeEmitter( 10166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "android/opengl/EGL14", 10266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer checker, egljStream, eglcStream); 10366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer emit(emitter, specReader, egljStream, eglcStream); 10466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer emitter.emitNativeRegistration("register_android_opengl_jni_EGL14"); 10566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer egljStream.println("}"); 10666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer egljStream.close(); 10766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer eglcStream.close(); 10866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 10966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer} 110