fix serializer being completely broken

http-comm
Ondřej Hruška 7 years ago
parent 948bcb62ff
commit 692b2c4d11
Signed by: MightyPork
GPG Key ID: 2C5FD5035250423D
  1. 75
      user/screen.c

@ -8,6 +8,7 @@
#include "jstring.h" #include "jstring.h"
#include "character_sets.h" #include "character_sets.h"
#include "utf8.h" #include "utf8.h"
#include "uart_buffer.h"
TerminalConfigBundle * const termconf = &persist.current.termconf; TerminalConfigBundle * const termconf = &persist.current.termconf;
TerminalConfigBundle termconf_live; TerminalConfigBundle termconf_live;
@ -1565,58 +1566,46 @@ screenSerializeToBuffer(char *buffer, size_t buf_len, void **data)
} }
Cell *cell, *cell0; Cell *cell, *cell0;
WordB2 w1;
WordB3 lw1;
u8 nbytes;
size_t remain = buf_len; size_t remain = buf_len;
char *bb = buffer; char *bb = buffer;
#define bufput_c(c) do { \ #define bufput_c(c) do { \
*bb = (char)c; bb++; \ *bb = (char)(c); \
bb++; \
remain--; \ remain--; \
} while(0) } while(0)
#define bufput_2B(n) do { \ #define bufput_utf8(num) do { \
encode2B((u16) n, &w1); \ nbytes = utf8_encode(bb, (num)+1); \
bufput_c(w1.lsb); \ bb += nbytes; \
bufput_c(w1.msb); \ remain -= nbytes; \
} while(0) } while(0)
#define bufput_3B(n) do { \
encode3B((u32) n, &lw1); \
bufput_c(lw1.lsb); \
bufput_c(lw1.msb); \
bufput_c(lw1.xsb); \
} while(0)
#define bufput_t2B(t, n) do { \
bufput_c(t); \
bufput_2B(n); \
} while(0)
#define bufput_t3B(t, n) do { \ #define bufput_t_utf8(t, num) do { \
bufput_c(t); \ bufput_c((t)); \
bufput_3B(n); \ bufput_utf8((num)); \
} while(0) } while(0)
if (ss == NULL) { if (ss == NULL) {
*data = ss = malloc(sizeof(struct ScreenSerializeState)); *data = ss = malloc(sizeof(struct ScreenSerializeState));
ss->index = 0; ss->index = 0;
ss->lastBg = 0; ss->lastBg = 0xFF;
ss->lastFg = 0; ss->lastFg = 0xFF;
ss->lastAttrs = 0; ss->lastAttrs = 0xFFFF;
ss->lastCharLen = 0; ss->lastCharLen = 0;
ss->lastSymbol = 32; ss->lastSymbol = 0;
strncpy(ss->lastChar, " ", 4); strncpy(ss->lastChar, " ", 4);
bufput_c('S'); bufput_c('S');
// H W X Y Attribs // H W X Y Attribs
bufput_2B(H); bufput_utf8(H);
bufput_2B(W); bufput_utf8(W);
bufput_2B(cursor.y); bufput_utf8(cursor.y);
bufput_2B(cursor.x); bufput_utf8(cursor.x);
// 3B has 18 free bits // 3B has 18 free bits
bufput_3B( bufput_utf8(
(scr.cursor_visible << 0) | (scr.cursor_visible << 0) |
(cursor.hanging << 1) | (cursor.hanging << 1) |
(scr.cursors_alt_mode << 2) | (scr.cursors_alt_mode << 2) |
@ -1656,7 +1645,7 @@ screenSerializeToBuffer(char *buffer, size_t buf_len, void **data)
} }
if (repCnt == 0) { if (repCnt == 0) {
// No repeat // No repeat - first occurrence
bool changeAttrs = cell0->attrs != ss->lastAttrs; bool changeAttrs = cell0->attrs != ss->lastAttrs;
bool changeFg = cell0->fg != ss->lastFg; bool changeFg = cell0->fg != ss->lastFg;
bool changeBg = cell0->bg != ss->lastBg; bool changeBg = cell0->bg != ss->lastBg;
@ -1668,17 +1657,17 @@ screenSerializeToBuffer(char *buffer, size_t buf_len, void **data)
bg = cell0->bg; bg = cell0->bg;
if (changeColors) { if (changeColors) {
bufput_t3B(SEQ_TAG_COLORS, bg<<8 | fg); bufput_t_utf8(SEQ_TAG_COLORS, bg<<8 | fg);
} }
else if (changeFg) { else if (changeFg) {
bufput_t2B(SEQ_TAG_FG, fg); bufput_t_utf8(SEQ_TAG_FG, fg);
} }
else if (changeBg) { else if (changeBg) {
bufput_t2B(SEQ_TAG_BG, bg); bufput_t_utf8(SEQ_TAG_BG, bg);
} }
if (changeAttrs) { if (changeAttrs) {
bufput_t3B(SEQ_TAG_ATTRS, cell0->attrs); bufput_t_utf8(SEQ_TAG_ATTRS, cell0->attrs);
} }
// copy the symbol, until first 0 or reached 4 bytes // copy the symbol, until first 0 or reached 4 bytes
@ -1703,7 +1692,7 @@ screenSerializeToBuffer(char *buffer, size_t buf_len, void **data)
int savings = ss->lastCharLen*repCnt; int savings = ss->lastCharLen*repCnt;
if (savings > 3) { if (savings > 3) {
// Repeat count // Repeat count
bufput_t2B(SEQ_TAG_REPEAT, repCnt); bufput_t_utf8(SEQ_TAG_REPEAT, repCnt);
} else { } else {
// repeat it manually // repeat it manually
for(int k = 0; k < repCnt; k++) { for(int k = 0; k < repCnt; k++) {
@ -1718,6 +1707,14 @@ screenSerializeToBuffer(char *buffer, size_t buf_len, void **data)
ss->index = i; ss->index = i;
bufput_c('\0'); // terminate the string bufput_c('\0'); // terminate the string
#if 0
printf("MSG: ");
for (int j=0;j<bb-buffer;j++) {
printf("%02X ", buffer[j]);
}
printf("\n");
#endif
if (i < W*H-1) { if (i < W*H-1) {
return HTTPD_CGI_MORE; return HTTPD_CGI_MORE;
} }

Loading…
Cancel
Save