1+ #include <stdio.h>
2+ #include <stdlib.h>
3+
4+ typedef unsigned char UCHAR ;
5+ int getnum (const UCHAR * p );
6+ int get32 (const UCHAR * p );
7+ void put32 (UCHAR * p , int i );
8+
9+ #define MAXSIZ 4 * 1024 * 1024
10+
11+ int main (int argc , UCHAR * * argv )
12+ {
13+ UCHAR * fbuf = malloc (MAXSIZ );
14+ int heap_siz , mmarea , fsiz , dsize , dofs , stksiz , wrksiz , entry , bsssiz ;
15+ int heap_adr , i ;
16+ FILE * fp ;
17+ static UCHAR sign [4 ] = "XuNet OS!" ; //XuNet OS 标准!!!
18+ if (argc < 4 ) {
19+ puts ("usage>bim2hel appname.bim appname.hel heap-size [mmarea-size]" );
20+ return 1 ;
21+ }
22+ heap_siz = getnum (argv [3 ]);
23+ mmarea = 0 ;
24+ if (argc >= 5 )
25+ mmarea = getnum (argv [4 ]);
26+ fp = fopen (argv [1 ], "rb" );
27+ if (fp == NULL ) {
28+ err_bim :
29+ puts ("bim file read error" );
30+ return 1 ;
31+ }
32+ fsiz = fread (fbuf , 1 , MAXSIZ , fp );
33+ fclose (fp );
34+ if (fsiz >= MAXSIZ || fsiz < 0 )
35+ goto err_bim ;
36+ if (get32 (& fbuf [4 ]) != 0x24 ) {
37+ err_form :
38+ puts ("bim file format error" );
39+ return 1 ;
40+ }
41+ if (get32 (& fbuf [8 ]) != 0x24 )
42+ goto err_form ;
43+ dsize = get32 (& fbuf [12 ]);
44+ dofs = get32 (& fbuf [16 ]);
45+ stksiz = get32 (& fbuf [20 ]);
46+ entry = get32 (& fbuf [24 ]);
47+ bsssiz = get32 (& fbuf [28 ]);
48+ heap_adr = stksiz + dsize + bsssiz ;
49+ heap_adr = (heap_adr + 0xf ) & 0xfffffff0 ;
50+ wrksiz = heap_adr + heap_siz ;
51+ wrksiz = (wrksiz + 0xfff ) & 0xfffff000 ;
52+ put32 (& fbuf [ 0 ], wrksiz );
53+ for (i = 0 ; i < 4 ; i ++ )
54+ fbuf [4 + i ] = sign [i ];
55+ put32 (& fbuf [ 8 ], mmarea );
56+ put32 (& fbuf [12 ], stksiz );
57+ put32 (& fbuf [16 ], dsize );
58+ put32 (& fbuf [20 ], dofs );
59+ put32 (& fbuf [24 ], 0xe9000000 );
60+ put32 (& fbuf [28 ], entry - 0x20 );
61+ put32 (& fbuf [32 ], heap_adr );
62+ fp = fopen (argv [2 ], "wb" );
63+ if (fp == NULL ) {
64+ err_hrb :
65+ puts ("hel file write error" );
66+ return 1 ;
67+ }
68+ i = fwrite (fbuf , 1 , fsiz , fp );
69+ fclose (fp );
70+ if (fsiz != i )
71+ goto err_hrb ;
72+
73+ return 0 ;
74+ }
75+
76+ int getnum (const UCHAR * p )
77+ {
78+ int i = 0 , base = 10 , sign = 1 ;
79+ UCHAR c ;
80+ if (* p == '-' ) {
81+ p ++ ;
82+ sign = -1 ;
83+ }
84+ if (* p == '0' ) {
85+ p ++ ;
86+ base = 8 ;
87+ c = * p ;
88+ if (c >= 'a' )
89+ c -= 'a' - 'A' ;
90+ if (c == 'X' ) {
91+ p ++ ;
92+ base = 16 ;
93+ }
94+ if (c == 'O' ) {
95+ p ++ ;
96+ base = 8 ;
97+ }
98+ if (c == 'B' ) {
99+ p ++ ;
100+ base = 2 ;
101+ }
102+ }
103+ for (;;) {
104+ c = * p ++ ;
105+ if ('0' <= c && c <= '9' )
106+ c -= '0' ;
107+ else if ('A' <= c && c <= 'F' )
108+ c -= 'A' - 10 ;
109+ else if ('a' <= c && c <= 'f' )
110+ c -= 'a' - 10 ;
111+ else
112+ break ;
113+ if (c >= base )
114+ break ;
115+ i = i * base + c ;
116+ }
117+ if (c >= 'a' )
118+ c -= 'a' - 'A' ;
119+ if (c == 'K' )
120+ i <<= 10 ;
121+ if (c == 'M' )
122+ i <<= 20 ;
123+ if (c == 'G' )
124+ i <<= 30 ;
125+ return i * sign ;
126+ }
127+
128+ int get32 (const UCHAR * p )
129+ {
130+ return p [0 ] | p [1 ] << 8 | p [2 ] << 16 | p [3 ] << 24 ;
131+ }
132+
133+ void put32 (UCHAR * p , int i )
134+ {
135+ p [0 ] = i & 0xff ;
136+ p [1 ] = (i >> 8 ) & 0xff ;
137+ p [2 ] = (i >> 16 ) & 0xff ;
138+ p [3 ] = (i >> 24 ) & 0xff ;
139+ return ;
140+ }
0 commit comments