www.pudn.com > apdb2ndb.rar > atn_conv_to_inst.cc
#ifndef lint
static char copyright[] = "Copyright (C) FUJITSU LIMITED 2000" ;
static char id[] = "$Id: atn_conv_to_inst.cc,v 1.6 2001/06/12 15:51:48 JST rad1 Exp $" ;
#endif
/*
* $Log: atn_conv_to_inst.cc,v $
* Revision 1.6 2001/06/12 15:51:48 JST rad1
* 阪本(TSL)
* 名前の先頭の\追加機能(2001.5.23)
*
* Revision 1.5 2001/02/07 17:31:59 JST rad1
* 阪本(TSL)
* ・atn_conv_to_iportを別ファイルとする
*
* Revision 1.4 2001/02/07 15:54:30 JST rad1
* 阪本(TSL)
* サフィクス処理の機能拡張
*
* Revision 1.3 2001/01/16 15:52:18 JST rad1
* 阪本(TSL)
* ・ブロック名の_Xが_Sになってしまう不具合を修正
*
* Revision 1.2 2000/12/19 16:42:03 JST rad1
* 阪本(TSL)
* ・サフィックスの変換処理を修正
*
* $Com: 阪本(TSL)
* $Com: 名前の先頭の\追加機能(2001.5.23)
*/
// Convert Io Block and IO component to NDB-inst
//
//
#include "atn_inc.h"
// ERR OK
ATN_FDEF int atn_conv_to_inst(atn_com &com)
{
int rcode =0;
int rc = 0;
int rc_get_ioblock;
AirBlockInfo BlockInfo;
AirSeq *seq_block = NULL_PTR;
rc = atn_init_seq_read(com,&seq_block);
for(;;)
{
rc_get_ioblock = seq_block->block_in_arch(BlockInfo);
if(rc_get_ioblock == AIR_R_NOEXIST)
{
com.afm->message("atn0012",
AIR_MSG_CHR,"table","component",
AIR_MSG_END);
break;
}
if(rc_get_ioblock == AIR_R_NOMEM)
{
// Error Message : Program Error
// No Enough Memory
com.afm->message("atn0800",
AIR_MSG_CHR,"file",__FILE__,
AIR_MSG_INT,"line",__LINE__,AIR_MSG_END);
rcode = -1;
goto exit_func;
}
const char *blockname = BlockInfo.get_blockname();
int blockid = BlockInfo.get_blockid();
int compid = BlockInfo.get_componentid();
const char *compname = BlockInfo.get_componentname();
int io_f = BlockInfo.get_io_f();
const char *stackname = BlockInfo.get_stackname();
atn_debug(__FILE__,__LINE__,"=== BLOCK ===\n");
atn_debug(__FILE__,__LINE__,
" blockid(%d) blockname<%s> stackname<%s> io_f(%d)\n",
(int)blockid,blockname,stackname?stackname:"",io_f);
atn_debug(__FILE__,__LINE__,
" componentid(%d) componentname<%s>\n",
compid,compname);
/* create ndb instance from block_name and component name */
int ileng;
if(stackname)
ileng = strlen(blockname)+strlen(stackname)+strlen("_S")
+ strlen("_X");
else
ileng = strlen(blockname) + strlen("_X");
char *instname = (char *)calloc(sizeof(char),ileng+1);
char *w_instname = (char *)calloc(sizeof(char),ileng+1);
char *w_stackname = (char *)calloc(sizeof(char),ileng+1);
// Check if orogonal block name has a stack name and dual info
strcpy(w_instname,blockname);
int blen = strlen(blockname);
bool contains_X = false;
bool contains_Sn = false;
if(blen >= 3 && w_instname[blen-1] == 'X' && w_instname[blen-2]=='_')
{
contains_X = true;
w_instname [blen-2] = '\0';
}
char *stack_top = NULL_PTR;
stack_top = strrchr(w_instname,'_');
if(stack_top && stack_top[1]=='S' && stack_top[2] != '\0')
{
strcpy(w_stackname,stack_top+2);
if(stackname )
{
contains_Sn == true;
stack_top[0] == NULL;
}
}
strcpy(instname,w_instname);
// if(contains_Sn == false && stackname && strlen(stackname)>0)
if(stackname && strlen(stackname)>0)
{
strcat(instname,"_S");
strcat(instname,stackname);
}
/* Check if this is a dual block and cat "_X" */
bool this_block_is_dual=false;
char *variety= NULL;
if(com.dual_flag)
{
com.arch->block_get_info(BlockInfo,
AIR_KEY_VARIETY,&variety,0);
if(variety != NULL_PTR && strcmp(variety,"or")==0)
{
// bug fix 2001.1.15
// bug fix 2001.4.11
if(contains_X == false)
strcat(instname,"_X");
}
}
else if(contains_X) strcat(instname,"_X"); /* 2001.4.11 */
/* 2001.5.23 */
char *ndb_inst_name = atn_conv_to_ndb_name((char *)instname);
char *ndb_comp_name = atn_conv_to_ndb_name((char *)compname);
NDB_INSTID ndb_instid =
ndb_add_inst_with_comp(com.part_cntl,com.mid,ndb_inst_name,
ndb_comp_name);
if(ndb_comp_name != compname) free(ndb_comp_name);
if(ndb_inst_name != instname) free(ndb_inst_name);
/* 2001.5.23 */
if(ndb_instid <0)
{
atn_debug(__FILE__,__LINE__,"E : ndb_add_inst failure\n");
// 2001.4.11
com.afm->message("atn0800",
AIR_MSG_CHR,"file",__FILE__,
AIR_MSG_INT,"line",__LINE__,AIR_MSG_END);
goto exit_func;
}
if(ndb_instid == 0)
{
/* it is not error */
}
NDB_INSTINFO ndb_instinfo;
rc = ndb_get_instinfo(com.part_cntl,com.mid,ndb_instid,
&ndb_instinfo);
rc = atn_conv_to_iport(com,BlockInfo,ndb_instid);
if(instname)
{
free(instname);
free(w_instname);
free(w_stackname);
instname = 0; }
BlockInfo.clear();
if(rc_get_ioblock == AIR_R_FINISH)
{
// end of io-block
break;
}
}
if(seq_block)
{
delete seq_block;
}
exit_func:
return rcode;
}