(playlist.c) Omit whitespace when writing compressed JSON format playlists

This commit is contained in:
jdgleaver 2020-04-23 10:49:16 +01:00
parent fa9290cf1e
commit 25c6499c5d

View File

@ -1274,12 +1274,28 @@ end:
free(file); free(file);
} }
/* No-op versions of JSON whitespace writers,
* used when generating compressed output */
static JSON_Status JSON_CALL JSON_Writer_WriteNewLine_NULL(JSON_Writer writer)
{
return JSON_Success;
}
static JSON_Status JSON_CALL JSON_Writer_WriteSpace_NULL(JSON_Writer writer, size_t numberOfSpaces)
{
return JSON_Success;
}
static JSON_Status JSON_CALL (*json_write_new_line)(JSON_Writer writer) = JSON_Writer_WriteNewLine;
static JSON_Status JSON_CALL (*json_write_space)(JSON_Writer writer, size_t numberOfSpaces) = JSON_Writer_WriteSpace;
void playlist_write_file( void playlist_write_file(
playlist_t *playlist, playlist_t *playlist,
bool use_old_format, bool compress) bool use_old_format, bool compress)
{ {
size_t i; size_t i;
intfstream_t *file = NULL; intfstream_t *file = NULL;
bool compressed = false;
/* Playlist will be written if any of the /* Playlist will be written if any of the
* following are true: * following are true:
@ -1312,6 +1328,9 @@ void playlist_write_file(
return; return;
} }
/* Get current file compression state */
compressed = intfstream_is_compressed(file);
#ifdef RARCH_INTERNAL #ifdef RARCH_INTERNAL
if (use_old_format) if (use_old_format)
{ {
@ -1358,28 +1377,39 @@ void playlist_write_file(
goto end; goto end;
} }
/* Assign JSON whitespace functions
* > When compressing playlists, human readability
* is not a factor - can skip all indentation
* and new line characters */
json_write_new_line = compressed ?
JSON_Writer_WriteNewLine_NULL :
JSON_Writer_WriteNewLine;
json_write_space = compressed ?
JSON_Writer_WriteSpace_NULL :
JSON_Writer_WriteSpace;
JSON_Writer_SetOutputEncoding(context.writer, JSON_UTF8); JSON_Writer_SetOutputEncoding(context.writer, JSON_UTF8);
JSON_Writer_SetOutputHandler(context.writer, &JSONOutputHandler); JSON_Writer_SetOutputHandler(context.writer, &JSONOutputHandler);
JSON_Writer_SetUserData(context.writer, &context); JSON_Writer_SetUserData(context.writer, &context);
JSON_Writer_WriteStartObject(context.writer); JSON_Writer_WriteStartObject(context.writer);
JSON_Writer_WriteNewLine(context.writer); json_write_new_line(context.writer);
JSON_Writer_WriteSpace(context.writer, 2); json_write_space(context.writer, 2);
JSON_Writer_WriteString(context.writer, "version", JSON_Writer_WriteString(context.writer, "version",
STRLEN_CONST("version"), JSON_UTF8); STRLEN_CONST("version"), JSON_UTF8);
JSON_Writer_WriteColon(context.writer); JSON_Writer_WriteColon(context.writer);
JSON_Writer_WriteSpace(context.writer, 1); json_write_space(context.writer, 1);
JSON_Writer_WriteString(context.writer, "1.4", JSON_Writer_WriteString(context.writer, "1.4",
STRLEN_CONST("1.4"), JSON_UTF8); STRLEN_CONST("1.4"), JSON_UTF8);
JSON_Writer_WriteComma(context.writer); JSON_Writer_WriteComma(context.writer);
JSON_Writer_WriteNewLine(context.writer); json_write_new_line(context.writer);
JSON_Writer_WriteSpace(context.writer, 2); json_write_space(context.writer, 2);
JSON_Writer_WriteString(context.writer, "default_core_path", JSON_Writer_WriteString(context.writer, "default_core_path",
STRLEN_CONST("default_core_path"), JSON_UTF8); STRLEN_CONST("default_core_path"), JSON_UTF8);
JSON_Writer_WriteColon(context.writer); JSON_Writer_WriteColon(context.writer);
JSON_Writer_WriteSpace(context.writer, 1); json_write_space(context.writer, 1);
JSON_Writer_WriteString(context.writer, JSON_Writer_WriteString(context.writer,
playlist->default_core_path playlist->default_core_path
? playlist->default_core_path ? playlist->default_core_path
@ -1389,13 +1419,13 @@ void playlist_write_file(
: 0, : 0,
JSON_UTF8); JSON_UTF8);
JSON_Writer_WriteComma(context.writer); JSON_Writer_WriteComma(context.writer);
JSON_Writer_WriteNewLine(context.writer); json_write_new_line(context.writer);
JSON_Writer_WriteSpace(context.writer, 2); json_write_space(context.writer, 2);
JSON_Writer_WriteString(context.writer, "default_core_name", JSON_Writer_WriteString(context.writer, "default_core_name",
STRLEN_CONST("default_core_name"), JSON_UTF8); STRLEN_CONST("default_core_name"), JSON_UTF8);
JSON_Writer_WriteColon(context.writer); JSON_Writer_WriteColon(context.writer);
JSON_Writer_WriteSpace(context.writer, 1); json_write_space(context.writer, 1);
JSON_Writer_WriteString(context.writer, JSON_Writer_WriteString(context.writer,
playlist->default_core_name playlist->default_core_name
? playlist->default_core_name ? playlist->default_core_name
@ -1405,79 +1435,79 @@ void playlist_write_file(
: 0, : 0,
JSON_UTF8); JSON_UTF8);
JSON_Writer_WriteComma(context.writer); JSON_Writer_WriteComma(context.writer);
JSON_Writer_WriteNewLine(context.writer); json_write_new_line(context.writer);
uint_str[0] = '\0'; uint_str[0] = '\0';
snprintf(uint_str, sizeof(uint_str), "%u", playlist->label_display_mode); snprintf(uint_str, sizeof(uint_str), "%u", playlist->label_display_mode);
JSON_Writer_WriteSpace(context.writer, 2); json_write_space(context.writer, 2);
JSON_Writer_WriteString(context.writer, "label_display_mode", JSON_Writer_WriteString(context.writer, "label_display_mode",
STRLEN_CONST("label_display_mode"), JSON_UTF8); STRLEN_CONST("label_display_mode"), JSON_UTF8);
JSON_Writer_WriteColon(context.writer); JSON_Writer_WriteColon(context.writer);
JSON_Writer_WriteSpace(context.writer, 1); json_write_space(context.writer, 1);
JSON_Writer_WriteNumber(context.writer, uint_str, JSON_Writer_WriteNumber(context.writer, uint_str,
strlen(uint_str), JSON_UTF8); strlen(uint_str), JSON_UTF8);
JSON_Writer_WriteComma(context.writer); JSON_Writer_WriteComma(context.writer);
JSON_Writer_WriteNewLine(context.writer); json_write_new_line(context.writer);
uint_str[0] = '\0'; uint_str[0] = '\0';
snprintf(uint_str, sizeof(uint_str), "%u", playlist->right_thumbnail_mode); snprintf(uint_str, sizeof(uint_str), "%u", playlist->right_thumbnail_mode);
JSON_Writer_WriteSpace(context.writer, 2); json_write_space(context.writer, 2);
JSON_Writer_WriteString(context.writer, "right_thumbnail_mode", JSON_Writer_WriteString(context.writer, "right_thumbnail_mode",
STRLEN_CONST("right_thumbnail_mode"), JSON_UTF8); STRLEN_CONST("right_thumbnail_mode"), JSON_UTF8);
JSON_Writer_WriteColon(context.writer); JSON_Writer_WriteColon(context.writer);
JSON_Writer_WriteSpace(context.writer, 1); json_write_space(context.writer, 1);
JSON_Writer_WriteNumber(context.writer, uint_str, JSON_Writer_WriteNumber(context.writer, uint_str,
strlen(uint_str), JSON_UTF8); strlen(uint_str), JSON_UTF8);
JSON_Writer_WriteComma(context.writer); JSON_Writer_WriteComma(context.writer);
JSON_Writer_WriteNewLine(context.writer); json_write_new_line(context.writer);
uint_str[0] = '\0'; uint_str[0] = '\0';
snprintf(uint_str, sizeof(uint_str), "%u", playlist->left_thumbnail_mode); snprintf(uint_str, sizeof(uint_str), "%u", playlist->left_thumbnail_mode);
JSON_Writer_WriteSpace(context.writer, 2); json_write_space(context.writer, 2);
JSON_Writer_WriteString(context.writer, "left_thumbnail_mode", JSON_Writer_WriteString(context.writer, "left_thumbnail_mode",
STRLEN_CONST("left_thumbnail_mode"), JSON_UTF8); STRLEN_CONST("left_thumbnail_mode"), JSON_UTF8);
JSON_Writer_WriteColon(context.writer); JSON_Writer_WriteColon(context.writer);
JSON_Writer_WriteSpace(context.writer, 1); json_write_space(context.writer, 1);
JSON_Writer_WriteNumber(context.writer, uint_str, JSON_Writer_WriteNumber(context.writer, uint_str,
strlen(uint_str), JSON_UTF8); strlen(uint_str), JSON_UTF8);
JSON_Writer_WriteComma(context.writer); JSON_Writer_WriteComma(context.writer);
JSON_Writer_WriteNewLine(context.writer); json_write_new_line(context.writer);
uint_str[0] = '\0'; uint_str[0] = '\0';
snprintf(uint_str, sizeof(uint_str), "%u", playlist->sort_mode); snprintf(uint_str, sizeof(uint_str), "%u", playlist->sort_mode);
JSON_Writer_WriteSpace(context.writer, 2); json_write_space(context.writer, 2);
JSON_Writer_WriteString(context.writer, "sort_mode", JSON_Writer_WriteString(context.writer, "sort_mode",
STRLEN_CONST("sort_mode"), JSON_UTF8); STRLEN_CONST("sort_mode"), JSON_UTF8);
JSON_Writer_WriteColon(context.writer); JSON_Writer_WriteColon(context.writer);
JSON_Writer_WriteSpace(context.writer, 1); json_write_space(context.writer, 1);
JSON_Writer_WriteNumber(context.writer, uint_str, JSON_Writer_WriteNumber(context.writer, uint_str,
strlen(uint_str), JSON_UTF8); strlen(uint_str), JSON_UTF8);
JSON_Writer_WriteComma(context.writer); JSON_Writer_WriteComma(context.writer);
JSON_Writer_WriteNewLine(context.writer); json_write_new_line(context.writer);
JSON_Writer_WriteSpace(context.writer, 2); json_write_space(context.writer, 2);
JSON_Writer_WriteString(context.writer, "items", JSON_Writer_WriteString(context.writer, "items",
STRLEN_CONST("items"), JSON_UTF8); STRLEN_CONST("items"), JSON_UTF8);
JSON_Writer_WriteColon(context.writer); JSON_Writer_WriteColon(context.writer);
JSON_Writer_WriteSpace(context.writer, 1); json_write_space(context.writer, 1);
JSON_Writer_WriteStartArray(context.writer); JSON_Writer_WriteStartArray(context.writer);
JSON_Writer_WriteNewLine(context.writer); json_write_new_line(context.writer);
for (i = 0; i < playlist->size; i++) for (i = 0; i < playlist->size; i++)
{ {
JSON_Writer_WriteSpace(context.writer, 4); json_write_space(context.writer, 4);
JSON_Writer_WriteStartObject(context.writer); JSON_Writer_WriteStartObject(context.writer);
JSON_Writer_WriteNewLine(context.writer); json_write_new_line(context.writer);
JSON_Writer_WriteSpace(context.writer, 6); json_write_space(context.writer, 6);
JSON_Writer_WriteString(context.writer, "path", JSON_Writer_WriteString(context.writer, "path",
STRLEN_CONST("path"), JSON_UTF8); STRLEN_CONST("path"), JSON_UTF8);
JSON_Writer_WriteColon(context.writer); JSON_Writer_WriteColon(context.writer);
JSON_Writer_WriteSpace(context.writer, 1); json_write_space(context.writer, 1);
JSON_Writer_WriteString(context.writer, JSON_Writer_WriteString(context.writer,
playlist->entries[i].path playlist->entries[i].path
? playlist->entries[i].path ? playlist->entries[i].path
@ -1488,12 +1518,12 @@ void playlist_write_file(
JSON_UTF8); JSON_UTF8);
JSON_Writer_WriteComma(context.writer); JSON_Writer_WriteComma(context.writer);
JSON_Writer_WriteNewLine(context.writer); json_write_new_line(context.writer);
JSON_Writer_WriteSpace(context.writer, 6); json_write_space(context.writer, 6);
JSON_Writer_WriteString(context.writer, "label", JSON_Writer_WriteString(context.writer, "label",
STRLEN_CONST("label"), JSON_UTF8); STRLEN_CONST("label"), JSON_UTF8);
JSON_Writer_WriteColon(context.writer); JSON_Writer_WriteColon(context.writer);
JSON_Writer_WriteSpace(context.writer, 1); json_write_space(context.writer, 1);
JSON_Writer_WriteString(context.writer, JSON_Writer_WriteString(context.writer,
playlist->entries[i].label playlist->entries[i].label
? playlist->entries[i].label ? playlist->entries[i].label
@ -1504,12 +1534,12 @@ void playlist_write_file(
JSON_UTF8); JSON_UTF8);
JSON_Writer_WriteComma(context.writer); JSON_Writer_WriteComma(context.writer);
JSON_Writer_WriteNewLine(context.writer); json_write_new_line(context.writer);
JSON_Writer_WriteSpace(context.writer, 6); json_write_space(context.writer, 6);
JSON_Writer_WriteString(context.writer, "core_path", JSON_Writer_WriteString(context.writer, "core_path",
STRLEN_CONST("core_path"), JSON_UTF8); STRLEN_CONST("core_path"), JSON_UTF8);
JSON_Writer_WriteColon(context.writer); JSON_Writer_WriteColon(context.writer);
JSON_Writer_WriteSpace(context.writer, 1); json_write_space(context.writer, 1);
JSON_Writer_WriteString(context.writer, JSON_Writer_WriteString(context.writer,
playlist->entries[i].core_path playlist->entries[i].core_path
? playlist->entries[i].core_path ? playlist->entries[i].core_path
@ -1520,12 +1550,12 @@ void playlist_write_file(
JSON_UTF8); JSON_UTF8);
JSON_Writer_WriteComma(context.writer); JSON_Writer_WriteComma(context.writer);
JSON_Writer_WriteNewLine(context.writer); json_write_new_line(context.writer);
JSON_Writer_WriteSpace(context.writer, 6); json_write_space(context.writer, 6);
JSON_Writer_WriteString(context.writer, "core_name", JSON_Writer_WriteString(context.writer, "core_name",
STRLEN_CONST("core_name"), JSON_UTF8); STRLEN_CONST("core_name"), JSON_UTF8);
JSON_Writer_WriteColon(context.writer); JSON_Writer_WriteColon(context.writer);
JSON_Writer_WriteSpace(context.writer, 1); json_write_space(context.writer, 1);
JSON_Writer_WriteString(context.writer, JSON_Writer_WriteString(context.writer,
playlist->entries[i].core_name playlist->entries[i].core_name
? playlist->entries[i].core_name ? playlist->entries[i].core_name
@ -1536,12 +1566,12 @@ void playlist_write_file(
JSON_UTF8); JSON_UTF8);
JSON_Writer_WriteComma(context.writer); JSON_Writer_WriteComma(context.writer);
JSON_Writer_WriteNewLine(context.writer); json_write_new_line(context.writer);
JSON_Writer_WriteSpace(context.writer, 6); json_write_space(context.writer, 6);
JSON_Writer_WriteString(context.writer, "crc32", JSON_Writer_WriteString(context.writer, "crc32",
STRLEN_CONST("crc32"), JSON_UTF8); STRLEN_CONST("crc32"), JSON_UTF8);
JSON_Writer_WriteColon(context.writer); JSON_Writer_WriteColon(context.writer);
JSON_Writer_WriteSpace(context.writer, 1); json_write_space(context.writer, 1);
JSON_Writer_WriteString(context.writer, playlist->entries[i].crc32 ? playlist->entries[i].crc32 : "", JSON_Writer_WriteString(context.writer, playlist->entries[i].crc32 ? playlist->entries[i].crc32 : "",
playlist->entries[i].crc32 playlist->entries[i].crc32
? strlen(playlist->entries[i].crc32) ? strlen(playlist->entries[i].crc32)
@ -1549,12 +1579,12 @@ void playlist_write_file(
JSON_UTF8); JSON_UTF8);
JSON_Writer_WriteComma(context.writer); JSON_Writer_WriteComma(context.writer);
JSON_Writer_WriteNewLine(context.writer); json_write_new_line(context.writer);
JSON_Writer_WriteSpace(context.writer, 6); json_write_space(context.writer, 6);
JSON_Writer_WriteString(context.writer, "db_name", JSON_Writer_WriteString(context.writer, "db_name",
STRLEN_CONST("db_name"), JSON_UTF8); STRLEN_CONST("db_name"), JSON_UTF8);
JSON_Writer_WriteColon(context.writer); JSON_Writer_WriteColon(context.writer);
JSON_Writer_WriteSpace(context.writer, 1); json_write_space(context.writer, 1);
JSON_Writer_WriteString(context.writer, playlist->entries[i].db_name ? playlist->entries[i].db_name : "", JSON_Writer_WriteString(context.writer, playlist->entries[i].db_name ? playlist->entries[i].db_name : "",
playlist->entries[i].db_name playlist->entries[i].db_name
? strlen(playlist->entries[i].db_name) ? strlen(playlist->entries[i].db_name)
@ -1564,12 +1594,12 @@ void playlist_write_file(
if (!string_is_empty(playlist->entries[i].subsystem_ident)) if (!string_is_empty(playlist->entries[i].subsystem_ident))
{ {
JSON_Writer_WriteComma(context.writer); JSON_Writer_WriteComma(context.writer);
JSON_Writer_WriteNewLine(context.writer); json_write_new_line(context.writer);
JSON_Writer_WriteSpace(context.writer, 6); json_write_space(context.writer, 6);
JSON_Writer_WriteString(context.writer, "subsystem_ident", JSON_Writer_WriteString(context.writer, "subsystem_ident",
STRLEN_CONST("subsystem_ident"), JSON_UTF8); STRLEN_CONST("subsystem_ident"), JSON_UTF8);
JSON_Writer_WriteColon(context.writer); JSON_Writer_WriteColon(context.writer);
JSON_Writer_WriteSpace(context.writer, 1); json_write_space(context.writer, 1);
JSON_Writer_WriteString(context.writer, playlist->entries[i].subsystem_ident ? playlist->entries[i].subsystem_ident : "", JSON_Writer_WriteString(context.writer, playlist->entries[i].subsystem_ident ? playlist->entries[i].subsystem_ident : "",
playlist->entries[i].subsystem_ident playlist->entries[i].subsystem_ident
? strlen(playlist->entries[i].subsystem_ident) ? strlen(playlist->entries[i].subsystem_ident)
@ -1580,12 +1610,12 @@ void playlist_write_file(
if (!string_is_empty(playlist->entries[i].subsystem_name)) if (!string_is_empty(playlist->entries[i].subsystem_name))
{ {
JSON_Writer_WriteComma(context.writer); JSON_Writer_WriteComma(context.writer);
JSON_Writer_WriteNewLine(context.writer); json_write_new_line(context.writer);
JSON_Writer_WriteSpace(context.writer, 6); json_write_space(context.writer, 6);
JSON_Writer_WriteString(context.writer, "subsystem_name", JSON_Writer_WriteString(context.writer, "subsystem_name",
STRLEN_CONST("subsystem_name"), JSON_UTF8); STRLEN_CONST("subsystem_name"), JSON_UTF8);
JSON_Writer_WriteColon(context.writer); JSON_Writer_WriteColon(context.writer);
JSON_Writer_WriteSpace(context.writer, 1); json_write_space(context.writer, 1);
JSON_Writer_WriteString(context.writer, JSON_Writer_WriteString(context.writer,
playlist->entries[i].subsystem_name playlist->entries[i].subsystem_name
? playlist->entries[i].subsystem_name ? playlist->entries[i].subsystem_name
@ -1601,19 +1631,19 @@ void playlist_write_file(
unsigned j; unsigned j;
JSON_Writer_WriteComma(context.writer); JSON_Writer_WriteComma(context.writer);
JSON_Writer_WriteNewLine(context.writer); json_write_new_line(context.writer);
JSON_Writer_WriteSpace(context.writer, 6); json_write_space(context.writer, 6);
JSON_Writer_WriteString(context.writer, "subsystem_roms", JSON_Writer_WriteString(context.writer, "subsystem_roms",
STRLEN_CONST("subsystem_roms"), JSON_UTF8); STRLEN_CONST("subsystem_roms"), JSON_UTF8);
JSON_Writer_WriteColon(context.writer); JSON_Writer_WriteColon(context.writer);
JSON_Writer_WriteSpace(context.writer, 1); json_write_space(context.writer, 1);
JSON_Writer_WriteStartArray(context.writer); JSON_Writer_WriteStartArray(context.writer);
JSON_Writer_WriteNewLine(context.writer); json_write_new_line(context.writer);
for (j = 0; j < playlist->entries[i].subsystem_roms->size; j++) for (j = 0; j < playlist->entries[i].subsystem_roms->size; j++)
{ {
const struct string_list *roms = playlist->entries[i].subsystem_roms; const struct string_list *roms = playlist->entries[i].subsystem_roms;
JSON_Writer_WriteSpace(context.writer, 8); json_write_space(context.writer, 8);
JSON_Writer_WriteString(context.writer, JSON_Writer_WriteString(context.writer,
!string_is_empty(roms->elems[j].data) !string_is_empty(roms->elems[j].data)
? roms->elems[j].data ? roms->elems[j].data
@ -1626,38 +1656,38 @@ void playlist_write_file(
if (j < playlist->entries[i].subsystem_roms->size - 1) if (j < playlist->entries[i].subsystem_roms->size - 1)
{ {
JSON_Writer_WriteComma(context.writer); JSON_Writer_WriteComma(context.writer);
JSON_Writer_WriteNewLine(context.writer); json_write_new_line(context.writer);
} }
} }
JSON_Writer_WriteNewLine(context.writer); json_write_new_line(context.writer);
JSON_Writer_WriteSpace(context.writer, 6); json_write_space(context.writer, 6);
JSON_Writer_WriteEndArray(context.writer); JSON_Writer_WriteEndArray(context.writer);
} }
JSON_Writer_WriteNewLine(context.writer); json_write_new_line(context.writer);
JSON_Writer_WriteSpace(context.writer, 4); json_write_space(context.writer, 4);
JSON_Writer_WriteEndObject(context.writer); JSON_Writer_WriteEndObject(context.writer);
if (i < playlist->size - 1) if (i < playlist->size - 1)
JSON_Writer_WriteComma(context.writer); JSON_Writer_WriteComma(context.writer);
JSON_Writer_WriteNewLine(context.writer); json_write_new_line(context.writer);
} }
JSON_Writer_WriteSpace(context.writer, 2); json_write_space(context.writer, 2);
JSON_Writer_WriteEndArray(context.writer); JSON_Writer_WriteEndArray(context.writer);
JSON_Writer_WriteNewLine(context.writer); json_write_new_line(context.writer);
JSON_Writer_WriteEndObject(context.writer); JSON_Writer_WriteEndObject(context.writer);
JSON_Writer_WriteNewLine(context.writer); json_write_new_line(context.writer);
JSON_Writer_Free(context.writer); JSON_Writer_Free(context.writer);
playlist->old_format = false; playlist->old_format = false;
} }
playlist->modified = false; playlist->modified = false;
playlist->compressed = intfstream_is_compressed(file); playlist->compressed = compressed;
RARCH_LOG("Written to playlist file: %s\n", playlist->conf_path); RARCH_LOG("Written to playlist file: %s\n", playlist->conf_path);
end: end: