• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/python
2# -*- coding: utf-8 -*-
3
4#
5# Copyright 2011, The Android Open Source Project
6#
7# Licensed under the Apache License, Version 2.0 (the "License");
8# you may not use this file except in compliance with the License.
9# You may obtain a copy of the License at
10#
11#     http://www.apache.org/licenses/LICENSE-2.0
12#
13# Unless required by applicable law or agreed to in writing, software
14# distributed under the License is distributed on an "AS IS" BASIS,
15# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16# See the License for the specific language governing permissions and
17# limitations under the License.
18#
19
20import os
21import sys
22
23def RemoveAnnotation(line):
24    if line.find(":") >= 0:
25        annotation = line[line.find(":"): line.find(" ", line.find(":"))]
26        return line.replace(annotation, "*")
27    else:
28        return line
29
30if __name__ == "__main__":
31    externs = []
32    lines = open("../../../frameworks/base/opengl/libs/GLES2_dbg/gl2_api_annotated.in").readlines()
33    output = open("src/com/android/glesv2debugger/MessageParser.java", "w")
34
35    i = 0
36    output.write("""\
37/*
38 ** Copyright 2011, The Android Open Source Project
39 **
40 ** Licensed under the Apache License, Version 2.0 (the "License");
41 ** you may not use this file except in compliance with the License.
42 ** You may obtain a copy of the License at
43 **
44 **     http://www.apache.org/licenses/LICENSE-2.0
45 **
46 ** Unless required by applicable law or agreed to in writing, software
47 ** distributed under the License is distributed on an "AS IS" BASIS,
48 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
49 ** See the License for the specific language governing permissions and
50 ** limitations under the License.
51 */
52
53// auto generated by generate_MessageParser_java.py,
54//  which also prints skeleton code for MessageParserEx.java
55
56package com.android.glesv2debugger;
57
58import com.android.glesv2debugger.DebuggerMessage.Message;
59import com.android.glesv2debugger.DebuggerMessage.Message.Function;
60import com.google.protobuf.ByteString;
61
62import java.nio.ByteBuffer;
63
64public abstract class MessageParser {
65
66    String args;
67
68    String[] getList()
69    {
70        String arg = args;
71        args = args.substring(args.lastIndexOf('}') + 1);
72        final int comma = args.indexOf(',');
73        if (comma >= 0)
74            args = args.substring(comma + 1).trim();
75        else
76            args = null;
77
78        final int comment = arg.indexOf('=');
79        if (comment >= 0)
80            arg = arg.substring(comment + 1);
81        arg = arg.trim();
82        assert arg.charAt(0) == '{';
83        arg = arg.substring(1, arg.lastIndexOf('}')).trim();
84        return arg.split("\\s*,\\s*");
85    }
86
87    ByteString parseFloats(int count) {
88        ByteBuffer buffer = ByteBuffer.allocate(count * 4);
89        buffer.order(SampleView.targetByteOrder);
90        String [] arg = getList();
91        for (int i = 0; i < count; i++)
92            buffer.putFloat(Float.parseFloat(arg[i].trim()));
93        buffer.rewind();
94        return ByteString.copyFrom(buffer);
95    }
96
97    ByteString parseInts(int count) {
98        ByteBuffer buffer = ByteBuffer.allocate(count * 4);
99        buffer.order(SampleView.targetByteOrder);
100        String [] arg = getList();
101        for (int i = 0; i < count; i++)
102            buffer.putInt(Integer.parseInt(arg[i].trim()));
103        buffer.rewind();
104        return ByteString.copyFrom(buffer);
105    }
106
107    ByteString parseUInts(int count) {
108        ByteBuffer buffer = ByteBuffer.allocate(count * 4);
109        buffer.order(SampleView.targetByteOrder);
110        String [] arg = getList();
111        for (int i = 0; i < count; i++)
112            buffer.putInt((int)(Long.parseLong(arg[i].trim()) & 0xffffffff));
113        buffer.rewind();
114        return ByteString.copyFrom(buffer);
115    }
116
117    ByteString parseMatrix(int columns, int count) {
118        return parseFloats(columns * columns * count);
119    }
120
121    ByteString parseString() {
122        // TODO: escape sequence and proper string literal
123        String arg = args.substring(args.indexOf('"') + 1, args.lastIndexOf('"'));
124        args = args.substring(args.lastIndexOf('"'));
125        int comma = args.indexOf(',');
126        if (comma >= 0)
127            args = args.substring(comma + 1).trim();
128        else
129            args = null;
130        return ByteString.copyFromUtf8(arg);
131    }
132
133    String getArgument()
134    {
135        final int comma = args.indexOf(',');
136        String arg = null;
137        if (comma >= 0)
138        {
139            arg = args.substring(0, comma);
140            args = args.substring(comma + 1);
141        }
142        else
143        {
144            arg = args;
145            args = null;
146        }
147        final int comment = arg.indexOf('=');
148        if (comment >= 0)
149            arg = arg.substring(comment + 1);
150        return arg.trim();
151    }
152
153    int parseArgument()
154    {
155        String arg = getArgument();
156        if (arg.startsWith("GL_"))
157            return GLEnum.valueOf(arg).value;
158        else if (arg.toLowerCase().startsWith("0x"))
159            return Integer.parseInt(arg.substring(2), 16);
160        else
161            return Integer.parseInt(arg);
162    }
163
164    int parseFloat()
165    {
166        String arg = getArgument();
167        return Float.floatToRawIntBits(Float.parseFloat(arg));
168    }
169
170    public void parse(final Message.Builder builder, String string) {
171        int lparen = string.indexOf("("), rparen = string.lastIndexOf(")");
172        String s = string.substring(0, lparen).trim();
173        args = string.substring(lparen + 1, rparen);
174        String[] t = s.split(" ");
175        Function function = Function.valueOf(t[t.length - 1]);
176        builder.setFunction(function);
177        switch (function) {
178""")
179
180    abstractParsers = ""
181
182    for line in lines:
183        if line.find("API_ENTRY(") >= 0: # a function prototype
184            returnType = line[0: line.find(" API_ENTRY(")].replace("const ", "")
185            functionName = line[line.find("(") + 1: line.find(")")] #extract GL function name
186            parameterList = line[line.find(")(") + 2: line.find(") {")]
187
188            parameters = parameterList.split(',')
189            paramIndex = 0
190
191            #if returnType != "void":
192            #else:
193
194            if parameterList == "void":
195                parameters = []
196            inout = ""
197
198            paramNames = []
199            abstract = False
200            argumentSetters = ""
201            output.write("\
202            case %s:\n" % (functionName))
203
204            for parameter in parameters:
205                parameter = parameter.replace("const","")
206                parameter = parameter.strip()
207                paramType = parameter.split(' ')[0]
208                paramName = parameter.split(' ')[1]
209                annotation = ""
210
211                argumentParser = ""
212
213                if parameter.find(":") >= 0:
214                    dataSetter = ""
215                    assert inout == "" # only one parameter should be annotated
216                    inout = paramType.split(":")[2]
217                    annotation = paramType.split(":")[1]
218                    paramType = paramType.split(":")[0]
219                    count = 1
220                    countArg = ""
221                    if annotation.find("*") >= 0: # [1,n] * param
222                        count = int(annotation.split("*")[0])
223                        countArg = annotation.split("*")[1]
224                        assert countArg in paramNames
225                    elif annotation in paramNames:
226                        count = 1
227                        countArg = annotation
228                    elif annotation == "GLstring":
229                        annotation = annotation
230                    else:
231                        count = int(annotation)
232
233                    if paramType == "GLfloat":
234                        argumentParser = "parseFloats"
235                    elif paramType == "GLint":
236                        argumentParser = "parseInts"
237                    elif paramType == "GLuint":
238                        argumentParser = "parseUInts"
239                    elif annotation == "GLstring":
240                        assert paramType == 'GLchar'
241                    elif paramType.find("void") >= 0:
242                        assert 1
243                    else:
244                        assert 0
245
246                    if functionName.find('Matrix') >= 0:
247                        columns = int(functionName[functionName.find("fv") - 1: functionName.find("fv")])
248                        assert columns * columns == count
249                        assert countArg != ""
250                        assert paramType == "GLfloat"
251                        dataSetter = "builder.setData(parseMatrix(%d, builder.getArg%d()));" % (
252                            columns, paramNames.index(countArg))
253                    elif annotation == "GLstring":
254                        dataSetter = "builder.setData(parseString());"
255                    elif paramType.find("void") >= 0:
256                        dataSetter = "// TODO"
257                        abstract = True
258                    elif countArg == "":
259                        dataSetter = "builder.setData(%s(%d));" % (argumentParser, count)
260                    else:
261                        dataSetter = "builder.setData(%s(%d * builder.getArg%d()));" % (
262                            argumentParser, count, paramNames.index(countArg))
263                    argumentSetters += "\
264                %s // %s %s\n" % (dataSetter, paramType, paramName)
265                else:
266                    if paramType == "GLfloat" or paramType == "GLclampf":
267                        argumentSetters += "\
268                builder.setArg%d(parseFloat()); // %s %s\n" % (
269                    paramIndex, paramType, paramName)
270                    elif paramType.find("*") >= 0:
271                        argumentSetters += "\
272                // TODO: %s %s\n" % (paramType, paramName)
273                        abstract = True
274                    else:
275                        argumentSetters += "\
276                builder.setArg%d(parseArgument()); // %s %s\n" % (
277                    paramIndex, paramType, paramName)
278                paramNames.append(paramName)
279                paramIndex += 1
280
281            if not abstract:
282                output.write("%s" % argumentSetters)
283            else:
284                output.write("\
285                parse_%s(builder);\n" % functionName)
286                abstractParsers += "\
287    abstract void parse_%s(Message.Builder builder);\n" % functionName
288                print """\
289    @Override
290    void parse_%s(Message.Builder builder) {
291%s    }
292""" % (functionName, argumentSetters) # print skeleton code for MessageParserEx
293
294            output.write("\
295                break;\n")
296    output.write("""\
297            default:
298                assert false;
299        }
300    }
301""")
302    output.write(abstractParsers)
303    output.write("\
304}""")
305