fis-gtm/sr_port/op_commarg.c

84 lines
2.3 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 "compiler.h"
#include "cmd.h"
#include "toktyp.h"
#include <rtnhdr.h>
#include "stack_frame.h"
#include "opcode.h"
#include "indir_enum.h"
#include "advancewindow.h"
#include "cache.h"
#include "hashtab_objcode.h"
#include "do_indir_do.h"
#include "op.h"
#define INDIR(a, b, c) b
UNIX_ONLY(GBLDEF) VMS_ONLY(LITDEF) int (*indir_fcn[])() = {
#include "indir.h"
};
GBLREF stack_frame *frame_pointer;
GBLREF unsigned short proc_act_type;
error_def (ERR_INDEXTRACHARS);
void op_commarg(mval *v, unsigned char argcode)
{
int rval;
icode_str indir_src;
mstr *obj, object;
DCL_THREADGBL_ACCESS;
SETUP_THREADGBL_ACCESS;
MV_FORCE_STR(v);
assert((3 <= argcode) && (SIZEOF(indir_fcn) / SIZEOF(indir_fcn[0]) > argcode));
indir_src.str = v->str;
indir_src.code = argcode;
if (NULL == (obj = cache_get(&indir_src))) /* NOTE assignment */
{
obj = &object;
if (((indir_do == argcode) || (indir_goto == argcode)) &&
(frame_pointer->type & SFT_COUNT) && v->str.len && (MAX_MIDENT_LEN > v->str.len) &&
!proc_act_type && do_indir_do(v, argcode))
return;
comp_init(&v->str, NULL);
for (;;)
{
if (EXPR_FAIL == (rval = (*indir_fcn[argcode])())) /* NOTE assignment */
break;
if (TK_EOL == TREF(window_token))
break;
if (TK_COMMA == TREF(window_token))
advancewindow();
else
{ /* Allow trailing spaces/comments that we will ignore */
while (TK_SPACE == TREF(window_token))
advancewindow();
if (TK_EOL == TREF(window_token))
break;
rts_error(VARLSTCNT(1) ERR_INDEXTRACHARS);
}
}
if (EXPR_FAIL == comp_fini(rval, obj, OC_RET, NULL, NULL, v->str.len))
return;
indir_src.str.addr = v->str.addr; /* reassign because stp_gcol might have changed v->str.addr */
cache_put(&indir_src, obj);
}
comp_indr(obj);
if (indir_linetail == argcode)
frame_pointer->type = SFT_COUNT;
}