| 2939 | return c == '\0' || isspace(uc) || strchr(",.()+-/*=~%[]{}<>:;!&|^?", c) != NULL; |
| 2940 | } |
| 2941 | |
| 2942 | static const char *agent_syntax_line_comment(const agent_syntax *syn, |
| 2943 | const char *p) { |
| 2944 | if (!syn) return NULL; |
| 2945 | for (int i = 0; i < 3 && syn->singleline_comments[i]; i++) { |
| 2946 | const char *m = syn->singleline_comments[i]; |
| 2947 | size_t mlen = strlen(m); |
| 2948 | if (mlen && !strncmp(p, m, mlen)) return m; |
| 2949 | } |
| 2950 | return NULL; |
| 2951 | } |
| 2952 | |
| 2953 | static int agent_syntax_color(int hl) { |
| 2954 | switch (hl) { |
| 2955 | case AGENT_HL_COMMENT: return 244; |
| 2956 | case AGENT_HL_KEYWORD1: return 214; |
| 2957 | case AGENT_HL_KEYWORD2: return 81; |
| 2958 | case AGENT_HL_STRING: return 150; |
| 2959 | case AGENT_HL_NUMBER: return 203; |
| 2960 | default: return 252; |
| 2961 | } |
| 2962 | } |
| 2963 | |
| 2964 | static void renderer_syntax_write(agent_token_renderer *r, int hl, |
| 2965 | const char *s, size_t n) { |
| 2966 | if (!n) return; |
| 2967 | if (hl != AGENT_HL_NORMAL) r->md_syntax_has_highlight = true; |
| 2968 | if (r->md_syntax_silent) return; |
| 2969 | if (r->use_color && hl != AGENT_HL_NORMAL) { |
| 2970 | char seq[32]; |
| 2971 | snprintf(seq, sizeof(seq), "\x1b[38;5;%dm", agent_syntax_color(hl)); |
| 2972 | renderer_write(r, seq, strlen(seq)); |
| 2973 | } |
| 2974 | renderer_write(r, s, n); |
| 2975 | if (r->use_color && hl != AGENT_HL_NORMAL) renderer_write(r, "\x1b[0m", 4); |
| 2976 | r->wrote_visible_output = true; |
| 2977 | r->last_output_newline = false; |
| 2978 | } |
| 2979 | |
| 2980 | static void renderer_syntax_write_upto_marker(agent_token_renderer *r) { |
| 2981 | static const char marker[] = "[upto]"; |
| 2982 | r->md_syntax_has_highlight = true; |
| 2983 | if (r->md_syntax_silent) return; |
| 2984 | if (r->use_color) { |
| 2985 | renderer_write(r, "\x1b[38;5;244m[", strlen("\x1b[38;5;244m[")); |
| 2986 | renderer_write(r, "\x1b[1;38;5;177mupto", |
| 2987 | strlen("\x1b[1;38;5;177mupto")); |
| 2988 | renderer_write(r, "\x1b[38;5;244m]\x1b[0m", |
| 2989 | strlen("\x1b[38;5;244m]\x1b[0m")); |
| 2990 | } else { |
no test coverage detected