00001 #include"NVlist.h" 00002 #include"Error.h" 00003 00004 #include<fcntl.h> 00005 #include<sys/mman.h> 00006 #include<sys/stat.h> 00007 #include<sys/types.h> 00008 00009 using namespace std; 00010 00011 void NVlist::sprepend(nvoff_t proot, const char *data, size_t szdata) 00012 { 00013 Record *tail; 00014 Record *nr; 00015 nr = o2r(nvalloc(szdata + sizeof(Record))); 00016 tail = o2r(*(nvoff_t *) (mem_p + proot)); 00017 00018 nr->szdata = szdata; 00019 memcpy(nr->datap(), data, szdata); 00020 if (tail) { 00021 nr->next = tail->next; 00022 tail->next = r2o(nr); 00023 } else { 00024 *(nvoff_t *) (mem_p + proot) = nr->next = r2o(nr); 00025 } 00026 } 00027 00028 void NVlist::sappend(nvoff_t proot, const char *data, size_t szdata) 00029 { 00030 Record *tail; 00031 Record *nr; 00032 nr = o2r(nvalloc(szdata + sizeof(Record))); 00033 tail = o2r(*(nvoff_t *) (mem_p + proot)); 00034 00035 nr->szdata = szdata; 00036 memcpy(nr->datap(), data, szdata); 00037 if (tail) { 00038 nr->next = tail->next; 00039 *(nvoff_t *) (mem_p + proot) = tail->next = r2o(nr); 00040 } else { 00041 *(nvoff_t *) (mem_p + proot) = nr->next = r2o(nr); 00042 } 00043 } 00044 00045 void NVlist::sremove(nvoff_t proot) 00046 { 00047 Record *tail = o2r(*(nvoff_t *) (mem_p + proot)); 00048 Record *nr = o2r(tail->next); 00049 00050 if (tail == nr) { 00051 *(nvoff_t *) (mem_p + proot) = 0; 00052 } else { 00053 tail->next = nr->next; 00054 } 00055 nvfree(r2o(nr)); 00056 } 00057 00058 void NVlist::sclear(nvoff_t proot) 00059 { 00060 while (*(nvoff_t *) (mem_p + proot)) 00061 sremove(proot); 00062 } 00063 00064 void NVlist::sprint(nvoff_t proot, ostream & os) 00065 { 00066 int i = 0; 00067 Record *head = o2r(*(nvoff_t *) (mem_p + proot)); 00068 Record *r = head; 00069 00070 while (r) { 00071 r = o2r(r->next); 00072 os << i++ << ": " << r2o(r) << "(" << r-> 00073 szdata << "): " << r->datap() << endl; 00074 if (r == head) 00075 r = NULL; 00076 } 00077 }
1.3.6-20040222