about summary refs log tree commit diff stats
path: root/ext/wittle_generator/Serializer.cpp
diff options
context:
space:
mode:
authorStar Rauchenberger <fefferburbia@gmail.com>2023-10-27 17:20:23 -0400
committerStar Rauchenberger <fefferburbia@gmail.com>2023-10-27 17:20:23 -0400
commit4f25fa9ae42a0d43c20e954e8e50c66a6b057c92 (patch)
tree6cdfc57f5e1f54d025610757efb0ec57c3b88b0b /ext/wittle_generator/Serializer.cpp
parentdde56d26837dc52e05207c0672b3c4a1046f6cb2 (diff)
downloadwittle-4f25fa9ae42a0d43c20e954e8e50c66a6b057c92.tar.gz
wittle-4f25fa9ae42a0d43c20e954e8e50c66a6b057c92.tar.bz2
wittle-4f25fa9ae42a0d43c20e954e8e50c66a6b057c92.zip
We can output a code for witnesspuzzles
Diffstat (limited to 'ext/wittle_generator/Serializer.cpp')
-rw-r--r--ext/wittle_generator/Serializer.cpp135
1 files changed, 135 insertions, 0 deletions
diff --git a/ext/wittle_generator/Serializer.cpp b/ext/wittle_generator/Serializer.cpp new file mode 100644 index 0000000..420926f --- /dev/null +++ b/ext/wittle_generator/Serializer.cpp
@@ -0,0 +1,135 @@
1#include "Serializer.h"
2
3#include <iostream>
4#include <string>
5
6#include "Base64.h"
7
8void Serializer::writeByte(char val) { buffer_.push_back(val); }
9
10void Serializer::writeInt(int val) {
11 int b1 = (val & 0x000000FF) >> 0;
12 int b2 = (val & 0x0000FF00) >> 8;
13 int b3 = (val & 0x00FF0000) >> 16;
14 int b4 = (val & 0xFF000000) >> 24;
15 writeByte(b1);
16 writeByte(b2);
17 writeByte(b3);
18 writeByte(b4);
19}
20
21void Serializer::writeLong(long val) {
22 long i1 = val & 0xFFFFFFFF;
23 long i2 = (val - i1) / 0x100000000;
24 writeInt(i1);
25 writeInt(i2);
26}
27
28void Serializer::writeColor(int val) {
29 switch (val) {
30 case 0x1: {
31 // Black
32 writeByte(0xFF);
33 writeByte(0xFF);
34 writeByte(0xFF);
35 writeByte(0xFF);
36 break;
37 }
38 case 0x2: {
39 // White
40 writeByte(0x00);
41 writeByte(0x00);
42 writeByte(0x00);
43 writeByte(0xFF);
44 break;
45 }
46 case 0x3: {
47 // Red
48 writeByte(0xFF);
49 writeByte(0x00);
50 writeByte(0x00);
51 writeByte(0xFF);
52 break;
53 }
54 case 0x4: {
55 // Purple
56 writeByte(0x80);
57 writeByte(0x00);
58 writeByte(0x80);
59 writeByte(0xFF);
60 break;
61 }
62 case 0x5: {
63 // Green
64 writeByte(0x00);
65 writeByte(0xFF);
66 writeByte(0x00);
67 writeByte(0xFF);
68 break;
69 }
70 case 0x6: {
71 // Cyan
72 writeByte(0x00);
73 writeByte(0xFF);
74 writeByte(0xFF);
75 writeByte(0xFF);
76 break;
77 }
78 case 0x7: {
79 // Magenta
80 writeByte(0xFF);
81 writeByte(0x00);
82 writeByte(0xFF);
83 writeByte(0xFF);
84 break;
85 }
86 case 0x8: {
87 // Yellow
88 writeByte(0xFF);
89 writeByte(0xFF);
90 writeByte(0x00);
91 writeByte(0xFF);
92 break;
93 }
94 case 0x9: {
95 // Blue
96 writeByte(0x00);
97 writeByte(0x00);
98 writeByte(0xFF);
99 writeByte(0xFF);
100 break;
101 }
102 case 0xA: {
103 // Orange
104 writeByte(0xFF);
105 writeByte(0x8C);
106 writeByte(0x00);
107 writeByte(0xFF);
108 break;
109 }
110 case 0xF: {
111 // X????
112 break;
113 }
114 }
115}
116
117void Serializer::writeString(const std::string& val) {
118 writeInt(val.length());
119 for (char ch : val) {
120 writeByte(ch);
121 }
122}
123
124std::string Serializer::str() const {
125 int i = 0;
126 for (char ch : buffer_) {
127 std::cout << std::hex << static_cast<int>(ch);
128 if (i++ % 4 == 3) {
129 std::cout << " ";
130 }
131 }
132 std::cout << std::endl;
133
134 return "_" + macaron::Base64::Encode(buffer_);
135}