#!/usr/bin/gawk -f
#
# Oracle Linux DTrace.
# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
# Licensed under the Universal Permissive License v 1.0 as shown at
# http://oss.oracle.com/licenses/upl.
#

/^\s*#/ { next; }
NF == 0 { next; }

{
	if (match($1, /^[1-9][0-9]*(\.[0-9]*){1,2}$/) == 0) {
		print "E: Invalid version string: " $1 >"/dev/stderr";
		exit 1
	}

	n = split($1, arr, /\./);
	if (n == 2)
		arr[3] = 0;

	code = arr[1] * 0x1000000 + arr[2] * 0x1000 + arr[3];
	versions[code] = arr[1] " " arr[2] " " arr[3];
	next;
}

END {
	n = asorti(versions, idx);

	if (current) {
		$0 = versions[idx[n]];
		if ($3 == 0)
			printf "%s.%s", $1, $2;
		else
			printf "%s.%s.%s", $1, $2, $3;

		exit(0);
	}

	for (i = 1; i <= n; i++) {
		$0 = versions[idx[i]];
		if ($3 == 0)
			printf "#define DT_VERS_%d_%d\tDT_VERSION_NUMBER(%d, %d, 0)\n",\
			       $1, $2, $1, $2;
		else
			printf "#define DT_VERS_%d_%d_%d\tDT_VERSION_NUMBER(%d, %d, %d)\n",\
			       $1, $2, $3, $1, $2, $3;
	}

	print "\n#define DTRACE_VERSIONS { \\";
	for (i = 1; i <= n; i++) {
		$0 = versions[idx[i]];
		if ($3 == 0)
			printf "\t\tDT_VERS_%d_%d, \\\n", $1, $2, $1, $2;
		else
			printf "\t\tDT_VERS_%d_%d_%d, \\\n", $1, $2, $3, $1, $2, $3;
	}
	print "}";

	if ($3 == 0) {
		printf "\n#define DT_VERS_LATEST\tDT_VERS_%d_%d\n", $1, $2;
		printf "#define DT_VERS_STRING\t\"D %d.%d\"\n", $1, $2;
	} else {
		printf "\n#define DT_VERS_LATEST\tDT_VERS_%d_%d_%d\n", $1, $2, $3;
		printf "#define DT_VERS_STRING\t\"D %d.%d.%d\"\n", $1, $2, $3;
	}
}
