/* * CDE - Common Desktop Environment * * Copyright (c) 1993-2012, The Open Group. All rights reserved. * * These libraries and programs are free software; you can * redistribute them and/or modify them under the terms of the GNU * Lesser General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) * any later version. * * These libraries and programs are distributed in the hope that * they will be useful, but WITHOUT ANY WARRANTY; without even the * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public * License along with these librararies and programs; if not, write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301 USA */ /* * $XConsortium: pstring.C /main/6 1996/09/16 14:26:44 mgreess $ * * Copyright (c) 1992 HAL Computer Systems International, Ltd. * All rights reserved. Unpublished -- rights reserved under * the Copyright Laws of the United States. USE OF A COPYRIGHT * NOTICE IS PRECAUTIONARY ONLY AND DOES NOT IMPLY PUBLICATION * OR DISCLOSURE. * * THIS SOFTWARE CONTAINS CONFIDENTIAL INFORMATION AND TRADE * SECRETS OF HAL COMPUTER SYSTEMS INTERNATIONAL, LTD. USE, * DISCLOSURE, OR REPRODUCTION IS PROHIBITED WITHOUT THE * PRIOR EXPRESS WRITTEN PERMISSION OF HAL COMPUTER SYSTEMS * INTERNATIONAL, LTD. * * RESTRICTED RIGHTS LEGEND * Use, duplication, or disclosure by the Government is subject * to the restrictions as set forth in subparagraph (c)(l)(ii) * of the Rights in Technical Data and Computer Software clause * at DFARS 252.227-7013. * * HAL COMPUTER SYSTEMS INTERNATIONAL, LTD. * 1315 Dell Avenue * Campbell, CA 95008 * */ #include "object/pstring.h" #ifdef C_API buffer* pstring::v_io_buf_ptr; #define v_io_buf (*v_io_buf_ptr) #else buffer pstring::v_io_buf(LBUFSIZ); #endif void pstring::init_persistent_info(persistent_info* x) { root::init_persistent_info(x); if ( get_mode(OLD_OBJECT) == false ) { char* y = 0; if ( storage_ptr ) storage_ptr -> insertString(v_str_ptr.loc, y, 0); } } pstring::pstring(c_code_t c_id) : primitive(c_id), v_sz(0) { // // CDExc21900 // Make sure the entire union is initialized for 64bit architectures. // memset((char*) &v_str_ptr, 0, sizeof(v_str_ptr)); } pstring::pstring(const char* x, int leng, c_code_t c_id) : primitive(c_id) { _init(x, leng); } pstring::pstring(pstring& x) : primitive(x) { _init((const char*)x.get(), x.v_sz); } void pstring::_init(const char* x, int leng) { v_sz = leng; if ( v_sz == 0 ) { v_str_ptr.loc = 0; return; } v_str_ptr.p = new char[leng+1]; memcpy(v_str_ptr.p, x, leng); v_str_ptr.p[leng] = 0; } pstring::~pstring() { if ( get_mode(PERSISTENT) == false && NULL != v_str_ptr.p ) delete v_str_ptr.p; } // ///////////////////////////////////// // should not delete what get() returns! // ///////////////////////////////////// char* pstring::get(buffer& string_buffer) { //MESSAGE(cerr, "get()"); if ( get_mode(PERSISTENT) == true ) { /* MESSAGE(cerr, "persistent"); debug(cerr, v_sz); debug(cerr, v_str_ptr.loc); debug(cerr, f_oid); */ string_buffer.reset(); string_buffer.expand_chunk(v_sz+1); char* this_v_str_ptr = string_buffer.get_base(); storage_ptr -> readString(v_str_ptr.loc, this_v_str_ptr, v_sz); /* for (int i=0; i readString(v_str_ptr.loc, this_v_str_ptr, v_sz); } else this_v_str_ptr = v_str_ptr.p; pstring &casted_x = *(pstring*)&x; if ( casted_x.get_mode(PERSISTENT) == true ) { x_v_str_ptr = new char[v_sz+1]; storage_ptr -> readString(casted_x.v_str_ptr.loc, x_v_str_ptr, casted_x.v_sz); } else x_v_str_ptr = casted_x.v_str_ptr.p; int min_len = MIN(v_sz, casted_x.v_sz); for ( int i=0; i x_v_str_ptr[i] ) { ok = false; break; } } if ( i == min_len && v_sz < casted_x.v_sz ) ok = true; else ok = false; if ( get_mode(PERSISTENT) == true ) delete this_v_str_ptr; if ( casted_x.get_mode(PERSISTENT) == true ) delete x_v_str_ptr; return ok; } Boolean pstring::value_EQ(root& x, Boolean safe) const { if ( safe == true && ( f_oid.ccode() != STRING_CODE || x.my_oid().ccode() != STRING_CODE ) ) return false; pstring &casted_x = *(pstring*)&x; if ( v_sz != casted_x.v_sz ) return false; Boolean ok; char* this_v_str_ptr; char* x_v_str_ptr; if ( get_mode(PERSISTENT) == true ) { this_v_str_ptr = new char[v_sz+1]; storage_ptr -> readString(v_str_ptr.loc, this_v_str_ptr, v_sz); } else this_v_str_ptr = v_str_ptr.p; if ( casted_x.get_mode(PERSISTENT) == true ) { x_v_str_ptr = new char[v_sz+1]; storage_ptr -> readString(casted_x.v_str_ptr.loc, x_v_str_ptr, casted_x.v_sz); } else x_v_str_ptr = casted_x.v_str_ptr.p; //ok = ( bcmp(this_v_str_ptr, x_v_str_ptr, v_sz) == 0 ) ? true : false; ok = ( memcmp(this_v_str_ptr, x_v_str_ptr, v_sz) == 0 ) ? true : false; if ( get_mode(PERSISTENT) == true ) delete this_v_str_ptr; if ( casted_x.get_mode(PERSISTENT) == true ) delete x_v_str_ptr; return ok; } */ io_status pstring::asciiOut(ostream& out) { /* MESSAGE(cerr, "pstring::asciiOut():"); debug(cerr, v_sz); debug(cerr, (void*)this); my_oid().asciiOut(cerr); cerr << "\n"; */ const char* x = get(); out << v_sz << '\t'; for ( unsigned int i=0; i> len; int tab = in.get(); // expect a '\t' if ( tab != '\t' ) { debug(cerr, len); debug(cerr, tab); throw(stringException("'\\t' expected")); } v_io_buf.reset(); v_io_buf.expand_chunk(len); if ( len > 0 && ( !in.read(v_io_buf.get_base(), len) || in.gcount() != len ) ) { debug(cerr, len); debug(cerr, v_io_buf.get_base()); throw(stringException("pstring::asciiIn(): read failed")); } int ret = in.get(); // expect a '\n' if ( ret != '\n' ) { debug(cerr, ret); throw(stringException(form("'\\n' expected. %c seen. (count=%d)", ret, len))); } v_io_buf.set_content_sz(len); } Boolean pstring::update(pstring& new_value) { return update((const char*)new_value.get(), new_value.v_sz); } Boolean pstring::update(const char* new_value, int new_value_sz) { /* MESSAGE(cerr, "pstring:: update value:"); debug(cerr, v_str_ptr.loc); debug(cerr, f_oid); debug(cerr, v_sz); debug(cerr, new_value_sz); for (int i=0; i insertString(v_str_ptr.loc, new_value, v_sz); } else { storage_ptr -> updateString(v_str_ptr.loc, new_value, v_sz); } } else { if ( old_sz < new_value_sz ) { delete v_str_ptr.p; v_str_ptr.p = new char[v_sz+1]; } memcpy(v_str_ptr.p, new_value, v_sz); *(v_str_ptr.p + v_sz) = '\0'; } set_mode(UPDATE, true); //debug(cerr, this -> get()); return true; } int pstring::cdr_sizeof() { return primitive::cdr_sizeof() + sizeof(v_str_ptr.loc) + sizeof(v_sz); } io_status pstring::cdrOut(buffer& buf) { primitive::cdrOut(buf); buf.put(v_str_ptr.loc); buf.put(v_sz); return done; } io_status pstring::cdrIn(buffer& buf) { primitive::cdrIn(buf); buf.get(v_str_ptr.loc); buf.get(v_sz); return done; } MMDB_BODIES(pstring) pstring_handler::pstring_handler(const oid_t& v_oid, storagePtr _store) : handler(v_oid, _store) { } pstring_handler::pstring_handler(const char* str, int sz, storagePtr _store) : handler(STRING_CODE, _store) { (this -> operator->()) -> update(str, sz); } pstring_handler::~pstring_handler() { } pstring* pstring_handler::operator ->() { return (pstring*)handler::operator->(); }