[ < ] | [ > ] |  | [ << ] | [ Up ] | [ >> ] |  |  |  |  | [Top] | [Contents] | [Index] | [ ? ]

# 12. Customizing

[ < ] | [ > ] |  | [ << ] | [ Up ] | [ >> ] |  |  |  |  | [Top] | [Contents] | [Index] | [ ? ]

## 12.1 Error handling

CLN signals abnormal situations by throwning exceptions. All exceptions thrown by the library are of type `runtime_exception` or of a derived type. Class `cln::runtime_exception` in turn is derived from the C++ standard library class `std::runtime_error` and inherits the `.what()` member function that can be used to query details about the cause of error.

The most important classes thrown by the library are

                      Exception base class
                        runtime_exception
                        <cln/exception.h>
                                |
               +----------------+----------------+
               |                                 |
     Malformed number input             Floating-point error
     read_number_exception            floating_poing_exception
       <cln/number_io.h>                   <cln/float.h>

CLN has many more exception classes that allow for more fine-grained control but I refrain from documenting them all here. They are all declared in the public header files and they are all subclasses of the above exceptions, so catching those you are always on the safe side.

[ < ] | [ > ] |  | [ << ] | [ Up ] | [ >> ] |  |  |  |  | [Top] | [Contents] | [Index] | [ ? ]

## 12.2 Floating-point underflow

Floating point underflow denotes the situation when a floating-point number is to be created which is so close to `0` that its exponent is too low to be represented internally. By default, this causes the exception `floating_point_underflow_exception` (subclass of `floating_point_exception`) to be thrown. If you set the global variable

    bool cl_inhibit_floating_point_underflow

to `true`, the exception will be inhibited, and a floating-point zero will be generated instead. The default value of `cl_inhibit_floating_point_underflow` is `false`.

[ < ] | [ > ] |  | [ << ] | [ Up ] | [ >> ] |  |  |  |  | [Top] | [Contents] | [Index] | [ ? ]

## 12.3 Customizing I/O

The output of the function `fprint` may be customized by changing the value of the global variable `default_print_flags`.

[ < ] | [ > ] |  | [ << ] | [ Up ] | [ >> ] |  |  |  |  | [Top] | [Contents] | [Index] | [ ? ]

## 12.4 Customizing the memory allocator

Every memory allocation of CLN is done through the function pointer `malloc_hook`. Freeing of this memory is done through the function pointer `free_hook`. The default versions of these functions, provided in the library, call `malloc` and `free` and check the `malloc` result against `NULL`. If you want to provide another memory allocator, you need to define the variables `malloc_hook` and `free_hook` yourself, like this:

    #include <cln/malloc.h>
    namespace cln {
            void* (*malloc_hook) (size_t size) = …;
            void (*free_hook) (void* ptr)      = …;
    }

The `cl_malloc_hook` function must not return a `NULL` pointer.

It is not possible to change the memory allocator at runtime, because it is already called at program startup by the constructors of some global variables.

[ << ] | [ >> ] |  |  |  |  |  | [Top] | [Contents] | [Index] | [ ? ]

This document was generated by Richard B. Kreckel on April, 5 2008 using texi2html 1.76.