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
|
#include <KayaAPI.h>
#include "binary_glue.h"
#include "stdfuns.h"
void* newBlock(int size)
{
return (void*)GC_MALLOC_ATOMIC(size);
}
void poke(void* block,int offset,int val)
{
BYTE* data = (BYTE*)block;
*(data+offset)=val;
}
int peek(void* block,int offset)
{
BYTE* data = (BYTE*)block;
return (int)(*(data+offset));
}
void pokestring(void* block, int offset, wchar_t* str)
{
BYTE* point = ((BYTE*)block)+offset;
memcpy(point,wctostr(str),strlen(wctostr(str))+1);
}
wchar_t* peekstring(void* block, int offset)
{
char* str = (char*)(((BYTE*)block)+offset);
char* buf = (char*)(KayaAlloc(strlen(str)));
strcpy(buf,str);
return strtowc(str);
}
void* copyBlock(void* block, int size)
{
void* newblock = (void*)KayaAlloc(size);
memcpy(newblock,block,size);
return newblock;
}
void* copyChunk(void* block,int offset,int size)
{
void* newblock = (void*)GC_MALLOC_ATOMIC(size);
void* blockstart = (void*)((BYTE*)block+offset);
memcpy(newblock,blockstart,size);
return newblock;
}
KayaArray getBlockData(void* block, int offset,int size)
{
BYTE* blockloc = (BYTE*)block+offset;
KayaArray data = newKayaArray(size);
for(int i=0;i<size;i++) {
KayaValue v = KayaInt((int)(*blockloc));
KayaArrayPush(data,v);
blockloc++;
}
return data;
}
void setBlockData(void* block, int offset, int size, KayaArray data)
{
int v;
BYTE* blockloc = (BYTE*)block+offset;
for(int i=0;i<size;i++) {
v = KayaGetInt(KayaArrayLookup(data,i));
*blockloc = (BYTE)v;
blockloc++;
}
}
int writeBlock(FILE* f,void* block, int size)
{
return fwrite(block,1,size,f);
}
void* readBlock(FILE* f, KayaValue size)
{
int isize = KayaGetInt(size);
void* newblock = (void*)GC_MALLOC_ATOMIC(isize);
isize = fread(newblock,1,isize,f);
KayaSetInt(size,isize);
return newblock;
}
wchar_t* b64binary(void* block, int len)
{
return strtowc(b64enc((char*)block, len));
}
void* b64binarydec(wchar_t* block, KayaValue len)
{
// use wctostr to get binary decoding
return (void*)(b64dec(wctostr(block), len));
}
|