📄 genoffset
字号:
#! /usr/bin/perl## TOPPERS/JSP Kernel# Toyohashi Open Platform for Embedded Real-Time Systems/# Just Standard Profile Kernel# # Copyright (C) 2000,2001 by Embedded and Real-Time Systems Laboratory# Toyohashi Univ. of Technology, JAPAN# # 惧淡螟侯涪荚は·Free Software Foundation によって给山されている # GNU General Public License の Version 2 に淡揭されている掘凤か·笆# 布の(1)×(4)の掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェ# アを猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布·# 网脱と钙ぶ∷することを痰浸で钓满するˉ# (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯# 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖# スコ〖ド面に崔まれていることˉ# (2) 塑ソフトウェアを浩网脱材墙なバイナリコ〖ド∈リロケ〖タブルオブ# ジェクトファイルやライブラリなど∷の妨で网脱する眷圭には·网脱# に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟侯涪山绩·# この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ# (3) 塑ソフトウェアを浩网脱稍材墙なバイナリコ〖ドの妨または怠达に寥# み哈んだ妨で网脱する眷圭には·肌のいずれかの掘凤を塔たすことˉ# (a) 网脱に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟侯# 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ# (b) 网脱の妨轮を·侍に年める数恕によって·惧淡螟侯涪荚に鼠桂する# ことˉ# (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄# 巢からも·惧淡螟侯涪荚を倘勒することˉ# # 塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚は·# 塑ソフトウェアに簇して·その努脱材墙拉も崔めて·いかなる瘦沮も乖わ# ないˉまた·塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じたい# かなる禄巢に簇しても·その勒扦を砷わないˉ# # @(#) $Id: genoffset,v 1.9 2002/04/08 05:28:34 hiro Exp $# ## ビットサ〖チ#sub search_bit { my($val) = @_; my($val_bit); return(-1) if ($val == 0); $val_bit = 0; while (($val & 1) == 0) { $val >>= 1; $val_bit++; } return($val_bit);}## オフセット猛の叫蜗#sub parse_begin { while ($line = <>) { chop $line; return if ($line =~ /! END/); if ($line =~ /^([^ \t]+) = [#\$]?([^ \t]+)/) { printf "#define %s\t%d\n",$1,$2; } }}## 豺坚できるディレクティブのテ〖ブル#%directives = ( "long", "", "word", "", "int", "", "short", "", "value", "", "byte", "", "data32", 4, "data16", 2, "data8", 1, "zero", -1, "space", -1, "globl", 0, "global", 0, "align", 0, "data", 0, "stabs", 0, "type", 0, "size", 0, "section", 0, "sdata", 0,);## ビット疤弥の叫蜗#sub parse_bit { my($endian, $size) = @_; my($offset, $dir, $val, $val_bit); $offset = 0; while ($line = <>) { chop $line; next if ($line =~ /^[ \t]*[#;].*$/); return if ($line =~ /! END/); if ($line =~ /^([^ \t]+):/) { $label = $1; } elsif ($line =~ /[ \t]*\.([a-zA-Z0-9]+)[ \t]*([^ \t]*)$/ && defined($dir = $directives{$1})) { $val = $2; # 16渴眶と8渴眶の眶猛への恃垂借妄 if ($val =~ /^0x(.+)$/) { $val = hex($1); } elsif ($val =~ /^0(.+)$/) { $val = oct($1); } if ($dir eq "") { # サイズを梦らないディレクティブ print STDERR "genoffset: unknown directive: ", "$line\n"; $error = 1; } elsif ($dir == 0) { # 粕み若ばすべきディレクティブ next; } elsif ($dir == -1) { # .zero ディレクティブの借妄 $offset += $val; next; } elsif ($val == 0) { # 猛が 0 のフィ〖ルドの借妄 $offset += $dir; next; } # ビット疤弥を玫す $val_bit = do search_bit($val); # バイト帽疤に垂换する if ($endian eq "B") { $offset += $dir - 1; $offset -= $val_bit >> 3; } else { $offset += $val_bit >> 3; } $val_bit &= 0x07; # 叫蜗帽疤に垂换する if ($size eq "W") { if ($endian eq "B") { $val_bit += 24; $val_bit -= ($offset & 0x03) << 3; } else { $val_bit += ($offset & 0x03) << 3; } $offset &= ~0x03; } elsif ($size eq "H") { if ($endian eq "B") { $val_bit += 8; $val_bit -= ($offset & 0x01) << 3; } else { $val_bit += ($offset & 0x01) << 3; } $offset &= ~0x01; } last; } else { # 豺老できない乖 print STDERR "genoffset: cannot parse: $line\n"; $error = 1; } } # END まで粕み若ばす while ($line = <>) { chop $line; last if ($line =~ /! END/); } # 年盗の叫蜗 $label =~ s/^_//; printf "#define %s\t%d\n",$label,$offset; printf "#define %s_bit\t%d\n",$label,$val_bit; printf "#define %s_mask\t0x%x\n",$label,(1 << $val_bit);}## ディレクティブの粕み艰り#sub ref_bit { my($size, $dir, $directive); while ($line = <>) { chop $line; next if ($line =~ /^[ \t]*[#;].*$/); return if ($line =~ /! END/); if ($line =~ /^_?ref_([0-9]+):/) { $size = $1; } elsif ($line =~ /[ \t]*\.([a-zA-Z0-9]+)[ \t]*([^ \t]*)$/ && defined($dir = $directives{$1})) { $directive = $1; if ($dir eq "") { # 判峡すべきディレクティブ $directives{$directive} = $size; } } else { # 豺老できない乖 print STDERR "genoffset: cannot parse: $line\n"; $error = 1; } }}## メインル〖チン#print "/* This file is generated by genoffset. */\n";print "\n";$error = 0;while ($line = <>) { chop $line; if ($line =~ /! BEGIN/) { do parse_begin(); } elsif ($line =~ /! BIT_REF/) { do ref_bit(); } elsif ($line =~ /! BIT_([BL])([BHW])/) { do parse_bit($1, $2); }}exit($error);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -