#!perl
# NetHack 5.0  mdgrep.pl  $NHDT-Date: 1710949914 2024/03/20 15:51:54 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.26 $
# Copyright (c) Kenneth Lorber, Kensington, Maryland
# NetHack may be freely redistributed.  See license for details.

# MAKEDEFS:
@commands = qw/grep/;

# GREP:
# Operating Systems:
@os = qw/WIN32 MSDOS VMS UNIX TOS AMIGA MAC WINNT __BEOS__ WIN_CE OS2
	WIN_CE_SMARTPHONE WIN_CE_POCKETPC WIN_CE_PS2xx
	WIN32_PLATFORM_HPCPRO WIN32_PLATFORM_WFSP/;

# Window Systems:
@win = qw/TTY_GRAPHICS MAC_GRAPHICS AMII_GRAPHICS MSWIN_GRAPHICS X11_GRAPHICS
	QT_GRAPHICS GNOME_GRAPHICS GEM_GRAPHICS/;

# Game Features:
@feature = qw/ZEROCOMP TILES_IN_GLYPHMAP ASCIIGRAPH CLIPPING
	COMPRESS ZLIB_COMP RANDOM SECURE USER_SOUNDS
	SAFERHANGUP MFLOPPY NOCWD_ASSUMPTIONS
	VAR_PLAYGROUND DLB SHELL SUSPEND NOSAVEONHANGUP HANGUPHANDLING
	BSD_JOB_CONTROL MAIL POSIX_JOB_CONTROL INSURANCE
	UNICODE_DRAWING UNICODE_WIDEWINPORT UNICODE_PLAYERTEXT
	CRASHREPORT
/;

# Miscellaneous
@misc = qw/CROSSCOMPILE/;

# Meta
@meta = qw/ALLDOCS/;	# convention: use --grep-define ALLDOCS to notate
			# items that are conditionally available

# Special mappings (if key == value, define prefix_value, prefix is [0])
$specials = {
    NH_DEVEL_STATUS => [qw/DS NH_STATUS_RELEASED NH_STATUS_WIP NH_STATUS_BETA/]
};

# JUNK:
# MICRO BSD __GNUC__ NHSTDC TERMLIB __linux__ LINUX WIN32CON NO_TERMS
# ULTRIX_PROTO TERMINFO _DCC DISPMAP OPT_DISPMAP TARGET_API_MAC_CARBON
# NOTTYGRAPHICS SYSV ULTRIX MAKEDEFS LEV_LEX_C __STDC__
# BITCOUNT TILE_X COLORS_IN_USE CHDIR KR1ED
# apollo __APPLE__ AIX_31 PC9800 __MACH__ _GNU_SOURCE __EMX__ DGUX
# __MWERKS__ __MRC__ __BORLANDC__ LINT THINK_C __SC__ AZTEC_C __FreeBSD__
# USE_PROTOTYPES __DJGPP__ macintosh POSIX_TYPES SUNOS4 _MSC_VER __OpenBSD__
# GCC_WARN VOIDYYPUT FLEX_SCANNER FLEXHACK_SCANNER WIERD_LEX
# NeXT __osf__ SVR4 _AIX32 _BULL_SOURCE AUX __sgi GNUDOS
# TIMED_DELAY DEF_MAILREADER DEF_PAGER NO_SIGNAL PC_LOCKING LATTICE __GO32__
# msleep NO_FILE_LINKS bsdi HPUX AMIFLUSH
# SCREEN_BIOS SCREEN_DJGPPFAST SCREEN_VGA SCREEN_8514
# EXEPATH NOTSTDC SELECTSAVED NOTPARMDECL

# constants
@const_true = qw/1 TRUE/;
@const_false = qw/0 FALSE/;

$outfile = "mdgrep.h";
sub start_file {
	($rev) = ('$NHDT-Revision: 1.26 $') =~ m/: (.*) .$/;
	my $date = '$NHDT-Date: 1710949915 2024/03/20 15:51:55 $';
	my $branch = '$NHDT-Branch: NetHack-5.0 $';
	my $revision = '$NHDT-Revision: 1.26 $';
	open(OUT, ">$outfile") || die "open $outfile: $!";
# NB: Date and Revision below will be modified when mdgrep.h is written to
# git - this is correct (but it means you must commit changes to mdgrep.pl
# before generating mdgrep.h and committing that file).
	print OUT <<E_O_M;
/*
 * NetHack 5.0  $outfile  $date $branch:$revision
 * Copyright (c) Kenneth Lorber, Kensington, Maryland, 2008
 * NetHack may be freely redistributed.  See license for details.
 *
 * This file generated by mdgrep.pl version $rev.
 * DO NOT EDIT!  Your changes will be lost.
 */

static struct grep_var grep_vars[]={
E_O_M
}

sub end_file {
	print OUT "/* End of file */\n";
	close OUT;
}

sub gen_magic {
	local($v, @x) = @_;
	foreach (@x){
		$magic{$_} = $v;
	}
}

# NB: Do NOT make grep_vars const - it needs to be writable for some debugging
# options.
sub gen_file {
	foreach(@_){
		if(defined $magic{$_}){
			print OUT <<E_O_M;
	{"$_", $magic{$_}},
E_O_M
			next;
		}
		print OUT <<E_O_M;
#if defined($_)
	{"$_", 1},
#else
	{"$_", 0},
#endif
E_O_M
	}
}

sub gen_commands {
	local($x) = 1;
	print OUT "\n/* Command ids */\n";
	foreach(@commands){
		print OUT "#define TODO_\U$_\E $x\n";
	}
	print OUT "\n";
}

sub gen_specials {
    my $in = $_[0];
    foreach my $name (keys %$in){
	my $list = %$in{$name};
	my $prefix = shift @$list;
	print OUT <<E_O_M;
    {"$name", $name},
E_O_M
	foreach my $val (@$list){
	    print OUT <<E_O_M;
#if ($name == $val)
    {"$prefix$val", 1},
#else
    {"$prefix$val", 0},
#endif
E_O_M
	}
    }
}

&start_file;
&gen_magic(0, @const_false);
&gen_magic(1, @const_true);
&gen_file(sort(@os,@win,@feature,@misc,@meta,@const_false,@const_true));
&gen_specials($specials);
print OUT "\t{0,0}\n};\n";
&gen_commands;
&end_file;
