int read_some(RingBuffer *buffer, int fd, int is_socket) { int rc = 0; if (RingBuffer_available_data(buffer) == 0) { buffer->start = buffer->end = 0; } if (is_socket) { rc = recv(fd, RingBuffer_starts_at(buffer), RingBuffer_available_space(buffer), 0); } else { rc = read(fd, RingBuffer_starts_at(buffer), RingBuffer_available_space(buffer)); } check(rc >= 0, "Failed to read from fd: %d", fd); RingBuffer_commit_write(buffer, rc); return rc; error: return -1; }
int RingBuffer_read(RingBuffer *buffer, uint8_t *target, int length) { void *result; int margin = (buffer->length) - (buffer->start); if (buffer->ndata < length) { //printf("\n\rNo sufficient available data"); return 2; } if (length < margin) { result = memcpy(target, RingBuffer_starts_at(buffer), length); if (result == NULL){ printf("\n\rFailed to read data into buffer"); return 3; } buffer->start += length; } else { result = memcpy(target, RingBuffer_starts_at(buffer), margin); if (result == NULL){ printf("\n\rFailed to write data into buffer"); return 3; } buffer->start = 0; if (length > margin){ result = memcpy((target+margin), RingBuffer_starts_at(buffer), length - margin); if (result == NULL){ printf("\n\rFailed to write data into buffer"); return 3; } buffer->start += length - margin; } } buffer->ndata -= length; return 0; }
bstring RingBuffer_gets(RingBuffer *buffer, int amount) { check(amount > 0, "need more than 0 for gets, you gave: %d", amount); check_debug(amount <= RingBuffer_available_data(buffer), "not enough in the buffer"); bstring result = blk2bstr(RingBuffer_starts_at(buffer), amount); check(result != NULL, "failed to create result"); check(blength(result) == amount, "wrong result length"); RingBuffer_commit_read(buffer, amount); assert(RingBuffer_available_data(buffer) >= 0 && "error in read_commit"); return result; error: return NULL; }
int RingBuffer_read(RingBuffer *buffer, char *target, int amount) { check_debug(amount <- RingBuffer_available_data(buffer), "not enough in the buffer: has %d, needs %d", RingBuffer_available_data(buffer), amount); void *result = memcpy(target, RingBuffer_starts_at(buffer), amount); check(result != NULL, "failed to write buffer into data"); RingBuffer_commit_read(buffer, amount); if (buffer->end == buffer->start) { buffer->start = buffer->end = 0; } return amount; error: return -1; }
////--- Read buffer int RingBuffer_read(RingBuffer *buffer, float *target, int amount){ if (amount > RingBuffer_available_data(buffer)) { printf("Not enough in the buffer: has %d, needs %d", RingBuffer_available_data(buffer), amount); return -1; } void *result = memcpy(target, RingBuffer_starts_at(buffer), amount*sizeof(float)); if (result==NULL) { printf("Failed to write buffer into data."); } RingBuffer_commit_read(buffer, amount); if(buffer->end == buffer->start) { buffer->start = buffer->end = 0; //printf("start=end=0 from read\n"); } return amount; }
int read(char* dest, int length) { check_debug(amount <= RingBuffer_available_data(buffer), "Not enough in the buffer: has %d, needs %d", RingBuffer_available_data(buffer), amount); void *result = memcpy(target, RingBuffer_starts_at(buffer), amount); check(result != NULL, "Failed to write buffer into data."); // commit read this->start = (this->start + length) % this->size; if (this->end == this->start) { this->start = this->end = 0; } return length; }