📄 genoffset
字号:
#! /usr/bin/perl
#
# TOPPERS/JSP Kernel
# Toyohashi Open Platform for Embedded Real-Time Systems/
# Just Standard Profile Kernel
#
# Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
# Toyohashi Univ. of Technology, JAPAN
# Copyright (C) 2004-2005 by Embedded and Real-Time Systems Laboratory
# Graduate School of Information Science, Nagoya Univ., JAPAN
#
# 忋婰挊嶌尃幰偼丆埲壓偺 (1)乣(4) 偺忦審偐丆Free Software Foundation
# 偵傛偭偰岞昞偝傟偰偄傞 GNU General Public License 偺 Version 2 偵婰
# 弎偝傟偰偄傞忦審傪枮偨偡応崌偵尷傝丆杮僜僼僩僂僃傾乮杮僜僼僩僂僃傾
# 傪夵曄偟偨傕偺傪娷傓丏埲壓摨偠乯傪巊梡丒暋惢丒夵曄丒嵞攝晍乮埲壓丆
# 棙梡偲屇傇乯偡傞偙偲傪柍彏偱嫋戻偡傞丏
# (1) 杮僜僼僩僂僃傾傪僜乕僗僐乕僪偺宍偱棙梡偡傞応崌偵偼丆忋婰偺挊嶌
# 尃昞帵丆偙偺棙梡忦審偍傛傃壓婰偺柍曐徹婯掕偑丆偦偺傑傑偺宍偱僜乕
# 僗僐乕僪拞偵娷傑傟偰偄傞偙偲丏
# (2) 杮僜僼僩僂僃傾傪丆儔僀僽儔儕宍幃側偳丆懠偺僜僼僩僂僃傾奐敪偵巊
# 梡偱偒傞宍偱嵞攝晍偡傞応崌偵偼丆嵞攝晍偵敽偆僪僉儏儊儞僩乮棙梡
# 幰儅僯儏傾儖側偳乯偵丆忋婰偺挊嶌尃昞帵丆偙偺棙梡忦審偍傛傃壓婰
# 偺柍曐徹婯掕傪宖嵹偡傞偙偲丏
# (3) 杮僜僼僩僂僃傾傪丆婡婍偵慻傒崬傓側偳丆懠偺僜僼僩僂僃傾奐敪偵巊
# 梡偱偒側偄宍偱嵞攝晍偡傞応崌偵偼丆師偺偄偢傟偐偺忦審傪枮偨偡偙
# 偲丏
# (a) 嵞攝晍偵敽偆僪僉儏儊儞僩乮棙梡幰儅僯儏傾儖側偳乯偵丆忋婰偺挊
# 嶌尃昞帵丆偙偺棙梡忦審偍傛傃壓婰偺柍曐徹婯掕傪宖嵹偡傞偙偲丏
# (b) 嵞攝晍偺宍懺傪丆暿偵掕傔傞曽朄偵傛偭偰丆TOPPERS僾儘僕僃僋僩偵
# 曬崘偡傞偙偲丏
# (4) 杮僜僼僩僂僃傾偺棙梡偵傛傝捈愙揑傑偨偼娫愙揑偵惗偠傞偄偐側傞懝
# 奞偐傜傕丆忋婰挊嶌尃幰偍傛傃TOPPERS僾儘僕僃僋僩傪柶愑偡傞偙偲丏
#
# 杮僜僼僩僂僃傾偼丆柍曐徹偱採嫙偝傟偰偄傞傕偺偱偁傞丏忋婰挊嶌尃幰偍
# 傛傃TOPPERS僾儘僕僃僋僩偼丆杮僜僼僩僂僃傾偵娭偟偰丆偦偺揔梡壜擻惈傕
# 娷傔偰丆偄偐側傞曐徹傕峴傢側偄丏傑偨丆杮僜僼僩僂僃傾偺棙梡偵傛傝捈
# 愙揑傑偨偼娫愙揑偵惗偠偨偄偐側傞懝奞偵娭偟偰傕丆偦偺愑擟傪晧傢側偄丏
#
# @(#) $Id: genoffset,v 1.1 2006/04/14 02:46:33 9564907 Exp $
#
#
# 弶婜壔
#
$infile = $ARGV[0];
#
# 價僢僩僒乕僠
#
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_offset {
if ($line =~ /OFFSET_DEF ([^ \t]+) = [#\$]?([^ \t]+)/) {
printf "#define %s\t%d\n",$1,$2;
}
}
#
# 夝庍偱偒傞僨傿儗僋僥傿僽偺僥乕僽儖
#
%directives = (
"long", "",
"dword", "",
"word", "",
"hword", "",
"int", "",
"short", "",
"half", "",
"byte", "",
"value", "",
"uaword", "",
"uashort", "",
"data32", 4,
"data16", 2,
"data8", 1,
"zero", -1,
"space", -1,
"globl", 0,
"global", 0,
"align", 0,
"p2align", 0,
"even", 0,
"data", 0,
"stabs", 0,
"type", 0,
"size", 0,
"section", 0,
"sdata", 0,
"code", 0,
);
#
# 價僢僩埵抲偺弌椡
#
sub parse_bit {
my($endian, $size) = @_;
my($offset, $dir, $val, $val_bit);
return unless ($line =~ /BIT_([BL])([BHW])_([^ \t]+):/);
$label = $3;
$offset = 0;
while ($line = <INFILE>) {
chomp $line;
next if ($line =~ /^[ \t]*[#;].*$/);
if ($line =~ /[ \t]*\.([a-zA-Z0-9]+)[ \t]*([^ \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;
}
}
# 掕媊偺弌椡
$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);
return unless ($line =~ /BIT_REF_([0-9]+):/);
$size = $1;
while ($line = <INFILE>) {
chomp $line;
next if ($line =~ /^[ \t]*[#;].*$/);
if ($line =~ /[ \t]*\.([a-zA-Z0-9]+)[ \t]*([^ \t]*)[ \t]*/
&& defined($dir = $directives{$1})) {
$directive = $1;
if ($dir eq "") {
# 搊榐偡傋偒僨傿儗僋僥傿僽
$directives{$directive} = $size;
}
last;
}
else {
# 夝愅偱偒側偄峴
print STDERR "genoffset: cannot parse: $line\n";
$error = 1;
}
}
}
#
# 儊僀儞儖乕僠儞
#
print "/* This file is generated by genoffset. */\n";
print "\n";
$error = 0;
open(INFILE, $infile) || die "Cannot open $infile";
while ($line = <INFILE>) {
chomp $line;
if ($line =~ /^[ \t]*OFFSET_DEF/) {
do parse_offset();
}
elsif ($line =~ /^[ \t]*_?BIT_REF/) {
do ref_bit();
}
}
seek(INFILE, 0, SEEK_SET);
while ($line = <INFILE>) {
chomp $line;
if ($line =~ /^[ \t]*_?BIT_([BL])([BHW])/) {
do parse_bit($1, $2);
}
}
close(INFILE);
exit($error);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -