ssize_t ircsock_read(IRCSock *ircsock) { /*{{{*/ /* We must have enough space for the newline and null character */ char buf[BCSIZE + 2]; ssize_t ramount; char *str, *tok; ramount = read(ircsock->socket, buf, BCSIZE); if(ramount > 0) { buf[ramount] = '\n'; buf[ramount + 1] = '\0'; tok = strtok(buf, "\r\n"); while(tok != NULL) { str = malloc(strlen(tok) + 1); if(!str) { fprintf(stderr, "Failed to allocate memory in ircsock_read!\n"); return IRCSOCK_MERROR; } strcpy(str, tok); cbuffer_push(ircsock->cbuf, str); tok = strtok(NULL, "\r\n"); } } return ramount; } /*}}}*/
int main(void) { struct cbuffer_t *cbuffer; uint8_t *message; uint8_t FLloop, len, i; char rxc; FLloop=TRUE; cbuffer = cbuffer_init(); message = malloc(MSG_SIZE); printf("\nTest circular buffer.\n"); printf("Copyright (C) 2016 Enrico Rossi - GNU GPL\n"); help(); while (FLloop) { /* get the char */ rxc = getchar(); switch(rxc) { case 'g': len = cbuffer_pop(cbuffer, message, MSG_SIZE); if (len) { printf("> Data fetched: %d\n", len); for (i=0; i < len; i++) printf("%c", *(message + i)); printf("\n"); } else { printf("> No data\n"); } printit(cbuffer); break; case 'h': help(); break; case 'q': FLloop=FALSE; break; case 'c': cbuffer_clear(cbuffer); printit(cbuffer); break; case '\n': break; default: rxc = 'a' + cbuffer->idx; cbuffer_push(cbuffer, rxc); printit(cbuffer); } } free(message); cbuffer_shut(cbuffer); return(0); }