#include "HPCxx_String.h" #include #include "hpcxx_byte.h" #include HPCxx_String::HPCxx_String() : len(0), room(0) { val = new char [1]; val[0] = '\0'; } HPCxx_String::HPCxx_String(char* v) { len = strlen(v); val = new char[len+1]; room = len; strncpy(val,v,len); val[len] = '\0'; } HPCxx_String::HPCxx_String(const HPCxx_String &source) { len = source.len; val = new char[len+1]; room = len; strncpy(val,source.val,len); val[len] = '\0'; } HPCxx_String& HPCxx_String::operator=(const HPCxx_String &source) { len = source.len; makeRoom(len); strncpy(val,source.val,len); val[len] = '\0'; return *this; } HPCxx_String& HPCxx_String::operator=(const char *buf) { len = strlen(buf); makeRoom(len); strncpy(val,buf,len); val[len] = '\0'; return *this; } void HPCxx_String::makeRoom(int l) { if (l > room) { delete[] val; val = new char[l+1]; room = l; } } int HPCxx_String::operator==(const HPCxx_String& str) const { return !strcmp(val,str.val); } HPCxx_String::~HPCxx_String() { delete[] val; } ostream &operator<<(ostream &output, const HPCxx_String &buffer) { output << buffer.val; return output; } void hpcxx_pack(HPCxx_Buffer& b, HPCxx_String* s, int i) { for (int j = 0; j < i; j++) { hpcxx_byte *two = new hpcxx_byte(); two->byte = 2; hpcxx_pack(b, two, 1); hpcxx_pack(b, &(s[j].len), 1); if (s[j].len > 0) { hpcxx_pack(b, s[j].val, s[j].len); } } } void hpcxx_unpack(HPCxx_Buffer& b, HPCxx_String* s, int i) { for (int j = 0; j < i; j++) { // NexusRMI packs in the following format // byte 2: indicates a final object // int length: indicates the number of characters that will follow // length of characters int l; hpcxx_byte *two = new hpcxx_byte(); hpcxx_unpack(b, two, 1); if (two->byte != 2) { cout << "Error !! in hpcxx_unpack() ... " <byte) << endl; cout << "exiting ... : " << endl << endl; exit(-1); } hpcxx_unpack(b, &l, 1); s[j].len = l; s[j].makeRoom(l); if (l > 0) { hpcxx_unpack(b, s[j].val, l); } s[j].val[l] = '\0'; } }