Chinaunix首页 | 论坛 | 博客
  • 博客访问: 334382
  • 博文数量: 214
  • 博客积分: 4258
  • 博客等级: 上校
  • 技术积分: 2021
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-02 09:16
个人简介

http://blog.csdn.net/ly21st http://ly21st.blog.chinaunix.net

文章分类

全部博文(214)

文章存档

2018年(16)

2015年(1)

2014年(2)

2012年(22)

2011年(173)

分类: LINUX

2011-09-21 11:48:56

/* include readline */
#include "unp.h"
static int read_cnt;
static char *read_ptr;
static char read_buf[MAXLINE];
static ssize_t
my_read(int fd, char *ptr)
{
 if (read_cnt <= 0) {
again:
  if ( (read_cnt = read(fd, read_buf, sizeof(read_buf))) < 0) {
   if (errno == EINTR)
    goto again;
   return(-1);
  } else if (read_cnt == 0)
   return(0);
  read_ptr = read_buf;
 }
 read_cnt--;
 *ptr = *read_ptr++;
 return(1);
}
ssize_t
readline(int fd, void *vptr, size_t maxlen)
{
 ssize_t n, rc;
 char c, *ptr;
 ptr = vptr;
 for (n = 1; n < maxlen; n++) {
  if ( (rc = my_read(fd, &c)) == 1) {
   *ptr++ = c;
   if (c == '\n')
    break; /* newline is stored, like fgets() */
  } else if (rc == 0) {
   *ptr = 0;
   return(n - 1); /* EOF, n - 1 bytes were read */
  } else
   return(-1);  /* error, errno set by read() */
 }
 *ptr = 0; /* null terminate like fgets() */
 return(n);
}
ssize_t
readlinebuf(void **vptrptr)
{
 if (read_cnt)
  *vptrptr = read_ptr;
 return(read_cnt);
}
/* end readline */
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);
}
阅读(296) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~