| --- 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); |
| |