source: anotherchoice/tags/jsp-1.4.4-full-UTF8/utils/m16c-renesas/m16coffset.c@ 26

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

initial

File size: 6.9 KB
Line 
1/*
2 * TOPPERS/JSP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2003-2004 by Ryosuke Takeuchi
9 * Platform Development Center RIOCH COMPANY,LTD. JAPAN
10 * Copyright (C) 2007, 2010 by Naoki Saito
11 * Nagoya Municipal Industrial Research Institute, JAPAN
12 *
13 * 上記著作権者
14は,Free Software Foundation によってå…
15¬è¡¨ã•ã‚Œã¦ã„ã‚‹
16 * GNU General Public License の Version 2 に記述されている条件か,以
17 * 下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェア(本ソフトウェ
18 * アを改変したものを含む.以下同じ)を使用・複製・改変・再é…
19å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
20 * 利用と呼ぶ)することを無償で許諾する.
21 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
22 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
23 * スコード中に含まれていること.
24 * (2) 本ソフトウェアを再利用可能なバイナリコード(リロケータブルオブ
25 * ジェクトファイルやライブラリなど)の形で利用する場合には,利用
26 * に伴うドキュメント(利用者
27マニュアルなど)に,上記の著作権表示,
28 * この利用条件および下記の無保証規定を掲載すること.
29 * (3) 本ソフトウェアを再利用不可能なバイナリコードの形または機器に組
30 * み込んだ形で利用する場合には,次のいずれかの条件を満たすこと.
31 * (a) 利用に伴うドキュメント(利用者
32マニュアルなど)に,上記の著作
33 * 権表示,この利用条件および下記の無保証規定を掲載すること.
34 * (b) 利用の形æ…
35‹ã‚’,別に定める方法によって,上記著作権者
36に報告する
37 * こと.
38 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
39 * 害からも,上記著作権者
40をå…
41è²¬ã™ã‚‹ã“と.
42 *
43 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
44は,
45 * 本ソフトウェアに関して,その適用可能性も含めて,いかなる保証も行わ
46 * ない.また,本ソフトウェアの利用により直接的または間接的に生じたい
47 * かなる損害に関しても,その責任を負わない.
48 *
49 * @(#) $Id: m16coffset.cpp,v 1.2 2007/03/23 07:12:10 honda Exp $
50 */
51// m16coffset.c : コンソール アプリケーション用のエントリ ポイントの定義
52// 2010/12/28 変更点: ファイル拡張子を .cpp から .c とした.
53// bool 型を扱うため stdbool.h をインクルードした.
54
55#include <stdio.h>
56#include <stdlib.h>
57#include <string.h>
58#include <ctype.h>
59#include <stdbool.h>
60
61#define BUF_SIZE 512
62#define STR_SIZE 128
63
64#define NORMAL_STATE 0
65#define CHECK_STATE 1
66
67struct OFF {
68 int bit;
69 int offset;
70 int check_type; /* OFF=0 or BIT=1 */
71 char label[STR_SIZE];
72 char mask[STR_SIZE];
73};
74
75static char const version[] = "02.00";
76static char const default_input_file[] = "makeoffset.a30";
77static char const default_output_file[] = "offset.inc";
78
79static char input_file[STR_SIZE];
80static char output_file[STR_SIZE];
81static int num_offset = 0;
82static int offset_state = NORMAL_STATE;
83static struct OFF off_table[20];
84
85static bool test_string(char** s, char const * t);
86static bool skip_space(char** s);
87
88int main(int argc, char* argv[])
89{
90 FILE* pfo;
91 FILE* pfi;
92 struct OFF *v = NULL;
93 char* s;
94 char* p;
95 char buf[BUF_SIZE];
96 char c;
97 int i;
98 int val;
99 int ofs = 0;
100 char ct[4]; /* "BIT" or "OFF" */
101
102 strcpy(input_file, default_input_file);
103 strcpy(output_file, default_output_file);
104
105 for(i = 1 ; i < argc ; i++){
106 s = argv[i];
107 if(*s++ == '-'){
108 c = *s;
109 while(*s != 0){
110 if(*s == ':')
111 break;
112 s++;
113 }
114 if(*s++ == ':'){
115 switch(c){
116 case 'O': // アウトプットファイルの設定
117 case 'o':
118 strcpy(output_file, s);
119 break;
120 case 'R': // インプットファイルの設定
121 case 'r':
122 strcpy(input_file, s);
123 break;
124 default:
125 printf("m16coffset -R:input_file -O:output_file\n");
126 break;
127 }
128 }
129 }
130 }
131 printf("version = %s\n", version);
132 printf("input file = %s\n", input_file);
133 printf("output file = %s\n", output_file);
134
135 if((pfi = fopen(input_file, "r")) == NULL){
136 fprintf(stderr, "can't open input file!");
137 exit(1);
138 }
139 if((pfo = fopen(output_file, "w")) == NULL){
140 fclose(pfi);
141 fprintf(stderr, "can't open output file!");
142 exit(1);
143 }
144
145 /* 一行å…
146¥åŠ› → 解析 */
147 for(;;){
148 if((fgets(buf, BUF_SIZE, pfi)) == NULL) break;
149 s = buf;
150
151 switch(offset_state){
152 case CHECK_STATE:
153 if(skip_space(&s)) /* 行頭の空白を除く */
154 continue;
155
156 /* オフセット */
157 if(test_string(&s, ".word")){
158 ofs = 2;
159 }
160 else if(test_string(&s, ".lword")){
161 ofs = 4;
162 }
163 else if(test_string(&s, ".byte")){
164 ofs = 1;
165 }
166 else if(test_string(&s, ".addr")){
167 ofs = 3;
168 }
169 else {
170 continue;
171 }
172
173 if(skip_space(&s))
174 continue;
175
176 sscanf(s, "%x", &val);
177 if(val){
178 offset_state = NORMAL_STATE;
179 if(v->check_type) {
180 sprintf(v->mask, "%xH", val);
181 for(v->bit=0; val>1; v->bit++) {
182 val /= 2;
183 }
184 }
185 continue;
186 }
187 v->offset += ofs;
188 break;
189 default:
190 if(!test_string(&s, "_____BEGIN_")) {
191 continue;
192 }
193 v = &off_table[num_offset++];
194
195 for(i = 0, p = ct; i < 4 && isalpha(*s) && *s != '_'; i++){
196 *p++ = *s++;
197 }
198 *p++ = 0, *s++;
199 if(strncmp(ct, "BIT", sizeof("BIT")) == 0) {
200 v->check_type = 1;
201 }
202
203 p = v->label;
204 while(*s > ':')
205 *p++ = *s++;
206 *p++ = 0;
207 offset_state = CHECK_STATE;
208 break;
209 }
210 }
211
212 /* 出力 */
213 for(i = 0 ; i < num_offset ; i++){
214 v = &off_table[i];
215 fprintf(pfo, "%s\t.equ\t%d\n", v->label, v->offset);
216 printf("%s\t.equ\t%d\n", v->label, v->offset);
217 if(v->check_type) {
218 fprintf(pfo, "%s_bit\t.equ\t%d\n", v->label, v->bit);
219 fprintf(pfo, "%s_mask\t.equ\t%s\n", v->label, v->mask);
220 printf("%s_bit\t.equ\t%d\n", v->label, v->bit);
221 printf("%s_mask\t.equ\t%s\n", v->label, v->mask);
222 }
223 }
224 fclose(pfi);
225 fclose(pfo);
226
227 return 0;
228}
229
230/*
231 * 文字列を比較して同一ならばTURE
232 */
233static bool test_string(char** s, char const *t)
234{
235 char* p;
236 char c;
237
238 p = *s;
239 while(*p <= ' '){
240 if(*p == 0)
241 return false;
242 p++;
243 }
244 while((c = *p++) != 0){
245 if(c != *t++)
246 break;
247 if(*t == 0){
248 *s = p;
249 return true;
250 }
251 }
252 return false;
253}
254
255/*
256 * スペースまたはタブをスキップする
257 */
258static bool skip_space(char** s)
259{
260 char* p;
261
262 p = *s;
263 while(*p <= ' '){
264 if(*p == 0)
265 break;
266 p++;
267 }
268 *s = p;
269 if(*p)
270 return false;
271 else
272 return true;
273}
Note: See TracBrowser for help on using the repository browser.