diff --git a/Source/writer.cpp b/Source/writer.cpp new file mode 100644 index 00000000..491885ee --- /dev/null +++ b/Source/writer.cpp @@ -0,0 +1,73 @@ +#include "exehead/config.h" +#include "writer.h" +#include "growbuf.h" +#include "util.h" +#include +#include +#include + +void writer_sink::write_byte(const unsigned char b) +{ + write_data(&b, 1); +} + +void writer_sink::write_short(const short s) +{ + short fs = FIX_ENDIAN_INT16(s); + write_data(&fs, sizeof(short)); +} + +void writer_sink::write_int(const int i) +{ + int fi = FIX_ENDIAN_INT32(i); + write_data(&fi, sizeof(int)); +} + +void writer_sink::write_int_array(const int i[], const size_t len) +{ + for (size_t l = 0; l < len; l++) + { + write_int(i[l]); + } +} + +void writer_sink::write_string(const char *s) +{ + write_data(s, strlen(s) + 1); +} + +void writer_sink::write_string(const char *s, const size_t size) +{ + char *wb = new char[size]; + memset(wb, 0, size); + strncpy(wb, s, size); + write_data(wb, size); + delete [] wb; +} + +void writer_sink::write_growbuf(const IGrowBuf *b) +{ + write_data(b->get(), b->getlen()); +} + +void growbuf_writer_sink::write_data(const void *data, const size_t size) +{ + m_buf->add(data, size); +} + +void file_writer_sink::write_data(const void *data, const size_t size) +{ + if (fwrite(data, 1, size, m_fp) != size) + { + throw std::runtime_error("error writing"); + } +} + +#ifdef NSIS_CONFIG_CRC_SUPPORT +extern "C" unsigned long NSISCALL CRC32(unsigned long crc, const unsigned char *buf, unsigned int len); + +void crc_writer_sink::write_data(const void *data, const size_t size) +{ + *m_crc = CRC32(*m_crc, (const unsigned char *) data, size); +} +#endif diff --git a/Source/writer.h b/Source/writer.h new file mode 100644 index 00000000..56ab7adc --- /dev/null +++ b/Source/writer.h @@ -0,0 +1,70 @@ +#ifndef ___WRITER__H___ +#define ___WRITER__H___ + +#include "exehead/config.h" +#include "growbuf.h" +#include + +class writer_sink { +public: + writer_sink() {} + virtual ~writer_sink() {} + + virtual void write_byte(const unsigned char b); + virtual void write_short(const short s); + virtual void write_int(const int i); + virtual void write_int_array(const int i[], const size_t len); + virtual void write_string(const char *s); + virtual void write_string(const char *s, const size_t size); + virtual void write_growbuf(const IGrowBuf *b); + + virtual void write_data(const void *data, const size_t size) = 0; + +}; + +class writer { +public: + writer(writer_sink *sink) : m_sink(sink) {} + virtual ~writer() {} + +protected: + writer_sink *m_sink; + +}; + +class growbuf_writer_sink : public writer_sink { +public: + growbuf_writer_sink(IGrowBuf *buf) : m_buf(buf) {} + + virtual void write_data(const void *data, const size_t size); + +private: + IGrowBuf *m_buf; + +}; + +class file_writer_sink : public writer_sink { +public: + file_writer_sink(FILE *fp) : m_fp(fp) {} + + virtual void write_data(const void *data, const size_t size); + +private: + FILE *m_fp; + +}; + +#ifdef NSIS_CONFIG_CRC_SUPPORT +class crc_writer_sink : public writer_sink { +public: + crc_writer_sink(unsigned long *crc) : m_crc(crc) {} + + virtual void write_data(const void *data, const size_t size); + +private: + unsigned long *m_crc; + +}; +#endif + +#endif//!___WRITER__H___