diff options
| author | tanaka takashi <isazaka@gmail.com> | 2026-06-29 21:43:54 +0900 |
|---|---|---|
| committer | tanaka takashi <isazaka@gmail.com> | 2026-06-30 01:23:51 +0900 |
| commit | 4bc721c3bf7589b519c5730d093f704ce56e3f09 (patch) | |
| tree | 38da055ab15fd70f5c92584560ea73486e5ddce0 /src/mcp/json.c | |
| parent | 4c6a831aa2a57e2bcc20aa3fc2f1b7172f5be285 (diff) | |
refactor: MCP層をmcpc APIベースに刷新
- 独自JSON-RPC処理をmcpcへ置き換え
- 各MCPツールを個別ソースへ分離
- 共通コンテキストと登録処理を整理
- mcpc互換修正と統合テストを更新
Diffstat (limited to 'src/mcp/json.c')
| -rw-r--r-- | src/mcp/json.c | 61 |
1 files changed, 49 insertions, 12 deletions
diff --git a/src/mcp/json.c b/src/mcp/json.c index dcef91b..62f31c9 100644 --- a/src/mcp/json.c +++ b/src/mcp/json.c @@ -4,11 +4,17 @@ #include <stdlib.h> #include <string.h> +#include "base/allocator.h" + static bool reserve(tiny_json_buffer_t *buffer, size_t addition) { size_t needed, capacity; char *resized; + if (buffer == NULL) + { + return false; + } if (buffer->failed || addition > SIZE_MAX - buffer->length - 1) { return false; @@ -42,11 +48,18 @@ reserve(tiny_json_buffer_t *buffer, size_t addition) void tiny_json_init(tiny_json_buffer_t *buffer) { - memset(buffer, 0, sizeof(*buffer)); + if (buffer != NULL) + { + memset(buffer, 0, sizeof(*buffer)); + } } void tiny_json_free(tiny_json_buffer_t *buffer) { + if (buffer == NULL) + { + return; + } free(buffer->data); tiny_json_init(buffer); } @@ -54,7 +67,7 @@ tiny_json_free(tiny_json_buffer_t *buffer) bool tiny_json_raw_n(tiny_json_buffer_t *buffer, const char *value, size_t length) { - if (!reserve(buffer, length)) + if ((value == NULL && length != 0) || !reserve(buffer, length)) { return false; } @@ -66,14 +79,14 @@ tiny_json_raw_n(tiny_json_buffer_t *buffer, const char *value, size_t length) bool tiny_json_raw(tiny_json_buffer_t *buffer, const char *value) { - return tiny_json_raw_n(buffer, value, strlen(value)); + return value != NULL && tiny_json_raw_n(buffer, value, strlen(value)); } bool tiny_json_string(tiny_json_buffer_t *buffer, const char *value) { const unsigned char *position = (const unsigned char *)value; - if (!tiny_json_raw(buffer, "\"")) + if (value == NULL || !tiny_json_raw(buffer, "\"")) { return false; } @@ -85,36 +98,60 @@ tiny_json_string(tiny_json_buffer_t *buffer, const char *value) escaped[0] = '\\'; escaped[1] = (char)*position; escaped[2] = '\0'; - tiny_json_raw(buffer, escaped); + if (!tiny_json_raw(buffer, escaped)) + { + return false; + } } else if (*position == '\b') { - tiny_json_raw(buffer, "\\b"); + if (!tiny_json_raw(buffer, "\\b")) + { + return false; + } } else if (*position == '\f') { - tiny_json_raw(buffer, "\\f"); + if (!tiny_json_raw(buffer, "\\f")) + { + return false; + } } else if (*position == '\n') { - tiny_json_raw(buffer, "\\n"); + if (!tiny_json_raw(buffer, "\\n")) + { + return false; + } } else if (*position == '\r') { - tiny_json_raw(buffer, "\\r"); + if (!tiny_json_raw(buffer, "\\r")) + { + return false; + } } else if (*position == '\t') { - tiny_json_raw(buffer, "\\t"); + if (!tiny_json_raw(buffer, "\\t")) + { + return false; + } } else if (*position < 0x20) { snprintf(escaped, sizeof(escaped), "\\u%04x", *position); - tiny_json_raw(buffer, escaped); + if (!tiny_json_raw(buffer, escaped)) + { + return false; + } } else { - tiny_json_raw_n(buffer, (const char *)position, 1); + if (!tiny_json_raw_n(buffer, (const char *)position, 1)) + { + return false; + } } ++position; } |
