UNP_2_Read Line Function

UNP Code

ssize_t Readline(int fd, void *ptr, size_t maxlen)
{
ssize_t n;

if ( (n = readline(fd, ptr, maxlen)) < 0)
err_sys("readline error"); // 套头函数,多了错误信息

return(n);
}


ssize_t readline(int fd, void *vptr, size_t maxlen)
{
int n, rc;
char c, *ptr;

ptr = vptr;
for (n = 1; n < maxlen; n++)
{
if ( (rc = my_read(fd, &c)) == 1) // my_read相当于一个数据池的作用
{ // readline只专注于行的逻辑关系
*ptr++ = c;
if (c == '\n') break; /* newline is stored, like fgets() */
}
else
{
if (rc == 0)
{
if (n == 1) return(0); /* EOF, no data read */
else break; /* EOF, some data was read */

} else return(-1); /* error, errno set by read() */
}
}

*ptr = 0; /* null terminate like fgets() */
return(n);
}


// static function
static ssize_t my_read(int fd, char *ptr)
{
static int read_cnt = 0;
static char *read_ptr;
static char read_buf[MAXLINE]; // 缓存池

if (read_cnt <= 0)
{
again:
// sizeof(read_buf) = 1 => read_cnt = 1,这里可以做缓存机制
if ( (read_cnt = read(fd, read_buf, sizeof(read_buf))) < 0)
{
if (errno == EINTR) // Interrupted system call
goto again;
return(-1); // 其它错误
}

if (read_cnt == 0)
return(0);

read_ptr = read_buf;
}

read_cnt--;
*ptr = *read_ptr++;
return(1);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值