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; 
       
}