Home | History | Annotate | Download | only in util
      1 /*
      2  * Copyright 2001-2004 Brandon Long
      3  * All Rights Reserved.
      4  *
      5  * ClearSilver Templating System
      6  *
      7  * This code is made available under the terms of the ClearSilver License.
      8  * http://www.clearsilver.net/license.hdf
      9  *
     10  */
     11 
     12 #include "cs_config.h"
     13 
     14 #include <stdlib.h>
     15 #include <stdio.h>
     16 #include <time.h>
     17 #include <string.h>
     18 #include "neo_misc.h"
     19 #include "neo_err.h"
     20 #include "neo_rand.h"
     21 #include "ulist.h"
     22 
     23 static int RandomInit = 0;
     24 
     25 void neo_seed_rand (long int seed)
     26 {
     27 #ifdef HAVE_DRAND48
     28   srand48(seed);
     29 #elif HAVE_RANDOM
     30   srandom(seed);
     31 #else
     32   srand(seed);
     33 #endif
     34   RandomInit = 1;
     35 }
     36 
     37 int neo_rand (int max)
     38 {
     39   int r;
     40 
     41   if (RandomInit == 0)
     42   {
     43     neo_seed_rand (time(NULL));
     44   }
     45 #ifdef HAVE_DRAND48
     46   r = drand48() * max;
     47 #elif HAVE_RANDOM
     48   r = random() * max;
     49 #else
     50   r = rand() * max;
     51 #endif
     52   return r;
     53 }
     54 
     55 int neo_rand_string (char *s, int max)
     56 {
     57   int size;
     58   int x = 0;
     59 
     60   size = neo_rand(max-1);
     61   for (x = 0; x < size; x++)
     62   {
     63     s[x] = (char)(32 + neo_rand(127-32));
     64     if (s[x] == '/') s[x] = ' ';
     65   }
     66   s[x] = '\0';
     67 
     68   return 0;
     69 }
     70 
     71 static ULIST *Words = NULL;
     72 
     73 int neo_rand_word (char *s, int max)
     74 {
     75   NEOERR *err;
     76   int x;
     77   char *word;
     78 
     79   if (Words == NULL)
     80   {
     81     FILE *fp;
     82     char buf[256];
     83 
     84     err = uListInit(&Words, 40000, 0);
     85     if (err)
     86     {
     87       nerr_log_error(err);
     88       return -1;
     89     }
     90     fp = fopen ("/usr/dict/words", "r");
     91     if (fp == NULL) {
     92       fp = fopen ("/usr/share/dict/words", "r");
     93       if (fp == NULL) {
     94         ne_warn("Unable to find dict/words file (looked in /usr/dict/words and /usr/share/dict/words)");
     95         return -1;
     96       }
     97     }
     98     while (fgets (buf, sizeof(buf), fp) != NULL)
     99     {
    100       x = strlen (buf);
    101       if (buf[x-1] == '\n')
    102 	buf[x-1] = '\0';
    103       uListAppend(Words, strdup(buf));
    104     }
    105     fclose (fp);
    106   }
    107   x = neo_rand (uListLength(Words));
    108   uListGet(Words, x, (void *)&word);
    109   strncpy (s, word, max);
    110   s[max-1] = '\0';
    111 
    112   return 0;
    113 }
    114 
    115