#include #include #include #include #include static int read_int(int,int *); /* fd must be open for read and write */ /*! * \brief initialize segment * structure * * Initializes the seg structure. The file on fd is * a segment file created by segment_format and must be open for * reading and writing. The segment file configuration parameters nrows, * ncols, srows, scols, and len, as written to the file by * segment_format, are read from the file and stored in the * seg structure. Nsegs specifies the number of segments that * will be retained in memory. The minimum value allowed is 1. * Note. The size of a segment is scols*srows*len plus a few * bytes for managing each segment. * Return codes are: 1 if ok; else -1 could not seek or read segment file, or -2 out of memory. * * \param seg * \param fd * \param nsegs * \return int */ int segment_init (SEGMENT *SEG,int fd,int nseg) { SEG->open = 0; SEG->fd = fd; SEG->nseg = nseg; if (lseek (fd, 0L, 0) < 0) { G_warning ("segment_init: %s\n",strerror(errno)); return -1; } /* read the header */ if (!read_int (fd, &SEG->nrows) || !read_int (fd, &SEG->ncols) || !read_int (fd, &SEG->srows) || !read_int (fd, &SEG->scols) || !read_int (fd, &SEG->len)) return -1; return segment_setup (SEG); } static int read_int (int fd, int *n) { int bytes_read; if((bytes_read = read (fd, n, sizeof(int))) == -1) G_warning("read_int: %s\n",strerror(errno)); bytes_read = (bytes_read == sizeof(int)); return bytes_read; }