1 /* $NetBSD: bn_mp_init_multi.c,v 1.1.1.1 2011/04/13 18:14:54 elric Exp $ */ 2 3 #include <tommath.h> 4 #ifdef BN_MP_INIT_MULTI_C 5 /* LibTomMath, multiple-precision integer library -- Tom St Denis 6 * 7 * LibTomMath is a library that provides multiple-precision 8 * integer arithmetic as well as number theoretic functionality. 9 * 10 * The library was designed directly after the MPI library by 11 * Michael Fromberger but has been written from scratch with 12 * additional optimizations in place. 13 * 14 * The library is free for all purposes without any express 15 * guarantee it works. 16 * 17 * Tom St Denis, tomstdenis@gmail.com, http://libtom.org 18 */ 19 #include <stdarg.h> 20 21 int mp_init_multi(mp_int *mp, ...) 22 { 23 mp_err res = MP_OKAY; /* Assume ok until proven otherwise */ 24 int n = 0; /* Number of ok inits */ 25 mp_int* cur_arg = mp; 26 va_list args; 27 28 va_start(args, mp); /* init args to next argument from caller */ 29 while (cur_arg != NULL) { 30 if (mp_init(cur_arg) != MP_OKAY) { 31 /* Oops - error! Back-track and mp_clear what we already 32 succeeded in init-ing, then return error. 33 */ 34 va_list clean_args; 35 36 /* end the current list */ 37 va_end(args); 38 39 /* now start cleaning up */ 40 cur_arg = mp; 41 va_start(clean_args, mp); 42 while (n--) { 43 mp_clear(cur_arg); 44 cur_arg = va_arg(clean_args, mp_int*); 45 } 46 va_end(clean_args); 47 res = MP_MEM; 48 break; 49 } 50 n++; 51 cur_arg = va_arg(args, mp_int*); 52 } 53 va_end(args); 54 return res; /* Assumed ok, if error flagged above. */ 55 } 56 57 #endif 58 59 /* Source: /cvs/libtom/libtommath/bn_mp_init_multi.c,v */ 60 /* Revision: 1.4 */ 61 /* Date: 2006/12/28 01:25:13 */ 62