#ifdef __GNUG__ #pragma implementation "Keydata.h" #endif #include #include "Keydata.h" #include void Keydata::append(void *p,int s) { int i = cnt - 1; if (adr[i] + len[i] == (char *)p) len[i] += s; else if (cnt < 8) { adr[cnt] = (char *)p; len[cnt++] = s; } } Keydata::Keydata(const Keydata &r,int len) { cnt = 0; for (int i = 0; i < r.cnt; ++i) { int rlen = r.len[i]; if (rlen >= len) { append(r.adr[i],len); return; } append(r.adr[i],rlen); len -= rlen; } } Keydata &Keydata::operator +=(const Keydata &r) { for (int i = 0; i < r.cnt; ++i) append(r.adr[i],r.len[i]); return *this; } int Keydata::compare(const char *buf,int clen) const { if (clen < 0) clen = size(); int pos = 0; for (int i = 0; i < cnt; ++i) { int slen = len[i]; if (clen < slen) slen = clen; int rc = blkcmpr(adr[i],buf+pos,slen); if (rc) return rc; if (slen < len[i]) return 1; pos += slen; clen -= slen; } if (clen) return -1; return 0; } int Keydata::compare(const Keydata &r) const { int slen = size(); char *p = (char *)alloca(slen); store(p); return r.compare(p,slen); } int Keydata::load(const char *buf) const { int pos = 0; for (int i = 0; i < cnt; ++i) { memcpy(adr[i],buf+pos,len[i]); pos += len[i]; } return pos; } int Keydata::store(char *buf) const { int pos = 0; for (int i = 0; i < cnt; ++i) { memcpy(buf+pos,adr[i],len[i]); pos += len[i]; } return pos; } int Keydata::size() const { int pos = 0; for (int i = 0; i < cnt; ++i) { pos += len[i]; } return pos; } #if 0 extern "C" { #include } struct keydesc Keydata::operator-(const void *buf) const return k; { k.k_flags = 0; k.k_nparts = cnt; k.k_len = 0; for (int i = 0; i < cnt; ++i) { k.k_part[i].kp_start = adr[i] - (const char *)buf; k.k_part[i].kp_leng = len[i]; k.k_part[i].kp_type = CHARTYPE; } } #endif