File: example4.c

package info (click to toggle)
tarantool 2.6.0-1.4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 85,412 kB
  • sloc: ansic: 513,775; cpp: 69,493; sh: 25,650; python: 19,190; perl: 14,973; makefile: 4,178; yacc: 1,329; sql: 1,074; pascal: 620; ruby: 190; awk: 18; lisp: 7
file content (61 lines) | stat: -rw-r--r-- 2,244 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/* ------------------------------------------------------------------ */
/* 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