Blame libdecnumber/decContext.c

Packit 7cb7d8
/* Decimal context module for the decNumber C Library.
Packit 7cb7d8
   Copyright (C) 2005-2018 Free Software Foundation, Inc.
Packit 7cb7d8
   Contributed by IBM Corporation.  Author Mike Cowlishaw.
Packit 7cb7d8
Packit 7cb7d8
   This file is part of GCC.
Packit 7cb7d8
Packit 7cb7d8
   GCC is free software; you can redistribute it and/or modify it under
Packit 7cb7d8
   the terms of the GNU General Public License as published by the Free
Packit 7cb7d8
   Software Foundation; either version 3, or (at your option) any later
Packit 7cb7d8
   version.
Packit 7cb7d8
Packit 7cb7d8
   GCC is distributed in the hope that it will be useful, but WITHOUT ANY
Packit 7cb7d8
   WARRANTY; without even the implied warranty of MERCHANTABILITY or
Packit 7cb7d8
   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
Packit 7cb7d8
   for more details.
Packit 7cb7d8
Packit 7cb7d8
Under Section 7 of GPL version 3, you are granted additional
Packit 7cb7d8
permissions described in the GCC Runtime Library Exception, version
Packit 7cb7d8
3.1, as published by the Free Software Foundation.
Packit 7cb7d8
Packit 7cb7d8
You should have received a copy of the GNU General Public License and
Packit 7cb7d8
a copy of the GCC Runtime Library Exception along with this program;
Packit 7cb7d8
see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
Packit 7cb7d8
<http://www.gnu.org/licenses/>.  */
Packit 7cb7d8
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
/* Decimal Context module					      */
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
/* This module comprises the routines for handling arithmetic	      */
Packit 7cb7d8
/* context structures.						      */
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
Packit 7cb7d8
#include <string.h>	      /* for strcmp */
Packit 7cb7d8
#ifdef DECCHECK
Packit 7cb7d8
#include <stdio.h>	      /* for printf if DECCHECK */
Packit 7cb7d8
#endif
Packit 7cb7d8
#include "dconfig.h"	      /* for GCC definitions */
Packit 7cb7d8
#include "decContext.h"       /* context and base types */
Packit 7cb7d8
#include "decNumberLocal.h"   /* decNumber local types, etc. */
Packit 7cb7d8
Packit 7cb7d8
/* compile-time endian tester [assumes sizeof(Int)>1] */
Packit 7cb7d8
static	const  Int mfcone=1;		     /* constant 1 */
Packit 7cb7d8
static	const  Flag *mfctop=(const Flag *)&mfcone; /* -> top byte */
Packit 7cb7d8
#define LITEND *mfctop		   /* named flag; 1=little-endian */
Packit 7cb7d8
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
/* round-for-reround digits					      */
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
const uByte DECSTICKYTAB[10]={1,1,2,3,4,6,6,7,8,9}; /* used if sticky */
Packit 7cb7d8
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
/* Powers of ten (powers[n]==10**n, 0<=n<=9)			      */
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
const uInt DECPOWERS[10]={1, 10, 100, 1000, 10000, 100000, 1000000,
Packit 7cb7d8
			  10000000, 100000000, 1000000000};
Packit 7cb7d8
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
/* decContextClearStatus -- clear bits in current status	      */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/*  context is the context structure to be queried		      */
Packit 7cb7d8
/*  mask indicates the bits to be cleared (the status bit that	      */
Packit 7cb7d8
/*    corresponds to each 1 bit in the mask is cleared) 	      */
Packit 7cb7d8
/*  returns context						      */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/* No error is possible.					      */
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
decContext *decContextClearStatus(decContext *context, uInt mask) {
Packit 7cb7d8
  context->status&=~mask;
Packit 7cb7d8
  return context;
Packit 7cb7d8
  } /* decContextClearStatus */
Packit 7cb7d8
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
/* decContextDefault -- initialize a context structure		      */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/*  context is the structure to be initialized			      */
Packit 7cb7d8
/*  kind selects the required set of default values, one of:	      */
Packit 7cb7d8
/*	DEC_INIT_BASE	    -- select ANSI X3-274 defaults	      */
Packit 7cb7d8
/*	DEC_INIT_DECIMAL32  -- select IEEE 754 defaults, 32-bit       */
Packit 7cb7d8
/*	DEC_INIT_DECIMAL64  -- select IEEE 754 defaults, 64-bit       */
Packit 7cb7d8
/*	DEC_INIT_DECIMAL128 -- select IEEE 754 defaults, 128-bit      */
Packit 7cb7d8
/*	For any other value a valid context is returned, but with     */
Packit 7cb7d8
/*	Invalid_operation set in the status field.		      */
Packit 7cb7d8
/*  returns a context structure with the appropriate initial values.  */
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
decContext * decContextDefault(decContext *context, Int kind) {
Packit 7cb7d8
  /* set defaults... */
Packit 7cb7d8
  context->digits=9;			     /* 9 digits */
Packit 7cb7d8
  context->emax=DEC_MAX_EMAX;		     /* 9-digit exponents */
Packit 7cb7d8
  context->emin=DEC_MIN_EMIN;		     /* .. balanced */
Packit 7cb7d8
  context->round=DEC_ROUND_HALF_UP;	     /* 0.5 rises */
Packit 7cb7d8
  context->traps=DEC_Errors;		     /* all but informational */
Packit 7cb7d8
  context->status=0;			     /* cleared */
Packit 7cb7d8
  context->clamp=0;			     /* no clamping */
Packit 7cb7d8
  #if DECSUBSET
Packit 7cb7d8
  context->extended=0;			     /* cleared */
Packit 7cb7d8
  #endif
Packit 7cb7d8
  switch (kind) {
Packit 7cb7d8
    case DEC_INIT_BASE:
Packit 7cb7d8
      /* [use defaults] */
Packit 7cb7d8
      break;
Packit 7cb7d8
    case DEC_INIT_DECIMAL32:
Packit 7cb7d8
      context->digits=7;		     /* digits */
Packit 7cb7d8
      context->emax=96; 		     /* Emax */
Packit 7cb7d8
      context->emin=-95;		     /* Emin */
Packit 7cb7d8
      context->round=DEC_ROUND_HALF_EVEN;    /* 0.5 to nearest even */
Packit 7cb7d8
      context->traps=0; 		     /* no traps set */
Packit 7cb7d8
      context->clamp=1; 		     /* clamp exponents */
Packit 7cb7d8
      #if DECSUBSET
Packit 7cb7d8
      context->extended=1;		     /* set */
Packit 7cb7d8
      #endif
Packit 7cb7d8
      break;
Packit 7cb7d8
    case DEC_INIT_DECIMAL64:
Packit 7cb7d8
      context->digits=16;		     /* digits */
Packit 7cb7d8
      context->emax=384;		     /* Emax */
Packit 7cb7d8
      context->emin=-383;		     /* Emin */
Packit 7cb7d8
      context->round=DEC_ROUND_HALF_EVEN;    /* 0.5 to nearest even */
Packit 7cb7d8
      context->traps=0; 		     /* no traps set */
Packit 7cb7d8
      context->clamp=1; 		     /* clamp exponents */
Packit 7cb7d8
      #if DECSUBSET
Packit 7cb7d8
      context->extended=1;		     /* set */
Packit 7cb7d8
      #endif
Packit 7cb7d8
      break;
Packit 7cb7d8
    case DEC_INIT_DECIMAL128:
Packit 7cb7d8
      context->digits=34;		     /* digits */
Packit 7cb7d8
      context->emax=6144;		     /* Emax */
Packit 7cb7d8
      context->emin=-6143;		     /* Emin */
Packit 7cb7d8
      context->round=DEC_ROUND_HALF_EVEN;    /* 0.5 to nearest even */
Packit 7cb7d8
      context->traps=0; 		     /* no traps set */
Packit 7cb7d8
      context->clamp=1; 		     /* clamp exponents */
Packit 7cb7d8
      #if DECSUBSET
Packit 7cb7d8
      context->extended=1;		     /* set */
Packit 7cb7d8
      #endif
Packit 7cb7d8
      break;
Packit 7cb7d8
Packit 7cb7d8
    default:				     /* invalid Kind */
Packit 7cb7d8
      /* use defaults, and .. */
Packit 7cb7d8
      decContextSetStatus(context, DEC_Invalid_operation); /* trap */
Packit 7cb7d8
    }
Packit 7cb7d8
Packit 7cb7d8
  return context;} /* decContextDefault */
Packit 7cb7d8
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
/* decContextGetRounding -- return current rounding mode	      */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/*  context is the context structure to be queried		      */
Packit 7cb7d8
/*  returns the rounding mode					      */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/* No error is possible.					      */
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
enum rounding decContextGetRounding(decContext *context) {
Packit 7cb7d8
  return context->round;
Packit 7cb7d8
  } /* decContextGetRounding */
Packit 7cb7d8
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
/* decContextGetStatus -- return current status 		      */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/*  context is the context structure to be queried		      */
Packit 7cb7d8
/*  returns status						      */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/* No error is possible.					      */
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
uInt decContextGetStatus(decContext *context) {
Packit 7cb7d8
  return context->status;
Packit 7cb7d8
  } /* decContextGetStatus */
Packit 7cb7d8
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
/* decContextRestoreStatus -- restore bits in current status	      */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/*  context is the context structure to be updated		      */
Packit 7cb7d8
/*  newstatus is the source for the bits to be restored 	      */
Packit 7cb7d8
/*  mask indicates the bits to be restored (the status bit that       */
Packit 7cb7d8
/*    corresponds to each 1 bit in the mask is set to the value of    */
Packit 7cb7d8
/*    the correspnding bit in newstatus)			      */
Packit 7cb7d8
/*  returns context						      */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/* No error is possible.					      */
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
decContext *decContextRestoreStatus(decContext *context,
Packit 7cb7d8
				    uInt newstatus, uInt mask) {
Packit 7cb7d8
  context->status&=~mask;		/* clear the selected bits */
Packit 7cb7d8
  context->status|=(mask&newstatus);	/* or in the new bits */
Packit 7cb7d8
  return context;
Packit 7cb7d8
  } /* decContextRestoreStatus */
Packit 7cb7d8
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
/* decContextSaveStatus -- save bits in current status		      */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/*  context is the context structure to be queried		      */
Packit 7cb7d8
/*  mask indicates the bits to be saved (the status bits that	      */
Packit 7cb7d8
/*    correspond to each 1 bit in the mask are saved)		      */
Packit 7cb7d8
/*  returns the AND of the mask and the current status		      */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/* No error is possible.					      */
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
uInt decContextSaveStatus(decContext *context, uInt mask) {
Packit 7cb7d8
  return context->status&mas;;
Packit 7cb7d8
  } /* decContextSaveStatus */
Packit 7cb7d8
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
/* decContextSetRounding -- set current rounding mode		      */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/*  context is the context structure to be updated		      */
Packit 7cb7d8
/*  newround is the value which will replace the current mode	      */
Packit 7cb7d8
/*  returns context						      */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/* No error is possible.					      */
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
decContext *decContextSetRounding(decContext *context,
Packit 7cb7d8
				  enum rounding newround) {
Packit 7cb7d8
  context->round=newround;
Packit 7cb7d8
  return context;
Packit 7cb7d8
  } /* decContextSetRounding */
Packit 7cb7d8
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
/* decContextSetStatus -- set status and raise trap if appropriate    */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/*  context is the context structure to be updated		      */
Packit 7cb7d8
/*  status  is the DEC_ exception code				      */
Packit 7cb7d8
/*  returns the context structure				      */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/* Control may never return from this routine, if there is a signal   */
Packit 7cb7d8
/* handler and it takes a long jump.				      */
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
decContext * decContextSetStatus(decContext *context, uInt status) {
Packit 7cb7d8
  context->status|=status;
Packit 7cb7d8
  if (status & context->traps) raise(SIGFPE);
Packit 7cb7d8
  return context;} /* decContextSetStatus */
Packit 7cb7d8
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
/* decContextSetStatusFromString -- set status from a string + trap   */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/*  context is the context structure to be updated		      */
Packit 7cb7d8
/*  string is a string exactly equal to one that might be returned    */
Packit 7cb7d8
/*	      by decContextStatusToString			      */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/*  The status bit corresponding to the string is set, and a trap     */
Packit 7cb7d8
/*  is raised if appropriate.					      */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/*  returns the context structure, unless the string is equal to      */
Packit 7cb7d8
/*    DEC_Condition_MU or is not recognized.  In these cases NULL is  */
Packit 7cb7d8
/*    returned. 						      */
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
decContext * decContextSetStatusFromString(decContext *context,
Packit 7cb7d8
					   const char *string) {
Packit 7cb7d8
  if (strcmp(string, DEC_Condition_CS)==0)
Packit 7cb7d8
    return decContextSetStatus(context, DEC_Conversion_syntax);
Packit 7cb7d8
  if (strcmp(string, DEC_Condition_DZ)==0)
Packit 7cb7d8
    return decContextSetStatus(context, DEC_Division_by_zero);
Packit 7cb7d8
  if (strcmp(string, DEC_Condition_DI)==0)
Packit 7cb7d8
    return decContextSetStatus(context, DEC_Division_impossible);
Packit 7cb7d8
  if (strcmp(string, DEC_Condition_DU)==0)
Packit 7cb7d8
    return decContextSetStatus(context, DEC_Division_undefined);
Packit 7cb7d8
  if (strcmp(string, DEC_Condition_IE)==0)
Packit 7cb7d8
    return decContextSetStatus(context, DEC_Inexact);
Packit 7cb7d8
  if (strcmp(string, DEC_Condition_IS)==0)
Packit 7cb7d8
    return decContextSetStatus(context, DEC_Insufficient_storage);
Packit 7cb7d8
  if (strcmp(string, DEC_Condition_IC)==0)
Packit 7cb7d8
    return decContextSetStatus(context, DEC_Invalid_context);
Packit 7cb7d8
  if (strcmp(string, DEC_Condition_IO)==0)
Packit 7cb7d8
    return decContextSetStatus(context, DEC_Invalid_operation);
Packit 7cb7d8
  #if DECSUBSET
Packit 7cb7d8
  if (strcmp(string, DEC_Condition_LD)==0)
Packit 7cb7d8
    return decContextSetStatus(context, DEC_Lost_digits);
Packit 7cb7d8
  #endif
Packit 7cb7d8
  if (strcmp(string, DEC_Condition_OV)==0)
Packit 7cb7d8
    return decContextSetStatus(context, DEC_Overflow);
Packit 7cb7d8
  if (strcmp(string, DEC_Condition_PA)==0)
Packit 7cb7d8
    return decContextSetStatus(context, DEC_Clamped);
Packit 7cb7d8
  if (strcmp(string, DEC_Condition_RO)==0)
Packit 7cb7d8
    return decContextSetStatus(context, DEC_Rounded);
Packit 7cb7d8
  if (strcmp(string, DEC_Condition_SU)==0)
Packit 7cb7d8
    return decContextSetStatus(context, DEC_Subnormal);
Packit 7cb7d8
  if (strcmp(string, DEC_Condition_UN)==0)
Packit 7cb7d8
    return decContextSetStatus(context, DEC_Underflow);
Packit 7cb7d8
  if (strcmp(string, DEC_Condition_ZE)==0)
Packit 7cb7d8
    return context;
Packit 7cb7d8
  return NULL;	/* Multiple status, or unknown */
Packit 7cb7d8
  } /* decContextSetStatusFromString */
Packit 7cb7d8
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
/* decContextSetStatusFromStringQuiet -- set status from a string     */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/*  context is the context structure to be updated		      */
Packit 7cb7d8
/*  string is a string exactly equal to one that might be returned    */
Packit 7cb7d8
/*	      by decContextStatusToString			      */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/*  The status bit corresponding to the string is set; no trap is     */
Packit 7cb7d8
/*  raised.							      */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/*  returns the context structure, unless the string is equal to      */
Packit 7cb7d8
/*    DEC_Condition_MU or is not recognized.  In these cases NULL is  */
Packit 7cb7d8
/*    returned. 						      */
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
decContext * decContextSetStatusFromStringQuiet(decContext *context,
Packit 7cb7d8
						const char *string) {
Packit 7cb7d8
  if (strcmp(string, DEC_Condition_CS)==0)
Packit 7cb7d8
    return decContextSetStatusQuiet(context, DEC_Conversion_syntax);
Packit 7cb7d8
  if (strcmp(string, DEC_Condition_DZ)==0)
Packit 7cb7d8
    return decContextSetStatusQuiet(context, DEC_Division_by_zero);
Packit 7cb7d8
  if (strcmp(string, DEC_Condition_DI)==0)
Packit 7cb7d8
    return decContextSetStatusQuiet(context, DEC_Division_impossible);
Packit 7cb7d8
  if (strcmp(string, DEC_Condition_DU)==0)
Packit 7cb7d8
    return decContextSetStatusQuiet(context, DEC_Division_undefined);
Packit 7cb7d8
  if (strcmp(string, DEC_Condition_IE)==0)
Packit 7cb7d8
    return decContextSetStatusQuiet(context, DEC_Inexact);
Packit 7cb7d8
  if (strcmp(string, DEC_Condition_IS)==0)
Packit 7cb7d8
    return decContextSetStatusQuiet(context, DEC_Insufficient_storage);
Packit 7cb7d8
  if (strcmp(string, DEC_Condition_IC)==0)
Packit 7cb7d8
    return decContextSetStatusQuiet(context, DEC_Invalid_context);
Packit 7cb7d8
  if (strcmp(string, DEC_Condition_IO)==0)
Packit 7cb7d8
    return decContextSetStatusQuiet(context, DEC_Invalid_operation);
Packit 7cb7d8
  #if DECSUBSET
Packit 7cb7d8
  if (strcmp(string, DEC_Condition_LD)==0)
Packit 7cb7d8
    return decContextSetStatusQuiet(context, DEC_Lost_digits);
Packit 7cb7d8
  #endif
Packit 7cb7d8
  if (strcmp(string, DEC_Condition_OV)==0)
Packit 7cb7d8
    return decContextSetStatusQuiet(context, DEC_Overflow);
Packit 7cb7d8
  if (strcmp(string, DEC_Condition_PA)==0)
Packit 7cb7d8
    return decContextSetStatusQuiet(context, DEC_Clamped);
Packit 7cb7d8
  if (strcmp(string, DEC_Condition_RO)==0)
Packit 7cb7d8
    return decContextSetStatusQuiet(context, DEC_Rounded);
Packit 7cb7d8
  if (strcmp(string, DEC_Condition_SU)==0)
Packit 7cb7d8
    return decContextSetStatusQuiet(context, DEC_Subnormal);
Packit 7cb7d8
  if (strcmp(string, DEC_Condition_UN)==0)
Packit 7cb7d8
    return decContextSetStatusQuiet(context, DEC_Underflow);
Packit 7cb7d8
  if (strcmp(string, DEC_Condition_ZE)==0)
Packit 7cb7d8
    return context;
Packit 7cb7d8
  return NULL;	/* Multiple status, or unknown */
Packit 7cb7d8
  } /* decContextSetStatusFromStringQuiet */
Packit 7cb7d8
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
/* decContextSetStatusQuiet -- set status without trap		      */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/*  context is the context structure to be updated		      */
Packit 7cb7d8
/*  status  is the DEC_ exception code				      */
Packit 7cb7d8
/*  returns the context structure				      */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/* No error is possible.					      */
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
decContext * decContextSetStatusQuiet(decContext *context, uInt status) {
Packit 7cb7d8
  context->status|=status;
Packit 7cb7d8
  return context;} /* decContextSetStatusQuiet */
Packit 7cb7d8
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
/* decContextStatusToString -- convert status flags to a string       */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/*  context is a context with valid status field		      */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/*  returns a constant string describing the condition.  If multiple  */
Packit 7cb7d8
/*    (or no) flags are set, a generic constant message is returned.  */
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
const char *decContextStatusToString(const decContext *context) {
Packit 7cb7d8
  Int status=context->status;
Packit 7cb7d8
Packit 7cb7d8
  /* test the five IEEE first, as some of the others are ambiguous when */
Packit 7cb7d8
  /* DECEXTFLAG=0 */
Packit 7cb7d8
  if (status==DEC_Invalid_operation    ) return DEC_Condition_IO;
Packit 7cb7d8
  if (status==DEC_Division_by_zero     ) return DEC_Condition_DZ;
Packit 7cb7d8
  if (status==DEC_Overflow	       ) return DEC_Condition_OV;
Packit 7cb7d8
  if (status==DEC_Underflow	       ) return DEC_Condition_UN;
Packit 7cb7d8
  if (status==DEC_Inexact	       ) return DEC_Condition_IE;
Packit 7cb7d8
Packit 7cb7d8
  if (status==DEC_Division_impossible  ) return DEC_Condition_DI;
Packit 7cb7d8
  if (status==DEC_Division_undefined   ) return DEC_Condition_DU;
Packit 7cb7d8
  if (status==DEC_Rounded	       ) return DEC_Condition_RO;
Packit 7cb7d8
  if (status==DEC_Clamped	       ) return DEC_Condition_PA;
Packit 7cb7d8
  if (status==DEC_Subnormal	       ) return DEC_Condition_SU;
Packit 7cb7d8
  if (status==DEC_Conversion_syntax    ) return DEC_Condition_CS;
Packit 7cb7d8
  if (status==DEC_Insufficient_storage ) return DEC_Condition_IS;
Packit 7cb7d8
  if (status==DEC_Invalid_context      ) return DEC_Condition_IC;
Packit 7cb7d8
  #if DECSUBSET
Packit 7cb7d8
  if (status==DEC_Lost_digits	       ) return DEC_Condition_LD;
Packit 7cb7d8
  #endif
Packit 7cb7d8
  if (status==0 		       ) return DEC_Condition_ZE;
Packit 7cb7d8
  return DEC_Condition_MU;  /* Multiple errors */
Packit 7cb7d8
  } /* decContextStatusToString */
Packit 7cb7d8
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
/* decContextTestEndian -- test whether DECLITEND is set correctly    */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/*  quiet is 1 to suppress message; 0 otherwise 		      */
Packit 7cb7d8
/*  returns 0 if DECLITEND is correct				      */
Packit 7cb7d8
/*	    1 if DECLITEND is incorrect and should be 1 	      */
Packit 7cb7d8
/*	   -1 if DECLITEND is incorrect and should be 0 	      */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/* A message is displayed if the return value is not 0 and quiet==0.  */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/* No error is possible.					      */
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
Int decContextTestEndian(Flag quiet) {
Packit 7cb7d8
  Int res=0;		      /* optimist */
Packit 7cb7d8
  uInt dle=(uInt)DECLITEND;   /* unsign */
Packit 7cb7d8
  if (dle>1) dle=1;	      /* ensure 0 or 1 */
Packit 7cb7d8
Packit 7cb7d8
  if (LITEND!=DECLITEND) {
Packit 7cb7d8
    if (!quiet) {
Packit 7cb7d8
#if DECCHECK
Packit 7cb7d8
      const char *adj;
Packit 7cb7d8
      if (LITEND) adj="little";
Packit 7cb7d8
	     else adj="big";
Packit 7cb7d8
      printf("Warning: DECLITEND is set to %d, but this computer appears to be %s-endian\n",
Packit 7cb7d8
	     DECLITEND, adj);
Packit 7cb7d8
#endif
Packit 7cb7d8
      }
Packit 7cb7d8
    res=(Int)LITEND-dle;
Packit 7cb7d8
    }
Packit 7cb7d8
  return res;
Packit 7cb7d8
  } /* decContextTestEndian */
Packit 7cb7d8
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
/* decContextTestSavedStatus -- test bits in saved status	      */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/*  oldstatus is the status word to be tested			      */
Packit 7cb7d8
/*  mask indicates the bits to be tested (the oldstatus bits that     */
Packit 7cb7d8
/*    correspond to each 1 bit in the mask are tested)		      */
Packit 7cb7d8
/*  returns 1 if any of the tested bits are 1, or 0 otherwise	      */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/* No error is possible.					      */
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
uInt decContextTestSavedStatus(uInt oldstatus, uInt mask) {
Packit 7cb7d8
  return (oldstatus&mask)!=0;
Packit 7cb7d8
  } /* decContextTestSavedStatus */
Packit 7cb7d8
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
/* decContextTestStatus -- test bits in current status		      */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/*  context is the context structure to be updated		      */
Packit 7cb7d8
/*  mask indicates the bits to be tested (the status bits that	      */
Packit 7cb7d8
/*    correspond to each 1 bit in the mask are tested)		      */
Packit 7cb7d8
/*  returns 1 if any of the tested bits are 1, or 0 otherwise	      */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/* No error is possible.					      */
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
uInt decContextTestStatus(decContext *context, uInt mask) {
Packit 7cb7d8
  return (context->status&mask)!=0;
Packit 7cb7d8
  } /* decContextTestStatus */
Packit 7cb7d8
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
/* decContextZeroStatus -- clear all status bits		      */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/*  context is the context structure to be updated		      */
Packit 7cb7d8
/*  returns context						      */
Packit 7cb7d8
/*								      */
Packit 7cb7d8
/* No error is possible.					      */
Packit 7cb7d8
/* ------------------------------------------------------------------ */
Packit 7cb7d8
decContext *decContextZeroStatus(decContext *context) {
Packit 7cb7d8
  context->status=0;
Packit 7cb7d8
  return context;
Packit 7cb7d8
  } /* decContextZeroStatus */
Packit 7cb7d8