00001 // -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 8 -*- 00002 // 00003 // RInside.cpp: Easier R embedding into C++ 00004 // 00005 // Copyright (C) 2009 Dirk Eddelbuettel and GPL'ed 00006 00007 #include <iostream> 00008 #include <cstdlib> 00009 #include <cstring> 00010 00011 #include "MemBuf.h" 00012 00013 extern bool verbose; 00014 extern const char *programName; 00015 00016 MemBuf::~MemBuf() { 00017 if (verbose) std::cout << "MemBuf::dtor BEGIN" << std::endl; 00018 free(p_m); 00019 if (verbose) std::cout << "MemBuf::dtor END" << std::endl; 00020 } 00021 00022 MemBuf::MemBuf(int sizebytes) { 00023 if (verbose) std::cout << "MemBuf::ctor BEGIN" << std::endl; 00024 p_m = (membuf_st*) malloc(sizebytes+sizeof(struct membuf_st)); 00025 00026 if (p_m == NULL) { 00027 std::cerr << programName << ": MemBuf ctor failed! Exiting!!!\n\n" << std::endl; 00028 exit(1); 00029 //return NULL; /* unreached */ 00030 } 00031 00032 p_m->size = sizebytes; 00033 p_m->count = 0; 00034 p_m->buf = (unsigned char *)p_m+sizeof(struct membuf_st); 00035 00036 if (verbose) std::cout << "MemBuf::ctor END" << std::endl; 00037 } 00038 00039 void MemBuf::resize() { // Use power of 2 resizing 00040 membuf_t lb = p_m; 00041 lb = p_m = (membuf_st*) realloc(lb, lb->size*2+sizeof(struct membuf_st)); 00042 if (lb == NULL) { 00043 std::cerr << programName << ": MemBuff::resize() failed! Exiting!!!\n\n" << std::endl; 00044 exit(1); 00045 } 00046 lb->size = lb->size * 2; 00047 lb->buf = (unsigned char *)lb+sizeof(struct membuf_st); 00048 } 00049 00050 void MemBuf::rewind(){ 00051 p_m->count = 0; 00052 } 00053 00054 void MemBuf::add(char *buf){ 00055 membuf_t mb = p_m; 00056 int buflen = strlen(buf); 00057 00058 while ((buflen + (mb->count)) >= mb->size) { 00059 resize(); 00060 mb = p_m; 00061 } 00062 00063 memcpy(mb->buf + mb->count, buf, buflen); 00064 mb->buf[mb->count+buflen] = '\0'; 00065 mb->count += buflen; 00066 } 00067