]> uap-core.de Git - uwplayer.git/commitdiff
switch to ucx json parser
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Sat, 8 Nov 2025 22:06:55 +0000 (23:06 +0100)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Sat, 8 Nov 2025 22:06:55 +0000 (23:06 +0100)
application/player.c
application/settings.c

index a6a1f46e9c716d7bedc9c5c380c661567878ded0..6da9fcd2dfbb6d06becbd2b5ead7df13137cbbb2 100644 (file)
@@ -38,7 +38,8 @@
 #include <sys/un.h>
 #include <pthread.h>
 
-#include "json.h"
+#include <cx/json.h>
+
 #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;i<value->value.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;i<value->value.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;i<value->value.object.size;i++) {
-                JSONValue *v = value->value.array.array[i];
+            for(int i=0;i<value->value.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;
index 0caece132c308a0ee01fd127a8060561914f5e78..e60022f123df18a153ff60ba4d62ec9c03f2ec2a 100644 (file)
@@ -38,7 +38,6 @@
 
 #include "main.h"
 #include "utils.h"
-#include "json.h"
 #include "window.h"
 #include "playlist.h"
 
@@ -48,6 +47,7 @@
 #include <cx/buffer.h>
 #include <cx/streams.h>
 #include <cx/printf.h>
+#include <cx/json.h>
 
 #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;i<s->size;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;i<s->values_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);
         }
     }
 }