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