static  char    sccsid[]="%Z% %M% %I% %E% %U%";
#include "colmn.h"

/********************************************************************
*																	*
* 処理目的 : パラメータ情報取得関数                                 *
*																	*
* 関数名　 : INT4 cmn_get_data( pBuff, pParm )                      *
*																	*
* 引き数   : (I)char      *  pBuff                                  *
*            (O)tdtInfoParm *  pParm                                *
*																	*
* 戻り値　 : NORMAL : 正常                                          *
*            SYSTEMERROR : 異常                                     *
*																	*
* 処理概要 : パケット中のパラメータを取得する。						*
*			 取得した情報はパラメータ情報構造体にセットされる		*
*																	*
*********************************************************************/
int cmn_get_data( pPrmHead, pInfoParm )
char        *pPrmHead;		/* パラメータの先頭へのアドレス */
tdtInfoParm *pInfoParm;		/* パラメータ情報構造体 */
{
	return cmn_get_data_byte_order(pPrmHead, pInfoParm, 0);
}

int cmn_get_data_byte_order(pPrmHead, pInfoParm, ucByteOrder)
char        *pPrmHead;		/* パラメータの先頭へのアドレス */
tdtInfoParm *pInfoParm;		/* パラメータ情報構造体 */
uchar       ucByteOrder;	/* 0/1:none/ntoh */
{
	FORM_S        *pStd   = NULL;
	FORM_K        *pKak   = NULL;
	tdtIndirectInfo *pInfo  = NULL;
	unsigned int   iAttr  = 0;
	unsigned int   iForm  = 0;
	char          *pData  = NULL;
	INT4           lLen   = 0;
	INT4           fLen   = 0;
	char           cAL;
	char          *pByte  = NULL;
	INT4  lw,alLen,lww;
	short sw,sww;
	unsigned char uw;
	int iScale,iCode;	/* add 94.2.2 Koba */

	if (!pPrmHead) return SYSTEMERROR;

	/*
	 * 初期化処理
	 */

	/* 情報構造体を初期化します */
	memset(pInfoParm, 0, sizeof(tdtInfoParm));
	pInfoParm->pi_id = ' ';
	
	/* 属性＆精度取得 */
	cAL = (char)*(pPrmHead+0);
	iAttr = (int)( ( cAL >> 4 ) & 0x0f );
	iForm = (int)( cAL & 0x0f );
	iScale = cAL & 0x0f;
	iForm = iScale & 0x01;
	pInfoParm->pi_scale = iScale;
	pInfoParm->pi_code = (iScale & 0x0e)>>1;
	/*
	 * 各データ取得
	 */
	/* フォーマットが拡張形式の時 */
	if( (iAttr == DEF_ZOK_CHAR && iForm == 0) || iAttr == DEF_ZOK_BULK ) {
		/* データ長を取得 */
		pKak = (FORM_K *)pPrmHead;
		memcpy((char *)&lw,pKak->dlen,sizeof(int));
		lLen = ntohl(lw);

		pInfoParm->pi_id   = ' ';		/* 直接形式           */
		pInfoParm->pi_attr = iAttr;	/* 属性               */
		pInfoParm->pi_dlen  = lLen;		/* データ長           */
		pInfoParm->pi_hlen  = sizeof( FORM_K ); /* フォーマット長(標準&拡張)*/
		pInfoParm->pi_len  = sizeof( FORM_K )  /* パラメータ長       */
		                      + lLen;
		if( lLen >= 0 ) {
			alLen = lLen;
			if (iAttr == DEF_ZOK_CHAR) alLen++;
			if (alLen > 0) {
				if (!(pInfoParm->pi_data=Malloc(alLen))) {
					return (-1);
				}
				pInfoParm->pi_scale |= 0x80;
				if (lLen > 0) memcpy(pInfoParm->pi_data, pKak+1, lLen );
				if (iAttr == DEF_ZOK_CHAR) pInfoParm->pi_data[lLen] = '\0';
			}
		}
		else if (lLen < 0) return (-1);
	}
	else {
		/* 標準形式・直接 */
		if( !( iAttr & DEF_ZOK_KANS ) ) {
			/* データ長を取得 */
			pStd = (FORM_S *)pPrmHead;
			lLen = (INT4)pStd->dlen;
			pInfoParm->pi_id   = ' ';		/* 直接形式       */
			pInfoParm->pi_attr = iAttr;	/* 属性           */
			pInfoParm->pi_dlen  = lLen;		/* データ長         */
			pInfoParm->pi_hlen  = sizeof( FORM_S ); /* フォーマット長(標準)*/
			pInfoParm->pi_len  = sizeof( FORM_S )  /* パラメータ長       */
			                      + lLen;
			if( lLen >= 0 ) {
				alLen = lLen;
				if (iAttr == DEF_ZOK_CHAR) alLen++;
				if (alLen > 0) {
					if (!(pInfoParm->pi_data=Malloc(alLen))) {
						return (-1);
					}
					pInfoParm->pi_scale |= 0x80;
					if (lLen > 0) {
						pStd++;
						if (iAttr==DEF_ZOK_BINA && lLen>1) {
							if (lLen == 2) {
								memcpy(&sw, pStd, lLen );
								sww = ntohs(sw);
								memcpy(pInfoParm->pi_data, &sww, lLen );
							}
							else {
								memcpy(&lw, pStd, lLen );
								lww = ntohl(lw);
								memcpy(pInfoParm->pi_data, &lww, lLen );
							}
						}
						else
							memcpy(pInfoParm->pi_data, pStd, lLen );
					}
					if (iAttr == DEF_ZOK_CHAR) pInfoParm->pi_data[lLen] = '\0';
				}
			}
			else if (lLen < 0) return (-1);
		}
		else {
			iAttr &= 0x07;     /* 属性           */
			pByte = (char *)pPrmHead;
			pStd  = (FORM_S *)pPrmHead;
			pInfo = (tdtIndirectInfo *)( pPrmHead + sizeof( FORM_S ) );
			lLen  = pStd->dlen;
			fLen  = lLen - sizeof( tdtIndirectInfo );

			pInfoParm->pi_id   = pByte[2];
			pInfoParm->pi_attr = iAttr;
			memcpy((char *)&lw,&pByte[6],sizeof(int));
			pInfoParm->pi_pos = ntohl(lw);
			memcpy((char *)&lw,&pByte[10],sizeof(int));
			pInfoParm->pi_dlen = ntohl(lw);
			pInfoParm->pi_hlen  = sizeof( FORM_S ); /* フォーマット長(標準)*/
			pInfoParm->pi_len  = sizeof( FORM_S )  /* パラメータ長       */
			                      + sizeof( tdtIndirectInfo )
			                      + fLen;
			if( fLen >= 0 ) {
				if (!(pInfoParm->pi_data=Malloc(fLen+1))) {
					return (-1);
				}
				pInfoParm->pi_scale |= 0x80;
				if (fLen > 0) memcpy(pInfoParm->pi_data, pInfo+1, fLen );
				pInfoParm->pi_data[fLen] = '\0';
			}
			else if (fLen < 0) return (-1);
		}
	}
	return NORMAL;
}
/**********************************************************/
/*              by A.Koba 6.19                            */
/**********************************************************/
int cmn_chk_data( pPrmHead, pInfoParm )
char      *pPrmHead ;              /* パラメータの先頭へのアドレス    */
tdtInfoParm *pInfoParm ;              /* パラメータ情報構造体         */
{
	return cmn_change_data(pPrmHead, pInfoParm, 0);
}

int cmn_change_data(pPrmHead, pInfoParm, iOption)
char      *pPrmHead ;	/* パラメータの先頭へのアドレス    */
tdtInfoParm *pInfoParm ;	/* パラメータ情報構造体         */
int        iOption;		/* 0/1:none/change source */
{
	FORM_S        *pStd   = NULL;
	FORM_K        *pKak   = NULL;
	tdtIndirectInfo *pInfo  = NULL;
	unsigned int   iAttr  = 0;
	unsigned int   iForm  = 0;
	char          *pData  = NULL;
	INT4           lLen   = 0;
	INT4           fLen   = 0;
	char           cAL;
	char          *pByte  = NULL;
	INT4  lw,alLen,lww;
	short sw,sww;
	unsigned char uw;
	int iScale,iCode;	/* add 94.2.2 Koba */

	if( pPrmHead == NULL ) return SYSTEMERROR;

	/* 情報構造体を初期化します */
	memset(pInfoParm,0,sizeof(tdtInfoParm));
	pInfoParm->pi_id = ' ';

	/* 属性＆精度取得 */
	cAL = (char)*(pPrmHead+0);
	iAttr = (int)( ( cAL >> 4 ) & 0x0f );
	iScale = cAL & 0x0f;
	iForm = iScale & 0x01;
	pInfoParm->pi_scale = iScale;
	pInfoParm->pi_code = (iScale & 0x0e)>>1;

	/* フォーマットが拡張形式の時 */
	if((iAttr==DEF_ZOK_CHAR && iForm==0) || iAttr==DEF_ZOK_BULK) {
		/* データ長を取得 */
		pKak = (FORM_K *)pPrmHead;
		memcpy((char *)&lw,pKak->dlen,sizeof(int));
		lLen = ntohl(lw);
		if (lLen!=lw && iOption) {
			memcpy(pKak->dlen,(char *)&lLen,sizeof(int));
		}

		pInfoParm->pi_id   = ' ';              /*            */
		pInfoParm->pi_attr = iAttr;            /* 属性               */
		pInfoParm->pi_dlen  = lLen;             /* データ長           */
		pInfoParm->pi_hlen  = sizeof( FORM_K ); /* フォーマット長(標準&拡張)*/
		pInfoParm->pi_len  = sizeof( FORM_K )  /* パラメータ長       */
		                      + lLen;
		pInfoParm->pi_data = (char *)(pKak+1);
	}
	else {
		/* 標準形式・直接（パケット） */
		if( !( iAttr & DEF_ZOK_KANS ) ) {
			/* データ長を取得 */
			pStd = (FORM_S *)pPrmHead;
			lLen = (INT4)pStd->dlen;
			pInfoParm->pi_id   = ' ';              /*           */
			pInfoParm->pi_attr = iAttr;            /* 属性           */
			pInfoParm->pi_dlen  = lLen;             /* データ長         */
			pInfoParm->pi_hlen  = sizeof( FORM_S ); /* フォーマット長(標準)*/
			pInfoParm->pi_len  = sizeof( FORM_S )  /* パラメータ長       */
			                      + lLen;
			pStd++;
			pInfoParm->pi_data = (char *)pStd;
			if (iAttr==DEF_ZOK_BINA && lLen>1) {
				if (lLen == 2) {
					memcpy(&sw, pStd, lLen );
					sww = ntohs(sw);
					if (sww != sw) {
						if (iOption) memcpy(pInfoParm->pi_data, &sww, lLen );
						memcpy(&pInfoParm->pi_pos,&sww,lLen);
						pInfoParm->pi_data = (char *)&(pInfoParm->pi_pos);
						pInfoParm->pi_scale |= 0x40;
					}
				}
				else {
					memcpy(&lw, pStd, lLen );
					lww = ntohl(lw);
					if (lww != lw) {
						if (iOption) memcpy(pInfoParm->pi_data, &lww, lLen );
						pInfoParm->pi_pos = lww;
						pInfoParm->pi_data = (char *)&(pInfoParm->pi_pos);
						pInfoParm->pi_scale |= 0x40;
					}
				}
			}
		}
		else {
			iAttr &= 0x07;     /* 属性           */
			pByte = (char *)pPrmHead;
			pStd  = (FORM_S *)pPrmHead;
			pInfo = (tdtIndirectInfo *)( pPrmHead + sizeof( FORM_S ) );
			lLen  = pStd->dlen;
			fLen  = lLen - sizeof( tdtIndirectInfo );

			pInfoParm->pi_id   = pByte[2];
			pInfoParm->pi_attr = iAttr;
			memcpy((char *)&lww,&pByte[6],sizeof(int));
			lw = ntohl(lww);
			pInfoParm->pi_pos = lw;
			if (iOption) {
				memcpy(&pByte[6],(char *)&pInfoParm->pi_pos,sizeof(int));
			}
			memcpy((char *)&lww,&pByte[10],sizeof(int));
			lw = ntohl(lww);
			pInfoParm->pi_dlen = lw;
			if (iOption) {
				memcpy(&pByte[10],(char *)&pInfoParm->pi_dlen,sizeof(int));
			}
			pInfoParm->pi_hlen  = sizeof( FORM_S ); /* フォーマット長(標準)*/
			pInfoParm->pi_len  = sizeof( FORM_S )  /* パラメータ長       */
			                      + sizeof( tdtIndirectInfo )
			                      + fLen;
			pInfoParm->pi_data = (char *)(pInfo+1);
		}
	}

	return NORMAL;
}
