4 # Toyohashi Open Platform for Embedded Real-Time Systems/
5 # Just Standard Profile Kernel
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
12 # 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation
13 # によって公表されている GNU General Public License の Version 2 に記
14 # 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
15 # を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
17 # (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
18 # 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
20 # (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
21 # 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
22 # 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
24 # (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
25 # 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
27 # (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
28 # 作権表示,この利用条件および下記の無保証規定を掲載すること.
29 # (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
31 # (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
32 # 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
34 # 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
35 # よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
36 # 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
37 # 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
39 # @(#) $Id: genoffset,v 1.2 2012/06/17 00:24:19 suikan Exp $
54 return(-1) if ($val == 0);
57 while (($val & 1) == 0) {
68 if ($line =~ /OFFSET_DEF ([^ \t]+) = [#\$]?([^ \t]+)/) {
69 printf "#define %s\t%d\n",$1,$2;
111 my($endian, $size) = @_;
112 my($offset, $dir, $val, $val_bit);
114 return unless ($line =~ /BIT_([BL])([BHW])_([^ \t]+):/);
118 while ($line = <INFILE>) {
120 next if ($line =~ /^[ \t]*[#;].*$/);
122 if ($line =~ /[ \t]*\.([a-zA-Z0-9]+)[ \t]*([^ \t]*)[ \t]*/
123 && defined($dir = $directives{$1})) {
127 if ($val =~ /^0x(.+)$/) {
130 elsif ($val =~ /^0(.+)$/) {
136 print STDERR "genoffset: unknown directive: ",
156 $val_bit = search_bit($val);
159 if ($endian eq "B") {
161 $offset -= $val_bit >> 3;
164 $offset += $val_bit >> 3;
170 if ($endian eq "B") {
172 $val_bit -= ($offset & 0x03) << 3;
175 $val_bit += ($offset & 0x03) << 3;
179 elsif ($size eq "H") {
180 if ($endian eq "B") {
182 $val_bit -= ($offset & 0x01) << 3;
185 $val_bit += ($offset & 0x01) << 3;
193 print STDERR "genoffset: cannot parse: $line\n";
200 printf "#define %s\t%d\n",$label,$offset;
201 printf "#define %s_bit\t%d\n",$label,$val_bit;
202 printf "#define %s_mask\t0x%x\n",$label,(1 << $val_bit);
209 my($size, $dir, $directive);
211 return unless ($line =~ /BIT_REF_([0-9]+):/);
214 while ($line = <INFILE>) {
216 next if ($line =~ /^[ \t]*[#;].*$/);
218 if ($line =~ /[ \t]*\.([a-zA-Z0-9]+)[ \t]*([^ \t]*)[ \t]*/
219 && defined($dir = $directives{$1})) {
223 $directives{$directive} = $size;
229 print STDERR "genoffset: cannot parse: $line\n";
238 print "/* This file is generated by genoffset. */\n";
242 open(INFILE, $infile) || die "Cannot open $infile";
243 while ($line = <INFILE>) {
246 if ($line =~ /^[ \t]*OFFSET_DEF/) {
249 elsif ($line =~ /^[ \t]*_?BIT_REF/) {
253 seek(INFILE, 0, SEEK_SET);
254 while ($line = <INFILE>) {
257 if ($line =~ /^[ \t]*_?BIT_([BL])([BHW])/) {