improve tk_istream_read_line

This commit is contained in:
lixianjing 2022-04-19 07:37:00 +08:00
parent 2f44ca1771
commit bc2bd979d7
4 changed files with 35 additions and 4 deletions

View File

@ -1,4 +1,7 @@
# 最新动态
2022/04/19
* 完善tk\_istream\_read\_line
2022/04/18
* 增加函数path\_app\_root\_ex
* 完善ui\_loader\_load对xml的支持。

View File

@ -144,10 +144,10 @@ int32_t tk_istream_read_line(tk_istream_t* stream, void* buff, uint32_t max_size
uint32_t end = 0;
int32_t offset = 0;
int32_t read_bytes = 0;
int32_t remain_bytes = max_size;
uint8_t* p = (uint8_t*)buff;
int32_t remain_bytes = max_size - 1;
return_value_if_fail(stream != NULL && stream->read != NULL, -1);
return_value_if_fail(buff != NULL, 0);
return_value_if_fail(buff != NULL && max_size > 1, 0);
start = time_now_ms();
end = start + timeout_ms;
@ -157,6 +157,8 @@ int32_t tk_istream_read_line(tk_istream_t* stream, void* buff, uint32_t max_size
if (read_bytes < 0) {
break;
} else if (read_bytes == 0 && tk_istream_eos(stream)) {
break;
}
offset += read_bytes;
@ -165,11 +167,14 @@ int32_t tk_istream_read_line(tk_istream_t* stream, void* buff, uint32_t max_size
break;
}
if (p[offset] == '\n') {
if (offset > 0 && p[offset - 1] == '\n') {
break;
}
} while (remain_bytes > 0);
p[offset] = '\0';
return offset;
}

View File

@ -168,6 +168,7 @@ int32_t tk_istream_read_line(tk_istream_t* stream, void* buff, uint32_t max_size
* @method tk_istream_read_line_str
*
*
* >istream必须支持随机读写(seek/tell)
*
* @param {tk_istream_t*} stream istream对象
* @param {str_t*} str str对象

View File

@ -79,7 +79,7 @@ TEST(IStreamMem, seek) {
tk_object_unref(TK_OBJECT(is));
}
TEST(IStreamMem, read_line) {
TEST(IStreamMem, read_line_str) {
str_t str;
const char* content = "1111\n2222\r\n\r\n3333\n";
tk_istream_t* is = tk_istream_mem_create((uint8_t*)content, strlen(content), 4, FALSE);
@ -102,3 +102,25 @@ TEST(IStreamMem, read_line) {
str_reset(&str);
tk_object_unref(TK_OBJECT(is));
}
TEST(IStreamMem, read_line) {
char str[128];
const char* content = "1111\n2222\r\n\r\n3333\n";
tk_istream_t* is = tk_istream_mem_create((uint8_t*)content, strlen(content), 4, FALSE);
uint32_t timeout = 100000000;
ASSERT_EQ(tk_istream_read_line(is, str, sizeof(str) - 1, timeout), 5);
ASSERT_STREQ(str, "1111\n");
ASSERT_EQ(tk_istream_read_line(is, str, sizeof(str) - 1, timeout), 6);
ASSERT_STREQ(str, "2222\r\n");
ASSERT_EQ(tk_istream_read_line(is, str, sizeof(str) - 1, timeout), 2);
ASSERT_STREQ(str, "\r\n");
ASSERT_EQ(tk_istream_read_line(is, str, sizeof(str) - 1, timeout), 5);
ASSERT_STREQ(str, "3333\n");
ASSERT_EQ(tk_istream_read_line(is, str, sizeof(str) - 1, timeout), 0);
tk_object_unref(TK_OBJECT(is));
}