-
Notifications
You must be signed in to change notification settings - Fork 0
/
utext.c
142 lines (116 loc) · 2.98 KB
/
utext.c
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
135
136
137
138
139
140
141
#include <stdio.h>
#include <string.h>
#include <peekpoke.h>
#include "utext.h"
/*
Decode a VERY constrained subset of ASCII:
Z-char 0123456789abcdef0123456789abcdef
--------------------------------
x-set ABCDEFGHIJKLMNOPQRSTUVWXYZ?:'!y
y-set 0123456789ABCDEFGHILMNORSTUWY-x
x = Toggle to the 'x' character set. Also used to pad end of string if necessary.
y = Toggle to the 'y' character set. Also used to pad end of string if necessary.
*/
char *alphabet[2] = { " abcdefghijklmnopqrstuvwxyz?:'!",
" 0123456789abcdefghilmnorstuwy-" };
unsigned char zcase = 0;
unsigned char outbufpos = 0;
unsigned char b0, b1, b2, b3, b4, b5;
void decodeUbyte(unsigned char b, char* outbuf)
{
if (b == 31)
{
zcase = 1 - zcase;
//printf( "%2d : * switch case *\n");
}
else
{
outbuf[outbufpos] = alphabet[zcase][b];
//printf( "%2d %2d.%c\n", b, outbufpos, outbuf[outbufpos] );
++outbufpos;
}
}
char* decodeUtext(unsigned startLoc, char* outbuf)
{
b5 = 0;
outbufpos = 0;
zcase = 0;
for(; b5 == 0; startLoc += 2)
{
b0 = PEEK(startLoc);
b1 = PEEK(startLoc+1);
b2 = b0 & 31;
b3 = (b0/32) + (b1 & 3)*8;
b4 = (b1 & 127)/4;
b5 = (b1/128);
decodeUbyte(b2, outbuf);
decodeUbyte(b3, outbuf);
decodeUbyte(b4, outbuf);
}
outbuf[outbufpos] = 0; // terminate string
return outbuf;
}
char* decodeUtextbuf(unsigned char *buf, char* outbuf)
{
unsigned char loc;
outbufpos = 0; // used by decodeUbyte
zcase = 0; // used by decodeUbyte
for(loc=0; loc<strlen(buf); loc += 2)
{
b0 = buf[loc];
b1 = buf[loc+1];
b2 = b0 & 31;
b3 = (b0/32) + (b1 & 3)*8;
b4 = (b1 & 127)/4;
b5 = (b1/128);
decodeUbyte(b2, outbuf);
decodeUbyte(b3, outbuf);
decodeUbyte(b4, outbuf);
if (b5 == 1) break;
}
outbuf[outbufpos] = 0; // terminate string
return outbuf;
}
typedef struct {
int b0 :5;
int b1 :5;
int b2 :5;
int parity :1;
} ThreeByteCode;
typedef union {
unsigned int encoded;
ThreeByteCode asBytes;
} Converter;
// void encodeUtext(char* src, unsigned char* outbuf)
// {
// unsigned char loc;
// unsigned char uvalue;
// zcase = 0;
// unsigned char bufpos = 0;
// unsigned char buf[256];
// // Convert to 5-bit bytes
// for(loc=0; loc<strlen(src); loc += 2)
// {
// if (!alphabet[zcase][src[loc]]) // switch case
// {
// zcase = 1 - zcase;
// buf[bufpos] = 31;
// ++bufpos;
// }
// buf[bufpos] = alphabet[zcase][src[loc]];
// }
//
// // Now compress those bytes
// }
/*
void main()
{
char buf1[8] = { 162, 12, 171, 79, 224, 62, 146, 145 };
char buf2[8] = { 137, 34, 79, 58, 46, 76, 244, 201 };
char outbuf[256];
decodeUtextbuf( buf1, outbuf );
printf( "%s\n", outbuf );
decodeUtextbuf( buf2, outbuf );
printf( "%s\n", outbuf );
}
*/