################################################################################
#
# PPL -- Producing Random Data
#
# PPL functions produce random data in the form of strings, numbers or dates.
# PPL functions may be used in conjunction with SPAWK functions in order to
# populate database tables mainly for testing purposes.
#
# This is not a great library; it's here mainly for tutorial purposes but any
# can use it to produce random data of some basic types.
#
# Because of rand AWK function particularity, data produced from specific AWK
# programs are random, but always the same when the same AWK executable is used.
# This may be useful for testing purposes; if real random data is needed, then
# srand function must be called in the BEGIN section before any PPL function is
# called.
#
# If you want to produce random strings from foreign character sets, e.g el_GR
# UTF-8, then you must create a palette and call ppl_string function with this
# custom palette:
#
#	BEGIN {
#		srand()
#		ppl_palette("αβγδεζηθικλμνοξοπρστυφψω", gr_lower)
#		ppl_palette("ΑΒΓΔΕΖΗΘΙΚΛΜΝΟΞΟΠΡΣΤΥΦΨΩ", gr_upper)
#
#		for (i = ppl_integer(100, 200); i > 0; i--)
#		print ppl_string(10, 20, gr_upper)
#	}
#
# The above script will print a random number (between 100 and 200) of random
# strings of random length (between 10 and 20) constructed of greek uppercase
# letters.
#
################################################################################

BEGIN {
	ppl_palette("abcdefghijklmnopqrstuvwxyz", ppl_lower)
	ppl_palette("ABCDEFGHIJKLMNOPQRSTUVWXYZ", ppl_upper)
}

function ppl_string(min, max, palette,		s) {
	if (max < min)
	max = min

	max = int(rand() * (max + 1 - min)) + min

	for (min = 0; min < max; min++)
	s = s palette[int(rand() * palette[0]) + 1]

	return s;

}

function ppl_integer(min, max) {
	return int(rand() * (max + 1 - min)) + min
}

function ppl_float(min, max) {
	return (rand() * (max - min)) + min
}

function ppl_timestamp(min, max) {
	if (!max)
	max = systime()

	if (min < 0)
	min = max + min

	return ppl_integer(min, max)
}

function ppl_login() {
	return ppl_string(3, 16, ppl_lower)
}

function ppl_domain() {
	return ppl_string(3, 20, ppl_lower) "." ppl_string(2, 3, ppl_lower)
}

function ppl_email() {
	return ppl_login() "@" ppl_domain();
}

function ppl_name() {
	return ppl_string(1, 1, ppl_upper) \
		ppl_string(3, 16, ppl_lower) " " \
		ppl_string(1, 1, ppl_upper) \
		ppl_string(3, 16, ppl_lower)
}

function ppl_palette(spalette, palette) {
	return (palette[0] = split(spalette, palette, ""))
}