Diff
Not logged in

Differences From Artifact [a6ec6d7c91]:

To Artifact [b840bb12ba]:


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
62
63
64
65








66
67
68
69
70
71
72
73
74
75









76
77
78
79
80
81





82
83
84
85
86
87
88






89
90
91
92
93
94





95
96
97


98
99
100
101
102
103





104
105

106
107
108
109
110
111
112
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
62
63
64
65









66
67
68
69
70
71
72
73
74
75





76
77
78
79
80
81






82
83
84
85
86
87
88





89
90
91
92
93
94


95
96
97





98
99
100
101
102
103

104
105
106
107
108
109
110
111







-
-
+

-
-
+
+

-
-
-
-
-
-
+
+
+
+
+
+

-
-
-
-
+
+
+
+

-
-
+
+

-
-
+
+

-
-
+
+

-
-
+
+

-
-
+
+

-
-
+
+

-
-
+
+

-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+

-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+

-
-
-
-
-
+
+
+
+
+

-
-
-
-
-
-
+
+
+
+
+
+

-
-
-
-
-
+
+
+
+
+

-
-
+
+

-
-
-
-
-
+
+
+
+
+

-
+







 * The library is free for all purposes without any express
 * guarantee it works.
 *
 * Tom St Denis, tstdenis82@gmail.com, http://libtom.org
 */

/* single digit addition */
int
mp_add_d (mp_int * a, mp_digit b, mp_int * c)
int mp_add_d(mp_int *a, mp_digit b, mp_int *c)
{
  int     res, ix, oldused;
  mp_digit *tmpa, *tmpc, mu;
   int     res, ix, oldused;
   mp_digit *tmpa, *tmpc, mu;

  /* grow c as required */
  if (c->alloc < (a->used + 1)) {
     if ((res = mp_grow(c, a->used + 1)) != MP_OKAY) {
        return res;
     }
  }
   /* grow c as required */
   if (c->alloc < (a->used + 1)) {
      if ((res = mp_grow(c, a->used + 1)) != MP_OKAY) {
         return res;
      }
   }

  /* if a is negative and |a| >= b, call c = |a| - b */
  if ((a->sign == MP_NEG) && ((a->used > 1) || (a->dp[0] >= b))) {
     /* temporarily fix sign of a */
     a->sign = MP_ZPOS;
   /* if a is negative and |a| >= b, call c = |a| - b */
   if ((a->sign == MP_NEG) && ((a->used > 1) || (a->dp[0] >= b))) {
      /* temporarily fix sign of a */
      a->sign = MP_ZPOS;

     /* c = |a| - b */
     res = mp_sub_d(a, b, c);
      /* c = |a| - b */
      res = mp_sub_d(a, b, c);

     /* fix sign  */
     a->sign = c->sign = MP_NEG;
      /* fix sign  */
      a->sign = c->sign = MP_NEG;

     /* clamp */
     mp_clamp(c);
      /* clamp */
      mp_clamp(c);

     return res;
  }
      return res;
   }

  /* old number of used digits in c */
  oldused = c->used;
   /* old number of used digits in c */
   oldused = c->used;

  /* source alias */
  tmpa    = a->dp;
   /* source alias */
   tmpa    = a->dp;

  /* destination alias */
  tmpc    = c->dp;
   /* destination alias */
   tmpc    = c->dp;

  /* if a is positive */
  if (a->sign == MP_ZPOS) {
     /* add digit, after this we're propagating
      * the carry.
      */
     *tmpc   = *tmpa++ + b;
     mu      = *tmpc >> DIGIT_BIT;
     *tmpc++ &= MP_MASK;
   /* if a is positive */
   if (a->sign == MP_ZPOS) {
      /* add digit, after this we're propagating
       * the carry.
       */
      *tmpc   = *tmpa++ + b;
      mu      = *tmpc >> DIGIT_BIT;
      *tmpc++ &= MP_MASK;

     /* now handle rest of the digits */
     for (ix = 1; ix < a->used; ix++) {
        *tmpc   = *tmpa++ + mu;
        mu      = *tmpc >> DIGIT_BIT;
        *tmpc++ &= MP_MASK;
     }
     /* set final carry */
     ix++;
     *tmpc++  = mu;
      /* now handle rest of the digits */
      for (ix = 1; ix < a->used; ix++) {
         *tmpc   = *tmpa++ + mu;
         mu      = *tmpc >> DIGIT_BIT;
         *tmpc++ &= MP_MASK;
      }
      /* set final carry */
      ix++;
      *tmpc++  = mu;

     /* setup size */
     c->used = a->used + 1;
  } else {
     /* a was negative and |a| < b */
     c->used  = 1;
      /* setup size */
      c->used = a->used + 1;
   } else {
      /* a was negative and |a| < b */
      c->used  = 1;

     /* the result is a single digit */
     if (a->used == 1) {
        *tmpc++  =  b - a->dp[0];
     } else {
        *tmpc++  =  b;
     }
      /* the result is a single digit */
      if (a->used == 1) {
         *tmpc++  =  b - a->dp[0];
      } else {
         *tmpc++  =  b;
      }

     /* setup count so the clearing of oldused
      * can fall through correctly
      */
     ix       = 1;
  }
      /* setup count so the clearing of oldused
       * can fall through correctly
       */
      ix       = 1;
   }

  /* sign always positive */
  c->sign = MP_ZPOS;
   /* sign always positive */
   c->sign = MP_ZPOS;

  /* now zero to oldused */
  while (ix++ < oldused) {
     *tmpc++ = 0;
  }
  mp_clamp(c);
   /* now zero to oldused */
   while (ix++ < oldused) {
      *tmpc++ = 0;
   }
   mp_clamp(c);

  return MP_OKAY;
   return MP_OKAY;
}

#endif

/* ref:         $Format:%D$ */
/* git commit:  $Format:%H$ */
/* commit time: $Format:%ai$ */