MCPcopy Create free account
hub / github.com/DeusData/codebase-memory-mcp / agent_json_find_member

Function agent_json_find_member

src/cli/agent_clients.c:915–979  ·  view source on GitHub ↗

Returns 0 found, 1 absent, -1 malformed/ambiguous/not-an-object. */

Source from the content-addressed store, hash-verified

913
914/* Returns 0 found, 1 absent, -1 malformed/ambiguous/not-an-object. */
915static int agent_json_find_member(const char *data, size_t object_start, size_t object_end,
916 const char *key, size_t *value_start, size_t *value_end) {
917 agent_json_scanner_t scanner = {.data = data, .length = object_end, .position = object_start};
918 if (agent_json_skip_space(&scanner) != 0 || scanner.position >= object_end ||
919 scanner.data[scanner.position++] != '{' || agent_json_skip_space(&scanner) != 0) {
920 return -1;
921 }
922 bool found = false;
923 if (scanner.position < object_end && scanner.data[scanner.position] == '}') {
924 return 1;
925 }
926 for (;;) {
927 size_t key_start = 0U;
928 size_t key_end = 0U;
929 if (scanner.position >= object_end) {
930 return -1;
931 }
932 if (scanner.data[scanner.position] == '"' || scanner.data[scanner.position] == '\'') {
933 if (agent_json_scan_string(&scanner, &key_start, &key_end) != 0) {
934 return -1;
935 }
936 } else {
937 key_start = scanner.position;
938 while (scanner.position < object_end &&
939 (isalnum((unsigned char)scanner.data[scanner.position]) ||
940 strchr("_$-", scanner.data[scanner.position]))) {
941 scanner.position++;
942 }
943 key_end = scanner.position;
944 if (key_end == key_start) {
945 return -1;
946 }
947 }
948 if (agent_json_skip_space(&scanner) != 0 || scanner.position >= object_end ||
949 scanner.data[scanner.position++] != ':' || agent_json_skip_space(&scanner) != 0) {
950 return -1;
951 }
952 size_t start = scanner.position;
953 if (agent_json_scan_value(&scanner, 1U) != 0) {
954 return -1;
955 }
956 size_t end = scanner.position;
957 if (agent_json_key_equals(data, key_start, key_end, key)) {
958 if (found) {
959 return -1;
960 }
961 found = true;
962 *value_start = start;
963 *value_end = end;
964 }
965 if (agent_json_skip_space(&scanner) != 0 || scanner.position >= object_end) {
966 return -1;
967 }
968 char separator = scanner.data[scanner.position++];
969 if (separator == '}') {
970 return found ? 0 : 1;
971 }
972 if (separator != ',' || agent_json_skip_space(&scanner) != 0) {

Callers 1

agent_json_find_entryFunction · 0.85

Calls 4

agent_json_skip_spaceFunction · 0.85
agent_json_scan_stringFunction · 0.85
agent_json_scan_valueFunction · 0.85
agent_json_key_equalsFunction · 0.85

Tested by

no test coverage detected