Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members | Related Pages

NVlist.cc

Go to the documentation of this file.
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 }

Generated on Fri Aug 20 10:58:07 2004 for NewsCache by doxygen 1.3.6-20040222