sum-prng.c revision 7c2fbfb345896881c631598ee3852ce9ce33fb07
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin/***********************************************************************
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* This software is part of the ast package *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* Copyright (c) 1996-2008 AT&T Intellectual Property *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* and is licensed under the *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* A copy of the License is available at *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* Information and Software Systems Research *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* AT&T Research *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* Florham Park NJ *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* Glenn Fowler <gsf@research.att.com> *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin***********************************************************************/
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "32 bit PRNG (pseudo random number generator) hash."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[+mpy?The 32 bit PRNG multiplier.]:[number:=0x01000193]\
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[+add?The 32 bit PRNG addend.]:[number:=0]\
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[+init?The PRNG initial value. 0xffffffff is used if \anumber\a is omitted.]:?[number:=0x811c9dc5]\
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypedef struct Prng_s
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinprng_open(const Method_t* method, const char* name)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register const char* s;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register const char* t;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register const char* v;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register int i;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while (*(t = s))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for (t = s, v = 0; *s && *s != '-'; s++)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (*s == '=' && !v)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin i = (v ? v : s) - t;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (isdigit(*t) || v && strneq(t, "mpy", i) && (t = v + 1))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sum->add = v ? strtoul(v + 1, NiL, 0) : ~sum->add;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sum->init = v ? strtoul(v + 1, NiL, 0) : ~sum->init;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (*s == '-')
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register unsigned char* b = (unsigned char*)s;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register unsigned char* e = b + n;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while (b < e)