1 /******************************************************************************
2 *
3 * Copyright (C) 2006, The Gentee Group. All rights reserved.
4 * This file is part of the Gentee open source project - http://www.gentee.com.
5 *
6 * THIS FILE IS PROVIDED UNDER THE TERMS OF THE GENTEE LICENSE ("AGREEMENT").
7 * ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS FILE CONSTITUTES RECIPIENTS
8 * ACCEPTANCE OF THE AGREEMENT.
9 *
10 * ID: geload 18.10.06 0.0.A.
11 *
12 * Author: Alexey Krivonogov ( gentee )
13 *
14 * Summary:
15 *
16 ******************************************************************************/
17
18 #include "ge.h"
19 #include "../vm/vmload.h"
20 #include "../vm/vmres.h"
21 #include "../vm/vmmanage.h"
22 #include "../common/crc.h"
23
24 void STDCALL load_none( void )
25 {
26 pvmobj pvmo = ( pvmobj )vmmng_begin( sizeof( vmobj ));
27
28 load_addobj( 0 );
29 vmmng_end( ( pubyte )( pvmo + 1 ));
30 }
31
32 void STDCALL load_resource( pubyte* in )
33 {
34 uint count, i, type;
35
36 *in += 5;
37 count = load_bwd( in ); // skip size
38 count = load_bwd( in );
39 _vm.irescnv = collect_count( &_vm.resource );
40
41 for ( i = 0; i < count; i ++ )
42 {
43 type = load_convert( in );
44 if ( type == TStr )
45 {
46 vmres_addstr( *in );
47 // print("OK=%s %i\n", *in, _vm.rescnv[ i ] );
48 *in += mem_len( *in ) + 1;
49 }
50 }
51 }
52
53 uint STDCALL ge_load( pbuf in )
54 {
55 pubyte cur, end, ptemp;
56 uint size;
57 pgehead phead = ( pgehead )buf_ptr( in );
58
59 // Проверка заголовка и целостности
60 // Сравниваем с 'GE' с двумя нулями на конце
61
62 if ( *( puint )phead != GE_STRING )//0x00004547 )
63 msg( MNotGE | MSG_EXIT );
64 if ( phead->crc != crc( ( pubyte )phead + 12, phead->size - 12, 0xFFFFFFFF ))
65 msg( MCrcGE | MSG_EXIT );
66 if ( phead->vermajor != GEVER_MAJOR || phead->verminor > GEVER_MINOR )
67 msg( MVerGE | MSG_EXIT );
68
69 _vm.loadmode = VMLOAD_GE;
70 _vm.icnv = arr_count( &_vm.objtbl ) - KERNEL_COUNT;
71 // print("icnv=%i\n", _vm.icnv );
72 cur = ( pubyte )phead + phead->headsize;
73 end = ( pubyte )phead + phead->size;
74 while ( cur < end )
75 {
76 ptemp = cur + 5; // type + flag
77 _vm.ipack = ( *( puint )( cur + 1 )) & GHCOM_PACK ? 1 : 0;
78
79 size = load_bwd( &ptemp );
80 ptemp = cur;
81 // print("size=%i type=%i flag = %x\n", size, *cur, *( puint )( cur + 1 ) );
82 switch ( *cur )
83 {
84 case OVM_NONE:
85 load_none();
86 break;
87 case OVM_BYTECODE:
88 load_bytecode( &cur, VMLOAD_GE );
89 break;
90 case OVM_EXFUNC:
91 load_exfunc( &cur, 0 );
92 _vm.loadmode = VMLOAD_GE;
93 break;
94 case OVM_TYPE:
95 load_type( &cur );
96 break;
97 case OVM_GLOBAL:
98 load_global( &cur );
99 break;
100 case OVM_DEFINE:
101 load_define( &cur );
102 break;
103 case OVM_IMPORT:
104 load_import( &cur );
105 break;
106 case OVM_RESOURCE:
107 load_resource( &cur );
108 break;
109 case OVM_ALIAS:
110 load_alias( &cur );
111 break;
112 default:
113 msg( MUnkGE | MSG_DVAL, cur - ( pubyte )phead );
114 }
115 cur = ptemp + size;
116 }
117 _vm.loadmode = VMLOAD_G;
118 _vm.icnv = 0;
119 return 1;
120 }