// // 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" extern int bDecimalComma; //#define DEBUG_MOVE_RTS 1 /*--------------------------------------------------------------------------*\ | | | Move routines where the source field is DTYPE_BINARY | | | \*--------------------------------------------------------------------------*/ void tcob_move_f_9(struct fld_desc *pfldDesc1, char *caData1, struct fld_desc *pfldDesc2, char *caData2) { char caWork[MAX_INTEGERS + MAX_DECIMALS + 2]; unsigned int picLen; char caFormat[20]; struct fld_desc fldWork; double dWork=0; #ifdef DEBUG_MOVE_RTS { extern int _iMoveLevel_; fprintf(stderr, "Debug: Enter tcob_move_f_9 (%d)\n", _iMoveLevel_++); } #endif fldWork.type = DTYPE_ALPHANUMERIC; 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 4: dWork = (double)(*(float *)caData1); break; case 8: dWork = *(double *)caData1; break; } // The following statements are wrong: the first one because it doesn't // allow more than 6 decimal places, the second because it rounds before // formatting. We have to design our own sprintf in the spirit of what is // done in dtofld. sprintf(caFormat, "%%%df", MAX_DIGITS); // sprintf(caFormat, "%%%d.%df", MAX_DIGITS, pfldDesc2->decimals+1); sprintf(caWork, caFormat, dWork); // If decimal point is comma, replace point by comma. fldWork.len = strlen(caWork); if (bDecimalComma){ unsigned int i; for(i=0;iall; fldWork.just_r = 0; fldWork.separate_sign = 0; fldWork.leading_sign = 0; switch(pfldDesc1->len) { case 4: dWork = (double)(*(float *)caData1); break; case 8: dWork = *(double *)caData1; break; } sprintf(caFormat, "%%%df", MAX_DIGITS); sprintf(caWork, caFormat, dWork); fldWork.len = strlen(caWork); picLen = tcob_picReqLen(1); fldWork.pic = (char *)malloc(picLen); tcob_picCreate (fldWork.pic, picLen, 'X', fldWork.len, NULL); tcob_move_x_b(&fldWork, caWork, pfldDesc2, caData2); #ifdef DEBUG_MOVE_RTS { extern int _iMoveLevel_; fprintf(stderr, "Debug: Leaving tcob_move_f_b (%d)\n", --_iMoveLevel_); _FLDDUMP_(pfldDesc1, caData1, "Source"); _FLDDUMP_(pfldDesc2, caData2, "Dest"); } #endif free(fldWork.pic); return; } void tcob_move_f_c(struct fld_desc *pfldDesc1, char *caData1, struct fld_desc *pfldDesc2, char *caData2) { char caWork[MAX_INTEGERS + MAX_DECIMALS + 2]; unsigned int picLen; char caFormat[20]; struct fld_desc fldWork; double dWork=0; #ifdef DEBUG_MOVE_RTS { extern int _iMoveLevel_; fprintf(stderr, "Debug: Enter tcob_move_f_c (%d)\n", _iMoveLevel_++); } #endif fldWork.type = DTYPE_ALPHANUMERIC; 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 4: dWork = (double)(*(float *)caData1); break; case 8: dWork = *(double *)caData1; break; } sprintf(caFormat, "%%%df", MAX_DIGITS); sprintf(caWork, caFormat, dWork); fldWork.len = strlen(caWork); picLen = tcob_picReqLen(1); fldWork.pic = (char *)malloc(picLen); tcob_picCreate (fldWork.pic, picLen, 'X', fldWork.len, NULL); tcob_move_x_c(&fldWork, caWork, pfldDesc2, caData2); #ifdef DEBUG_MOVE_RTS { extern int _iMoveLevel_; fprintf(stderr, "Debug: Leaving tcob_move_f_c (%d)\n", --_iMoveLevel_); _FLDDUMP_(pfldDesc1, caData1, "Source"); _FLDDUMP_(pfldDesc2, caData2, "Dest"); } #endif free(fldWork.pic); return; } void tcob_move_f_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_f_e (%d)\n", _iMoveLevel_++); } #endif tcob_move_edited(pfldDesc1, caData1, pfldDesc2, caData2); #ifdef DEBUG_MOVE_RTS { extern int _iMoveLevel_; fprintf(stderr, "Debug: Leaving tcob_move_f_e (%d)\n", --_iMoveLevel_); _FLDDUMP_(pfldDesc1, caData1, "Source"); _FLDDUMP_(pfldDesc2, caData2, "Dest"); } #endif return; } void tcob_move_f_f(struct fld_desc *pfldDesc1, char *caData1, struct fld_desc *pfldDesc2, char *caData2) { double dWork=0; #ifdef DEBUG_MOVE_RTS { extern int _iMoveLevel_; fprintf(stderr, "Debug: Enter tcob_move_f_f (%d)\n", _iMoveLevel_++); } #endif switch(pfldDesc1->len) { case 4: dWork = (double)(*(float *)caData1); break; case 8: dWork = *(double *)caData1; break; } switch(pfldDesc2->len) { case 4: *(float *)caData2 = (float)dWork; break; case 8: *(double *)caData2 = dWork; } #ifdef DEBUG_MOVE_RTS { extern int _iMoveLevel_; fprintf(stderr, "Debug: Leaving tcob_move_f_f (%d)\n", --_iMoveLevel_); _FLDDUMP_(pfldDesc1, caData1, "Source"); _FLDDUMP_(pfldDesc2, caData2, "Dest"); } #endif return; } void tcob_move_f_x(struct fld_desc *pfldDesc1, char *caData1, struct fld_desc *pfldDesc2, char *caData2) { char caWork[MAX_INTEGERS + MAX_DECIMALS + 2]; unsigned int picLen; char caFormat[20]; struct fld_desc fldWork; double dWork=0; unsigned int i, j; #ifdef DEBUG_MOVE_RTS { extern int _iMoveLevel_; fprintf(stderr, "Debug: Enter tcob_move_f_x (%d)\n", _iMoveLevel_++); } #endif fldWork.type = DTYPE_ALPHANUMERIC; 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 4: dWork = (double)(*(float *)caData1); break; case 8: dWork = *(double *)caData1; break; } sprintf(caFormat, "%%%df", MAX_DIGITS); sprintf(caWork, caFormat, dWork); #ifdef DEBUG_MOVE_RTS fprintf(stderr, "Debug tcob_move_f_x 0 : caWork=%s:\n", caWork); #endif // Remove sign and decimal point fldWork.len = strlen(caWork); for (i=0, j=0; i