Initial import of the CDE 2.1.30 sources from the Open Group.
This commit is contained in:
319
cde/programs/dtinfo/DtMmdb/api/smart_ptr.C
Normal file
319
cde/programs/dtinfo/DtMmdb/api/smart_ptr.C
Normal file
@@ -0,0 +1,319 @@
|
||||
/*
|
||||
* $XConsortium: smart_ptr.cc /main/4 1996/06/11 17:11:33 cde-hal $
|
||||
*
|
||||
* 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 "api/smart_ptr.h"
|
||||
#include "object/compressed_pstring.h"
|
||||
|
||||
|
||||
smart_ptr::smart_ptr(info_lib* lib_ptr,
|
||||
const char* ibase_name,
|
||||
int composite_pos,
|
||||
const handler& query_hd,
|
||||
int index_selector,
|
||||
composite_tag tag
|
||||
)
|
||||
{
|
||||
info_base* ibase = lib_ptr -> get_info_base(ibase_name);
|
||||
|
||||
if ( ibase == 0 ) {
|
||||
throw(stringException(
|
||||
form("unknown base %s in %s\n", ibase_name,
|
||||
lib_ptr -> get_info_lib_path()
|
||||
)));
|
||||
}
|
||||
//debug(cerr, ibase -> num_of_docs());
|
||||
|
||||
switch (tag) {
|
||||
case SET:
|
||||
{
|
||||
cset_handlerPtr set_ptr = ibase -> get_set(composite_pos);
|
||||
|
||||
if ( set_ptr == 0 )
|
||||
throw(stringException("NULL set ptr"));
|
||||
|
||||
_init((*set_ptr)->get_first_oid(query_hd, index_selector),
|
||||
set_ptr -> its_store()
|
||||
);
|
||||
}
|
||||
break;
|
||||
case LIST:
|
||||
{
|
||||
dl_list_handlerPtr list_ptr = ibase -> get_list(composite_pos);
|
||||
|
||||
if ( list_ptr == 0 )
|
||||
throw(stringException("NULL set ptr"));
|
||||
|
||||
_init((*list_ptr)->get_first_oid(query_hd, index_selector),
|
||||
list_ptr -> its_store()
|
||||
);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw(stringException("unknown tag"));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
smart_ptr::smart_ptr(info_base* ibase,
|
||||
int composite_pos,
|
||||
const handler& query_hd,
|
||||
int index_selector,
|
||||
composite_tag tag
|
||||
)
|
||||
{
|
||||
switch (tag) {
|
||||
case SET:
|
||||
{
|
||||
cset_handlerPtr set_ptr = ibase -> get_set(composite_pos);
|
||||
|
||||
if ( set_ptr == 0 )
|
||||
throw(stringException("NULL set ptr"));
|
||||
|
||||
_init((*set_ptr)->get_first_oid(query_hd, index_selector),
|
||||
set_ptr -> its_store()
|
||||
);
|
||||
}
|
||||
break;
|
||||
case LIST:
|
||||
{
|
||||
dl_list_handlerPtr list_ptr = ibase -> get_list(composite_pos);
|
||||
|
||||
if ( list_ptr == 0 )
|
||||
throw(stringException("NULL set ptr"));
|
||||
|
||||
_init((*list_ptr)->get_first_oid(query_hd, index_selector),
|
||||
list_ptr -> its_store()
|
||||
);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw(stringException("unknown tag"));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* inlined */
|
||||
/*
|
||||
smart_ptr::smart_ptr()
|
||||
{
|
||||
}
|
||||
|
||||
smart_ptr::~smart_ptr()
|
||||
{
|
||||
}
|
||||
*/
|
||||
|
||||
void smart_ptr::_init(const oid_t& id, const abs_storage* x)
|
||||
{
|
||||
//MESSAGE(cerr, "smart_ptr::_init()");
|
||||
obj_id.become(id);
|
||||
//obj_id.asciiOut(cerr); cerr << "\n";
|
||||
|
||||
store = (abs_storage*)x;
|
||||
obj_ptr = 0;
|
||||
|
||||
handler::operator->();
|
||||
|
||||
//obj_id.asciiOut(cerr); cerr << "\n";
|
||||
//debug(cerr, int(obj_ptr));
|
||||
//MESSAGE(cerr, "smart_ptr::_init() done");
|
||||
}
|
||||
|
||||
|
||||
handler* smart_ptr::get_handler(int i, c_code_t code)
|
||||
{
|
||||
handler* x = _get_component(i);
|
||||
x -> operator->();
|
||||
|
||||
if ( x -> its_oid().ccode() != code )
|
||||
throw(stringException("invalid node data class code"));
|
||||
|
||||
return x;
|
||||
}
|
||||
|
||||
int smart_ptr::get_int(int i)
|
||||
{
|
||||
handler* x = get_handler(i, INTEGER_CODE);
|
||||
int y= (*(integer_handler*)x) -> get();
|
||||
delete x;
|
||||
|
||||
return y;
|
||||
}
|
||||
|
||||
const char* smart_ptr::get_string(int i, buffer& buf)
|
||||
{
|
||||
handler* x = _get_component(i);
|
||||
|
||||
x -> operator->(); // this will bring the its_oid field up-to-date
|
||||
|
||||
char* str;
|
||||
|
||||
switch ( x -> its_oid().ccode() ) {
|
||||
case STRING_CODE:
|
||||
{
|
||||
str = (*(pstring_handler*)x) -> get(buf);
|
||||
break;
|
||||
}
|
||||
case COMPRESSED_STRING_CODE:
|
||||
{
|
||||
str = (*(compressed_pstring_handler*)x) -> get(buf);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
throw(stringException("invalid node data class code"));
|
||||
}
|
||||
|
||||
delete x;
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
const char* smart_ptr::get_string(int i)
|
||||
{
|
||||
handler* x = _get_component(i);
|
||||
|
||||
x -> operator->(); // this will bring the its_oid field up-to-date
|
||||
|
||||
char* str;
|
||||
|
||||
switch ( x -> its_oid().ccode() ) {
|
||||
case STRING_CODE:
|
||||
{
|
||||
str = (*(pstring_handler*)x) -> get();
|
||||
break;
|
||||
}
|
||||
case COMPRESSED_STRING_CODE:
|
||||
{
|
||||
str = (*(compressed_pstring_handler*)x) -> get();
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
throw(stringException("invalid node data class code"));
|
||||
}
|
||||
|
||||
delete x;
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
|
||||
int smart_ptr::get_string_size(int i)
|
||||
{
|
||||
handler* x = _get_component(i);
|
||||
x -> operator->(); // this will bring the its_oid field up-to-date
|
||||
|
||||
int y ;
|
||||
|
||||
switch ( x -> its_oid().ccode() ) {
|
||||
case STRING_CODE:
|
||||
y = (*(pstring_handler*)x) -> size();
|
||||
break;
|
||||
|
||||
case COMPRESSED_STRING_CODE:
|
||||
y = (*(compressed_pstring_handler*)x) -> size();
|
||||
break;
|
||||
|
||||
default:
|
||||
throw(stringException("invalid node data class code"));
|
||||
}
|
||||
|
||||
delete x;
|
||||
|
||||
return y;
|
||||
}
|
||||
|
||||
oid_t smart_ptr::get_oid(int i)
|
||||
{
|
||||
handler* x = get_handler(i, OID_CODE);
|
||||
oid_t y = (*(oid_handler*)x) -> my_coid();
|
||||
delete x;
|
||||
|
||||
return y;
|
||||
}
|
||||
|
||||
void smart_ptr::update_oid(int i, const oid_t& x)
|
||||
{
|
||||
static char buf[64];
|
||||
|
||||
handler* z = get_handler(i, OID_CODE);
|
||||
oid_handler* y = (oid_handler*)z;
|
||||
|
||||
sprintf(buf, "%d.%d\n", x.ccode(), x.icode());
|
||||
istrstream in(buf, 64);
|
||||
|
||||
(*y) -> asciiIn(in);
|
||||
|
||||
delete y;
|
||||
}
|
||||
|
||||
void smart_ptr::update_string(int i, istream& in)
|
||||
{
|
||||
handler* x = _get_component(i);
|
||||
|
||||
x -> operator->(); // this will bring the its_oid field up-to-date
|
||||
|
||||
io_status ok;
|
||||
switch ( x -> its_oid().ccode() ) {
|
||||
case STRING_CODE:
|
||||
ok = (*(pstring_handler*)x) -> asciiIn(in);
|
||||
break;
|
||||
|
||||
case COMPRESSED_STRING_CODE:
|
||||
ok = (*(compressed_pstring_handler*)x) -> _asciiIn(in);
|
||||
break;
|
||||
|
||||
default:
|
||||
throw(stringException("invalid node data class code"));
|
||||
}
|
||||
delete x;
|
||||
}
|
||||
|
||||
void smart_ptr::update_string(int i, const char* buf, int size)
|
||||
{
|
||||
handler* x = _get_component(i);
|
||||
|
||||
x -> operator->(); // this will bring the its_oid field up-to-date
|
||||
|
||||
switch ( x -> its_oid().ccode() ) {
|
||||
case STRING_CODE:
|
||||
(*(pstring_handler*)x) -> update(buf, size);
|
||||
break;
|
||||
|
||||
case COMPRESSED_STRING_CODE:
|
||||
(*(compressed_pstring_handler*)x) -> _asciiIn(buf, size);
|
||||
break;
|
||||
|
||||
default:
|
||||
throw(stringException("invalid node data class code"));
|
||||
}
|
||||
delete x;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user