1 /* 2 * Copyright (c) 2009-2016 Petri Lehtinen <petri@digip.org> 3 * 4 * Jansson is free software; you can redistribute it and/or modify 5 * it under the terms of the MIT license. See LICENSE for details. 6 */ 7 /** 8 * License: MIT 9 */ 10 module jansson_d.jansson_private; 11 12 13 package: 14 15 private static import core.stdc.stdarg; 16 private static import core.stdc.stdio; 17 private static import core.stdc.string; 18 private static import core.stdcpp.xutility; 19 private static import jansson_d.error; 20 private static import jansson_d.hashtable; 21 private static import jansson_d.jansson; 22 private static import jansson_d.memory; 23 private static import jansson_d.strconv; 24 private static import jansson_d.value; 25 26 package template container_of(string ptr_, string type_, string member_) 27 { 28 enum container_of = "(cast(" ~ type_ ~ "*)(cast(char*)(" ~ ptr_ ~ ") - " ~ type_ ~ "." ~ member_ ~ ".offsetof))"; 29 } 30 31 /* On some platforms, max() may already be defined */ 32 package template max(string a, string b) 33 { 34 enum max = "(( " ~ a ~ ") > (" ~ b ~ ") ? (" ~ a ~ ") : (" ~ b ~ "))"; 35 } 36 37 /* 38 * va_copy is a C99 feature. In C89 implementations, it's sometimes 39 * available as __va_copy. If not, memcpy() should do the trick. 40 */ 41 static if (__traits(compiles, core.stdc.stdarg.va_copy)) { 42 alias va_copy = core.stdc.stdarg.va_copy; 43 } else { 44 void va_copy(A, B)(A a, B b) 45 46 do 47 { 48 core.stdc..string.memcpy(&a, &b, core.stdc.stdarg.va_list.sizeof); 49 } 50 } 51 52 struct json_object_t 53 { 54 jansson_d.jansson.json_t json; 55 jansson_d.hashtable.hashtable_t hashtable; 56 } 57 58 struct json_array_t 59 { 60 jansson_d.jansson.json_t json; 61 size_t size; 62 size_t entries; 63 jansson_d.jansson.json_t** table; 64 } 65 66 struct json_string_t 67 { 68 jansson_d.jansson.json_t json; 69 char* value; 70 size_t length_; 71 72 @disable 73 alias length = length_; 74 } 75 76 struct json_real_t 77 { 78 jansson_d.jansson.json_t json; 79 double value = 0; 80 } 81 82 struct json_integer_t 83 { 84 jansson_d.jansson.json_t json; 85 jansson_d.jansson.json_int_t value; 86 } 87 88 template json_to_object(string json_) 89 { 90 enum json_to_object = "mixin (jansson_d.jansson_private.container_of!(\"" ~ json_ ~ "\", \"jansson_d.jansson_private.json_object_t\", \"json\"))"; 91 } 92 93 template json_to_array(string json_) 94 { 95 enum json_to_array = "mixin (jansson_d.jansson_private.container_of!(\"" ~ json_ ~ "\", \"jansson_d.jansson_private.json_array_t\", \"json\"))"; 96 } 97 98 template json_to_string(string json_) 99 { 100 enum json_to_string = "mixin (jansson_d.jansson_private.container_of!(\"" ~ json_ ~ "\", \"jansson_d.jansson_private.json_string_t\", \"json\"))"; 101 } 102 103 template json_to_real(string json_) 104 { 105 enum json_to_real = "mixin (jansson_d.jansson_private.container_of!(\"" ~ json_ ~ "\", \"jansson_d.jansson_private.json_real_t\", \"json\"))"; 106 } 107 108 template json_to_integer(string json_) 109 { 110 enum json_to_integer = "mixin (jansson_d.jansson_private.container_of!(\"" ~ json_ ~ "\", \"jansson_d.jansson_private.json_integer_t\", \"json\"))"; 111 } 112 113 /* Create a string by taking ownership of an existing buffer */ 114 alias jsonp_stringn_nocheck_own = jansson_d.value.jsonp_stringn_nocheck_own; 115 116 /* Error message formatting */ 117 alias jsonp_error_init = jansson_d.error.jsonp_error_init; 118 alias jsonp_error_set_source = jansson_d.error.jsonp_error_set_source; 119 alias jsonp_error_set = jansson_d.error.jsonp_error_set; 120 alias jsonp_error_vset = jansson_d.error.jsonp_error_vset; 121 122 /* Locale independent string<.double conversions */ 123 alias jsonp_strtod = jansson_d.strconv.jsonp_strtod; 124 alias jsonp_dtostr = jansson_d.strconv.jsonp_dtostr; 125 126 /* Wrappers for custom memory functions */ 127 public alias jsonp_malloc = jansson_d.memory.jsonp_malloc; 128 public alias jsonp_free = jansson_d.memory.jsonp_free; 129 130 alias jsonp_strndup = jansson_d.memory.jsonp_strndup; 131 132 alias jsonp_strdup = jansson_d.memory.jsonp_strdup; 133 134 /* Circular reference check*/ 135 /* Space for "0x", double the sizeof a pointer for the hex and a terminator. */ 136 enum LOOP_KEY_LEN = 2 + ((jansson_d.jansson.json_t*).sizeof * 2) + 1; 137 alias jsonp_loop_check = jansson_d.value.jsonp_loop_check; 138 139 /* Windows compatibility */ 140 version (Windows) { 141 static if (__traits(compiles, core.stdcpp.xutility._MSC_VER)) { 142 /* MS compiller */ 143 144 static if ((core.stdcpp.xutility._MSC_VER < 1900) && (!__traits(compiles, core.stdc.stdio.snprintf))) { 145 alias snprintf = core.stdc.stdio._snprintf; 146 } else { 147 alias snprintf = core.stdc.stdio.snprintf; 148 } 149 150 static if ((core.stdcpp.xutility._MSC_VER < 1500) && (!__traits(compiles, core.stdc.stdio.vsnprintf))) { 151 alias vsnprintf = core.stdc.stdio._vsnprintf; 152 } else { 153 alias vsnprintf = core.stdc.stdio.vsnprintf; 154 } 155 } else { 156 /* Other Windows compiller, old definition */ 157 alias snprintf = core.stdc.stdio._snprintf; 158 alias vsnprintf = core.stdc.stdio._vsnprintf; 159 } 160 } else { 161 alias snprintf = core.stdc.stdio.snprintf; 162 alias vsnprintf = core.stdc.stdio.vsnprintf; 163 } 164