tinycobol/lib/cobmove_b_.c

479 lines
12 KiB
C

//
// Copyright (C) 2001, 2000, 1999, Rildo Pragana, Jim Noeth,
// Andrew Cameron, David Essex.
// Copyright (C) 1993, 1991 Rildo Pragana.
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License
// as published by the Free Software Foundation; either version 2.1,
// or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; see the file COPYING.LIB. If
// not, write to the Free Software Foundation, Inc., 59 Temple Place,
// Suite 330, Boston, MA 02111-1307 USA
#include "htcoblib.h"
//#define DEBUG_MOVE_RTS 1
/*--------------------------------------------------------------------------*\
| |
| Move routines where the source field is DTYPE_BINARY |
| |
\*--------------------------------------------------------------------------*/
void tcob_move_b_9(struct fld_desc *pfldDesc1, char *caData1,
struct fld_desc *pfldDesc2, char *caData2) {
int i;
int bIsNegative;
char caWork[MAX_INTEGERS];
unsigned int picLen;
char *pData=NULL;
struct fld_desc fldWork;
long long iLongField=0;
long long iLongWork;
extern long long _iIntValues_[MAX_INTEGERS];
char caWork1[MAX_INTEGERS+1];
unsigned int iLen;
#ifdef DEBUG_MOVE_RTS
{
extern int _iMoveLevel_;
caWork1[MAX_INTEGERS] = '\0';
fprintf(stderr, "Debug: Enter tcob_move_b_9 (%d)\n", _iMoveLevel_++);
}
#endif
if(_iIntValues_[0] == (long long)-1) /* first time called */
initIntValues();
fldWork.type = DTYPE_DISPLAY;
fldWork.decimals = pfldDesc1->decimals;
fldWork.pscale = 0;
fldWork.all = pfldDesc1->all;
fldWork.just_r = 0;
fldWork.separate_sign = 0;
fldWork.leading_sign = 0;
if (tcob_picElemVal(pfldDesc1->pic,0) == 'S') {
switch(pfldDesc1->len) {
case 1:
iLongField = *(char *)caData1;
iLen = 3;
break;
case 2:
iLongField = *(short int *)caData1;
iLen = 5;
break;
case 4:
iLongField = *(int *)caData1;
iLen = 10;
break;
case 8:
iLongField = *(long long *)caData1;
iLen = 18;
break;
}
}
else {
switch(pfldDesc1->len) {
case 1:
iLongField = *(unsigned char *)caData1;
iLen = 3;
break;
case 2:
iLongField = *(unsigned short int *)caData1;
iLen = 5;
break;
case 4:
iLongField = *(unsigned int *)caData1;
iLen = 10;
break;
case 8:
iLongField = *(unsigned long long *)caData1;
iLen = 18;
break;
}
}
fldWork.len = iLen;
picLen = tcob_picReqLen(2);
fldWork.pic = (char *)malloc(picLen);
tcob_picCreate (fldWork.pic, picLen, 'S', 1, '9', iLen, NULL);
pData = &caWork[MAX_INTEGERS - iLen];
if(iLongField < 0) {
bIsNegative = 1;
iLongField = iLongField * (long long)-1;
} else
bIsNegative = 0;
for(i = 0; i < MAX_INTEGERS; ++i) {
iLongWork = iLongField / _iIntValues_[i];
caWork[i] = (unsigned char)iLongWork + '0';
iLongField = iLongField - (_iIntValues_[i] * iLongWork);
caWork1[i] = '=';
}
tcob_put_sign(&fldWork, pData, bIsNegative);
#ifdef DEBUG_MOVE_RTS
{
extern int _iMoveLevel_;
fprintf(stderr, "Debug: before tcob_move_9_9 call (%d)\n", _iMoveLevel_);
strncpy(caWork1, caWork, MAX_INTEGERS);
fprintf(stderr, "Debug tcob_move_b_9: caWork1=%s, len=%d, bIsNegative=%d;\n",
caWork1, strlen(caWork1), bIsNegative);
_FLDDUMP_(&fldWork, pData, "Source");
_FLDDUMP_(pfldDesc2, caData2, "Dest");
}
#endif
tcob_move_9_9(&fldWork, pData, pfldDesc2, caData2);
#ifdef DEBUG_MOVE_RTS
{
extern int _iMoveLevel_;
fprintf(stderr, "Debug: after tcob_move_9_9 call (%d)\n", _iMoveLevel_);
_FLDDUMP_(&fldWork, pData, "Source");
_FLDDUMP_(pfldDesc2, caData2, "Dest");
}
#endif
#ifdef DEBUG_MOVE_RTS
{
extern int _iMoveLevel_;
fprintf(stderr, "Debug: Leaving tcob_move_b_9 (%d)\n", --_iMoveLevel_);
_FLDDUMP_(pfldDesc1, caData1, "Source");
_FLDDUMP_(pfldDesc2, caData2, "Dest");
}
#endif
free(fldWork.pic);
return;
}
void tcob_move_b_b(struct fld_desc *pfldDesc1, char *caData1,
struct fld_desc *pfldDesc2, char *caData2) {
unsigned int i;
long long iLongField=0;
int iSrcDecimals, iSrcPscale;
int iDstDecimals, iDstPscale;
int scale;
#ifdef DEBUG_MOVE_RTS
{
extern int _iMoveLevel_;
fprintf(stderr, "Debug: Enter tcob_move_b_b (%d)\n", _iMoveLevel_++);
}
#endif
if (tcob_picElemVal(pfldDesc1->pic,0) == 'S') {
switch(pfldDesc1->len) {
case 1:
iLongField = *(char *)caData1;
break;
case 2:
iLongField = *(short int *)caData1;
break;
case 4:
iLongField = *(int *)caData1;
break;
case 8:
iLongField = *(long long *)caData1;
break;
}
}
else {
switch(pfldDesc1->len) {
case 1:
iLongField = *(unsigned char *)caData1;
break;
case 2:
iLongField = *(unsigned short int *)caData1;
break;
case 4:
iLongField = *(unsigned int *)caData1;
break;
case 8:
iLongField = *(unsigned long long *)caData1;
break;
}
}
if ((tcob_picElemVal(pfldDesc2->pic,0) != 'S') && (iLongField < 0)) {
iLongField = - iLongField;
}
/* Scaling */
iSrcDecimals = (char)pfldDesc1->decimals;
iDstDecimals = (char)pfldDesc2->decimals;
iSrcPscale = (char)pfldDesc1->pscale;
iDstPscale = (char)pfldDesc2->pscale;
scale = (iDstDecimals?iDstDecimals:iDstPscale) -
(iSrcDecimals?iSrcDecimals:iSrcPscale);
if (scale > 0) {
for (i=0; i<scale; i++)
iLongField *= 10;
} else if (scale < 0) {
for (i=0; i<-scale; i++)
iLongField /= 10;
}
switch(pfldDesc2->len) {
case 1:
*(char *)caData2 = iLongField;
break;
case 2:
*(short int *)caData2 = iLongField;
break;
case 4:
*(int *)caData2 = iLongField;
break;
case 8:
*(long long *)caData2 = iLongField;
break;
}
#ifdef DEBUG_MOVE_RTS
{
extern int _iMoveLevel_;
fprintf(stderr, "Debug: Leaving tcob_move_b_b (%d)\n", --_iMoveLevel_);
_FLDDUMP_(pfldDesc1, caData1, "Source");
_FLDDUMP_(pfldDesc2, caData2, "Dest");
}
#endif
return;
}
void tcob_move_b_c(struct fld_desc *pfldDesc1, char *caData1,
struct fld_desc *pfldDesc2, char *caData2) {
int i;
int bIsNegative;
char caWork[MAX_INTEGERS];
unsigned int picLen;
char *pData=NULL;
struct fld_desc fldWork;
long long iLongField=0;
long long iLongWork;
extern long long _iIntValues_[MAX_INTEGERS];
unsigned int iLen;
#ifdef DEBUG_MOVE_RTS
{
extern int _iMoveLevel_;
fprintf(stderr, "Debug: Enter tcob_move_b_c (%d)\n", _iMoveLevel_++);
}
#endif
if(_iIntValues_[0] == (long long)-1) /* first time called */
initIntValues();
fldWork.type = DTYPE_DISPLAY;
fldWork.decimals = 0;
fldWork.pscale = 0;
fldWork.all = pfldDesc1->all;
fldWork.just_r = 0;
fldWork.separate_sign = 0;
fldWork.leading_sign = 0;
switch(pfldDesc1->len) {
case 1:
iLongField = *(char *)caData1;
iLen = 3;
break;
case 2:
iLongField = *(short int *)caData1;
iLen = 5;
break;
case 4:
iLongField = *(int *)caData1;
iLen = 10;
break;
case 8:
iLongField = *(long long *)caData1;
iLen = 18;
break;
}
fldWork.len = iLen;
picLen = tcob_picReqLen(2);
fldWork.pic = (char *)malloc(picLen);
tcob_picCreate (fldWork.pic, picLen, 'S', 1, '9', iLen, NULL);
pData = &caWork[MAX_INTEGERS - iLen];
if(iLongField < 0) {
bIsNegative = 1;
iLongField = iLongField * (long long)-1;
} else
bIsNegative = 0;
for(i = 0; i < MAX_INTEGERS; ++i) {
iLongWork = iLongField / _iIntValues_[i];
caWork[i] = (unsigned char)iLongWork + '0';
iLongField = iLongField - (_iIntValues_[i] * iLongWork);
}
tcob_put_sign(&fldWork, pData, bIsNegative);
tcob_move_9_c(&fldWork, pData, pfldDesc2, caData2);
#ifdef DEBUG_MOVE_RTS
{
extern int _iMoveLevel_;
fprintf(stderr, "Debug: Leaving tcob_move_b_c (%d)\n", --_iMoveLevel_);
_FLDDUMP_(pfldDesc1, caData1, "Source");
_FLDDUMP_(pfldDesc2, caData2, "Dest");
}
#endif
free(fldWork.pic);
return;
}
void tcob_move_b_e(struct fld_desc *pfldDesc1, char *caData1,
struct fld_desc *pfldDesc2, char *caData2) {
#ifdef DEBUG_MOVE_RTS
{
extern int _iMoveLevel_;
fprintf(stderr, "Debug: Enter tcob_move_b_e (%d)\n", _iMoveLevel_++);
_FLDDUMP_(pfldDesc1, caData1, "Source");
_FLDDUMP_(pfldDesc2, caData2, "Dest");
}
#endif
tcob_move_edited(pfldDesc1, caData1, pfldDesc2, caData2);
#ifdef DEBUG_MOVE_RTS
{
extern int _iMoveLevel_;
fprintf(stderr, "Debug: Leaving tcob_move_b_e (%d)\n", --_iMoveLevel_);
_FLDDUMP_(pfldDesc1, caData1, "Source");
_FLDDUMP_(pfldDesc2, caData2, "Dest");
}
#endif
return;
}
void tcob_move_b_f(struct fld_desc *pfldDesc1, char *caData1,
struct fld_desc *pfldDesc2, char *caData2) {
long long iLongField=0;
#ifdef DEBUG_MOVE_RTS
{
extern int _iMoveLevel_;
fprintf(stderr, "Debug: Enter tcob_move_b_f (%d)\n", _iMoveLevel_++);
}
#endif
switch(pfldDesc1->len) {
case 1:
iLongField = *(char *)caData1;
break;
case 2:
iLongField = *(short int *)caData1;
break;
case 4:
iLongField = *(int *)caData1;
break;
case 8:
iLongField = *(long long *)caData1;
break;
}
switch(pfldDesc2->len) {
case 4:
*(float *)caData2 = (float)iLongField;
break;
case 8:
*(double *)caData2 = (double)iLongField;
break;
}
#ifdef DEBUG_MOVE_RTS
{
extern int _iMoveLevel_;
fprintf(stderr, "Debug: Leaving tcob_move_b_f (%d)\n", --_iMoveLevel_);
_FLDDUMP_(pfldDesc1, caData1, "Source");
_FLDDUMP_(pfldDesc2, caData2, "Dest");
}
#endif
return;
}
void tcob_move_b_x(struct fld_desc *pfldDesc1, char *caData1,
struct fld_desc *pfldDesc2, char *caData2) {
int i;
int bIsNegative;
char caWork[MAX_INTEGERS];
unsigned int picLen;
char *pData=NULL;
struct fld_desc fldWork;
long long iLongField=0;
long long iLongWork;
extern long long _iIntValues_[MAX_INTEGERS];
unsigned int iLen;
#ifdef DEBUG_MOVE_RTS
{
extern int _iMoveLevel_;
fprintf(stderr, "Debug: Enter tcob_move_b_x (%d)\n", _iMoveLevel_++);
}
#endif
if(_iIntValues_[0] == (long long)-1) /* first time called */
initIntValues();
fldWork.type = DTYPE_DISPLAY;
fldWork.decimals = 0;
fldWork.pscale = 0;
fldWork.all = pfldDesc1->all;
fldWork.just_r = 0;
fldWork.separate_sign = 0;
fldWork.leading_sign = 0;
switch(pfldDesc1->len) {
case 1:
iLongField = *(char *)caData1;
iLen = 3;
break;
case 2:
iLongField = *(short int *)caData1;
iLen = 5;
break;
case 4:
iLongField = *(int *)caData1;
iLen = 10;
break;
case 8:
iLongField = *(long long *)caData1;
iLen = 18;
break;
}
fldWork.len = (pfldDesc2->len > iLen ? iLen: pfldDesc2->len);
picLen = tcob_picReqLen(2);
fldWork.pic = (char *)malloc(picLen);
tcob_picCreate (fldWork.pic, picLen, 'S', 1, '9', iLen, NULL);
pData = &caWork[MAX_INTEGERS - iLen];
if(iLongField < 0) {
bIsNegative = 1;
iLongField = iLongField * (long long)-1;
} else
bIsNegative = 0;
for(i = 0; i < MAX_INTEGERS; ++i) {
iLongWork = iLongField / _iIntValues_[i];
caWork[i] = (unsigned char)iLongWork + '0';
iLongField = iLongField - (_iIntValues_[i] * iLongWork);
}
tcob_put_sign(&fldWork, pData, bIsNegative);
tcob_move_9_x(&fldWork, pData, pfldDesc2, caData2);
#ifdef DEBUG_MOVE_RTS
{
extern int _iMoveLevel_;
fprintf(stderr, "Debug: Leaving tcob_move_b_x (%d)\n", --_iMoveLevel_);
_FLDDUMP_(pfldDesc1, caData1, "Source");
_FLDDUMP_(pfldDesc2, caData2, "Dest");
}
#endif
free(fldWork.pic);
return;
}