62 lines
2.3 KiB
C
Vendored
62 lines
2.3 KiB
C
Vendored
/* ------------------------------------------------------------------ */
|
|
/* Decimal Number Library Demonstration program */
|
|
/* ------------------------------------------------------------------ */
|
|
/* Copyright (c) IBM Corporation, 2001. All rights reserved. */
|
|
/* ----------------------------------------------------------------+- */
|
|
/* right margin -->| */
|
|
|
|
// example4.c -- add two numbers, active error handling
|
|
// Arguments are two numbers
|
|
|
|
#define DECNUMDIGITS 38 // work with up to 38 digits
|
|
#include "decNumber.h" // base number library
|
|
#include <stdio.h> // for printf
|
|
|
|
// [snip...
|
|
#include <signal.h> // signal handling
|
|
#include <setjmp.h> // setjmp/longjmp
|
|
|
|
jmp_buf preserve; // stack snapshot
|
|
|
|
void signalHandler(int); // prototype for GCC
|
|
void signalHandler(int sig) {
|
|
signal(SIGFPE, signalHandler); // re-enable
|
|
longjmp(preserve, sig); // branch to preserved point
|
|
}
|
|
// ...snip]
|
|
int main(int argc, char *argv[]) {
|
|
decNumber a, b; // working numbers
|
|
decContext set; // working context
|
|
char string[DECNUMDIGITS+14]; // conversion buffer
|
|
int value; // work variable
|
|
|
|
if (argc<3) { // not enough words
|
|
printf("Please supply two numbers to add.\n");
|
|
return 1;
|
|
}
|
|
decContextDefault(&set, DEC_INIT_BASE); // initialize
|
|
|
|
// [snip...
|
|
signal(SIGFPE, signalHandler); // set up signal handler
|
|
value=setjmp(preserve); // preserve and test environment
|
|
if (value) { // (non-0 after longjmp)
|
|
set.status &= DEC_Errors; // keep only errors
|
|
printf("Signal trapped [%s].\n", decContextStatusToString(&set));
|
|
return 1;
|
|
}
|
|
// ...snip]
|
|
|
|
// [change from Example 1, here]
|
|
// leave traps enabled
|
|
set.digits=DECNUMDIGITS; // set precision
|
|
|
|
decNumberFromString(&a, argv[1], &set);
|
|
decNumberFromString(&b, argv[2], &set);
|
|
|
|
decNumberAdd(&a, &a, &b, &set); // A=A+B
|
|
decNumberToString(&a, string);
|
|
|
|
printf("%s + %s => %s\n", argv[1], argv[2], string);
|
|
return 0;
|
|
} // main
|