feature: added currency conversion infobox
This commit is contained in:
139
src/Utility/JsonHelper.c
Normal file
139
src/Utility/JsonHelper.c
Normal file
@@ -0,0 +1,139 @@
|
||||
#include "JsonHelper.h"
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
static int is_whitespace_json(char c) {
|
||||
return c == ' ' || c == '\t' || c == '\n' || c == '\r';
|
||||
}
|
||||
|
||||
int json_parse_float_map(const char *json, const char *target_key,
|
||||
JsonFloatMap *result) {
|
||||
memset(result, 0, sizeof(JsonFloatMap));
|
||||
|
||||
if (!json || !target_key)
|
||||
return 0;
|
||||
|
||||
const char *obj_start = strchr(json, '{');
|
||||
if (!obj_start)
|
||||
return 0;
|
||||
|
||||
const char *rates_start = strstr(obj_start, target_key);
|
||||
if (!rates_start)
|
||||
return 0;
|
||||
|
||||
rates_start = strchr(rates_start, '{');
|
||||
if (!rates_start)
|
||||
return 0;
|
||||
|
||||
const char *p = rates_start + 1;
|
||||
while (*p && *p != '}') {
|
||||
while (*p && (*p == ' ' || *p == '\n' || *p == '\t' || *p == ','))
|
||||
p++;
|
||||
|
||||
if (*p == '}')
|
||||
break;
|
||||
|
||||
if (*p != '"')
|
||||
break;
|
||||
p++;
|
||||
|
||||
char key[32] = {0};
|
||||
size_t key_len = 0;
|
||||
while (*p && *p != '"' && key_len < 31) {
|
||||
key[key_len++] = *p++;
|
||||
}
|
||||
if (*p != '"')
|
||||
break;
|
||||
p++;
|
||||
|
||||
while (*p && *p != ':')
|
||||
p++;
|
||||
if (*p != ':')
|
||||
break;
|
||||
p++;
|
||||
|
||||
while (*p && is_whitespace_json(*p))
|
||||
p++;
|
||||
|
||||
double value = 0;
|
||||
int has_digit = 0;
|
||||
while (*p >= '0' && *p <= '9') {
|
||||
value = value * 10 + (*p - '0');
|
||||
has_digit = 1;
|
||||
p++;
|
||||
}
|
||||
if (*p == '.') {
|
||||
p++;
|
||||
double frac = 0.1;
|
||||
while (*p >= '0' && *p <= '9') {
|
||||
value += (*p - '0') * frac;
|
||||
frac *= 0.1;
|
||||
has_digit = 1;
|
||||
p++;
|
||||
}
|
||||
}
|
||||
|
||||
if (has_digit && key_len > 0) {
|
||||
memcpy(result->keys[result->count], key, key_len);
|
||||
result->keys[result->count][key_len] = '\0';
|
||||
result->values[result->count] = value;
|
||||
result->count++;
|
||||
if (result->count >= 256)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return result->count > 0;
|
||||
}
|
||||
|
||||
double json_get_float(const char *json, const char *key) {
|
||||
if (!json || !key)
|
||||
return 0;
|
||||
|
||||
const char *key_pos = strstr(json, key);
|
||||
if (!key_pos)
|
||||
return 0;
|
||||
|
||||
const char *colon = strchr(key_pos, ':');
|
||||
if (!colon)
|
||||
return 0;
|
||||
|
||||
colon++;
|
||||
while (*colon && is_whitespace_json(*colon))
|
||||
colon++;
|
||||
|
||||
return strtod(colon, NULL);
|
||||
}
|
||||
|
||||
char *json_get_string(const char *json, const char *key) {
|
||||
if (!json || !key)
|
||||
return NULL;
|
||||
|
||||
static char buffer[256];
|
||||
|
||||
const char *key_pos = strstr(json, key);
|
||||
if (!key_pos)
|
||||
return NULL;
|
||||
|
||||
const char *colon = strchr(key_pos, ':');
|
||||
if (!colon)
|
||||
return NULL;
|
||||
|
||||
colon++;
|
||||
while (*colon && is_whitespace_json(*colon))
|
||||
colon++;
|
||||
|
||||
if (*colon != '"')
|
||||
return NULL;
|
||||
colon++;
|
||||
|
||||
size_t len = 0;
|
||||
while (*colon && *colon != '"' && len < 255) {
|
||||
buffer[len++] = *colon++;
|
||||
}
|
||||
buffer[len] = '\0';
|
||||
|
||||
return buffer;
|
||||
}
|
||||
17
src/Utility/JsonHelper.h
Normal file
17
src/Utility/JsonHelper.h
Normal file
@@ -0,0 +1,17 @@
|
||||
#ifndef JSONHELPER_H
|
||||
#define JSONHELPER_H
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
typedef struct {
|
||||
double values[256];
|
||||
char keys[256][32];
|
||||
size_t count;
|
||||
} JsonFloatMap;
|
||||
|
||||
int json_parse_float_map(const char *json, const char *target_key,
|
||||
JsonFloatMap *result);
|
||||
double json_get_float(const char *json, const char *key);
|
||||
char *json_get_string(const char *json, const char *key);
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user