use unix domain socket for communication with mpv
[uwplayer.git] / application / json.h
diff --git a/application/json.h b/application/json.h
new file mode 100644 (file)
index 0000000..88494bf
--- /dev/null
@@ -0,0 +1,209 @@
+/*
+ * Copyright 2022 Olaf Wintermann
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a 
+ * copy of this software and associated documentation files (the "Software"), 
+ * to deal in the Software without restriction, including without limitation 
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
+ * and/or sell copies of the Software, and to permit persons to whom the 
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in 
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef JSON_H
+#define JSON_H
+
+#include <stdlib.h>
+#include <inttypes.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct JSONParser    JSONParser;
+typedef struct JSONToken     JSONToken;
+
+typedef struct JSONValue     JSONValue;
+
+typedef enum JSONTokenType   JSONTokenType;
+typedef enum JSONValueType   JSONValueType;
+typedef enum JSONLiteralType JSONLiteralType;
+typedef enum JSONReaderType  JSONReaderType;
+
+typedef struct JSONArray JSONArray;
+typedef struct JSONObject JSONObject;
+typedef struct JSONString JSONString;
+typedef struct JSONInteger JSONInteger;
+typedef struct JSONNumber JSONNumber;
+typedef struct JSONLiteral JSONLiteral;
+
+typedef struct JSONObjValue JSONObjValue;
+
+typedef struct JSONReadValueStack JSONReadValueStack;
+
+enum JSONTokenType {
+    JSON_NO_TOKEN = 0,
+    JSON_TOKEN_ERROR,
+    JSON_TOKEN_BEGIN_ARRAY,
+    JSON_TOKEN_BEGIN_OBJECT,
+    JSON_TOKEN_END_ARRAY,
+    JSON_TOKEN_END_OBJECT,
+    JSON_TOKEN_NAME_SEPARATOR,
+    JSON_TOKEN_VALUE_SEPARATOR,
+    JSON_TOKEN_STRING,
+    JSON_TOKEN_INTEGER,
+    JSON_TOKEN_NUMBER,
+    JSON_TOKEN_LITERAL,
+    JSON_TOKEN_SPACE
+};
+
+enum JSONValueType {
+    JSON_OBJECT = 0,
+    JSON_ARRAY,
+    JSON_STRING,
+    JSON_INTEGER,
+    JSON_NUMBER,
+    JSON_LITERAL
+};
+
+enum JSONLiteralType {
+    JSON_NULL = 0,
+    JSON_TRUE,
+    JSON_FALSE
+};
+
+enum JSONReaderType {
+    JSON_READER_OBJECT_BEGIN,
+    JSON_READER_OBJECT_END,
+    JSON_READER_ARRAY_BEGIN,
+    JSON_READER_ARRAY_END,
+    JSON_READER_STRING,
+    JSON_READER_INTEGER,
+    JSON_READER_NUMBER,
+    JSON_READER_LITERAL
+};
+
+struct JSONToken {
+    JSONTokenType tokentype;
+    const char *content;
+    size_t length;
+    size_t alloc;
+};
+
+struct JSONParser {
+    const char *buffer;
+    size_t size;
+    size_t pos;
+    
+    JSONToken uncompleted;
+    int tokenizer_escape;
+    
+    int *states;
+    int nstates;
+    int states_alloc;
+    
+    JSONToken reader_token;
+    JSONReaderType reader_type;
+    int value_ready;
+    char *value_name;
+    size_t value_name_len;
+    char *value_str;
+    size_t value_str_len;
+    int64_t value_int;
+    double value_double;
+    
+    JSONValue **readvalue_stack;
+    int readvalue_nelm;
+    int readvalue_alloc;
+    JSONValue *read_value;
+    int readvalue_initialized;
+    
+    int reader_array_alloc;
+    
+    int error;
+};
+
+struct JSONArray {
+    JSONValue **array;
+    size_t alloc;
+    size_t size;
+};
+
+struct JSONObject {
+    JSONObjValue *values;
+    size_t alloc;
+    size_t size;
+};
+
+struct JSONObjValue {
+    char *name;
+    JSONValue *value;
+};
+
+struct JSONString {
+    char *string;
+    size_t length;
+};
+
+struct JSONInteger {
+    int64_t value;
+};
+
+struct JSONNumber {
+    double value;
+};
+
+struct JSONLiteral {
+    JSONLiteralType literal;
+};
+
+
+struct JSONValue {
+    JSONValueType type;
+    union {
+        JSONArray   array;
+        JSONObject  object;
+        JSONString  string;
+        JSONInteger integer;
+        JSONNumber  number;
+        JSONLiteral literal;
+    } value;
+};
+
+
+JSONParser* json_parser_new(void);
+
+void json_parser_fill(JSONParser *p, const char *buf, size_t size);
+
+JSONToken json_parser_next_token(JSONParser *p);
+
+int json_read(JSONParser *p);
+
+JSONReaderType json_reader_type(JSONParser *p);
+const char* json_reader_name(JSONParser *p, size_t *opt_len);
+const char* json_reader_string(JSONParser *p, size_t *opt_len);
+int64_t json_reader_int(JSONParser *p);
+double json_reader_double(JSONParser *p);
+int json_reader_isnull(JSONParser *p);
+JSONLiteralType json_reader_literal(JSONParser *p);
+int json_reader_bool(JSONParser *p);
+
+int json_read_value(JSONParser *p, JSONValue **value);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* JSON_H */
+