From: Olaf Wintermann Date: Sat, 8 Nov 2025 22:06:55 +0000 (+0100) Subject: switch to ucx json parser X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=1cd5dccae65a494bbe8879b951716454b7318e64;p=uwplayer.git switch to ucx json parser --- diff --git a/application/player.c b/application/player.c index a6a1f46..6da9fcd 100644 --- a/application/player.c +++ b/application/player.c @@ -38,7 +38,8 @@ #include #include -#include "json.h" +#include + #include "utils.h" #include "settings.h" #include "playlist.h" @@ -53,15 +54,20 @@ extern char **environ; #define PLAYER_POLL_TIMEOUT 500 #define PLAYER_IN_BUFSIZE 8192 -static void json_print(JSONValue *value, char *name, int indent); +static void json_print(CxJsonValue *value, char *name, int indent); static void* start_player(void *data); static void player_io(Player *p); -static void handle_json_rpc_msg(Player *player, JSONValue *v); -static void handle_json_rpc_reqid(Player *player, JSONValue *v, int reqid); -static void handle_json_rpc_event(Player *player, JSONValue *v, JSONValue *event); +static void handle_json_rpc_msg(Player *player, CxJsonValue *v); +static void handle_json_rpc_reqid(Player *player, CxJsonValue *v, int reqid); +static void handle_json_rpc_event(Player *player, CxJsonValue *v, CxJsonValue *event); + +static int json_strcmp(CxJsonValue *value, const char *str) { + if(value->type != CX_JSON_STRING) return 1; + return cx_strcmp(value->value.string, str); +} void PlayerOpenFile(MainWindow *win) { pthread_t tid; @@ -302,7 +308,8 @@ static void player_io(Player *p) { fds[1].fd = p->log; fds[1].events = POLLIN; fds[1].revents = 0; - JSONParser *js = json_parser_new(); + CxJson js; + cxJsonInit(&js, NULL); char buf[PLAYER_IN_BUFSIZE]; while(p->isactive && (poll(fds, 2, PLAYER_POLL_TIMEOUT) >= 0)) { @@ -313,13 +320,13 @@ static void player_io(Player *p) { } //fwrite(buf, 1, r, stdout); //fflush(stdout); - json_parser_fill(js, buf, r); + cxJsonFilln(&js, buf, r); - JSONValue *value; + CxJsonValue *value; int ret; - while((ret = json_read_value(js, &value)) == 1) { + while((ret = cxJsonNext(&js, &value)) == CX_JSON_NO_ERROR) { handle_json_rpc_msg(p, value); - json_value_free(value); + cxJsonValueFree(value); } if(ret == -1) { @@ -339,22 +346,24 @@ static void player_io(Player *p) { printf("PlayerEnd: %s\n", strerror(errno)); fflush(stdout); + + cxJsonDestroy(&js); } -static void handle_json_rpc_msg(Player *player, JSONValue *v) { - if(v->type != JSON_OBJECT) return; +static void handle_json_rpc_msg(Player *player, CxJsonValue *v) { + if(v->type != CX_JSON_OBJECT) return; - JSONValue *request_id_v = json_obj_get(&v->value.object, "request_id"); - JSONValue *event = NULL; - if(request_id_v && request_id_v->type == JSON_STRING) { + CxJsonValue *request_id_v = cxJsonObjGet(v, "request_id"); + CxJsonValue *event = NULL; + if(request_id_v && request_id_v->type == CX_JSON_STRING) { int request_id = 0; if(request_id_v->value.string.length == 2) { - request_id = 10 * (request_id_v->value.string.string[0] - '0') + (request_id_v->value.string.string[1] - '0'); + request_id = 10 * (request_id_v->value.string.ptr[0] - '0') + (request_id_v->value.string.ptr[1] - '0'); handle_json_rpc_reqid(player, v, request_id); return; } - } else if ((event = json_obj_get(&v->value.object, "event")) != NULL) { + } else if ((event = cxJsonObjGet(v, "event")) != NULL) { handle_json_rpc_event(player, v, event); } @@ -406,26 +415,26 @@ static void player_set_size(Player *player, int width, int height) { } } -static void handle_json_rpc_reqid(Player *player, JSONValue *v, int reqid) { - JSONValue *data = json_obj_get(&v->value.object, "data"); +static void handle_json_rpc_reqid(Player *player, CxJsonValue *v, int reqid) { + CxJsonValue *data = cxJsonObjGet(v, "data"); if(!data) return; switch(reqid) { case REQ_ID_PLAYBACK_TIME_INT: { - if(data->type == JSON_NUMBER) { - player->playback_time = data->value.number.value; + if(data->type == CX_JSON_NUMBER) { + player->playback_time = data->value.number; } break; } case REQ_ID_WIDTH_INT: { - if(data->type == JSON_INTEGER) { - player_set_size(player, data->value.integer.value, -1); + if(data->type == CX_JSON_INTEGER) { + player_set_size(player, data->value.integer, -1); } break; } case REQ_ID_HEIGHT_INT: { - if(data->type == JSON_INTEGER) { - player_set_size(player, -1, data->value.integer.value); + if(data->type == CX_JSON_INTEGER) { + player_set_size(player, -1, data->value.integer); } break; } @@ -469,23 +478,23 @@ static void check_hide_cursor(Player *p) { } } -static void handle_json_rpc_event(Player *p, JSONValue *v, JSONValue *event) { +static void handle_json_rpc_event(Player *p, CxJsonValue *v, CxJsonValue *event) { if(!json_strcmp(event, "property-change")) { - JSONValue *name = json_obj_get(&v->value.object, "name"); - JSONValue *data = json_obj_get(&v->value.object, "data"); + CxJsonValue *name = cxJsonObjGet(v, "name"); + CxJsonValue *data = cxJsonObjGet(v, "data"); if(!json_strcmp(name, "playback-time")) { - if(data && data->type == JSON_NUMBER) { - p->playback_time = data->value.number.value; + if(data && data->type == CX_JSON_NUMBER) { + p->playback_time = data->value.number; //printf("playback-time: %f\n", p->playback_time); check_hide_cursor(p); } } else if(!json_strcmp(name, "eof-reached")) { - if(data && data->type == JSON_LITERAL && data->value.literal.literal == JSON_TRUE) { + if(data && data->type == CX_JSON_LITERAL && data->value.literal == CX_JSON_TRUE) { PlayerEOF(p); } } else if(!json_strcmp(name, "osd-height")) { - if(data->type == JSON_NUMBER) { - p->osd_height = data->value.number.value; + if(data->type == CX_JSON_NUMBER) { + p->osd_height = data->value.number; } } } else if(!p->isstarted && !json_strcmp(event, "playback-restart")) { @@ -528,7 +537,7 @@ void PlayerUnref(Player *p) { } -static void json_print(JSONValue *value, char *name, int indent) { +static void json_print(CxJsonValue *value, char *name, int indent) { if(name) { printf("%*s%s: ", indent*4, "", name); } else { @@ -537,13 +546,13 @@ static void json_print(JSONValue *value, char *name, int indent) { switch(value->type) { - case JSON_OBJECT: { + case CX_JSON_OBJECT: { printf("{\n"); - for(int i=0;ivalue.object.size;i++) { - JSONObjValue val = value->value.object.values[i]; - json_print(val.value, val.name, indent+1); - if(i+1 < value->value.object.size) { + for(int i=0;ivalue.object.values_size;i++) { + CxJsonObjValue val = value->value.object.values[i]; + json_print(val.value, val.name.ptr, indent+1); + if(i+1 < value->value.object.values_size) { printf(",\n"); } else { printf("\n"); @@ -553,13 +562,13 @@ static void json_print(JSONValue *value, char *name, int indent) { printf("%*s}", indent*4, ""); break; } - case JSON_ARRAY: { + case CX_JSON_ARRAY: { printf("[\n"); - for(int i=0;ivalue.object.size;i++) { - JSONValue *v = value->value.array.array[i]; + for(int i=0;ivalue.array.array_size;i++) { + CxJsonValue *v = value->value.array.array[i]; json_print(v, NULL, indent+1); - if(i+1 < value->value.array.size) { + if(i+1 < value->value.array.array_size) { printf(",\n"); } else { printf("\n"); @@ -569,24 +578,24 @@ static void json_print(JSONValue *value, char *name, int indent) { printf("%*s]", indent*4, ""); break; } - case JSON_STRING: { - printf("\"%s\"", value->value.string.string); + case CX_JSON_STRING: { + printf("\"%.*s\"", (int)value->value.string.length, value->value.string.ptr); break; } - case JSON_INTEGER: { - printf("%i", (int)value->value.integer.value); + case CX_JSON_INTEGER: { + printf("%i", (int)value->value.integer); break; } - case JSON_NUMBER: { - printf("%f", value->value.number.value); + case CX_JSON_NUMBER: { + printf("%f", (float)value->value.number); break; } - case JSON_LITERAL: { + case CX_JSON_LITERAL: { char *lit = "NULL"; - switch(value->value.literal.literal) { - case JSON_NULL: break; - case JSON_TRUE: lit = "true"; break; - case JSON_FALSE: lit = "false"; break; + switch(value->value.literal) { + case CX_JSON_NULL: break; + case CX_JSON_TRUE: lit = "true"; break; + case CX_JSON_FALSE: lit = "false"; break; } printf("%s\n", lit); break; diff --git a/application/settings.c b/application/settings.c index 0caece1..e60022f 100644 --- a/application/settings.c +++ b/application/settings.c @@ -38,7 +38,6 @@ #include "main.h" #include "utils.h" -#include "json.h" #include "window.h" #include "playlist.h" @@ -48,6 +47,7 @@ #include #include #include +#include #define CONFIG_BASE_DIR ".config" #define UWP_CONFIG_DIR "uwplayer" @@ -65,7 +65,7 @@ static int instance_socket = -1; /* * root json config object */ -static JSONObject *uwp_config; +static CxJsonValue *uwp_config; /* * global settings from json config converted to key/value pairs @@ -120,30 +120,27 @@ int load_config(void) { int ret = 0; if(cfgfile) { - JSONParser *parser = json_parser_new(); + CxJson parser; + cxJsonInit(&parser, NULL); - JSONValue *value = NULL; + CxJsonValue *value = NULL; char buf[JS_READ_BUFSIZE]; size_t r; - while((ret = json_read_value(parser, &value)) >= 0) { - if(ret == 0) { - r = fread(buf, 1, JS_READ_BUFSIZE, cfgfile); - if(r == 0) { - break; - } - json_parser_fill(parser, buf, r); - } else { + while((ret = cxJsonNext(&parser, &value)) == CX_JSON_INCOMPLETE_DATA) { + r = fread(buf, 1, JS_READ_BUFSIZE, cfgfile); + if(r == 0) { break; } + cxJsonFilln(&parser, buf, r); } - json_parser_free(parser); + cxJsonDestroy(&parser); if(value) { - if(value->type == JSON_OBJECT) { + if(value->type == CX_JSON_OBJECT) { ret = 0; - uwp_config = &value->value.object; + uwp_config = value; conf_load_global_settings(); } else { ret = 1; @@ -177,22 +174,22 @@ int load_config(void) { } static void conf_load_global_settings(void) { - JSONValue *settings = json_obj_get(uwp_config, "settings"); + CxJsonValue *settings = cxJsonObjGet(uwp_config, "settings"); if(!settings) { return; } - if(settings->type != JSON_OBJECT) { + if(settings->type != CX_JSON_OBJECT) { fprintf(stderr, "Warning: 'settings' not an object\n"); return; } - JSONObject *s = &settings->value.object; + CxJsonObject *s = &settings->value.object; - for(size_t i=0;isize;i++) { - JSONObjValue *gs = &s->values[i]; - if(gs->value->type == JSON_STRING) { - cxMapPut(uwp_settings, cx_hash_key_str(gs->name), strdup(gs->value->value.string.string)); + for(size_t i=0;ivalues_size;i++) { + CxJsonObjValue *gs = &s->values[i]; + if(gs->value->type == CX_JSON_STRING) { + cxMapPut(uwp_settings, gs->name, cx_strdup(gs->value->value.string).ptr); } } }