X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/5c19dc3ae3bd8e40a9c028b0deddd50ff337692c..7e6b461318c8a779d91381531435a68ee4e8b6ed:/OSX/libsecurity_utilities/lib/memstreams.h diff --git a/OSX/libsecurity_utilities/lib/memstreams.h b/OSX/libsecurity_utilities/lib/memstreams.h index 0c7ac496..f3287805 100644 --- a/OSX/libsecurity_utilities/lib/memstreams.h +++ b/OSX/libsecurity_utilities/lib/memstreams.h @@ -110,7 +110,7 @@ public: size_t operator () (const char *s) { align(); return totalSoFar += strlen(s) + 1; } void countedData(const void *, size_t length) - { insert(sizeof(length)); insert(length); } + { insert(sizeof(uint32_t)); insert(length); } template void countedData(const Data &data) @@ -121,6 +121,28 @@ private: }; +// A variant of Writer which returns offsets from the start of the buffer from the operator() functions. +class OffsetWriter : Writer { +public: + OffsetWriter() { } + OffsetWriter(void *base) : Writer(base), basePos(base) { } + void operator = (void *base) { basePos = base; Writer::operator = (base); } + + template + T *operator () (const T &obj) + { return Writer::operator() (obj) - basePos; } + + void *operator () (const void *addr, size_t size) + { return reinterpret_cast(uintptr_t(Writer::operator() (addr, size)) - uintptr_t(basePos)); } + + char *operator () (const char *s) + { return (char *)(*this)(s, strlen(s) + 1); } + +private: + void *basePos; // base address +}; + + // // The Reader counter-part for a Writer. // Again, Reader and Writer share alignment and representation rules, so what was