Skip to content

Commit 0081eef

Browse files
Update jellyfish.c
1 parent aea46f6 commit 0081eef

File tree

1 file changed

+89
-0
lines changed

1 file changed

+89
-0
lines changed

code/logic/jellyfish.c

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,95 @@
1919
#include <ctype.h>
2020
#include <time.h>
2121

22+
23+
// Parses a string like: "key": "value"
24+
static bool match_key_value(const char **ptr, const char *key, const char *value) {
25+
const char *p = *ptr;
26+
while (isspace(*p)) p++;
27+
size_t klen = strlen(key);
28+
if (strncmp(p, "\"", 1) != 0 || strncmp(p + 1, key, klen) != 0 || strncmp(p + 1 + klen, "\":", 2) != 0)
29+
return false;
30+
p += klen + 3;
31+
while (isspace(*p)) p++;
32+
size_t vlen = strlen(value);
33+
if (strncmp(p, "\"", 1) != 0 || strncmp(p + 1, value, vlen) != 0 || strncmp(p + 1 + vlen, "\"", 1) != 0)
34+
return false;
35+
*ptr = p + vlen + 2;
36+
return true;
37+
}
38+
39+
static bool skip_key(const char **ptr, const char *key) {
40+
const char *p = *ptr;
41+
while (isspace(*p)) p++;
42+
size_t klen = strlen(key);
43+
if (strncmp(p, "\"", 1) != 0 || strncmp(p + 1, key, klen) != 0 || strncmp(p + 1 + klen, "\":", 2) != 0)
44+
return false;
45+
*ptr = p + klen + 3;
46+
return true;
47+
}
48+
49+
static bool skip_symbol(const char **ptr, char symbol) {
50+
const char *p = *ptr;
51+
while (isspace(*p)) p++;
52+
if (*p != symbol)
53+
return false;
54+
*ptr = p + 1;
55+
return true;
56+
}
57+
58+
static bool skip_comma(const char **ptr) {
59+
const char *p = *ptr;
60+
while (isspace(*p)) p++;
61+
if (*p == ',') {
62+
*ptr = p + 1;
63+
return true;
64+
}
65+
return false;
66+
}
67+
68+
static bool parse_string_field(const char **ptr, const char *key, char *out, size_t max) {
69+
if (!skip_key(ptr, key)) return false;
70+
if (!skip_symbol(ptr, '"')) return false;
71+
72+
const char *p = *ptr;
73+
size_t i = 0;
74+
75+
while (*p && *p != '"' && i < max - 1) {
76+
if (*p == '\\' && *(p + 1)) p++; // skip escape
77+
out[i++] = *p++;
78+
}
79+
80+
if (*p != '"') return false;
81+
out[i] = '\0';
82+
*ptr = p + 1;
83+
return true;
84+
}
85+
86+
static bool parse_number_field(const char **ptr, const char *key, double *out_d, uint64_t *out_u64, int *out_i, uint32_t *out_u32) {
87+
if (!skip_key(ptr, key)) return false;
88+
89+
char *end;
90+
const char *p = *ptr;
91+
92+
while (isspace(*p)) p++;
93+
94+
if (out_d) {
95+
*out_d = strtod(p, &end);
96+
} else if (out_u64) {
97+
*out_u64 = strtoull(p, &end, 10);
98+
} else if (out_i) {
99+
*out_i = strtol(p, &end, 10);
100+
} else if (out_u32) {
101+
*out_u32 = strtoul(p, &end, 10);
102+
} else {
103+
return false;
104+
}
105+
106+
if (end == p) return false;
107+
*ptr = end;
108+
return true;
109+
}
110+
22111
void fossil_jellyfish_hash(const char *input, const char *output, uint8_t *hash_out) {
23112
const uint32_t FNV_PRIME = 0x01000193;
24113
uint32_t hash = 0x811c9dc5;

0 commit comments

Comments
 (0)