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