gen_defs.tcl   [plain text]


#This parses and generates #defines from an enum.spec type of file.

proc main {argc argv} {
    if {2 != $argc} {
	puts stderr "syntax is: [info script] input.spec output.h"
	exit 1
    }

    set fd [open [lindex $argv 0] r]
    set data [read $fd]
    close $fd

    set fd [open [lindex $argv 1] w]
    
    set state ""

    puts $fd "#define GL_VERSION_1_1 1"
    puts $fd "#define GL_VERSION_1_2 1"
    puts $fd "#define GL_VERSION_1_3 1"
    puts $fd "#define GL_VERSION_1_4 1"
    puts $fd "#define GL_VERSION_1_5 1"
    puts $fd "#define GL_VERSION_2_0 1"
    #puts $fd "#define GL_VERSION_3_0 1"

    set mask ""
    array set ar {}

    foreach line [split $data \n] {
	if {[regexp {^\S*#.*} $line] > 0} {
	    #puts COMMENT:$line
	    set state ""
	} elseif {"enum" eq $state} {
	    if {[string match "\t*" $line]} {
		if {[regexp {^\tuse.*} $line] > 0} {
		    lassign [split [string trim $line]] use usemask def
		    set usemask [string trim $usemask]
		    set def [string trim $def]
		    puts $fd "/* GL_$def */" 
		} else {
		    lassign [split [string trim $line] =] def value
		    set def [string trim $def]
		    set value [string trim $value]

		    #Trim out the data like: 0x0B00 # 4 F
		    set value [lindex [split $value] 0]

		    puts $fd "#define GL_$def $value"

		    #Save this association with the value.
		    set d $ar($mask)
		    dict set d $def $value
		    set ar($mask) $d
		}
	    } else {
		set state ""
	    }
	} elseif {[string match "* enum:*" $line]} {
	    lassign [split $line] mask _
	    puts $fd "\n/*[string trim $mask]*/"
	    set ar($mask) [dict create]
	    set state enum
  	}
    }
    
    close $fd
}
main $::argc $::argv