campo-sirio/gfm/divarrd.c

91 lines
1.8 KiB
C
Raw Normal View History

/* DEC **DivideDecimalArrayByDecimal(pDst,pSrc1,pSrc2,n)
*
* ARGUMENT
* pDst is a ptr to the array of destination DEC pointers.
* pSrc1 is a ptr to the arrays of source DEC pointers
* pSrc2 is a ptr to another DEC.
* n is the number of elements in pSrc
*
* DESCRIPTION
* Sets pDst[i] = pSrc1[i] / pSrc2. If pDst is null, tries to create a
* DEC structure, then divide. If some of the pSrc structures
* are null, the non-null ones are still divided.
*
* SIDE EFFECTS
* None.
*
* RETURNS
* Returns pointer to the new structure if successful, otherwise
* returns GM_NULLARR.
*
* POSSIBLE ERROR CODES
*
* GM_NULLPOINTER
* GM_OVERFLOW
* GM_UNDERFLOW
* GM_DIV0
* GM_ARGVAL
*
* AUTHOR
* Jared Levy
* Copyright (C) 1987-1990 Greenleaf Software Inc. All rights reserved.
*
* MODIFICATIONS
*
*/
#include <stdio.h>
#include "gm.h"
#include "gmsystem.h"
DEC **DivideDecimalArrayByDecimal(pDst,pSrc1,pSrc2,n)
DEC **pDst;
DEC **pSrc1, *pSrc2;
int n;
{
int i;
DEC dcop2, *cop2=&dcop2;
mbool copyback;
/* source must be supplied !! */
_MacStart(GM_DIVARRD);
_MacInVar(pSrc2, GM_NULLARR);
if (!pSrc1 || !pDst) {
_MacErr(GM_NULLPOINTER);
_MacRet(GM_NULLARR);
}
if (n<0) {
_MacErr(GM_ARGVAL);
_MacRet(GM_NULLARR);
}
/* if pSrc2 is 0, call error routine once */
if (_MacIsDecZ(pSrc2)) {
_MacErr(GM_DIV0);
_MacRet(GM_NULLARR);
}
/* Copy Src2 in case it is part of destination array */
_MacDCopy(cop2, pSrc2);
/* check if backwards copy is necessary */
copyback=(pDst > pSrc1);
/* Divide the numbers */
i = copyback ? n-1 : 0;
while ((i<n) && (i>=0)) {
(void) DivideDecimal(pDst[i], pSrc1[i], cop2);
/* DivideDecimal sets the error flag each time an error occurs */
if (copyback)
i--;
else
i++;
}
_MacRet(pDst);
}