Example #1
0
int segment_get_row(const SEGMENT * SEG, void *buf, int row)
{
    int size;
    int ncols;
    int scols;
    int n, index, col;

    ncols = SEG->ncols - SEG->spill;
    scols = SEG->scols;
    size = scols * SEG->len;

    for (col = 0; col < ncols; col += scols) {
	segment_address(SEG, row, col, &n, &index);
	if (segment_seek(SEG, n, index) < 0)
	    return -1;

	if (read(SEG->fd, buf, size) != size) {
	    G_warning("segment_get_row: %s", strerror(errno));
	    return -1;
	}

	/* The buf variable is a void pointer and thus points to anything. */
	/* Therefore, it's size is unknown and thus, it cannot be used for */
	/* pointer arithmetic (some compilers treat this as an error - SGI */
	/* MIPSPro compiler for one). Since the read command is reading in */
	/* "size" bytes, cast the buf variable to char * before incrementing */
	buf = ((char *)buf) + size;
    }
    if ((size = SEG->spill * SEG->len)) {
	segment_address(SEG, row, col, &n, &index);
	if (segment_seek(SEG, n, index) < 0)
	    return -1;

	if (read(SEG->fd, buf, size) != size) {
	    G_warning("segment_get_row: %s", strerror(errno));
	    return -1;
	}
    }

    return 1;
}
Example #2
0
int segment_get(SEGMENT * SEG, void *buf, int row, int col)
{
    int index, n, i;

    segment_address(SEG, row, col, &n, &index);
    if ((i = segment_pagein(SEG, n)) < 0)
	return -1;

    memcpy(buf, &SEG->scb[i].buf[index], SEG->len);

    return 1;
}