--- a/src/ldump.c +++ b/src/ldump.c @@ -67,12 +67,12 @@ static void DumpString(const TString* s, { if (s==NULL || getstr(s)==NULL) { - size_t size=0; + unsigned int size=0; DumpVar(size,D); } else { - size_t size=s->tsv.len+1; /* include trailing '\0' */ + unsigned int size=s->tsv.len+1; /* include trailing '\0' */ DumpVar(size,D); DumpBlock(getstr(s),size,D); } --- a/src/lundump.c +++ b/src/lundump.c @@ -25,6 +25,7 @@ typedef struct { ZIO* Z; Mbuffer* b; const char* name; + int swap; } LoadState; #ifdef LUAC_TRUST_BINARIES @@ -40,7 +41,6 @@ static void error(LoadState* S, const ch } #endif -#define LoadMem(S,b,n,size) LoadBlock(S,b,(n)*(size)) #define LoadByte(S) (lu_byte)LoadChar(S) #define LoadVar(S,x) LoadMem(S,&x,1,sizeof(x)) #define LoadVector(S,b,n,size) LoadMem(S,b,n,size) @@ -51,6 +51,49 @@ static void LoadBlock(LoadState* S, void IF (r!=0, "unexpected end"); } +static void LoadMem (LoadState* S, void* b, int n, size_t size) +{ + LoadBlock(S,b,n*size); + if (S->swap) + { + char* p=(char*) b; + char c; + switch (size) + { + case 1: + break; + case 2: + while (n--) + { + c=p[0]; p[0]=p[1]; p[1]=c; + p+=2; + } + break; + case 4: + while (n--) + { + c=p[0]; p[0]=p[3]; p[3]=c; + c=p[1]; p[1]=p[2]; p[2]=c; + p+=4; + } + break; + case 8: + while (n--) + { + c=p[0]; p[0]=p[7]; p[7]=c; + c=p[1]; p[1]=p[6]; p[6]=c; + c=p[2]; p[2]=p[5]; p[5]=c; + c=p[3]; p[3]=p[4]; p[4]=c; + p+=8; + } + break; + default: + IF(1, "bad size"); + break; + } + } +} + static int LoadChar(LoadState* S) { char x; @@ -82,7 +125,7 @@ static lua_Integer LoadInteger(LoadState static TString* LoadString(LoadState* S) { - size_t size; + unsigned int size; LoadVar(S,size); if (size==0) return NULL; @@ -196,6 +239,7 @@ static void LoadHeader(LoadState* S) char s[LUAC_HEADERSIZE]; luaU_header(h); LoadBlock(S,s,LUAC_HEADERSIZE); + S->swap=(s[6]!=h[6]); s[6]=h[6]; IF (memcmp(h,s,LUAC_HEADERSIZE)!=0, "bad header"); } @@ -230,7 +274,7 @@ void luaU_header (char* h) *h++=(char)LUAC_FORMAT; *h++=(char)*(char*)&x; /* endianness */ *h++=(char)sizeof(int); - *h++=(char)sizeof(size_t); + *h++=(char)sizeof(unsigned int); *h++=(char)sizeof(Instruction); *h++=(char)sizeof(lua_Number); >committer
path: root/tools/misc/xensv
blob: b877538d67e3bbb9c20d8f63dbb1ecfedb4225d4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134