Quake-III-Arena

Quake III Arena GPL Source Release
Log | Files | Refs

GenerateQGL.pl (4281B)


      1 #!/usr/bin/perl
      2 
      3 open(INPUT_FILE, ">/tmp/input-$$.h") || die "$!";
      4 print INPUT_FILE "#import <OpenGL/gl.h>\n";
      5 close INPUT_FILE;
      6 open(CPP, "cpp /tmp/input-$$.h|") || die "$!";
      7 
      8 print "/**** This file is autogenerated.  Run GenerateQGL.pl to update it ****/\n\n";
      9 
     10 print "#ifdef QGL_LOG_GL_CALLS\n";
     11 print "extern unsigned int QGLLogGLCalls;\n";
     12 print "extern FILE *QGLDebugFile(void);\n";
     13 print "#endif\n\n";
     14 
     15 print "extern void QGLCheckError(const char *message);\n";
     16 print "extern unsigned int QGLBeginStarted;\n\n";
     17 print "// This has to be done to avoid infinite recursion between our glGetError wrapper and QGLCheckError()\n";
     18 print "static inline GLenum _glGetError(void) {\n";
     19 print "    return glGetError();\n";
     20 print "}\n\n";
     21 
     22 @functionNames = ();
     23 
     24 while (<CPP>) {
     25     chop;
     26     /^extern/ || next;
     27     s/extern //;
     28     print "// $_\n";
     29 
     30     # This approach is necessary to deal with glGetString whos type isn't a single word
     31     ($type, $rest) = m/(.+)\s+(gl.*)/;
     32 #    print "type='$type'\n";
     33 #    print "rest='$rest'\n";
     34 
     35     ($name, $argString) = ($rest =~ m/(\w+).*\s*\((.*)\)/);
     36     $isVoid = ($type =~ m/void/);
     37     push(@functionNames, $name);
     38 
     39 #    print "name=$name\n";
     40 #    print "argString=$argString\n";
     41 #    print "argCount=$#args\n";
     42 
     43     # Parse the argument list into two arrays, one of types and one of argument names
     44     if ($argString =~ m/^void$/) {
     45         @args = ();
     46     } else {
     47         @args = split(",", $argString);
     48     }
     49     @argTypes = ();
     50     @argNames = ();
     51     for $arg (@args) {
     52         ($argType, $argName) = ($arg =~ m/(.*[ \*])([_a-zA-Z0-9]+)/);
     53         $argType =~ s/^ *//;
     54         $argType =~ s/ *$//;
     55 
     56         push(@argTypes, $argType);
     57         push(@argNames, $argName);
     58 #        print "argType='$argType'\n";
     59 #        print "argName='$argName'\n";
     60     }
     61 
     62 
     63     print "static inline $type q$name($argString)\n";
     64     print "{\n";
     65 
     66     if (! $isVoid) {
     67         print "    $type returnValue;\n";
     68     }
     69 
     70     print "#if !defined(NDEBUG) && defined(QGL_LOG_GL_CALLS)\n";
     71     print "    if (QGLLogGLCalls)\n";
     72     print "        fprintf(QGLDebugFile(), \"$name(";
     73 
     74     if ($#argTypes >= 0) {
     75         for ($i = 0; $i <= $#argTypes; $i++) {
     76             $argType = $argTypes[$i];
     77             $argName = $argNames[$i];
     78             $_ = $argType;
     79             if (/^GLenum$/ || /^GLuint$/ || /^GLbitfield$/) {
     80                 print "$argName=%lu";
     81             } elsif (/^GLsizei$/ || /^GLint$/) {
     82                 print "$argName=%ld";
     83             } elsif (/^GLfloat$/ || /^GLdouble$/ || /^GLclampf$/ || /^GLclampd$/) {
     84                 print "$argName=%f";
     85             } elsif (/^GLbyte$/) {
     86                 print "$argName=%d";
     87             } elsif (/^GLubyte$/) {
     88                 print "$argName=%u";
     89             } elsif (/^GLshort$/) {
     90                 print "$argName=%d";
     91             } elsif (/^GLushort$/) {
     92                 print "$argName=%u";
     93             } elsif (/^GLboolean$/) {
     94                 print "$argName=%u";
     95             } elsif (/\*$/) {
     96                 # TJW -- Later we should look at the count specified in the function name, look at the basic type and print out an array.  Or we could just special case them...
     97                 print "$argName=%p";
     98             } else {
     99                 print STDERR "Unknown type '$argType'\n";
    100                 exit(1);
    101             }
    102 
    103             print ", " if ($i != $#argTypes);
    104         }
    105     } else {
    106         print "void";
    107     }
    108 
    109     print ")\\n\"";
    110     print ", " if $#argTypes >= 0;
    111     print join(", ", @argNames);
    112     print ");\n";
    113     print "#endif\n";
    114 
    115     if (! $isVoid) {
    116         print "    returnValue = ";
    117     } else {
    118         print "    ";
    119     }
    120     print "$name(" . join(", ", @argNames) . ");\n";
    121 
    122     print "#if !defined(NDEBUG) && defined(QGL_CHECK_GL_ERRORS)\n";
    123     if ($name eq "glBegin") {
    124         print "    QGLBeginStarted++;\n";
    125     }
    126     if ($name eq "glEnd") {
    127         print "    QGLBeginStarted--;\n";
    128     }
    129     print "    if (!QGLBeginStarted)\n";
    130     print "        QGLCheckError(\"$name\");\n";
    131     print "#endif\n";
    132 
    133     if (! $isVoid) {
    134         print "    return returnValue;\n";
    135     }
    136     
    137     print "}\n\n";
    138 }
    139 
    140 
    141 print "// Prevent calls to the 'normal' GL functions\n";
    142 for $name (@functionNames) {
    143     print "#define $name CALL_THE_QGL_VERSION_OF_$name\n";
    144 }
    145 
    146