github.com/matrixorigin/matrixone@v0.7.0/cgo/external/decNumber/example4.c (about) 1 /* ------------------------------------------------------------------ */ 2 /* Decimal Number Library Demonstration program */ 3 /* ------------------------------------------------------------------ */ 4 /* Copyright (c) IBM Corporation, 2001. All rights reserved. */ 5 /* ----------------------------------------------------------------+- */ 6 /* right margin -->| */ 7 8 // example4.c -- add two numbers, active error handling 9 // Arguments are two numbers 10 11 #define DECNUMDIGITS 38 // work with up to 38 digits 12 #include "decNumber.h" // base number library 13 #include <stdio.h> // for printf 14 15 // [snip... 16 #include <signal.h> // signal handling 17 #include <setjmp.h> // setjmp/longjmp 18 19 jmp_buf preserve; // stack snapshot 20 21 void signalHandler(int); // prototype for GCC 22 void signalHandler(int sig) { 23 signal(SIGFPE, signalHandler); // re-enable 24 longjmp(preserve, sig); // branch to preserved point 25 } 26 // ...snip] 27 int main(int argc, char *argv[]) { 28 decNumber a, b; // working numbers 29 decContext set; // working context 30 char string[DECNUMDIGITS+14]; // conversion buffer 31 int value; // work variable 32 33 if (argc<3) { // not enough words 34 printf("Please supply two numbers to add.\n"); 35 return 1; 36 } 37 decContextDefault(&set, DEC_INIT_BASE); // initialize 38 39 // [snip... 40 signal(SIGFPE, signalHandler); // set up signal handler 41 value=setjmp(preserve); // preserve and test environment 42 if (value) { // (non-0 after longjmp) 43 set.status &= DEC_Errors; // keep only errors 44 printf("Signal trapped [%s].\n", decContextStatusToString(&set)); 45 return 1; 46 } 47 // ...snip] 48 49 // [change from Example 1, here] 50 // leave traps enabled 51 set.digits=DECNUMDIGITS; // set precision 52 53 decNumberFromString(&a, argv[1], &set); 54 decNumberFromString(&b, argv[2], &set); 55 56 decNumberAdd(&a, &a, &b, &set); // A=A+B 57 decNumberToString(&a, string); 58 59 printf("%s + %s => %s\n", argv[1], argv[2], string); 60 return 0; 61 } // main