You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
echoping/SRC/readline.c

92 lines
1.8 KiB
C

/*
* Read a line from a descriptor.
*
* To save read() system calls, we first check the static buffer if it
* still contains data. If so, we send it back. Otherwise, we call
* read().
*
* If ln == 0, we treat newline as an ordinary charracter.
*
* $Id$
* */
#include "echoping.h"
char buffer[MAXTOREAD]; /* Must survive between calls to readline */
int
readline (fd, ptr, maxlen, ln)
int fd;
char *ptr;
int maxlen;
unsigned short ln;
{
char *origptr = ptr;
int n, i, j, rc;
char s[maxlen];
int bufend = strlen(buffer);
n = 0;
/* Use the buffer if it is still full */
for (i = 0; i < strlen(buffer); i++) {
*ptr++ = buffer[i];
n++;
if (buffer[i] == '\n' && ln == 1)
break;
}
if (n) {
/* printf ("DEBUG, got %d bytes from the buffer\n", i); */
strcpy (buffer, (char *)(buffer+i+1));
*ptr = 0;
return (n);
}
bufend = strlen (buffer);
reading:
for (; n < maxlen;)
{
if (timeout_flag)
return n;
if ((rc = read (fd, &s, maxlen)) > 0)
{
/* printf ("DEBUG, %d bytes asked (nl = %d) %d bytes read\n", maxlen, ln, rc); */
parsing:
for (i = 0; i < rc; i++) {
*ptr++ = s[i];
/* printf ("DEBUG, adding %c ", s[i]); */
n++;
if (s[i] == '\n' && ln == 1) {
for (j = i+1; j < rc; j++) {
buffer[bufend++] = s[j];
}
break;
}
}
if (s[i] == '\n' && ln == 1) {
break;
}
}
else if (rc == 0)
{
if (n == 1)
return (0); /* EOF, no data read */
else {
n++;
break; /* EOF, some data was read */
}
}
else
return (-1); /* error */
}
*ptr = 0;
/* printf ("DEBUG, Returning %d bytes (%s)\n", n, origptr); */
return (n);
}
void clear_read_buffer () {
buffer[0] = 0;
}