mpmul.[ch]: Move internal `HWM' and `LWM' constants to implementation.
[u/mdw/catacomb] / lcrand.c
index 3686e17..a108f13 100644 (file)
--- a/lcrand.c
+++ b/lcrand.c
@@ -1,13 +1,13 @@
 /* -*-c-*-
  *
- * $Id: lcrand.c,v 1.1 1999/12/10 23:15:27 mdw Exp $
+ * $Id: lcrand.c,v 1.5 2004/04/08 01:36:15 mdw Exp $
  *
  * Simple linear congruential generator
  *
  * (c) 1999 Straylight/Edgeware
  */
 
-/*----- Licensing notice --------------------------------------------------* 
+/*----- Licensing notice --------------------------------------------------*
  *
  * This file is part of Catacomb.
  *
  * it under the terms of the GNU Library General Public License as
  * published by the Free Software Foundation; either version 2 of the
  * License, or (at your option) any later version.
- * 
+ *
  * Catacomb is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU Library General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Library General Public
  * License along with Catacomb; if not, write to the Free
  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  * MA 02111-1307, USA.
  */
 
-/*----- Revision history --------------------------------------------------* 
- *
- * $Log: lcrand.c,v $
- * Revision 1.1  1999/12/10 23:15:27  mdw
- * Noncryptographic random number generator.
- *
- */
-
 /*----- Header files ------------------------------------------------------*/
 
 #include <stdarg.h>
@@ -172,7 +164,7 @@ uint32 lcrand_range(uint32 *x, uint32 m)
   uint32 r = P - P % m;
   do xx = lcrand(xx); while (xx >= r);
   *x = xx;
-  return (xx / (r / m));
+  return (xx % m);
 }
 
 /*----- Generic interface -------------------------------------------------*/
@@ -201,6 +193,7 @@ static int gmisc(grand *r, unsigned op, ...)
        case GRAND_CHECK:
        case GRAND_SEEDINT:
        case GRAND_SEEDUINT32:
+       case GRAND_SEEDRAND:
          rc = 1;
          break;
        default:
@@ -214,6 +207,12 @@ static int gmisc(grand *r, unsigned op, ...)
     case GRAND_SEEDUINT32:
       g->x = va_arg(ap, uint32);
       break;
+    case GRAND_SEEDRAND: {
+      grand *rr = va_arg(ap, grand *);
+      uint32 x;
+      do x = rr->ops->word(rr); while (x >= P || x == LCRAND_FIXEDPT);
+      g->x = x;
+    } break;
     default:
       GRAND_BADOP;
       break;
@@ -237,7 +236,7 @@ static octet gbyte(grand *r)
   do x = lcrand(x); while (x >= P256);
   g->x = x;
   return (x / (P256 / 256));
-}  
+}
 
 static uint32 grange(grand *r, uint32 l)
 {
@@ -247,7 +246,7 @@ static uint32 grange(grand *r, uint32 l)
 
 static const grand_ops gops = {
   "lcrand",
-  LCRAND_P,
+  LCRAND_P, 0,
   gmisc, gdestroy,
   graw, gbyte, grand_word, grange, grand_fill
 };