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;
}
示例#2
0
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;
}
示例#3
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;
}
示例#4
0
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;
}
示例#5
0
////--- 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;
    
}
示例#6
0
		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;
		}