GRASS Programmer's Manual  6.4.2(2012)
rowio/get.c
Go to the documentation of this file.
00001 #include <stdio.h>
00002 #include <grass/rowio.h>
00003 
00004 static void *my_select(ROWIO *, int);
00005 static void pageout(ROWIO *, int);
00006 
00007 
00031 void *rowio_get(ROWIO * R, int row)
00032 {
00033     int i;
00034     int age;
00035     int cur;
00036 
00037     if (row < 0)
00038         return NULL;
00039 
00040     if (row == R->cur)
00041         return R->buf;
00042 
00043     for (i = 0; i < R->nrows; i++)
00044         if (row == R->rcb[i].row)
00045             return my_select(R, i);
00046 
00047     age = 0;
00048     cur = 0;
00049 
00050     for (i = 0; i < R->nrows; i++)
00051         if (R->rcb[i].row < 0) {        /* free slot ! */
00052             cur = i;
00053             break;
00054         }
00055         else if (age < R->rcb[i].age) {
00056             cur = i;
00057             age = R->rcb[i].age;
00058         }
00059 
00060     pageout(R, cur);
00061 
00062     i = (*R->getrow) (R->fd, R->rcb[cur].buf, R->rcb[cur].row = row, R->len);
00063     R->rcb[cur].dirty = 0;
00064     if (!i) {
00065         R->rcb[cur].row = -1;
00066         if (cur == R->cur)
00067             R->cur = -1;
00068         return NULL;
00069     }
00070 
00071     return my_select(R, cur);
00072 }
00073 
00074 void rowio_flush(ROWIO * R)
00075 {
00076     int i;
00077 
00078     for (i = 0; i < R->nrows; i++)
00079         pageout(R, i);
00080 }
00081 
00082 static void pageout(ROWIO * R, int cur)
00083 {
00084     if (R->rcb[cur].row < 0)
00085         return;
00086     if (!R->rcb[cur].dirty)
00087         return;
00088     (*R->putrow) (R->fd, R->rcb[cur].buf, R->rcb[cur].row, R->len);
00089     R->rcb[cur].dirty = 0;
00090 }
00091 
00092 static void *my_select(ROWIO * R, int n)
00093 {
00094     int i;
00095 
00096     R->rcb[n].age = 0;
00097     for (i = 0; i < R->nrows; i++)
00098         R->rcb[i].age++;
00099     R->cur = R->rcb[n].row;
00100     R->buf = R->rcb[n].buf;
00101     return R->buf;
00102 }
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines