127 lines
3.0 KiB
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;
|
|
}
|