Skip to content

Commit aa18ec1

Browse files
committed
Import ota generator
1 parent bff7ffd commit aa18ec1

File tree

14 files changed

+556
-3
lines changed

14 files changed

+556
-3
lines changed

go.mod

+3-1
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@ go 1.15
55
require (
66
github.com/antihax/optional v1.0.0
77
github.com/arduino/arduino-cli v0.0.0-20210607095659-16f41352eac3
8-
github.com/arduino/go-paths-helper v1.6.0
8+
github.com/arduino/go-paths-helper v1.6.1
99
github.com/arduino/iot-client-go v1.3.4-0.20210902151346-1cd63fb0c784
1010
github.com/howeyc/crc16 v0.0.0-20171223171357-2b2a61e366a6
11+
github.com/juju/errors v0.0.0-20210818161939-5560c4c073ff
1112
github.com/sirupsen/logrus v1.4.2
1213
github.com/spf13/cobra v1.1.3
1314
github.com/spf13/viper v1.7.0
@@ -21,4 +22,5 @@ require (
2122
google.golang.org/grpc v1.39.0
2223
google.golang.org/protobuf v1.27.1 // indirect
2324
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c
25+
gotest.tools v2.2.0+incompatible
2426
)

go.sum

+7-2
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,9 @@ github.com/arduino/board-discovery v0.0.0-20180823133458-1ba29327fb0c h1:agh2JT9
5252
github.com/arduino/board-discovery v0.0.0-20180823133458-1ba29327fb0c/go.mod h1:HK7SpkEax/3P+0w78iRQx1sz1vCDYYw9RXwHjQTB5i8=
5353
github.com/arduino/go-paths-helper v1.0.1/go.mod h1:HpxtKph+g238EJHq4geEPv9p+gl3v5YYu35Yb+w31Ck=
5454
github.com/arduino/go-paths-helper v1.2.0/go.mod h1:HpxtKph+g238EJHq4geEPv9p+gl3v5YYu35Yb+w31Ck=
55-
github.com/arduino/go-paths-helper v1.6.0 h1:S7/d7DqB9XlnvF9KrgSiGmo2oWKmYW6O/DTjj3Bijx4=
5655
github.com/arduino/go-paths-helper v1.6.0/go.mod h1:V82BWgAAp4IbmlybxQdk9Bpkz8M4Qyx+RAFKaG9NuvU=
56+
github.com/arduino/go-paths-helper v1.6.1 h1:lha+/BuuBsx0qTZ3gy6IO1kU23lObWdQ/UItkzVWQ+0=
57+
github.com/arduino/go-paths-helper v1.6.1/go.mod h1:V82BWgAAp4IbmlybxQdk9Bpkz8M4Qyx+RAFKaG9NuvU=
5758
github.com/arduino/go-properties-orderedmap v1.3.0 h1:4No/vQopB36e7WUIk6H6TxiSEJPiMrVOCZylYmua39o=
5859
github.com/arduino/go-properties-orderedmap v1.3.0/go.mod h1:DKjD2VXY/NZmlingh4lSFMEYCVubfeArCsGPGDwb2yk=
5960
github.com/arduino/go-timeutils v0.0.0-20171220113728-d1dd9e313b1b/go.mod h1:uwGy5PpN4lqW97FiLnbcx+xx8jly5YuPMJWfVwwjJiQ=
@@ -240,12 +241,14 @@ github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7
240241
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
241242
github.com/juju/clock v0.0.0-20180524022203-d293bb356ca4/go.mod h1:nD0vlnrUjcjJhqN5WuCWZyzfd5AHZAC9/ajvbSx69xA=
242243
github.com/juju/errors v0.0.0-20150916125642-1b5e39b83d18/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q=
243-
github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5 h1:rhqTjzJlm7EbkELJDKMTU7udov+Se0xZkWmugr6zGok=
244244
github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q=
245+
github.com/juju/errors v0.0.0-20210818161939-5560c4c073ff h1:WLHwK6yMswDvGUNrkxp4GYnrbQS8WULu1D3qteVdUIg=
246+
github.com/juju/errors v0.0.0-20210818161939-5560c4c073ff/go.mod h1:i1eL7XREII6aHpQ2gApI/v6FkVUDEBremNkcBCKYAcY=
245247
github.com/juju/loggo v0.0.0-20170605014607-8232ab8918d9/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U=
246248
github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8 h1:UUHMLvzt/31azWTN/ifGWef4WUqvXk0iRqdhdy/2uzI=
247249
github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U=
248250
github.com/juju/retry v0.0.0-20160928201858-1998d01ba1c3/go.mod h1:OohPQGsr4pnxwD5YljhQ+TZnuVRYpa5irjugL1Yuif4=
251+
github.com/juju/testing v0.0.0-20180517134105-72703b1e95eb/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA=
249252
github.com/juju/testing v0.0.0-20200510222523-6c8c298c77a0 h1:+WWUkhnTjV6RNOxkcwk79qrjeyHEHvBzlneueBsatX4=
250253
github.com/juju/testing v0.0.0-20200510222523-6c8c298c77a0/go.mod h1:hpGvhGHPVbNBraRLZEhoQwFLMrjK8PSlO4D3nDjKYXo=
251254
github.com/juju/utils v0.0.0-20180808125547-9dfc6dbfb02b/go.mod h1:6/KLg8Wz/y2KVGWEpkK9vMNGkOnu4k/cqs8Z1fKjTOk=
@@ -738,6 +741,8 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
738741
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
739742
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
740743
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
744+
gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
745+
gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
741746
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
742747
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
743748
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=

internal/lzss/README.md

Whitespace-only changes.

internal/lzss/lzss.c

+194
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
/* LZSS encoder-decoder (Haruhiko Okumura; public domain) */
2+
3+
#include <stdio.h>
4+
#include <stdlib.h>
5+
6+
#define EI 11 /* typically 10..13 */
7+
#define EJ 4 /* typically 4..5 */
8+
#define P 1 /* If match length <= P then output one character */
9+
#define N (1 << EI) /* buffer size */
10+
#define F ((1 << EJ) + 1) /* lookahead buffer size */
11+
12+
int bit_buffer = 0, bit_mask = 128;
13+
unsigned long codecount = 0, textcount = 0;
14+
unsigned char buffer[N * 2];
15+
FILE *infile, *outfile;
16+
17+
void error(void)
18+
{
19+
printf("Output error\n"); exit(1);
20+
}
21+
22+
void putbit1(void)
23+
{
24+
bit_buffer |= bit_mask;
25+
if ((bit_mask >>= 1) == 0) {
26+
if (fputc(bit_buffer, outfile) == EOF) error();
27+
bit_buffer = 0; bit_mask = 128; codecount++;
28+
}
29+
}
30+
31+
void putbit0(void)
32+
{
33+
if ((bit_mask >>= 1) == 0) {
34+
if (fputc(bit_buffer, outfile) == EOF) error();
35+
bit_buffer = 0; bit_mask = 128; codecount++;
36+
}
37+
}
38+
39+
void flush_bit_buffer(void)
40+
{
41+
if (bit_mask != 128) {
42+
if (fputc(bit_buffer, outfile) == EOF) error();
43+
codecount++;
44+
}
45+
}
46+
47+
void output1(int c)
48+
{
49+
int mask;
50+
51+
putbit1();
52+
mask = 256;
53+
while (mask >>= 1) {
54+
if (c & mask) putbit1();
55+
else putbit0();
56+
}
57+
}
58+
59+
void output2(int x, int y)
60+
{
61+
int mask;
62+
63+
putbit0();
64+
mask = N;
65+
while (mask >>= 1) {
66+
if (x & mask) putbit1();
67+
else putbit0();
68+
}
69+
mask = (1 << EJ);
70+
while (mask >>= 1) {
71+
if (y & mask) putbit1();
72+
else putbit0();
73+
}
74+
}
75+
76+
void encode(void)
77+
{
78+
int i, j, f1, x, y, r, s, bufferend, c;
79+
80+
for (i = 0; i < N - F; i++) buffer[i] = ' ';
81+
for (i = N - F; i < N * 2; i++) {
82+
if ((c = fgetc(infile)) == EOF) break;
83+
buffer[i] = c; textcount++;
84+
}
85+
bufferend = i; r = N - F; s = 0;
86+
while (r < bufferend) {
87+
f1 = (F <= bufferend - r) ? F : bufferend - r;
88+
x = 0; y = 1; c = buffer[r];
89+
for (i = r - 1; i >= s; i--)
90+
if (buffer[i] == c) {
91+
for (j = 1; j < f1; j++)
92+
if (buffer[i + j] != buffer[r + j]) break;
93+
if (j > y) {
94+
x = i; y = j;
95+
}
96+
}
97+
if (y <= P) { y = 1; output1(c); }
98+
else output2(x & (N - 1), y - 2);
99+
r += y; s += y;
100+
if (r >= N * 2 - F) {
101+
for (i = 0; i < N; i++) buffer[i] = buffer[i + N];
102+
bufferend -= N; r -= N; s -= N;
103+
while (bufferend < N * 2) {
104+
if ((c = fgetc(infile)) == EOF) break;
105+
buffer[bufferend++] = c; textcount++;
106+
}
107+
}
108+
}
109+
flush_bit_buffer();
110+
// printf("text: %ld bytes\n", textcount);
111+
// printf("code: %ld bytes (%ld%%)\n",
112+
// codecount, (codecount * 100) / textcount);
113+
}
114+
115+
int getbit(int n) /* get n bits */
116+
{
117+
int i, x;
118+
static int buf, mask = 0;
119+
120+
x = 0;
121+
for (i = 0; i < n; i++) {
122+
if (mask == 0) {
123+
if ((buf = fgetc(infile)) == EOF) return EOF;
124+
mask = 128;
125+
}
126+
x <<= 1;
127+
if (buf & mask) x++;
128+
mask >>= 1;
129+
}
130+
return x;
131+
}
132+
133+
void decode(void)
134+
{
135+
int i, j, k, r, c;
136+
137+
for (i = 0; i < N - F; i++) buffer[i] = ' ';
138+
r = N - F;
139+
while ((c = getbit(1)) != EOF) {
140+
if (c) {
141+
if ((c = getbit(8)) == EOF) break;
142+
fputc(c, outfile);
143+
buffer[r++] = c; r &= (N - 1);
144+
} else {
145+
if ((i = getbit(EI)) == EOF) break;
146+
if ((j = getbit(EJ)) == EOF) break;
147+
for (k = 0; k <= j + 1; k++) {
148+
c = buffer[(i + k) & (N - 1)];
149+
fputc(c, outfile);
150+
buffer[r++] = c; r &= (N - 1);
151+
}
152+
}
153+
}
154+
}
155+
156+
int encode_file(char const * in, char const * out)
157+
{
158+
// reset counters
159+
bit_buffer = 0, bit_mask = 128;
160+
codecount = 0, textcount = 0;
161+
162+
infile = fopen(in, "rb");
163+
if (infile == NULL) return 0;
164+
165+
outfile = fopen(out, "wb");
166+
if (outfile == NULL) return 0;
167+
168+
encode();
169+
170+
fclose(infile);
171+
fclose(outfile);
172+
173+
return 0;
174+
}
175+
176+
int decode_file(char const * in, char const * out)
177+
{
178+
// reset counters
179+
bit_buffer = 0, bit_mask = 128;
180+
codecount = 0, textcount = 0;
181+
182+
infile = fopen(in, "rb");
183+
if (infile == NULL) return 0;
184+
185+
outfile = fopen(out, "wb");
186+
if (outfile == NULL) return 0;
187+
188+
decode();
189+
190+
fclose(infile);
191+
fclose(outfile);
192+
193+
return 0;
194+
}

internal/lzss/lzss.go

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package lzss
2+
3+
// #cgo CFLAGS: -g -Wall
4+
// #include <stdlib.h>
5+
// #include "lzss.h"
6+
import "C"
7+
import (
8+
// "fmt"
9+
"sync"
10+
"unsafe"
11+
)
12+
13+
func Encode(source, destination string) {
14+
15+
var mutex sync.Mutex
16+
17+
src := C.CString(source)
18+
defer C.free(unsafe.Pointer(src))
19+
20+
dst := C.CString(destination)
21+
defer C.free(unsafe.Pointer(dst))
22+
23+
mutex.Lock()
24+
C.encode_file(src, dst)
25+
mutex.Unlock()
26+
}

internal/lzss/lzss.h

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#ifndef _LZSS_H
2+
#define _LZSS_H
3+
4+
int encode_file(char const * in, char const * out);
5+
6+
#endif

internal/lzss/testdata/lorem.lzss

1.7 KB
Binary file not shown.

internal/lzss/testdata/lorem.txt

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse ligula dui, imperdiet ut vulputate semper, sollicitudin ut eros. Aliquam erat volutpat. In hac habitasse platea dictumst. Nam non tortor sit amet mauris rutrum eleifend. Pellentesque vel justo nibh. Vivamus sem risus, pharetra eget egestas eget, venenatis a ipsum. Cras ultrices aliquam sagittis. Donec lacinia urna ac orci congue ut adipiscing dolor fringilla. Nullam nibh magna, bibendum vulputate ornare id, hendrerit et metus. Nullam dapibus neque quis mi laoreet molestie. Mauris et dui lacus, sit amet egestas purus.
2+
3+
Donec accumsan elementum accumsan. Nullam gravida dictum diam non semper. Curabitur vel magna in velit accumsan pulvinar eget in lorem. Duis vitae ante velit, at hendrerit nibh. Pellentesque lacus urna, cursus ac semper sagittis, viverra at sem. Quisque ullamcorper odio dolor. In quis pretium lacus. Maecenas lacinia urna id massa congue blandit. Suspendisse dapibus eros sit amet neque fermentum imperdiet. Cras interdum pulvinar eleifend. Suspendisse molestie neque a risus imperdiet convallis. In interdum dignissim pharetra. Morbi lectus tortor, pulvinar quis eleifend in, placerat at risus. Sed aliquam diam at metus adipiscing blandit.
4+
5+
Integer tristique metus vel ipsum pulvinar dignissim quis vel quam. Donec auctor aliquet bibendum. Morbi aliquet malesuada ultrices. Vivamus ac leo odio. Nam tristique eros non arcu porttitor non volutpat mauris tempus. Proin vestibulum suscipit pretium. Etiam elit tortor, dictum a gravida porta, congue id dolor. Duis eget est vitae elit facilisis blandit. Proin tincidunt felis et ipsum pharetra tempor. Fusce imperdiet vulputate magna, vel lacinia neque volutpat a. Vivamus a elit dolor. Aliquam sollicitudin dui et leo elementum mattis. Quisque suscipit, lorem id eleifend imperdiet, ipsum lorem pharetra purus, vel tempus lectus ligula id tortor. Morbi eget eros vel sapien scelerisque aliquam pellentesque sed turpis. Duis vel lorem non eros semper fringilla vitae vitae erat.
6+
7+
Vivamus porttitor pulvinar tristique. Proin sed elit ipsum. Phasellus faucibus pulvinar dapibus. Praesent quis sem in purus ultrices imperdiet. Aenean ut nulla urna. In tristique tincidunt urna, nec adipiscing velit laoreet ut. Curabitur et ante sed libero tristique pellentesque. Quisque porttitor sodales ipsum ut rhoncus. Nunc vitae diam gravida orci aliquam cursus vitae ut sapien. Proin ullamcorper felis eu nulla dapibus nec faucibus odio hendrerit. Aenean lorem magna, fermentum in tristique sit amet, accumsan ut massa. Fusce tristique, lectus rhoncus commodo sagittis, ligula felis consequat arcu, id pretium enim dolor id mi. Donec facilisis pulvinar luctus. Pellentesque vitae condimentum risus. Nam quis elit a orci adipiscing bibendum.
8+
9+
Ut quis felis lorem, dignissim varius turpis. Sed convallis dui semper mauris fermentum porta. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam erat volutpat. Proin lorem felis, scelerisque nec commodo non, porta eu metus. Nulla id augue a turpis mollis pellentesque. Aenean in lectus et leo tincidunt auctor eu interdum est. Nulla varius, lorem congue laoreet laoreet, felis quam ullamcorper ligula, non pellentesque dui ipsum quis odio. Etiam sit amet blandit leo. Aenean venenatis molestie eros, in fermentum ipsum dictum eget. Donec ultricies feugiat nisl, non molestie mi congue quis. Quisque mattis augue nec neque fringilla varius. Proin sollicitudin risus et elit pretium congue. Sed consequat eros sit amet felis pulvinar pulvinar. Morbi in turpis eu nulla cursus venenatis at ut urna. Donec vel lectus quis nisi aliquam varius.

0 commit comments

Comments
 (0)