source: anotherchoice/tags/jsp-1.4.4-full-UTF8/utils/genoffset@ 26

Last change on this file since 26 was 26, checked in by ykominami, 10 years ago

initial

File size: 6.5 KB
Line 
1#! /usr/bin/perl
2#
3# TOPPERS/JSP Kernel
4# Toyohashi Open Platform for Embedded Real-Time Systems/
5# Just Standard Profile Kernel
6#
7# Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
8# Toyohashi Univ. of Technology, JAPAN
9# Copyright (C) 2004-2005 by Embedded and Real-Time Systems Laboratory
10# Graduate School of Information Science, Nagoya Univ., JAPAN
11#
12# 上記著作権者
13は,以下の (1)〜(4) の条件か,Free Software Foundation
14# によってå…
15¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
16# 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
17# を改変したものを含む.以下同じ)を使用・複製・改変・再é…
18å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
19# 利用と呼ぶ)することを無償で許諾する.
20# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
21# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
22# スコード中に含まれていること.
23# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
24# 用できる形で再é…
25å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
26å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
27# 者
28マニュアルなど)に,上記の著作権表示,この利用条件および下記
29# の無保証規定を掲載すること.
30# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
31# 用できない形で再é…
32å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
33# と.
34# (a) 再é…
35å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
36マニュアルなど)に,上記の著
37# 作権表示,この利用条件および下記の無保証規定を掲載すること.
38# (b) 再é…
39å¸ƒã®å½¢æ…
40‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
41# 報告すること.
42# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
43# 害からも,上記著作権者
44およびTOPPERSプロジェクトをå…
45è²¬ã™ã‚‹ã“と.
46#
47# 本ソフトウェアは,無保証で提供されているものである.上記著作権者
48お
49# よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
50# 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
51# 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
52#
53# @(#) $Id: genoffset,v 1.18 2005/11/12 15:00:36 hiro Exp $
54#
55
56#
57# 初期化
58#
59$infile = $ARGV[0];
60
61#
62# ビットサーチ
63#
64sub search_bit {
65 my($val) = @_;
66 my($val_bit);
67
68 return(-1) if ($val == 0);
69
70 $val_bit = 0;
71 while (($val & 1) == 0) {
72 $val >>= 1;
73 $val_bit++;
74 }
75 return($val_bit);
76}
77
78#
79# オフセット値の出力
80#
81sub parse_offset {
82 if ($line =~ /OFFSET_DEF ([^ \t]+) = [#\$]?([^ \t]+)/) {
83 printf "#define %s\t%d\n",$1,$2;
84 }
85}
86
87#
88# 解釈できるディレクティブのテーブル
89#
90%directives = (
91 "long", "",
92 "dword", "",
93 "word", "",
94 "hword", "",
95 "int", "",
96 "short", "",
97 "half", "",
98 "byte", "",
99 "value", "",
100 "uaword", "",
101 "uashort", "",
102 "data32", 4,
103 "data16", 2,
104 "data8", 1,
105 "zero", -1,
106 "space", -1,
107 "globl", 0,
108 "global", 0,
109 "align", 0,
110 "p2align", 0,
111 "even", 0,
112 "data", 0,
113 "stabs", 0,
114 "type", 0,
115 "size", 0,
116 "section", 0,
117 "sdata", 0,
118 "code", 0,
119);
120
121#
122# ビット位置の出力
123#
124sub parse_bit {
125 my($endian, $size) = @_;
126 my($offset, $dir, $val, $val_bit);
127
128 return unless ($line =~ /BIT_([BL])([BHW])_([^ \t]+):/);
129 $label = $3;
130
131 $offset = 0;
132 while ($line = <INFILE>) {
133 chomp $line;
134 next if ($line =~ /^[ \t]*[#;].*$/);
135
136 if ($line =~ /[ \t]*\.([a-zA-Z0-9]+)[ \t]*([^ \t]*)[ \t]*/
137 && defined($dir = $directives{$1})) {
138 $val = $2;
139
140 # 16進数と8進数の数値への変換処理
141 if ($val =~ /^0x(.+)$/) {
142 $val = hex($1);
143 }
144 elsif ($val =~ /^0(.+)$/) {
145 $val = oct($1);
146 }
147
148 if ($dir eq "") {
149 # サイズを知らないディレクティブ
150 print STDERR "genoffset: unknown directive: ",
151 "$line\n";
152 $error = 1;
153 }
154 elsif ($dir == 0) {
155 # 読み飛ばすべきディレクティブ
156 next;
157 }
158 elsif ($dir == -1) {
159 # .zero ディレクティブの処理
160 $offset += $val;
161 next;
162 }
163 elsif ($val == 0) {
164 # 値が 0 のフィールドの処理
165 $offset += $dir;
166 next;
167 }
168
169 # ビット位置を探す
170 $val_bit = do search_bit($val);
171
172 # バイト単位に換算する
173 if ($endian eq "B") {
174 $offset += $dir - 1;
175 $offset -= $val_bit >> 3;
176 }
177 else {
178 $offset += $val_bit >> 3;
179 }
180 $val_bit &= 0x07;
181
182 # 出力単位に換算する
183 if ($size eq "W") {
184 if ($endian eq "B") {
185 $val_bit += 24;
186 $val_bit -= ($offset & 0x03) << 3;
187 }
188 else {
189 $val_bit += ($offset & 0x03) << 3;
190 }
191 $offset &= ~0x03;
192 }
193 elsif ($size eq "H") {
194 if ($endian eq "B") {
195 $val_bit += 8;
196 $val_bit -= ($offset & 0x01) << 3;
197 }
198 else {
199 $val_bit += ($offset & 0x01) << 3;
200 }
201 $offset &= ~0x01;
202 }
203 last;
204 }
205 else {
206 # 解析できない行
207 print STDERR "genoffset: cannot parse: $line\n";
208 $error = 1;
209 }
210 }
211
212 # 定義の出力
213 $label =~ s/^_//;
214 printf "#define %s\t%d\n",$label,$offset;
215 printf "#define %s_bit\t%d\n",$label,$val_bit;
216 printf "#define %s_mask\t0x%x\n",$label,(1 << $val_bit);
217}
218
219#
220# ディレクティブの読み取り
221#
222sub ref_bit {
223 my($size, $dir, $directive);
224
225 return unless ($line =~ /BIT_REF_([0-9]+):/);
226 $size = $1;
227
228 while ($line = <INFILE>) {
229 chomp $line;
230 next if ($line =~ /^[ \t]*[#;].*$/);
231
232 if ($line =~ /[ \t]*\.([a-zA-Z0-9]+)[ \t]*([^ \t]*)[ \t]*/
233 && defined($dir = $directives{$1})) {
234 $directive = $1;
235 if ($dir eq "") {
236 # 登録すべきディレクティブ
237 $directives{$directive} = $size;
238 }
239 last;
240 }
241 else {
242 # 解析できない行
243 print STDERR "genoffset: cannot parse: $line\n";
244 $error = 1;
245 }
246 }
247}
248
249#
250# メインルーチン
251#
252print "/* This file is generated by genoffset. */\n";
253print "\n";
254
255$error = 0;
256open(INFILE, $infile) || die "Cannot open $infile";
257while ($line = <INFILE>) {
258 chomp $line;
259
260 if ($line =~ /^[ \t]*OFFSET_DEF/) {
261 do parse_offset();
262 }
263 elsif ($line =~ /^[ \t]*_?BIT_REF/) {
264 do ref_bit();
265 }
266}
267seek(INFILE, 0, SEEK_SET);
268while ($line = <INFILE>) {
269 chomp $line;
270
271 if ($line =~ /^[ \t]*_?BIT_([BL])([BHW])/) {
272 do parse_bit($1, $2);
273 }
274}
275close(INFILE);
276exit($error);
Note: See TracBrowser for help on using the repository browser.