• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
neo_seed_rand(long int seed)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 
neo_rand(int max)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 
neo_rand_string(char * s,int max)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 
neo_rand_word(char * s,int max)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