fis-gtm/sr_port_cm/gtcm_bind_name.c

69 lines
2.1 KiB
C

/****************************************************************
* *
* Copyright 2001, 2012 Fidelity Information Services, Inc *
* *
* This source code contains the intellectual property *
* of its copyright holder(s), and is made available *
* under a license. If you do not know the terms of *
* the license, please stop and do not read further. *
* *
****************************************************************/
#include "mdef.h"
#include "gtm_string.h"
#include "gdsroot.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsbt.h"
#include "gdsfhead.h"
#include "filestruct.h"
#include "cmidef.h"
#include "hashtab_mname.h"
#include "cmmdef.h"
#include "gtcm_bind_name.h"
#include "gv_xform_key.h"
#include "targ_alloc.h"
#include "gvcst_protos.h" /* for gvcst_root_search prototype */
#define DIR_ROOT 1
GBLREF gv_key *gv_currkey;
GBLREF sgmnt_data *cs_data;
GBLREF gv_namehead *gv_target;
void gtcm_bind_name(cm_region_head *rh, boolean_t xform)
{
ht_ent_mname *tabent;
mname_entry gvent;
boolean_t added;
gvnh_reg_t *gvnh_reg;
GTCM_CHANGE_REG(rh); /* sets the global variables gv_cur_region/cs_addrs/cs_data appropriately */
gvent.var_name.addr = (char *)gv_currkey->base;
gvent.var_name.len = STRLEN((char *)gv_currkey->base);
COMPUTE_HASH_MNAME(&gvent);
if (NULL == (tabent = lookup_hashtab_mname(rh->reg_hash, &gvent)) || NULL == (gvnh_reg = (gvnh_reg_t *)tabent->value))
{
gv_target = targ_alloc(cs_data->max_key_size, &gvent, rh->reg);
gvnh_reg = (gvnh_reg_t *)malloc(SIZEOF(gvnh_reg_t));
gvnh_reg->gvt = gv_target;
gvnh_reg->gd_reg = rh->reg;
if (NULL != tabent)
{ /* Since the global name was found but gv_target was null and now we created a new gv_target,
* the hash table key must point to the newly created gv_target->gvname. */
tabent->key = gv_target->gvname;
tabent->value = (char *)gvnh_reg;
} else
{
added = add_hashtab_mname((hash_table_mname *)rh->reg_hash, &gv_target->gvname, gvnh_reg, &tabent);
assert(added);
}
} else
gv_target = gvnh_reg->gvt;
GVCST_ROOT_SEARCH;
if ((gv_target->collseq || gv_target->nct) && xform)
gv_xform_key(gv_currkey, FALSE);
return;
}