File: binary_glue.cc

package info (click to toggle)
kaya 0.2.0-6
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 3,012 kB
  • ctags: 1,307
  • sloc: cpp: 6,691; haskell: 4,833; sh: 2,868; yacc: 768; makefile: 700; perl: 87
file content (97 lines) | stat: -rw-r--r-- 2,115 bytes parent folder | download
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));
}