GRASS Programmer's Manual
6.4.2(2012)
|
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 }