home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Dream 52
/
Amiga_Dream_52.iso
/
Linux
/
Divers
/
yagirc-0.51.tar.gz
/
yagirc-0.51.tar
/
yagirc-0.51
/
misc.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-05-06
|
2KB
|
107 lines
#include <stdio.h>
#include <string.h>
#include <glib.h>
#include <unistd.h>
#include <errno.h>
#include "network.h"
GList *glist_case_find_string(GList *list, char *str)
{
for (list = g_list_first(list); list != NULL; list = list->next)
{
if (strcasecmp((char *) list->data, str) == 0)
return list;
}
return NULL;
}
GList *glist_find_string(GList *list, char *str)
{
for (list = g_list_first(list); list != NULL; list = list->next)
{
if (strcmp((char *) list->data, str) == 0)
return list;
}
return NULL;
}
/* Read line from somewhere..
socket : 0 = read from file/pipe, 1 = read from socket
handle : file/socket handle to read from
str : where to put line
buf : temp buffer
bufsize: temp buffer size
bufpos : current position in temp buffer
*/
int read_line(int socket, int handle, char *str, char *buf, int bufsize, int *bufpos)
{
int len, pos, bufs;
if (handle == -1 || str == NULL || buf == NULL || bufpos == NULL) return -1;
*str = '\0';
if (socket)
{
len = net_receive(handle, buf+*bufpos, bufsize-*bufpos);
}
else
{
len = read(handle, buf+*bufpos, bufsize-*bufpos);
}
if (len < 0 && *bufpos != 0)
{
/* error/connection lost but still something in buffer.. */
for (pos = 0; pos < *bufpos; pos++)
{
if (buf[pos] == 13 || buf[pos] == 10)
{
len = 0;
break;
}
}
}
if (len < 0)
{
if (errno == EAGAIN || errno == EWOULDBLOCK) return 0;
return -1;
}
bufs = len+*bufpos;
if (bufs == 0) return 0; /* nothing came.. */
for (pos = 0; pos < bufs; pos++)
{
if (buf[pos] == 13 || buf[pos] == 10)
{
/* end of line */
memcpy(str, buf, pos); str[pos] = '\0';
if (buf[pos] == 13 && pos+1 < len && buf[pos+1] == 10) pos++;
memmove(buf, buf+pos+1, bufs-(pos+1));
*bufpos = bufs-(pos+1);
return 1;
}
}
if (len+*bufpos == bufsize)
{
/* buffer overrun... */
memcpy(str, buf, bufsize-1); str[bufsize-1] = '\0';
*bufpos = 0;
return 1;
}
/* EOL wasn't found, wait for more data.. */
*bufpos = bufs;
return 0;
}