xref: /aosp_15_r20/frameworks/base/media/mca/structgen.py (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker#!/usr/bin/env python
2*d57664e9SAndroid Build Coastguard Worker
3*d57664e9SAndroid Build Coastguard Worker#
4*d57664e9SAndroid Build Coastguard Worker# Copyright (C) 2011 The Android Open Source Project
5*d57664e9SAndroid Build Coastguard Worker#
6*d57664e9SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
7*d57664e9SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
8*d57664e9SAndroid Build Coastguard Worker# You may obtain a copy of the License at
9*d57664e9SAndroid Build Coastguard Worker#
10*d57664e9SAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
11*d57664e9SAndroid Build Coastguard Worker#
12*d57664e9SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
13*d57664e9SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
14*d57664e9SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15*d57664e9SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
16*d57664e9SAndroid Build Coastguard Worker# limitations under the License.
17*d57664e9SAndroid Build Coastguard Worker#
18*d57664e9SAndroid Build Coastguard Worker
19*d57664e9SAndroid Build Coastguard Workerimport os
20*d57664e9SAndroid Build Coastguard Workerimport sys
21*d57664e9SAndroid Build Coastguard Worker
22*d57664e9SAndroid Build Coastguard WorkerhFileTemplate = """/**
23*d57664e9SAndroid Build Coastguard Worker * This file is auto-generated by platform/system/media/mca/structgen.py! Do NOT modify!
24*d57664e9SAndroid Build Coastguard Worker **/
25*d57664e9SAndroid Build Coastguard Worker
26*d57664e9SAndroid Build Coastguard Worker#ifndef %s
27*d57664e9SAndroid Build Coastguard Worker#define %s
28*d57664e9SAndroid Build Coastguard Worker
29*d57664e9SAndroid Build Coastguard Worker%s
30*d57664e9SAndroid Build Coastguard Worker
31*d57664e9SAndroid Build Coastguard Worker#endif // %s
32*d57664e9SAndroid Build Coastguard Worker"""
33*d57664e9SAndroid Build Coastguard Worker
34*d57664e9SAndroid Build Coastguard WorkerjniFileTemplate = """/**
35*d57664e9SAndroid Build Coastguard Worker * This file is auto-generated by platform/system/media/mca/structgen.py! Do NOT modify!
36*d57664e9SAndroid Build Coastguard Worker **/
37*d57664e9SAndroid Build Coastguard Worker
38*d57664e9SAndroid Build Coastguard Worker#include <stdint.h>
39*d57664e9SAndroid Build Coastguard Worker#include "native/%s.h"
40*d57664e9SAndroid Build Coastguard Worker
41*d57664e9SAndroid Build Coastguard Worker#ifdef __cplusplus
42*d57664e9SAndroid Build Coastguard Workerextern "C" {
43*d57664e9SAndroid Build Coastguard Worker#endif
44*d57664e9SAndroid Build Coastguard Worker
45*d57664e9SAndroid Build Coastguard Worker#include "jni.h"
46*d57664e9SAndroid Build Coastguard Worker
47*d57664e9SAndroid Build Coastguard Worker// Helper functions ////////////////////////////////////////////////////////////////////////////////
48*d57664e9SAndroid Build Coastguard Worker%s* Get%sAtIndex(JNIEnv* env, jobject buffer, int index) {
49*d57664e9SAndroid Build Coastguard Worker  jclass base_class = (*env)->FindClass(env, "android/filterfw/core/NativeBuffer");
50*d57664e9SAndroid Build Coastguard Worker  jfieldID ptr_field = (*env)->GetFieldID(env, base_class, "mDataPointer", "J");
51*d57664e9SAndroid Build Coastguard Worker  uintptr_t data_ptr = (*env)->GetLongField(env, buffer, ptr_field);
52*d57664e9SAndroid Build Coastguard Worker  %s* array = (%s*)data_ptr;
53*d57664e9SAndroid Build Coastguard Worker  (*env)->DeleteLocalRef(env, base_class);
54*d57664e9SAndroid Build Coastguard Worker  return &array[index];
55*d57664e9SAndroid Build Coastguard Worker}
56*d57664e9SAndroid Build Coastguard Worker
57*d57664e9SAndroid Build Coastguard Worker// Declarations ////////////////////////////////////////////////////////////////////////////////////
58*d57664e9SAndroid Build Coastguard WorkerJNIEXPORT jint JNICALL
59*d57664e9SAndroid Build Coastguard WorkerJava_%s_getElementSize(JNIEnv* env, jobject thiz);
60*d57664e9SAndroid Build Coastguard Worker
61*d57664e9SAndroid Build Coastguard Worker%s
62*d57664e9SAndroid Build Coastguard Worker
63*d57664e9SAndroid Build Coastguard Worker#ifdef __cplusplus
64*d57664e9SAndroid Build Coastguard Worker}
65*d57664e9SAndroid Build Coastguard Worker#endif
66*d57664e9SAndroid Build Coastguard Worker
67*d57664e9SAndroid Build Coastguard Worker// Implementation //////////////////////////////////////////////////////////////////////////////////
68*d57664e9SAndroid Build Coastguard Workerjint Java_%s_getElementSize(JNIEnv* env, jobject thiz) {
69*d57664e9SAndroid Build Coastguard Worker  return sizeof(%s);
70*d57664e9SAndroid Build Coastguard Worker}
71*d57664e9SAndroid Build Coastguard Worker
72*d57664e9SAndroid Build Coastguard Worker%s
73*d57664e9SAndroid Build Coastguard Worker"""
74*d57664e9SAndroid Build Coastguard Worker
75*d57664e9SAndroid Build Coastguard WorkerjavaFileTemplate = """/**
76*d57664e9SAndroid Build Coastguard Worker * This file is auto-generated by platform/system/media/mca/structgen.py! Do NOT modify!
77*d57664e9SAndroid Build Coastguard Worker **/
78*d57664e9SAndroid Build Coastguard Worker
79*d57664e9SAndroid Build Coastguard Workerpackage %s;
80*d57664e9SAndroid Build Coastguard Worker
81*d57664e9SAndroid Build Coastguard Workerimport android.filterfw.core.NativeBuffer;
82*d57664e9SAndroid Build Coastguard Worker
83*d57664e9SAndroid Build Coastguard Worker%s
84*d57664e9SAndroid Build Coastguard Worker"""
85*d57664e9SAndroid Build Coastguard Worker
86*d57664e9SAndroid Build Coastguard Worker
87*d57664e9SAndroid Build Coastguard Workerdef ToJavaName(cname, start_upper_at = 1):
88*d57664e9SAndroid Build Coastguard Worker  lower = cname.split("_")
89*d57664e9SAndroid Build Coastguard Worker  upper = [c.title() for c in lower]
90*d57664e9SAndroid Build Coastguard Worker  return "".join(lower[:start_upper_at] + upper[start_upper_at:])
91*d57664e9SAndroid Build Coastguard Worker
92*d57664e9SAndroid Build Coastguard Workerdef ToJNIPackage(package, jclassname):
93*d57664e9SAndroid Build Coastguard Worker  return "%s_%s" % (package.replace(".", "_"), jclassname)
94*d57664e9SAndroid Build Coastguard Worker
95*d57664e9SAndroid Build Coastguard Workerdef ToMacroDefName(cname, pname):
96*d57664e9SAndroid Build Coastguard Worker  return "%s_%s" % (pname.replace(".", "_").upper(), cname.upper())
97*d57664e9SAndroid Build Coastguard Worker
98*d57664e9SAndroid Build Coastguard Workerclass ParseError:
99*d57664e9SAndroid Build Coastguard Worker  def __init__(self, lineno, message):
100*d57664e9SAndroid Build Coastguard Worker    self.lineno = lineno
101*d57664e9SAndroid Build Coastguard Worker    self.message = message
102*d57664e9SAndroid Build Coastguard Worker
103*d57664e9SAndroid Build Coastguard Worker  def __str__(self):
104*d57664e9SAndroid Build Coastguard Worker    return "On line %d: %s" % (self.lineno, self.message)
105*d57664e9SAndroid Build Coastguard Worker
106*d57664e9SAndroid Build Coastguard Workerclass FieldType_BasePOD:
107*d57664e9SAndroid Build Coastguard Worker  def __init__(self, name, structname, jclassname, package, javatype, ctype, jtype, defval):
108*d57664e9SAndroid Build Coastguard Worker    self.name = name
109*d57664e9SAndroid Build Coastguard Worker    self.structname = structname
110*d57664e9SAndroid Build Coastguard Worker    self.jclassname = jclassname
111*d57664e9SAndroid Build Coastguard Worker    self.package = package
112*d57664e9SAndroid Build Coastguard Worker    self.javatype = javatype
113*d57664e9SAndroid Build Coastguard Worker    self.ctype = ctype
114*d57664e9SAndroid Build Coastguard Worker    self.jtype = jtype
115*d57664e9SAndroid Build Coastguard Worker    self.defval = defval
116*d57664e9SAndroid Build Coastguard Worker
117*d57664e9SAndroid Build Coastguard Worker  def cString(self):
118*d57664e9SAndroid Build Coastguard Worker    return "  %s %s;" % (self.ctype, self.name)
119*d57664e9SAndroid Build Coastguard Worker
120*d57664e9SAndroid Build Coastguard Worker  def javaGetter(self):
121*d57664e9SAndroid Build Coastguard Worker    return "    public %s get%s(int index) {\n"\
122*d57664e9SAndroid Build Coastguard Worker           "        assertReadable();\n"\
123*d57664e9SAndroid Build Coastguard Worker           "        return nativeGet%s(index);\n"\
124*d57664e9SAndroid Build Coastguard Worker           "    }" % (self.javatype, ToJavaName(self.name, 0), ToJavaName(self.name, 0))
125*d57664e9SAndroid Build Coastguard Worker
126*d57664e9SAndroid Build Coastguard Worker  def javaSetter(self):
127*d57664e9SAndroid Build Coastguard Worker    return "    public void set%s(int index, %s value) {\n"\
128*d57664e9SAndroid Build Coastguard Worker           "        assertWritable();\n"\
129*d57664e9SAndroid Build Coastguard Worker           "        nativeSet%s(index, value);\n"\
130*d57664e9SAndroid Build Coastguard Worker           "    }" % (ToJavaName(self.name, 0), self.javatype, ToJavaName(self.name, 0))
131*d57664e9SAndroid Build Coastguard Worker
132*d57664e9SAndroid Build Coastguard Worker  def javaNativeGetter(self):
133*d57664e9SAndroid Build Coastguard Worker    return "    private native %s nativeGet%s(int index);"\
134*d57664e9SAndroid Build Coastguard Worker           % (self.javatype, ToJavaName(self.name, 0))
135*d57664e9SAndroid Build Coastguard Worker
136*d57664e9SAndroid Build Coastguard Worker  def javaNativeSetter(self):
137*d57664e9SAndroid Build Coastguard Worker    return "    private native boolean nativeSet%s(int index, %s value);"\
138*d57664e9SAndroid Build Coastguard Worker           % (ToJavaName(self.name, 0), self.javatype)
139*d57664e9SAndroid Build Coastguard Worker
140*d57664e9SAndroid Build Coastguard Worker  def jniGetterDefString(self):
141*d57664e9SAndroid Build Coastguard Worker    return "JNIEXPORT %s JNICALL\n" \
142*d57664e9SAndroid Build Coastguard Worker           "Java_%s_nativeGet%s(JNIEnv* env, jobject thiz, jint index);" \
143*d57664e9SAndroid Build Coastguard Worker           % (self.jtype, ToJNIPackage(self.package, self.jclassname), ToJavaName(self.name, 0))
144*d57664e9SAndroid Build Coastguard Worker
145*d57664e9SAndroid Build Coastguard Worker  def jniGetterImplString(self):
146*d57664e9SAndroid Build Coastguard Worker    return \
147*d57664e9SAndroid Build Coastguard Worker      "%s Java_%s_nativeGet%s(JNIEnv* env, jobject thiz, jint index) {\n"\
148*d57664e9SAndroid Build Coastguard Worker      "  %s* instance = Get%sAtIndex(env, thiz, index);\n"\
149*d57664e9SAndroid Build Coastguard Worker      "  return instance ? instance->%s : %s;\n"\
150*d57664e9SAndroid Build Coastguard Worker      "}\n" % (self.jtype, ToJNIPackage(self.package, self.jclassname), ToJavaName(self.name, 0),\
151*d57664e9SAndroid Build Coastguard Worker               self.structname, self.structname, self.name, self.defval)
152*d57664e9SAndroid Build Coastguard Worker
153*d57664e9SAndroid Build Coastguard Worker  def jniSetterDefString(self):
154*d57664e9SAndroid Build Coastguard Worker    return "JNIEXPORT jboolean JNICALL\n" \
155*d57664e9SAndroid Build Coastguard Worker           "Java_%s_nativeSet%s(JNIEnv* env, jobject thiz, jint index, %s value);" \
156*d57664e9SAndroid Build Coastguard Worker           % (ToJNIPackage(self.package, self.jclassname), ToJavaName(self.name, 0), self.jtype)
157*d57664e9SAndroid Build Coastguard Worker
158*d57664e9SAndroid Build Coastguard Worker  def jniSetterImplString(self):
159*d57664e9SAndroid Build Coastguard Worker    return \
160*d57664e9SAndroid Build Coastguard Worker      "jboolean Java_%s_nativeSet%s(JNIEnv* env, jobject thiz, jint index, %s value) {\n"\
161*d57664e9SAndroid Build Coastguard Worker      "  %s* instance = Get%sAtIndex(env, thiz, index);\n"\
162*d57664e9SAndroid Build Coastguard Worker      "  if (instance) {\n"\
163*d57664e9SAndroid Build Coastguard Worker      "    instance->%s = value;\n"\
164*d57664e9SAndroid Build Coastguard Worker      "    return JNI_TRUE;\n"\
165*d57664e9SAndroid Build Coastguard Worker      "  }\n"\
166*d57664e9SAndroid Build Coastguard Worker      "  return JNI_FALSE;\n"\
167*d57664e9SAndroid Build Coastguard Worker      "}\n" % (ToJNIPackage(self.package, self.jclassname), ToJavaName(self.name, 0),\
168*d57664e9SAndroid Build Coastguard Worker               self.jtype, self.structname, self.structname, self.name)
169*d57664e9SAndroid Build Coastguard Worker
170*d57664e9SAndroid Build Coastguard Workerclass FieldType_Float(FieldType_BasePOD):
171*d57664e9SAndroid Build Coastguard Worker  def __init__(self, name, structname, jclassname, package):
172*d57664e9SAndroid Build Coastguard Worker    FieldType_BasePOD.__init__(self, name, structname, jclassname, package, "float", "float", "jfloat", "0.0")
173*d57664e9SAndroid Build Coastguard Worker
174*d57664e9SAndroid Build Coastguard Workerclass FieldType_Int(FieldType_BasePOD):
175*d57664e9SAndroid Build Coastguard Worker  def __init__(self, name, structname, jclassname, package):
176*d57664e9SAndroid Build Coastguard Worker    FieldType_BasePOD.__init__(self, name, structname, jclassname, package, "int", "int", "jint", "0")
177*d57664e9SAndroid Build Coastguard Worker
178*d57664e9SAndroid Build Coastguard Workerclass FieldType_Long(FieldType_BasePOD):
179*d57664e9SAndroid Build Coastguard Worker  def __init__(self, name, structname, jclassname, package):
180*d57664e9SAndroid Build Coastguard Worker    FieldType_BasePOD.__init__(self, name, structname, jclassname, package, "long", "long long", "jlong", "0")
181*d57664e9SAndroid Build Coastguard Worker
182*d57664e9SAndroid Build Coastguard Workerclass StructSpec:
183*d57664e9SAndroid Build Coastguard Worker
184*d57664e9SAndroid Build Coastguard Worker  def parseTextFile(self, filepath):
185*d57664e9SAndroid Build Coastguard Worker    # Init
186*d57664e9SAndroid Build Coastguard Worker    self.name = None
187*d57664e9SAndroid Build Coastguard Worker    self.package = None
188*d57664e9SAndroid Build Coastguard Worker    self.fields = []
189*d57664e9SAndroid Build Coastguard Worker    self.structname = None
190*d57664e9SAndroid Build Coastguard Worker    self.jclassname = None
191*d57664e9SAndroid Build Coastguard Worker    self.libname = None
192*d57664e9SAndroid Build Coastguard Worker
193*d57664e9SAndroid Build Coastguard Worker    # Open the file
194*d57664e9SAndroid Build Coastguard Worker    txtfile = open(filepath)
195*d57664e9SAndroid Build Coastguard Worker
196*d57664e9SAndroid Build Coastguard Worker    # Parse it line by line
197*d57664e9SAndroid Build Coastguard Worker    lineno = 0
198*d57664e9SAndroid Build Coastguard Worker    for line in txtfile:
199*d57664e9SAndroid Build Coastguard Worker      # Split line into components
200*d57664e9SAndroid Build Coastguard Worker      linecomps = line.split()
201*d57664e9SAndroid Build Coastguard Worker      if len(linecomps) == 0:
202*d57664e9SAndroid Build Coastguard Worker        continue
203*d57664e9SAndroid Build Coastguard Worker
204*d57664e9SAndroid Build Coastguard Worker      # Execute command
205*d57664e9SAndroid Build Coastguard Worker      cmd = linecomps[0]
206*d57664e9SAndroid Build Coastguard Worker      if cmd == "@name":
207*d57664e9SAndroid Build Coastguard Worker        self.commandArgAssert(linecomps, 1, lineno)
208*d57664e9SAndroid Build Coastguard Worker        self.name = linecomps[1]
209*d57664e9SAndroid Build Coastguard Worker        if not self.structname:
210*d57664e9SAndroid Build Coastguard Worker          self.structname = self.name
211*d57664e9SAndroid Build Coastguard Worker        if not self.jclassname:
212*d57664e9SAndroid Build Coastguard Worker          self.jclassname = self.name
213*d57664e9SAndroid Build Coastguard Worker      elif cmd == "@package":
214*d57664e9SAndroid Build Coastguard Worker        self.commandArgAssert(linecomps, 1, lineno)
215*d57664e9SAndroid Build Coastguard Worker        self.package = linecomps[1]
216*d57664e9SAndroid Build Coastguard Worker      elif cmd == "@libname":
217*d57664e9SAndroid Build Coastguard Worker        self.commandArgAssert(linecomps, 1, lineno)
218*d57664e9SAndroid Build Coastguard Worker        self.libname = linecomps[1]
219*d57664e9SAndroid Build Coastguard Worker      elif cmd == "@structname":
220*d57664e9SAndroid Build Coastguard Worker        self.commandArgAssert(linecomps, 1, lineno)
221*d57664e9SAndroid Build Coastguard Worker        self.structname = linecomps[1]
222*d57664e9SAndroid Build Coastguard Worker      elif cmd == "@javaclassname":
223*d57664e9SAndroid Build Coastguard Worker        self.commandArgAssert(linecomps, 1, lineno)
224*d57664e9SAndroid Build Coastguard Worker        self.jclassname = linecomps[1]
225*d57664e9SAndroid Build Coastguard Worker      elif cmd == "@field":
226*d57664e9SAndroid Build Coastguard Worker        self.commandArgAssert(linecomps, 2, lineno)
227*d57664e9SAndroid Build Coastguard Worker        typestr = linecomps[1]
228*d57664e9SAndroid Build Coastguard Worker        if typestr == "int":
229*d57664e9SAndroid Build Coastguard Worker          fieldtype = FieldType_Int(linecomps[2], self.structname, self.jclassname, self.package)
230*d57664e9SAndroid Build Coastguard Worker        elif typestr == "long":
231*d57664e9SAndroid Build Coastguard Worker          fieldtype = FieldType_Long(linecomps[2], self.structname, self.jclassname, self.package)
232*d57664e9SAndroid Build Coastguard Worker        elif typestr == "float":
233*d57664e9SAndroid Build Coastguard Worker          fieldtype = FieldType_Float(linecomps[2], self.structname, self.jclassname, self.package)
234*d57664e9SAndroid Build Coastguard Worker        else:
235*d57664e9SAndroid Build Coastguard Worker          raise ParseError(lineno, "Unknown field type '%s'!" % typestr)
236*d57664e9SAndroid Build Coastguard Worker        self.fields.append(fieldtype)
237*d57664e9SAndroid Build Coastguard Worker      else:
238*d57664e9SAndroid Build Coastguard Worker        raise ParseError(lineno, "Unknown command: '%s'!" % cmd)
239*d57664e9SAndroid Build Coastguard Worker
240*d57664e9SAndroid Build Coastguard Worker      lineno = lineno + 1
241*d57664e9SAndroid Build Coastguard Worker
242*d57664e9SAndroid Build Coastguard Worker    # Make sure we have all required info
243*d57664e9SAndroid Build Coastguard Worker    if not self.name:
244*d57664e9SAndroid Build Coastguard Worker      raise ParseError(lineno, "Required field '@name' missing!")
245*d57664e9SAndroid Build Coastguard Worker    elif not self.package:
246*d57664e9SAndroid Build Coastguard Worker      raise ParseError(lineno, "Required field '@package' missing!")
247*d57664e9SAndroid Build Coastguard Worker    elif not self.libname:
248*d57664e9SAndroid Build Coastguard Worker      raise ParseError(lineno, "Required field '@libname' missing!")
249*d57664e9SAndroid Build Coastguard Worker
250*d57664e9SAndroid Build Coastguard Worker    # Normalize values
251*d57664e9SAndroid Build Coastguard Worker    if self.libname[:3] == "lib":
252*d57664e9SAndroid Build Coastguard Worker      self.libname = self.libname[3:]
253*d57664e9SAndroid Build Coastguard Worker
254*d57664e9SAndroid Build Coastguard Worker  def commandArgAssert(self, linecomps, expectedcount, lineno):
255*d57664e9SAndroid Build Coastguard Worker    foundcount = len(linecomps) - 1
256*d57664e9SAndroid Build Coastguard Worker    if foundcount < expectedcount:
257*d57664e9SAndroid Build Coastguard Worker      raise ParseError(lineno, "Not enough arguments specifed for command '%s'! Expected %d, " \
258*d57664e9SAndroid Build Coastguard Worker                       "but got only %d!" % (linecomps[0], expectedcount, foundcount))
259*d57664e9SAndroid Build Coastguard Worker    elif foundcount > expectedcount + 1:
260*d57664e9SAndroid Build Coastguard Worker      raise ParseError(lineno, "Too many arguments specifed for command '%s'! Expected %d, " \
261*d57664e9SAndroid Build Coastguard Worker                       "but got %d!" % (linecomps[0], expectedcount, foundcount))
262*d57664e9SAndroid Build Coastguard Worker
263*d57664e9SAndroid Build Coastguard Worker
264*d57664e9SAndroid Build Coastguard Worker  def cStructString(self):
265*d57664e9SAndroid Build Coastguard Worker    cfields = [f.cString() for f in self.fields]
266*d57664e9SAndroid Build Coastguard Worker    return "typedef struct Struct%s {\n%s\n} %s;\n" % (self.structname,\
267*d57664e9SAndroid Build Coastguard Worker                                                       "\n".join(cfields),\
268*d57664e9SAndroid Build Coastguard Worker                                                       self.structname)
269*d57664e9SAndroid Build Coastguard Worker
270*d57664e9SAndroid Build Coastguard Worker  def javaClassString(self):
271*d57664e9SAndroid Build Coastguard Worker    jgetters = [f.javaGetter() for f in self.fields]
272*d57664e9SAndroid Build Coastguard Worker    jsetters = [f.javaSetter() for f in self.fields]
273*d57664e9SAndroid Build Coastguard Worker    jnativesetters = [f.javaNativeSetter() for f in self.fields]
274*d57664e9SAndroid Build Coastguard Worker    jnativegetters = [f.javaNativeGetter() for f in self.fields]
275*d57664e9SAndroid Build Coastguard Worker    return "public class %s extends NativeBuffer {\n\n"\
276*d57664e9SAndroid Build Coastguard Worker           "    public %s() {\n"\
277*d57664e9SAndroid Build Coastguard Worker           "        super();\n"\
278*d57664e9SAndroid Build Coastguard Worker           "    }\n"\
279*d57664e9SAndroid Build Coastguard Worker           "\n"\
280*d57664e9SAndroid Build Coastguard Worker           "    public %s(int count) {\n"\
281*d57664e9SAndroid Build Coastguard Worker           "        super(count);\n"\
282*d57664e9SAndroid Build Coastguard Worker           "    }\n"\
283*d57664e9SAndroid Build Coastguard Worker           "\n"\
284*d57664e9SAndroid Build Coastguard Worker           "    public native int getElementSize();\n"\
285*d57664e9SAndroid Build Coastguard Worker           "\n"\
286*d57664e9SAndroid Build Coastguard Worker           "%s\n\n"\
287*d57664e9SAndroid Build Coastguard Worker           "%s\n\n"\
288*d57664e9SAndroid Build Coastguard Worker           "%s\n\n"\
289*d57664e9SAndroid Build Coastguard Worker           "%s\n\n"\
290*d57664e9SAndroid Build Coastguard Worker           "    static {\n"\
291*d57664e9SAndroid Build Coastguard Worker           "        System.loadLibrary(\"%s\");\n"\
292*d57664e9SAndroid Build Coastguard Worker           "    }\n"\
293*d57664e9SAndroid Build Coastguard Worker           "\n"\
294*d57664e9SAndroid Build Coastguard Worker           "};\n" % (self.jclassname,\
295*d57664e9SAndroid Build Coastguard Worker                     self.jclassname,\
296*d57664e9SAndroid Build Coastguard Worker                     self.jclassname,\
297*d57664e9SAndroid Build Coastguard Worker                     "\n\n".join(jgetters),\
298*d57664e9SAndroid Build Coastguard Worker                     "\n\n".join(jsetters),\
299*d57664e9SAndroid Build Coastguard Worker                     "\n\n".join(jnativegetters),\
300*d57664e9SAndroid Build Coastguard Worker                     "\n\n".join(jnativesetters),\
301*d57664e9SAndroid Build Coastguard Worker                     self.libname)
302*d57664e9SAndroid Build Coastguard Worker
303*d57664e9SAndroid Build Coastguard Worker  def jniDeclString(self):
304*d57664e9SAndroid Build Coastguard Worker    jnigetters = [f.jniGetterDefString() for f in self.fields]
305*d57664e9SAndroid Build Coastguard Worker    jnisetters = [f.jniSetterDefString() for f in self.fields]
306*d57664e9SAndroid Build Coastguard Worker    return "\n\n".join(jnigetters + jnisetters)
307*d57664e9SAndroid Build Coastguard Worker
308*d57664e9SAndroid Build Coastguard Worker  def jniImplString(self):
309*d57664e9SAndroid Build Coastguard Worker    jnigetters = [f.jniGetterImplString() for f in self.fields]
310*d57664e9SAndroid Build Coastguard Worker    jnisetters = [f.jniSetterImplString() for f in self.fields]
311*d57664e9SAndroid Build Coastguard Worker    return "\n\n".join(jnigetters + jnisetters)
312*d57664e9SAndroid Build Coastguard Worker
313*d57664e9SAndroid Build Coastguard Worker  def hFileString(self):
314*d57664e9SAndroid Build Coastguard Worker    defname = ToMacroDefName(self.structname, self.package)
315*d57664e9SAndroid Build Coastguard Worker    return hFileTemplate % (defname, defname, self.cStructString(), defname)
316*d57664e9SAndroid Build Coastguard Worker
317*d57664e9SAndroid Build Coastguard Worker  def javaFileString(self):
318*d57664e9SAndroid Build Coastguard Worker    return javaFileTemplate % (self.package, self.javaClassString())
319*d57664e9SAndroid Build Coastguard Worker
320*d57664e9SAndroid Build Coastguard Worker  def jniFileString(self):
321*d57664e9SAndroid Build Coastguard Worker    return jniFileTemplate % (self.structname.lower(),\
322*d57664e9SAndroid Build Coastguard Worker                              self.structname,\
323*d57664e9SAndroid Build Coastguard Worker                              self.structname,\
324*d57664e9SAndroid Build Coastguard Worker                              self.structname,\
325*d57664e9SAndroid Build Coastguard Worker                              self.structname,\
326*d57664e9SAndroid Build Coastguard Worker                              ToJNIPackage(self.package, self.jclassname),\
327*d57664e9SAndroid Build Coastguard Worker                              self.jniDeclString(),\
328*d57664e9SAndroid Build Coastguard Worker                              ToJNIPackage(self.package, self.jclassname),\
329*d57664e9SAndroid Build Coastguard Worker                              self.structname,
330*d57664e9SAndroid Build Coastguard Worker                              self.jniImplString())
331*d57664e9SAndroid Build Coastguard Worker
332*d57664e9SAndroid Build Coastguard Workerdef main(argv):
333*d57664e9SAndroid Build Coastguard Worker  if len(argv) != 2:
334*d57664e9SAndroid Build Coastguard Worker    print("Usage: %s <file.struct>" % argv[0])
335*d57664e9SAndroid Build Coastguard Worker    return -1
336*d57664e9SAndroid Build Coastguard Worker
337*d57664e9SAndroid Build Coastguard Worker  filepath = argv[1]
338*d57664e9SAndroid Build Coastguard Worker
339*d57664e9SAndroid Build Coastguard Worker  structspec = StructSpec()
340*d57664e9SAndroid Build Coastguard Worker  structspec.parseTextFile(filepath)
341*d57664e9SAndroid Build Coastguard Worker
342*d57664e9SAndroid Build Coastguard Worker  hfilename = "%s.h" % structspec.structname.lower()
343*d57664e9SAndroid Build Coastguard Worker  javafilename = "%s.java" % structspec.jclassname
344*d57664e9SAndroid Build Coastguard Worker  jnifilename = "jni_%s.c" % structspec.structname.lower()
345*d57664e9SAndroid Build Coastguard Worker
346*d57664e9SAndroid Build Coastguard Worker  javapackagepath = structspec.package.replace('.','/')
347*d57664e9SAndroid Build Coastguard Worker
348*d57664e9SAndroid Build Coastguard Worker  rootdir = os.path.dirname(filepath)
349*d57664e9SAndroid Build Coastguard Worker  hfilepath = "%s/../native/%s" % (rootdir, hfilename)
350*d57664e9SAndroid Build Coastguard Worker  javafilepath = "%s/../java/%s/%s" % (rootdir, javapackagepath, javafilename)
351*d57664e9SAndroid Build Coastguard Worker  jnifilepath = "%s/../jni/%s" % (rootdir, jnifilename)
352*d57664e9SAndroid Build Coastguard Worker
353*d57664e9SAndroid Build Coastguard Worker  hfile = open(hfilepath, 'w')
354*d57664e9SAndroid Build Coastguard Worker  hfile.write(structspec.hFileString())
355*d57664e9SAndroid Build Coastguard Worker  hfile.close()
356*d57664e9SAndroid Build Coastguard Worker
357*d57664e9SAndroid Build Coastguard Worker  javafile = open(javafilepath, 'w')
358*d57664e9SAndroid Build Coastguard Worker  javafile.write(structspec.javaFileString())
359*d57664e9SAndroid Build Coastguard Worker  javafile.close()
360*d57664e9SAndroid Build Coastguard Worker
361*d57664e9SAndroid Build Coastguard Worker  jnifile = open(jnifilepath, 'w')
362*d57664e9SAndroid Build Coastguard Worker  jnifile.write(structspec.jniFileString())
363*d57664e9SAndroid Build Coastguard Worker  jnifile.close()
364*d57664e9SAndroid Build Coastguard Worker
365*d57664e9SAndroid Build Coastguard Worker
366*d57664e9SAndroid Build Coastguard Workerif __name__ == "__main__":
367*d57664e9SAndroid Build Coastguard Worker  sys.exit(main(sys.argv))
368