#include #include "types.h" #include "string_utils.h" #include "interpreter.h" int is_string_ptr(long val) { if (val < 0) { return 0; } if (val > MEM_SIZE * 8) { return 1; } return 0; } long concat_strings(long ptr1, long ptr2) { static char empty_str[] = ""; char *s1 = (char*)ptr1; char *s2 = (char*)ptr2; if (!s1 || !s2) { return (long)empty_str; } if (str_pool_idx >= STR_POOL_SIZE) { error("String pool overflow"); return (long)empty_str; } char *result = &str_pool[str_pool_idx]; int len1 = strlen(s1); int len2 = strlen(s2); if (str_pool_idx + len1 + len2 + 1 >= STR_POOL_SIZE) { error("String pool overflow"); return (long)empty_str; } strcpy(result, s1); strcat(result, s2); str_pool_idx += len1 + len2 + 1; return (long)result; } long slice_string(long str_ptr, int start, int end) { static char empty_str[] = ""; char *str = (char*)str_ptr; if (!str) { return (long)empty_str; } if (str_pool_idx >= STR_POOL_SIZE) { error("String pool overflow"); return (long)empty_str; } char *result = &str_pool[str_pool_idx]; int str_len = strlen(str); if (start < 0) start = 0; if (end < 0) end = str_len; if (end > str_len) end = str_len; if (start > end) start = end; if (start > str_len) start = str_len; int length = end - start; if (length < 0) length = 0; if (str_pool_idx + length + 1 >= STR_POOL_SIZE) { error("String pool overflow"); return (long)empty_str; } if (length > 0 && start < str_len) { strncpy(result, str + start, length); } result[length] = 0; str_pool_idx += length + 1; return (long)result; }