add function fc_get_file_line_count_ex
parent
201daee3b6
commit
01b1841fda
3
HISTORY
3
HISTORY
|
|
@ -1,5 +1,5 @@
|
||||||
|
|
||||||
Version 1.44 2020-03-30
|
Version 1.44 2020-03-31
|
||||||
* add test file src/tests/test_pthread_lock.c
|
* add test file src/tests/test_pthread_lock.c
|
||||||
* add uniq_skiplist.[hc]
|
* add uniq_skiplist.[hc]
|
||||||
* add function split_string_ex
|
* add function split_string_ex
|
||||||
|
|
@ -24,6 +24,7 @@ Version 1.44 2020-03-30
|
||||||
* add function common_blocked_queue_return_nodes
|
* add function common_blocked_queue_return_nodes
|
||||||
* add functions getIpAndPort and getPeerIpAndPort
|
* add functions getIpAndPort and getPeerIpAndPort
|
||||||
* bugfixed: call fast_mblock_destroy in common_blocked_queue_destroy
|
* bugfixed: call fast_mblock_destroy in common_blocked_queue_destroy
|
||||||
|
* add function fc_get_file_line_count_ex
|
||||||
|
|
||||||
Version 1.43 2019-12-25
|
Version 1.43 2019-12-25
|
||||||
* replace function call system to getExecResult,
|
* replace function call system to getExecResult,
|
||||||
|
|
|
||||||
|
|
@ -693,6 +693,64 @@ int getOccurCount(const char *src, const char seperator)
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int fc_get_file_line_count_ex(const char *filename,
|
||||||
|
const int64_t until_offset, int64_t *line_count)
|
||||||
|
{
|
||||||
|
#define READ_BUFFER_SIZE (256 * 1024)
|
||||||
|
int fd;
|
||||||
|
int result;
|
||||||
|
int read_bytes;
|
||||||
|
int64_t remain_bytes;
|
||||||
|
char *buff;
|
||||||
|
|
||||||
|
*line_count = 0;
|
||||||
|
buff = (char *)malloc(READ_BUFFER_SIZE);
|
||||||
|
if (buff == NULL) {
|
||||||
|
logError("file: "__FILE__", line: %d, "
|
||||||
|
"malloc %d bytes fail",
|
||||||
|
__LINE__, READ_BUFFER_SIZE);
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
fd = open(filename, O_RDONLY);
|
||||||
|
if (fd < 0) {
|
||||||
|
result = errno != 0 ? errno : EACCES;
|
||||||
|
logError("file: "__FILE__", line: %d, "
|
||||||
|
"open file \"%s\" fail, errno: %d, error info: %s",
|
||||||
|
__LINE__, filename, result, STRERROR(result));
|
||||||
|
free(buff);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (until_offset >= 0) {
|
||||||
|
remain_bytes = until_offset;
|
||||||
|
} else {
|
||||||
|
remain_bytes = lseek(fd, 0, SEEK_END);
|
||||||
|
}
|
||||||
|
while (remain_bytes > 0) {
|
||||||
|
read_bytes = remain_bytes >= READ_BUFFER_SIZE ?
|
||||||
|
(READ_BUFFER_SIZE - 1) : remain_bytes;
|
||||||
|
read_bytes = read(fd, buff, read_bytes);
|
||||||
|
if (read_bytes == 0) {
|
||||||
|
break;
|
||||||
|
} else if (read_bytes < 0) {
|
||||||
|
result = errno != 0 ? errno : EIO;
|
||||||
|
logError("file: "__FILE__", line: %d, "
|
||||||
|
"read file \"%s\" fail, errno: %d, error info: %s",
|
||||||
|
__LINE__, filename, result, STRERROR(result));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
*(buff + read_bytes) = '\0';
|
||||||
|
*line_count += getOccurCount(buff, '\n');
|
||||||
|
remain_bytes -= read_bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
free(buff);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
char **split(char *src, const char seperator, const int nMaxCols, int *nColCount)
|
char **split(char *src, const char seperator, const int nMaxCols, int *nColCount)
|
||||||
{
|
{
|
||||||
char **pCols;
|
char **pCols;
|
||||||
|
|
|
||||||
|
|
@ -362,6 +362,24 @@ char *urldecode_ex(const char *src, const int src_len, char *dest, int *dest_len
|
||||||
*/
|
*/
|
||||||
int getOccurCount(const char *src, const char seperator);
|
int getOccurCount(const char *src, const char seperator);
|
||||||
|
|
||||||
|
|
||||||
|
/** get the file line count
|
||||||
|
* parameters:
|
||||||
|
* filename: the filename
|
||||||
|
* until_offset: util the file offset, -1 for file end
|
||||||
|
* line_count: store the line count
|
||||||
|
* return: error no, 0 success, != 0 fail
|
||||||
|
*/
|
||||||
|
int fc_get_file_line_count_ex(const char *filename,
|
||||||
|
const int64_t until_offset, int64_t *line_count);
|
||||||
|
|
||||||
|
static inline int fc_get_file_line_count(const char *filename,
|
||||||
|
int64_t *line_count)
|
||||||
|
{
|
||||||
|
const int64_t until_offset = -1;
|
||||||
|
return fc_get_file_line_count_ex(filename, until_offset, line_count);
|
||||||
|
}
|
||||||
|
|
||||||
/** split string
|
/** split string
|
||||||
* parameters:
|
* parameters:
|
||||||
* src: the source string, will be modified by this function
|
* src: the source string, will be modified by this function
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue