ref: 47905e954726ff95ce5e4493def91b9107668c94
parent: 12491021d0541ded9f8f160a15b886a36e5aa8ac
author: Ben Harris <bjh21@bjh21.me.uk>
date: Thu Oct 20 20:25:34 EDT 2022
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.
--- a/emcc.c
+++ b/emcc.c
@@ -773,53 +773,12 @@
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)
--- a/emccpre.js
+++ b/emccpre.js
@@ -363,7 +363,8 @@
"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("."));