fis-gtm/sr_port/viewkeys.c

75 lines
2.0 KiB
C

/****************************************************************
* *
* Copyright 2001, 2011 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 "view.h"
#include "gtm_caseconv.h"
#include "gdsroot.h" /* Added to support alias.h */
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsbt.h"
#include "gdsfhead.h"
#include "alias.h" /* Needed for DEBUG_ALIAS flag used in viewtab.h */
#define VT_KWSIZE (SIZEOF(viewtab[0].keyword))
#define VIEWTAB(A,B,C,D) {A, B, C, D}
const static readonly viewtab_entry viewtab[] =
{
#include "viewtab.h"
};
#undef VIEWTAB
error_def(ERR_VIEWNOTFOUND);
error_def(ERR_VIEWAMBIG);
viewtab_entry *viewkeys(mstr *v)
{ /* given view keyword, return pointer to viewtab_entry for that keyword
* or: return 0 means not found, return -1 means keyword is ambiguous.
*/
unsigned char cmpbuf[VT_KWSIZE];
const viewtab_entry *vt_ptr, *vt_top;
short len;
int n;
if (v->len == 0)
vt_ptr = (viewtab_entry *)NULL;
else
{
len = (v->len < SIZEOF(cmpbuf) ? v->len : SIZEOF(cmpbuf));
lower_to_upper(cmpbuf, (uchar_ptr_t)v->addr, len);
vt_top = ARRAYTOP(viewtab);
for (vt_ptr = viewtab ; vt_ptr < vt_top ; vt_ptr++)
{
n = memcmp(vt_ptr->keyword, cmpbuf, len);
if (n > 0)
{ vt_ptr = 0;
break;
}
else if (n == 0)
{
if (vt_ptr < vt_top - 1 && memcmp(cmpbuf, (vt_ptr + 1)->keyword, len) == 0)
vt_ptr = (viewtab_entry *)-1L;
break;
}
}
}
if (vt_ptr == (viewtab_entry *)-1L)
rts_error(VARLSTCNT(4) ERR_VIEWAMBIG, 2, v->len, v->addr);
else if (!vt_ptr || vt_ptr >= vt_top)
rts_error(VARLSTCNT(4) ERR_VIEWNOTFOUND, 2, v->len, v->addr);
return (viewtab_entry *)vt_ptr;
}