#!/usr/bin/env python2

import codecs

Unicode_from_CBM = [
    0x0040, # 0
    0x0041, # 1
    0x0042, # 2
    0x0043, # 3
    0x0044, # 4
    0x0045, # 5
    0x0046, # 6
    0x0047, # 7
    0x0048, # 8
    0x0049, # 9
    0x004A, # 10
    0x004B, # 11
    0x004C, # 12
    0x004D, # 13
    0x004E, # 14
    0x004F, # 15
    0x0050, # 16
    0x0051, # 17
    0x0052, # 18
    0x0053, # 19
    0x0054, # 20
    0x0055, # 21
    0x0056, # 22
    0x0057, # 23
    0x0058, # 24
    0x0059, # 25
    0x005A, # 26
    0x005B, # 27
    0x00A3, # 28
    0x005D, # 29
    0x2191, # 30
    0x2190, # 31
    0x0020, # 32
    0x0021, # 33
    0x0022, # 34
    0x0023, # 35
    0x0024, # 36
    0x0025, # 37
    0x0026, # 38
    0x0027, # 39
    0x0028, # 40
    0x0029, # 41
    0x002A, # 42
    0x002B, # 43
    0x002C, # 44
    0x002D, # 45
    0x002E, # 46
    0x002F, # 47
    0x0030, # 48
    0x0031, # 49
    0x0032, # 50
    0x0033, # 51
    0x0034, # 52
    0x0035, # 53
    0x0036, # 54
    0x0037, # 55
    0x0038, # 56
    0x0039, # 57
    0x003A, # 58
    0x003B, # 59
    0x003C, # 60
    0x003D, # 61
    0x003E, # 62
    0x003F, # 63
    0x2501, # 64
    0x2660, # 65
    0x2503, # 66
    0x2501, # 67 # dupe
    0x0000, # 68
    0x0000, # 69 # dupe
    0x0000, # 70 # dupe
    0x0000, # 71 # dupe
    0x0000, # 72 # dupe
    0x0000, # 73 # dupe
    0x0000, # 74 # dupe
    0x0000, # 75 # dupe
    0x0000, # 76 # dupe
    0x0000, # 77 # dupe
    0x0000, # 78 # dupe
    0x0000, # 79 # dupe
    0x0000, # 80 # dupe
    0x25CF, # 81
    0x0000, # 82 # dupe
    0x2665, # 83
    0x0000, # 84 # dupe
    0x0000, # 85 # dupe
    0x0000, # 86 # dupe
    0x25CB, # 87
    0x2663, # 88
    0x0000, # 89 # dupe
    0x2666, # 90
    0x254B, # 91
    0x0000, # 92 # dupe
    0x2503, # 93 # dupe
    0x03C0, # 94
    0x25E5, # 95
    0x0020, # 96 # dupe
    0x258C, # 97
    0x2584, # 98
    0x2594, # 99
    0x2581, # 100
    0x258E, # 101
    0x0000, # 102 # dupe
    0x0000, # 103 # dupe
    0x0000, # 104 # dupe
    0x25E4, # 105
    0x0000, # 106 # dupe
    0x2523, # 107
    0x2597, # 108
    0x2517, # 109
    0x2513, # 110
    0x2582, # 111
    0x250F, # 112
    0x253B, # 113
    0x2533, # 114
    0x252B, # 115
    0x258E, # 116 # dupe
    0x258D, # 117
    0x0000, # 118 # dupe
    0x0000, # 119 # dupe
    0x0000, # 120 # dupe
    0x2583, # 121
    0x0000, # 122 # dupe
    0x2596, # 123
    0x259D, # 124
    0x251B, # 125
    0x2598, # 126
    0x259A, # 127
    0x0000, # 128 # dupe
    0x0061, # 129
    0x0000, # 130 # dupe
    0x0063, # 131
    0x0064, # 132
    0x0000, # 133 # dupe
    0x0066, # 134
    0x0067, # 135
    0x0000, # 136 # dupe
    0x0069, # 137
    0x006A, # 138
    0x0000, # 139 # dupe
    0x006C, # 140
    0x006D, # 141
    0x0000, # 142 # dupe
    0x006F, # 143
    0x0070, # 144
    0x0000, # 145 # dupe
    0x0072, # 146
    0x0073, # 147
    0x0000, # 148 # dupe
    0x0075, # 149
    0x0076, # 150
    0x0000, # 151 # dupe
    0x0078, # 152
    0x0079, # 153
    0x0000, # 154 # dupe
    0x0000, # 155 # dupe
    0x00A3, # 156 # dupe
    0x005D, # 157 # dupe
    0x2191, # 158 # dupe
    0x0000, # 159 # dupe
    0x0020, # 160 # dupe
    0x0021, # 161 # dupe
    0x0000, # 162 # dupe
    0x0023, # 163 # dupe
    0x0024, # 164 # dupe
    0x0000, # 165 # dupe
    0x0026, # 166 # dupe
    0x0027, # 167 # dupe
    0x0000, # 168 # dupe
    0x0029, # 169 # dupe
    0x002A, # 170 # dupe
    0x0000, # 171 # dupe
    0x002C, # 172 # dupe
    0x002D, # 173 # dupe
    0x0000, # 174 # dupe
    0x002F, # 175 # dupe
    0x0030, # 176 # dupe
    0x0000, # 177 # dupe
    0x0032, # 178 # dupe
    0x0033, # 179 # dupe
    0x0000, # 180 # dupe
    0x0035, # 181 # dupe
    0x0036, # 182 # dupe
    0x0000, # 183 # dupe
    0x0038, # 184 # dupe
    0x0039, # 185 # dupe
    0x0000, # 186 # dupe
    0x003B, # 187 # dupe
    0x003C, # 188 # dupe
    0x0000, # 189 # dupe
    0x003E, # 190 # dupe
    0x003F, # 191 # dupe
    0x0000, # 192 # dupe
    0x0041, # 193 # dupe
    0x0042, # 194 # dupe
    0x0000, # 195 # dupe
    0x0044, # 196 # dupe
    0x0045, # 197 # dupe
    0x0000, # 198 # dupe
    0x0047, # 199 # dupe
    0x0048, # 200 # dupe
    0x0000, # 201 # dupe
    0x004A, # 202 # dupe
    0x004B, # 203 # dupe
    0x0000, # 204 # dupe
    0x004D, # 205 # dupe
    0x004E, # 206 # dupe
    0x0000, # 207 # dupe
    0x0050, # 208 # dupe
    0x0051, # 209 # dupe
    0x0000, # 210 # dupe
    0x0053, # 211 # dupe
    0x0054, # 212 # dupe
    0x0000, # 213 # dupe
    0x0056, # 214 # dupe
    0x0057, # 215 # dupe
    0x0000, # 216 # dupe
    0x0059, # 217 # dupe
    0x005A, # 218 # dupe
    0x254B, # 219 # dupe
    0x0000, # 220 # dupe
    0x2503, # 221 # dupe
    0x0000, # 222 # dupe
    0x0000, # 223 # dupe
    0x0020, # 224 # dupe
    0x0000, # 225 # dupe
    0x2584, # 226 # dupe
    0x0000, # 227 # dupe
    0x2581, # 228 # dupe
    0x258E, # 229 # dupe
    0x0000, # 230 # dupe
    0x0000, # 231 # dupe
    0x0000, # 232 # dupe
    0x0000, # 233 # dupe
    0x0000, # 234 # dupe
    0x0000, # 235 # dupe
    0x2597, # 236 # dupe
    0x2517, # 237 # dupe
    0x0000, # 238 # dupe
    0x0000, # 239 # dupe
    0x250F, # 240 # dupe
    0x0000, # 241 # dupe
    0x2533, # 242 # dupe
    0x252B, # 243 # dupe
    0x258E, # 244 # dupe
    0x258D, # 245 # dupe
    0x0000, # 246 # dupe
    0x0000, # 247 # dupe
    0x0000, # 248 # dupe
    0x2583, # 249 # dupe
    0x221A, # 250
    0x2596, # 251 # dupe
    0x259D, # 252 # dupe
    0x251B, # 253 # dupe
    0x0000, # 254 # dupe
    0x259A, # 255 # dupe
]
CBM_from_Unicode = {}
for CBM, Unicode in enumerate(Unicode_from_CBM):
    #assert(Unicode not in CBM_from_Unicode) # FIXME use this
    if Unicode not in CBM_from_Unicode:
        CBM_from_Unicode[Unicode] = CBM
        #print("U", hex(Unicode))
#print(CBM_from_Unicode[0x41])
assert(CBM_from_Unicode[0x41] == 1)

def search_function(name):
    if(name != "petscii"):
        return(None)
    def encode(arg, errors = {}):
        return(b"".join(map(lambda item: chr(CBM_from_Unicode[ord(item)]), arg)), len(arg))
    def decode(arg, errors = {}):
        return(u"".join(map(lambda item: unichr(Unicode_from_CBM[ord(item)]), arg)), len(arg))
    return(codecs.CodecInfo(encode, decode)) # streamreader, streamwriter, incrementalencoder, incrementaldecoder

codecs.register(search_function)

if __name__ == "__main__":
    assert(b"\x01\x02\x03".decode("petscii") == "ABC")
    #print ord(u"ABC".encode("petscii")[0])
    assert(u"ABC".encode("petscii") == b"\x01\x02\x03")
    #        data, bytesdecoded = self.decode(data, self.errors)
