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