quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

bjson.c (3130B)


      1 /*
      2  * QuickJS: binary JSON module (test only)
      3  *
      4  * Copyright (c) 2017-2019 Fabrice Bellard
      5  *
      6  * Permission is hereby granted, free of charge, to any person obtaining a copy
      7  * of this software and associated documentation files (the "Software"), to deal
      8  * in the Software without restriction, including without limitation the rights
      9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     10  * copies of the Software, and to permit persons to whom the Software is
     11  * furnished to do so, subject to the following conditions:
     12  *
     13  * The above copyright notice and this permission notice shall be included in
     14  * all copies or substantial portions of the Software.
     15  *
     16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
     19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     22  * THE SOFTWARE.
     23  */
     24 #include "../quickjs-libc.h"
     25 #include "../cutils.h"
     26 
     27 static JSValue js_bjson_read(JSContext *ctx, JSValueConst this_val,
     28                              int argc, JSValueConst *argv)
     29 {
     30     uint8_t *buf;
     31     uint64_t pos, len;
     32     JSValue obj;
     33     size_t size;
     34     int flags;
     35 
     36     if (JS_ToIndex(ctx, &pos, argv[1]))
     37         return JS_EXCEPTION;
     38     if (JS_ToIndex(ctx, &len, argv[2]))
     39         return JS_EXCEPTION;
     40     buf = JS_GetArrayBuffer(ctx, &size, argv[0]);
     41     if (!buf)
     42         return JS_EXCEPTION;
     43     if (pos + len > size)
     44         return JS_ThrowRangeError(ctx, "array buffer overflow");
     45     flags = 0;
     46     if (JS_ToBool(ctx, argv[3]))
     47         flags |= JS_READ_OBJ_REFERENCE;
     48     obj = JS_ReadObject(ctx, buf + pos, len, flags);
     49     return obj;
     50 }
     51 
     52 static JSValue js_bjson_write(JSContext *ctx, JSValueConst this_val,
     53                               int argc, JSValueConst *argv)
     54 {
     55     size_t len;
     56     uint8_t *buf;
     57     JSValue array;
     58     int flags;
     59 
     60     flags = 0;
     61     if (JS_ToBool(ctx, argv[1]))
     62         flags |= JS_WRITE_OBJ_REFERENCE;
     63     buf = JS_WriteObject(ctx, &len, argv[0], flags);
     64     if (!buf)
     65         return JS_EXCEPTION;
     66     array = JS_NewArrayBufferCopy(ctx, buf, len);
     67     js_free(ctx, buf);
     68     return array;
     69 }
     70 
     71 static const JSCFunctionListEntry js_bjson_funcs[] = {
     72     JS_CFUNC_DEF("read", 4, js_bjson_read ),
     73     JS_CFUNC_DEF("write", 2, js_bjson_write ),
     74 };
     75 
     76 static int js_bjson_init(JSContext *ctx, JSModuleDef *m)
     77 {
     78     return JS_SetModuleExportList(ctx, m, js_bjson_funcs,
     79                                   countof(js_bjson_funcs));
     80 }
     81 
     82 #ifdef JS_SHARED_LIBRARY
     83 #define JS_INIT_MODULE js_init_module
     84 #else
     85 #define JS_INIT_MODULE js_init_module_bjson
     86 #endif
     87 
     88 JSModuleDef *JS_INIT_MODULE(JSContext *ctx, const char *module_name)
     89 {
     90     JSModuleDef *m;
     91     m = JS_NewCModule(ctx, module_name, js_bjson_init);
     92     if (!m)
     93         return NULL;
     94     JS_AddModuleExportList(ctx, m, js_bjson_funcs, countof(js_bjson_funcs));
     95     return m;
     96 }