From 47905e954726ff95ce5e4493def91b9107668c94 Mon Sep 17 00:00:00 2001 From: Ben Harris Date: Fri, 21 Oct 2022 00:25:34 +0100 Subject: [PATCH] Revert "WASM: move save file encoding from JS into C." Now that save files are (even more) officially ASCII, it's perfectly safe to pass them to JavaScript as UTF-8 strings. This means that the form in which save files are shipped from C to JavaScript is the same is the form in which they're shipped from JavaScript to C. That allows for doing new things with them, like writing them to local storage. This reverts commit f729f51e475ff98d0caf529f0723ef810b1c88ef. --- emcc.c | 49 ++++--------------------------------------------- emccpre.js | 3 ++- 2 files changed, 6 insertions(+), 46 deletions(-) diff --git a/emcc.c b/emcc.c index 5f21476..9f46c33 100644 --- a/emcc.c +++ b/emcc.c @@ -773,53 +773,12 @@ struct savefile_write_ctx { size_t pos; }; -static void savefile_write(void *vctx, const void *vbuf, int len) +static void savefile_write(void *vctx, const void *buf, int len) { - static const unsigned char length[256] = { - /* - * Assign a length of 1 to any printable ASCII character that - * can be written literally in URI-encoding, i.e. - * - * A-Z a-z 0-9 - _ . ! ~ * ' ( ) - * - * Assign length 3 (for % and two hex digits) to all other - * byte values. - */ - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 1, 3, 3, 3, 3, 3, 1, 1, 1, 1, 3, 3, 1, 1, 3, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, - 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 1, - 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 1, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - }; - static const char hexdigits[] = "0123456789ABCDEF"; - struct savefile_write_ctx *ctx = (struct savefile_write_ctx *)vctx; - const unsigned char *buf = (const unsigned char *)vbuf; - for (int i = 0; i < len; i++) { - unsigned char c = buf[i]; - int clen = length[c]; - if (ctx->buffer) { - if (clen == 1) { - ctx->buffer[ctx->pos] = c; - } else { - ctx->buffer[ctx->pos] = '%'; - ctx->buffer[ctx->pos+1] = hexdigits[c >> 4]; - ctx->buffer[ctx->pos+2] = hexdigits[c & 0xF]; - } - } - ctx->pos += clen; - } + if (ctx->buffer) + memcpy(ctx->buffer + ctx->pos, buf, len); + ctx->pos += len; } char *get_save_file(void) diff --git a/emccpre.js b/emccpre.js index b4ab82d..aa2803e 100644 --- a/emccpre.js +++ b/emccpre.js @@ -363,7 +363,8 @@ function initPuzzle() { "Click to download the ")); var a = document.createElement("a"); a.download = "puzzle.sav"; - a.href = "data:application/octet-stream," + savefile_text; + a.href = "data:application/octet-stream," + + encodeURIComponent(savefile_text); a.appendChild(document.createTextNode("saved-game file")); dlg_form.appendChild(a); dlg_form.appendChild(document.createTextNode("."));