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