1 /*
2 * Copyright 2017, Andrew Lindesay <apl@lindesay.co.nz>
3 * Distributed under the terms of the MIT License.
4 */
5
6
7 #include "JsonEvent.h"
8
9 #include <stdlib.h>
10 #include <stdio.h>
11
12 #include <String.h>
13
14
BJsonEvent(json_event_type eventType,const char * content)15 BJsonEvent::BJsonEvent(json_event_type eventType, const char* content)
16 :
17 fEventType(eventType),
18 fContent(content),
19 fOwnedContent(NULL)
20 {
21 }
22
23
BJsonEvent(const char * content)24 BJsonEvent::BJsonEvent(const char* content)
25 :
26 fEventType(B_JSON_STRING),
27 fContent(content),
28 fOwnedContent(NULL)
29 {
30 }
31
32
BJsonEvent(double content)33 BJsonEvent::BJsonEvent(double content) {
34 fEventType = B_JSON_NUMBER;
35 fContent = NULL;
36
37 int actualLength = snprintf(0, 0, "%f", content) + 1;
38 char* buffer = (char*) malloc(sizeof(char) * actualLength);
39
40 if (buffer == NULL) {
41 fprintf(stderr, "memory exhaustion\n");
42 // given the risk, this is the only sensible thing to do here.
43 exit(EXIT_FAILURE);
44 }
45
46 sprintf(buffer, "%f", content);
47 fOwnedContent = buffer;
48 }
49
50
BJsonEvent(int64 content)51 BJsonEvent::BJsonEvent(int64 content) {
52 fEventType = B_JSON_NUMBER;
53 fContent = NULL;
54 fOwnedContent = NULL;
55
56 static const char* zeroValue = "0";
57 static const char* oneValue = "1";
58
59 switch (content) {
60 case 0:
61 fContent = zeroValue;
62 break;
63 case 1:
64 fContent = oneValue;
65 break;
66 default:
67 {
68 int actualLength = snprintf(0, 0, "%" B_PRId64, content) + 1;
69 char* buffer = (char*) malloc(sizeof(char) * actualLength);
70
71 if (buffer == NULL) {
72 fprintf(stderr, "memory exhaustion\n");
73 // given the risk, this is the only sensible thing to do
74 // here.
75 exit(EXIT_FAILURE);
76 }
77
78 sprintf(buffer, "%" B_PRId64, content);
79 fOwnedContent = buffer;
80 break;
81 }
82 }
83 }
84
85
BJsonEvent(json_event_type eventType)86 BJsonEvent::BJsonEvent(json_event_type eventType)
87 :
88 fEventType(eventType),
89 fContent(NULL),
90 fOwnedContent(NULL)
91 {
92 }
93
94
~BJsonEvent()95 BJsonEvent::~BJsonEvent()
96 {
97 if (NULL != fOwnedContent)
98 free(fOwnedContent);
99 }
100
101
102 json_event_type
EventType() const103 BJsonEvent::EventType() const
104 {
105 return fEventType;
106 }
107
108
109 const char*
Content() const110 BJsonEvent::Content() const
111 {
112 if (NULL != fOwnedContent)
113 return fOwnedContent;
114 return fContent;
115 }
116
117
118 double
ContentDouble() const119 BJsonEvent::ContentDouble() const
120 {
121 return strtod(Content(), NULL);
122 }
123
124
125 int64
ContentInteger() const126 BJsonEvent::ContentInteger() const
127 {
128 return strtoll(Content(), NULL, 10);
129 }
130