C++程序  |  115行  |  1.89 KB

/*
 * 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;
}