diff --git a/include/cyclone/runtime.h b/include/cyclone/runtime.h index 96b74023..3bc02de5 100644 --- a/include/cyclone/runtime.h +++ b/include/cyclone/runtime.h @@ -172,6 +172,7 @@ object Cyc_string2number2_(void *data, object cont, int argc, object str, ...); int binstr2int(const char *str); int octstr2int(const char *str); object Cyc_string_append(void *data, object cont, int argc, object str1, ...); +object Cyc_string_append2(void *data, object cont, int argc, object str1, object str2); object Cyc_string_length(void *data, object str); object Cyc_string_byte_length(void *data, object str); object Cyc_substring(void *data, object cont, object str, object start, diff --git a/runtime.c b/runtime.c index bc0ce84c..86fb5d60 100644 --- a/runtime.c +++ b/runtime.c @@ -2245,38 +2245,35 @@ object Cyc_string_append(void *data, object cont, int _argc, object str1, ...) Cyc_string_append_va_list(data, _argc); } -// TODO: -//object Cyc_string_append2(void *data, object cont, int _argc, object str1, object str2) -//{ -// int i = 0, total_cp = 0, total_len = 1; -// int *len = alloca(sizeof(int) * argc); -// char *buffer, *bufferp, **str = alloca(sizeof(char *) * argc); -// object tmp; -// if (argc > 0) { -// Cyc_check_str(data, str1); -// str[i] = ((string_type *)str1)->str; -// len[i] = string_len((str1)); -// total_len += len[i]; -// total_cp += string_num_cp((str1)); -// } -// for (i = 1; i < argc; i++) { -//TODO: tmp = va_arg(ap, object); -// Cyc_check_str(data, tmp); -// str[i] = ((string_type *)tmp)->str; -// len[i] = string_len((tmp)); -// total_len += len[i]; -// total_cp += string_num_cp((tmp)); -// } -// buffer = bufferp = alloca(sizeof(char) * total_len); -// for (i = 0; i < argc; i++) { -// memcpy(bufferp, str[i], len[i]); -// bufferp += len[i]; -// } -// *bufferp = '\0'; -// make_string(result, buffer); -// string_num_cp((&result)) = total_cp; -// _return_closcall1(data, cont, &result); -//} +object Cyc_string_append2(void *data, object cont, int _argc, object str1, object str2) +{ + int i = 0, total_cp = 0, total_len = 1; + int len[2]; + char *buffer, *bufferp, *str[2]; + + Cyc_check_str(data, str1); + Cyc_check_str(data, str2); + + str[0] = ((string_type *)str1)->str; + len[0] = string_len((str1)); + total_len += len[0]; + total_cp += string_num_cp((str1)); + + str[1] = ((string_type *)str2)->str; + len[1] = string_len((str2)); + total_len += len[1]; + total_cp += string_num_cp((str2)); + + buffer = bufferp = alloca(sizeof(char) * total_len); + for (i = 0; i < 2; i++) { + memcpy(bufferp, str[i], len[i]); + bufferp += len[i]; + } + *bufferp = '\0'; + make_string(result, buffer); + string_num_cp((&result)) = total_cp; + _return_closcall1(data, cont, &result); +} object Cyc_string_length(void *data, object str) {