blob: 390a6c329c339320f7a09433f68061a85f2a9733 [file] [log] [blame]
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001#!/bin/bash
2#
3# Copyright (C) 2007 The Android Open Source Project
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17# opcode-gen <file>
18#
19# Use the file bytecodes.txt to generate code inside <file>, based on
20# the directives found in that file:
21#
22# opcodes: static final ints for each opcode
23# dops: static final objects for each opcode
24# dops-init: initialization code for the "dops"
25
26file="$1"
27tmpfile="/tmp/$$.txt"
28
29if [ "x$1" = "x" ]; then
30 echo "must specify a file"
31 exit 1
32fi
33
34# Set up prog to be the path of this script, including following symlinks,
35# and set up progdir to be the fully-qualified pathname of its directory.
36prog="$0"
37while [ -h "${prog}" ]; do
38 newProg=`/bin/ls -ld "${prog}"`
39 newProg=`expr "${newProg}" : ".* -> \(.*\)$"`
40 if expr "x${newProg}" : 'x/' >/dev/null; then
41 prog="${newProg}"
42 else
43 progdir=`dirname "${prog}"`
44 prog="${progdir}/${newProg}"
45 fi
46done
47oldwd=`pwd`
48progdir=`dirname "${prog}"`
49cd "${progdir}"
50progdir=`pwd`
51prog="${progdir}"/`basename "${prog}"`
52cd "${oldwd}"
53
54bytecodeFile="$progdir/bytecode.txt"
55
56awk -v "bytecodeFile=$bytecodeFile" '
57
58BEGIN {
59 readBytecodes();
60 consumeUntil = "";
61}
62
63consumeUntil != "" {
64 if (index($0, consumeUntil) != 0) {
65 consumeUntil = "";
66 } else {
67 next;
68 }
69}
70
71/BEGIN\(opcodes\)/ {
72 consumeUntil = "END(opcodes)";
73 print;
74
75 for (i = 0; i < 256; i++) {
76 printf(" public static final int %s = 0x%s;\n",
77 uppername[i], hex[i]);
78 }
79
80 next;
81}
82
83/BEGIN\(dops\)/ {
84 consumeUntil = "END(dops)";
85 print;
86
87 for (i = 0; i < 256; i++) {
88 if (index(name[i], "unused") != 0) {
89 continue;
90 }
91 printf(" public static final Dop %s =\n" \
92 " new Dop(DalvOps.%s, DalvOps.%s,\n" \
93 " Form%s.THE_ONE, %s, \"%s\");\n\n",
94 uppername[i], uppername[i], family[i], format[i], hasres[i],
95 name[i]);
96 }
97
98 next;
99}
100
101/BEGIN\(dops-init\)/ {
102 consumeUntil = "END(dops-init)";
103 print;
104
105 for (i = 0; i < 256; i++) {
106 if (index(name[i], "unused") != 0) {
107 continue;
108 }
109 printf(" set(%s);\n", uppername[i]);
110 }
111
112 next;
113}
114
115{ print; }
116
117function readBytecodes(i, parts) {
118 for (i = 0; i < 256; i++) {
119 $0 = "";
120 while (($0 == "") || (index($0, "#") != 0)) {
121 if ((getline <bytecodeFile) != 1) {
122 print "trouble reading bytecode file";
123 exit 1;
124 }
125 }
126 split($0, parts);
127 hex[i] = parts[1];
128 format[i] = parts[2];
129 hasres[i] = (parts[3] == "n") ? "false" : "true";
130 name[i] = parts[4];
131 uppername[i] = toupper(parts[4]);
132 gsub("[---/]", "_", uppername[i]);
133 split(name[i], parts, "/");
134 family[i] = toupper(parts[1]);
135 gsub("-", "_", family[i]);
136 }
137}
138' "$file" > "$tmpfile"
139
140cp "$tmpfile" "$file"
141rm "$tmpfile"