root/shared/rand.c

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. randrange
  2. vpick_r
  3. pick_r
  4. ppick_r

   1 /*
   2 ** Copyright (c) 2024 Amelia Campbell
   3 **
   4 ** Redistribution and use in source and binary forms, with or without
   5 ** modification, are permitted provided that the following conditions are met: 
   6 **
   7 **  1. Redistributions of source code must retain the above copyright notice,
   8 **     this list of conditions and the following disclaimer.
   9 **  2. Redistributions in binary form must reproduce the above copyright
  10 **     notice, this list of conditions and the following disclaimer in the
  11 **     documentation and/or other materials provided with the distribution.
  12 **  3. Neither the name of the copyright holder nor the names of its
  13 **     contributors may be used to endorse or promote products derived from
  14 **     this software without specific prior written permission.
  15 **
  16 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  17 ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  18 ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  19 ** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  20 ** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  21 ** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  22 ** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  23 ** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  24 ** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  25 ** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  26 ** POSSIBILITY OF SUCH DAMAGE.
  27 */
  28 
  29 #include <stdarg.h>
  30 #include <stdio.h>
  31 #include <limits.h>
  32 #include <openssl/rand.h>
  33 
  34 #include "rand.h"
  35 
  36 unsigned long randrange(unsigned long l, unsigned long u)
  37     {
  38     unsigned int x;
  39     union {
  40         unsigned char r[sizeof(unsigned long)];
  41         unsigned long i;
  42         } orb;
  43 
  44     u++;
  45     do
  46         {
  47         RAND_bytes(orb.r, sizeof(unsigned long));
  48         x = orb.i;
  49         } while (x >= (UINT_MAX - UINT_MAX % (u - l)));
  50 
  51     return l + (x % (u - l));
  52     }
  53 
  54 
  55 int vpick_r(int a, va_list v)
  56     {
  57     int i, s, r = 0;
  58 
  59     s = a == 1 ? 0 : (int)randrange(0, a-1);
  60     for (i = 0; i < a; i++)
  61         {
  62         r = va_arg(v, int);
  63         if (i == s)
  64             break;
  65         }
  66     return r;
  67     }
  68 
  69 
  70 int pick_r(int a, ...)
  71     {
  72     int r;
  73     va_list v;
  74 
  75     va_start(v, a);
  76     r = vpick_r(a, v);
  77     va_end(v);
  78     return r;
  79     }
  80 
  81 
  82 void ppick_r(int a, ...)
  83     {
  84     va_list v;
  85 
  86     va_start(v, a);
  87     putchar(vpick_r(a, v));
  88     va_end(v);
  89     }

/* [previous][next][first][last][top][bottom][index][help] */