fis-gtm/sr_port/cvtparm.c

127 lines
3.0 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 "stringpool.h"
#include "io_params.h"
#include "io.h"
#include "iottdef.h"
#include "cvtparm.h"
#include "mvalconv.h"
#include "cvttime.h"
#include "cvtprot.h"
GBLREF spdesc stringpool;
LITREF unsigned char io_params_size[];
#define IOP_DESC(a,b,c,d,e) {d, e}
LITDEF dev_ctl_struct dev_param_control[] =
{
#include "iop.h"
};
#undef IOP_DESC
int4 cvtparm(int iocode, mval *src, mval *dst)
{
error_def(ERR_DEVPARTOOBIG);
error_def(ERR_DEVPARPROT);
int4 status, nl, tim[2];
int siz, cnt, strlen;
short ns;
unsigned char *cp, msk;
io_termmask lngmsk;
assert(MV_DEFINED(src));
strlen = -1;
siz = io_params_size[iocode];
ENSURE_STP_FREE_SPACE(siz + 1);
switch(dev_param_control[iocode].source_type)
{
case IOP_SRC_INT:
assert(siz == SIZEOF(int4) || siz == SIZEOF(short));
MV_FORCE_NUM(src);
nl = MV_FORCE_INT(src);
if (siz == SIZEOF(int4))
cp = (unsigned char *)&nl;
else
{
assert (siz == SIZEOF(short));
ns = (short) nl;
cp = (unsigned char *) &ns;
}
break;
case IOP_SRC_STR:
assert(siz == IOP_VAR_SIZE);
MV_FORCE_STR(src);
if (src->str.len > 255) /*one byte string lengths within a parameter string*/
return (int4) ERR_DEVPARTOOBIG;
strlen = src->str.len;
siz = strlen + SIZEOF(unsigned char);
cp = (unsigned char *) src->str.addr;
break;
case IOP_SRC_MSK:
MV_FORCE_STR(src);
assert(siz == SIZEOF(int4));
nl = 0;
for (cp = (unsigned char *) src->str.addr, cnt = src->str.len ; cnt > 0 ; cnt--)
nl |= (1 << *cp++);
cp = (unsigned char *) &nl;
break;
case IOP_SRC_LNGMSK:
MV_FORCE_STR(src);
assert(siz == SIZEOF(io_termmask));
memset(&lngmsk, 0, SIZEOF(io_termmask));
for (cp = (unsigned char *) src->str.addr, cnt = src->str.len ; cnt > 0 ; cnt--)
{
msk = *cp++;
nl = msk / 32;
lngmsk.mask[nl] |= (1 << (msk - (nl * 32)));
}
cp = (unsigned char *) &lngmsk;
break;
case IOP_SRC_PRO:
assert(siz == SIZEOF(unsigned char));
MV_FORCE_STR(src);
nl = cvtprot(src->str.addr, src->str.len);
if (nl == -1)
return (int4) ERR_DEVPARPROT;
msk = nl;
cp = &msk;
break;
case IOP_SRC_TIME:
status = cvttime(src, tim);
if ((status & 1) == 0)
return status;
siz = SIZEOF(tim) ;
cp = (unsigned char *) tim ;
break;
default:
assert(FALSE);
}
dst->mvtype = MV_STR;
dst->str.addr = (char *) stringpool.free;
dst->str.len = siz;
if (strlen >= 0)
{
*stringpool.free++ = strlen;
siz -= SIZEOF(char);
}
memcpy(stringpool.free, cp, siz);
stringpool.free += siz;
return 0;
}