fis-gtm/sr_port/get_mvaddr.c

67 lines
1.5 KiB
C

/****************************************************************
* *
* Copyright 2001, 2009 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 "compiler.h"
#include "mmemory.h"
#include "min_max.h"
#include "stringpool.h"
GBLREF mvar *mvartab;
GBLREF mvax *mvaxtab, *mvaxtab_end;
GBLREF int mvmax;
mvar *get_mvaddr(mident *var_name)
{
mvar **p;
mvax *px;
mstr vname;
int x;
p = &mvartab;
while (*p)
{
MIDENT_CMP(&(*p)->mvname, var_name, x);
if (x < 0)
p = &((*p)->rson);
else if (x > 0)
p = &((*p)->lson);
else
return *p;
}
/* variable doesn't exist - create a new mvar in mvartab */
vname.len = var_name->len;
vname.addr = var_name->addr;
s2pool_align(&vname);
*p = (mvar *)mcalloc(SIZEOF(mvar));
(*p)->mvname.len = vname.len;
(*p)->mvname.addr = vname.addr;
(*p)->mvidx = mvmax++;
(*p)->lson = (*p)->rson = NULL;
(*p)->last_fetch = NULL;
px = (mvax *)mcalloc(SIZEOF(mvax));
px->var = *p;
px->last = px->next = 0;
px->mvidx = (*p)->mvidx;
if (mvaxtab_end)
{
px->last = mvaxtab_end;
mvaxtab_end->next = px;
mvaxtab_end = px;
}
else
mvaxtab = mvaxtab_end = px;
return *p;
}