#!/bin/bash
#
# This script generates the required files for supporting the debug
# channels used throught the code.
# The generated files are 
#   include/debugdefs.h
#   include/debug.h
# The script must be run in the root directory of the project.
#
# Dimitrie O. Paun <dimi@cs.toronto.edu>
#
DEBUG_H="include/debug.h"
DEBUG_DEFS_H="include/debugdefs.h"

DEBUG_CHANNELS="$( tools/find_debug_channels )"
DEBUG_CLASSES="fixme err warn trace"

{
    cat <<EOF
/* Do not modify this file -- it is automatically generated! */

#ifndef __WINE_DEBUGTOOLS_H
#include "debugtools.h"
#endif

EOF
    echo "/* Definitions for channels identifiers */"

    chno=0
    for ch in $DEBUG_CHANNELS
    do
	echo "#define dbch_${ch} $chno"
	let chno=$chno+1
    done

    echo "/* Definitions for classes identifiers */"
    clno=0
    for cl in $DEBUG_CLASSES
    do
	echo "#define dbcl_${cl} $clno"
	let clno=$clno+1
    done
} > $DEBUG_H

# Now, on the last step, we proceed to construct
# the definitions to be used by the main function.
# These will be stored in include/debugdefs.h
{
    cat <<EOF
/* Do not modify this file -- it is automatically generated! */

#ifndef __WINE_DEBUGTOOLS_H
#include "debugtools.h"
#endif

#define DEBUG_CHANNEL_COUNT $chno
#ifdef DEBUG_RUNTIME
short debug_msg_enabled[][DEBUG_CLASS_COUNT] = {
EOF

    for ch in $DEBUG_CHANNELS
    do
	echo "{1, 1, 0, 0},"
    done
    echo '};'

    echo 'const char* debug_ch_name[] = {'
    for ch in $DEBUG_CHANNELS
    do
	echo "\"${ch}\","
    done
    echo '};'
    
    echo 'const char* debug_cl_name[] = {'
    for ch in $DEBUG_CLASSES
    do
	echo "\"${ch}\","
    done
    echo '};'

    cat <<EOF

#endif /*DEBUG_RUNTIME*/

/* end of automatically generated debug.h */
EOF

} > $DEBUG_DEFS_H


