Edit

kc3-lang/libtommath/bn_mp_init_multi.c

Branch :

  • Show log

    Commit

  • Author : Tom St Denis
    Date : 2007-04-18 09:58:18
    Hash : 333aebc8
    Message : added libtommath-0.41

  • bn_mp_init_multi.c
  • #include <tommath.h>
    #ifdef BN_MP_INIT_MULTI_C
    /* LibTomMath, multiple-precision integer library -- Tom St Denis
     *
     * LibTomMath is a library that provides multiple-precision
     * integer arithmetic as well as number theoretic functionality.
     *
     * The library was designed directly after the MPI library by
     * Michael Fromberger but has been written from scratch with
     * additional optimizations in place.
     *
     * The library is free for all purposes without any express
     * guarantee it works.
     *
     * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
     */
    #include <stdarg.h>
    
    int mp_init_multi(mp_int *mp, ...) 
    {
        mp_err res = MP_OKAY;      /* Assume ok until proven otherwise */
        int n = 0;                 /* Number of ok inits */
        mp_int* cur_arg = mp;
        va_list args;
    
        va_start(args, mp);        /* init args to next argument from caller */
        while (cur_arg != NULL) {
            if (mp_init(cur_arg) != MP_OKAY) {
                /* Oops - error! Back-track and mp_clear what we already
                   succeeded in init-ing, then return error.
                */
                va_list clean_args;
                
                /* end the current list */
                va_end(args);
                
                /* now start cleaning up */            
                cur_arg = mp;
                va_start(clean_args, mp);
                while (n--) {
                    mp_clear(cur_arg);
                    cur_arg = va_arg(clean_args, mp_int*);
                }
                va_end(clean_args);
                res = MP_MEM;
                break;
            }
            n++;
            cur_arg = va_arg(args, mp_int*);
        }
        va_end(args);
        return res;                /* Assumed ok, if error flagged above. */
    }
    
    #endif
    
    /* $Source$ */
    /* $Revision$ */
    /* $Date$ */