/* * Copyright 2001-2004 Brandon Long * All Rights Reserved. * * ClearSilver Templating System * * This code is made available under the terms of the ClearSilver License. * http://www.clearsilver.net/license.hdf * */ #include "cs_config.h" #include <stdlib.h> #include <stdio.h> #include <time.h> #include <string.h> #include "neo_misc.h" #include "neo_err.h" #include "neo_rand.h" #include "ulist.h" static int RandomInit = 0; void neo_seed_rand (long int seed) { #ifdef HAVE_DRAND48 srand48(seed); #elif HAVE_RANDOM srandom(seed); #else srand(seed); #endif RandomInit = 1; } int neo_rand (int max) { int r; if (RandomInit == 0) { neo_seed_rand (time(NULL)); } #ifdef HAVE_DRAND48 r = drand48() * max; #elif HAVE_RANDOM r = random() * max; #else r = rand() * max; #endif return r; } int neo_rand_string (char *s, int max) { int size; int x = 0; size = neo_rand(max-1); for (x = 0; x < size; x++) { s[x] = (char)(32 + neo_rand(127-32)); if (s[x] == '/') s[x] = ' '; } s[x] = '\0'; return 0; } static ULIST *Words = NULL; int neo_rand_word (char *s, int max) { NEOERR *err; int x; char *word; if (Words == NULL) { FILE *fp; char buf[256]; err = uListInit(&Words, 40000, 0); if (err) { nerr_log_error(err); return -1; } fp = fopen ("/usr/dict/words", "r"); if (fp == NULL) { fp = fopen ("/usr/share/dict/words", "r"); if (fp == NULL) { ne_warn("Unable to find dict/words file (looked in /usr/dict/words and /usr/share/dict/words)"); return -1; } } while (fgets (buf, sizeof(buf), fp) != NULL) { x = strlen (buf); if (buf[x-1] == '\n') buf[x-1] = '\0'; uListAppend(Words, strdup(buf)); } fclose (fp); } x = neo_rand (uListLength(Words)); uListGet(Words, x, (void *)&word); strncpy (s, word, max); s[max-1] = '\0'; return 0; }