mirror of
https://github.com/justinethier/cyclone.git
synced 2025-07-14 08:17:35 +02:00
Fixed substring
This commit is contained in:
parent
950d92615b
commit
509fd43022
2 changed files with 24 additions and 18 deletions
29
runtime.c
29
runtime.c
|
@ -2238,19 +2238,34 @@ object Cyc_substring(void *data, object cont, object str, object start,
|
||||||
const char *tmp = raw;
|
const char *tmp = raw;
|
||||||
char_type codepoint;
|
char_type codepoint;
|
||||||
uint32_t state = 0;
|
uint32_t state = 0;
|
||||||
int count, start_i = 0, end_i = 0;
|
int num_ch, cur_ch_bytes = 0, start_i = 0, end_i = 0;
|
||||||
|
for (num_ch = 0; *tmp; ++tmp){
|
||||||
for (count = 0; *tmp; ++tmp){
|
cur_ch_bytes++;
|
||||||
if (!Cyc_utf8_decode(&state, &codepoint, (uint8_t)*tmp)){
|
if (!Cyc_utf8_decode(&state, &codepoint, (uint8_t)*tmp)){
|
||||||
if (count == s) {
|
end_i += cur_ch_bytes;
|
||||||
|
num_ch += 1;
|
||||||
|
cur_ch_bytes = 0;
|
||||||
|
|
||||||
|
if (num_ch == s) {
|
||||||
start_i = end_i;
|
start_i = end_i;
|
||||||
} else if (count == e) {
|
}
|
||||||
|
if (num_ch == e) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
count += 1;
|
|
||||||
}
|
}
|
||||||
end_i++;
|
|
||||||
}
|
}
|
||||||
|
//int count, start_i = 0, end_i = 0;
|
||||||
|
//for (count = 0; *tmp; ++tmp){
|
||||||
|
// if (!Cyc_utf8_decode(&state, &codepoint, (uint8_t)*tmp)){
|
||||||
|
// if (count == s) {
|
||||||
|
// start_i = end_i;
|
||||||
|
// } else if (count == e) {
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// count += 1;
|
||||||
|
// }
|
||||||
|
// end_i++;
|
||||||
|
//}
|
||||||
if (state != CYC_UTF8_ACCEPT)
|
if (state != CYC_UTF8_ACCEPT)
|
||||||
Cyc_rt_raise2(data, "substring - invalid character in string", str);
|
Cyc_rt_raise2(data, "substring - invalid character in string", str);
|
||||||
make_utf8_string_with_len(sub, raw + start_i, end_i - start_i, e - s);
|
make_utf8_string_with_len(sub, raw + start_i, end_i - start_i, e - s);
|
||||||
|
|
13
test.c
13
test.c
|
@ -132,7 +132,7 @@ void substring(int s, int e, const char *expected) {
|
||||||
uint32_t state = 0;
|
uint32_t state = 0;
|
||||||
int num_ch, cur_ch_bytes = 0, start_i = 0, end_i = 0;
|
int num_ch, cur_ch_bytes = 0, start_i = 0, end_i = 0;
|
||||||
for (num_ch = 0; *tmp; ++tmp){
|
for (num_ch = 0; *tmp; ++tmp){
|
||||||
//printf("char = %d\n", (int)*tmp);
|
cur_ch_bytes++;
|
||||||
if (!Cyc_utf8_decode(&state, &codepoint, (uint8_t)*tmp)){
|
if (!Cyc_utf8_decode(&state, &codepoint, (uint8_t)*tmp)){
|
||||||
end_i += cur_ch_bytes;
|
end_i += cur_ch_bytes;
|
||||||
num_ch += 1;
|
num_ch += 1;
|
||||||
|
@ -144,18 +144,9 @@ void substring(int s, int e, const char *expected) {
|
||||||
if (num_ch == e) {
|
if (num_ch == e) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
//if (num_ch == s) {
|
|
||||||
// start_i = end_i;
|
|
||||||
//} else if (num_ch == (e - 1)) {
|
|
||||||
// end_i += cur_ch_bytes;
|
|
||||||
// if (s == e) start_i = end_i;
|
|
||||||
// break;
|
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
cur_ch_bytes++;
|
|
||||||
}
|
}
|
||||||
raw[end_i + 1] = '\0';
|
raw[end_i] = '\0';
|
||||||
printf("expected=%s, raw=%s, s=%d, e=%d, start_i=%d, end_i=%d\n", expected, raw + start_i, s, e, start_i, end_i);
|
printf("expected=%s, raw=%s, s=%d, e=%d, start_i=%d, end_i=%d\n", expected, raw + start_i, s, e, start_i, end_i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue