00001 #include "wvattrs.h"
00002
00003 WvAttrs::WvAttrs() : attrlist(NULL), attrlen(0)
00004 {
00005 }
00006
00007 WvAttrs::WvAttrs(const WvAttrs ©) : attrlist(NULL), attrlen(copy.attrlen)
00008 {
00009 if (copy.attrlen) {
00010 attrlist = (char *)malloc((copy.attrlen + 1) * sizeof(char));
00011 memcpy(attrlist, copy.attrlist, copy.attrlen + 1);
00012 }
00013 }
00014
00015 WvAttrs::~WvAttrs()
00016 {
00017 free(attrlist);
00018 }
00019
00020 char *WvAttrs::_get(WvStringParm name) const
00021 {
00022 if (!attrlist)
00023 return NULL;
00024
00025 const char *curpos = attrlist;
00026 while (*curpos)
00027 {
00028 const char *const valoffset = curpos + strlen(curpos) + 1;
00029 if (!strcmp(curpos, name.cstr()))
00030 return (char *)valoffset;
00031
00032 curpos = valoffset + strlen(valoffset) + 1;
00033 }
00034
00035 return NULL;
00036 }
00037
00038 void WvAttrs::set(WvStringParm name, WvStringParm value)
00039 {
00040 if (!name)
00041 return;
00042
00043 const int namelen = name.len();
00044 char *exists = _get(name);
00045 if (exists)
00046 {
00047
00048 const int toremove = namelen + strlen(exists) + 2;
00049 exists -= namelen + 1;
00050
00051
00052 const int endpart = attrlen - (exists - attrlist) - toremove + 1;
00053 memmove(exists, exists + toremove, endpart);
00054 attrlen -= toremove;
00055 attrlist = (char *)realloc(attrlist, (attrlen + 1)
00056 * sizeof(char));
00057 }
00058
00059 if (!value)
00060 return;
00061
00062 const unsigned int totallen = namelen + value.len() + 2;
00063 attrlist = (char *)realloc(attrlist, (attrlen + totallen + 1)*sizeof(char));
00064
00065 char *const beginloc = attrlist + attrlen;
00066 strcpy(beginloc, name.cstr());
00067 strcpy(beginloc + namelen + 1, value.cstr());
00068
00069 attrlen += totallen;
00070 attrlist[attrlen] = 0;
00071 }