Merge branch 'nouveau-import'
[mesa.git] / src / glut / os2 / glut_ext.cpp
1
2 /* Copyright (c) Mark J. Kilgard, 1994, 1997. */
3
4 /* This program is freely distributable without licensing fees
5 and is provided without guarantee or warrantee expressed or
6 implied. This program is -not- in the public domain. */
7
8 #include <stdlib.h>
9 #include <string.h>
10
11 #include "glutint.h"
12
13 /* CENTRY */
14 int GLUTAPIENTRY
15 glutExtensionSupported(const char *extension)
16 {
17 static const GLubyte *extensions = NULL;
18 const GLubyte *start;
19 GLubyte *where, *terminator;
20
21 /* Extension names should not have spaces. */
22 where = (GLubyte *) strchr(extension, ' ');
23 if (where || *extension == '\0')
24 return 0;
25
26 if (!extensions) {
27 extensions = glGetString(GL_EXTENSIONS);
28 }
29 /* It takes a bit of care to be fool-proof about parsing the
30 OpenGL extensions string. Don't be fooled by sub-strings,
31 etc. */
32 start = extensions;
33 for (;;) {
34 /* If your application crashes in the strstr routine below,
35 you are probably calling glutExtensionSupported without
36 having a current window. Calling glGetString without
37 a current OpenGL context has unpredictable results.
38 Please fix your program. */
39 where = (GLubyte *) strstr((const char *) start, extension);
40 if (!where)
41 break;
42 terminator = where + strlen(extension);
43 if (where == start || *(where - 1) == ' ') {
44 if (*terminator == ' ' || *terminator == '\0') {
45 return 1;
46 }
47 }
48 start = terminator;
49 }
50 return 0;
51 }
52
53
54 struct name_address_pair {
55 const char *name;
56 const void *address;
57 };
58
59 static struct name_address_pair glut_functions[] = {
60 { "glutInit", (const void *) glutInit },
61 { "glutInitDisplayMode", (const void *) glutInitDisplayMode },
62 { "glutInitDisplayString", (const void *) glutInitDisplayString },
63 { "glutInitWindowPosition", (const void *) glutInitWindowPosition },
64 { "glutInitWindowSize", (const void *) glutInitWindowSize },
65 { "glutMainLoop", (const void *) glutMainLoop },
66 { "glutCreateWindow", (const void *) glutCreateWindow },
67 { "glutCreateSubWindow", (const void *) glutCreateSubWindow },
68 { "glutDestroyWindow", (const void *) glutDestroyWindow },
69 { "glutPostRedisplay", (const void *) glutPostRedisplay },
70 { "glutPostWindowRedisplay", (const void *) glutPostWindowRedisplay },
71 { "glutSwapBuffers", (const void *) glutSwapBuffers },
72 { "glutGetWindow", (const void *) glutGetWindow },
73 { "glutSetWindow", (const void *) glutSetWindow },
74 { "glutSetWindowTitle", (const void *) glutSetWindowTitle },
75 { "glutSetIconTitle", (const void *) glutSetIconTitle },
76 { "glutPositionWindow", (const void *) glutPositionWindow },
77 { "glutReshapeWindow", (const void *) glutReshapeWindow },
78 { "glutPopWindow", (const void *) glutPopWindow },
79 { "glutPushWindow", (const void *) glutPushWindow },
80 { "glutIconifyWindow", (const void *) glutIconifyWindow },
81 { "glutShowWindow", (const void *) glutShowWindow },
82 { "glutHideWindow", (const void *) glutHideWindow },
83 { "glutFullScreen", (const void *) glutFullScreen },
84 { "glutSetCursor", (const void *) glutSetCursor },
85 { "glutWarpPointer", (const void *) glutWarpPointer },
86 { "glutEstablishOverlay", (const void *) glutEstablishOverlay },
87 { "glutRemoveOverlay", (const void *) glutRemoveOverlay },
88 { "glutUseLayer", (const void *) glutUseLayer },
89 { "glutPostOverlayRedisplay", (const void *) glutPostOverlayRedisplay },
90 { "glutPostWindowOverlayRedisplay", (const void *) glutPostWindowOverlayRedisplay },
91 { "glutShowOverlay", (const void *) glutShowOverlay },
92 { "glutHideOverlay", (const void *) glutHideOverlay },
93 { "glutCreateMenu", (const void *) glutCreateMenu },
94 { "glutDestroyMenu", (const void *) glutDestroyMenu },
95 { "glutGetMenu", (const void *) glutGetMenu },
96 { "glutSetMenu", (const void *) glutSetMenu },
97 { "glutAddMenuEntry", (const void *) glutAddMenuEntry },
98 { "glutAddSubMenu", (const void *) glutAddSubMenu },
99 { "glutChangeToMenuEntry", (const void *) glutChangeToMenuEntry },
100 { "glutChangeToSubMenu", (const void *) glutChangeToSubMenu },
101 { "glutRemoveMenuItem", (const void *) glutRemoveMenuItem },
102 { "glutAttachMenu", (const void *) glutAttachMenu },
103 { "glutDetachMenu", (const void *) glutDetachMenu },
104 { "glutDisplayFunc", (const void *) glutDisplayFunc },
105 { "glutReshapeFunc", (const void *) glutReshapeFunc },
106 { "glutKeyboardFunc", (const void *) glutKeyboardFunc },
107 { "glutMouseFunc", (const void *) glutMouseFunc },
108 { "glutMotionFunc", (const void *) glutMotionFunc },
109 { "glutPassiveMotionFunc", (const void *) glutPassiveMotionFunc },
110 { "glutEntryFunc", (const void *) glutEntryFunc },
111 { "glutVisibilityFunc", (const void *) glutVisibilityFunc },
112 { "glutIdleFunc", (const void *) glutIdleFunc },
113 { "glutTimerFunc", (const void *) glutTimerFunc },
114 { "glutMenuStateFunc", (const void *) glutMenuStateFunc },
115 { "glutSpecialFunc", (const void *) glutSpecialFunc },
116 { "glutSpaceballMotionFunc", (const void *) glutSpaceballMotionFunc },
117 { "glutSpaceballRotateFunc", (const void *) glutSpaceballRotateFunc },
118 { "glutSpaceballButtonFunc", (const void *) glutSpaceballButtonFunc },
119 { "glutButtonBoxFunc", (const void *) glutButtonBoxFunc },
120 { "glutDialsFunc", (const void *) glutDialsFunc },
121 { "glutTabletMotionFunc", (const void *) glutTabletMotionFunc },
122 { "glutTabletButtonFunc", (const void *) glutTabletButtonFunc },
123 { "glutMenuStatusFunc", (const void *) glutMenuStatusFunc },
124 { "glutOverlayDisplayFunc", (const void *) glutOverlayDisplayFunc },
125 { "glutWindowStatusFunc", (const void *) glutWindowStatusFunc },
126 { "glutKeyboardUpFunc", (const void *) glutKeyboardUpFunc },
127 { "glutSpecialUpFunc", (const void *) glutSpecialUpFunc },
128 { "glutJoystickFunc", (const void *) glutJoystickFunc },
129 { "glutSetColor", (const void *) glutSetColor },
130 { "glutGetColor", (const void *) glutGetColor },
131 { "glutCopyColormap", (const void *) glutCopyColormap },
132 { "glutGet", (const void *) glutGet },
133 { "glutDeviceGet", (const void *) glutDeviceGet },
134 { "glutExtensionSupported", (const void *) glutExtensionSupported },
135 { "glutGetModifiers", (const void *) glutGetModifiers },
136 { "glutLayerGet", (const void *) glutLayerGet },
137 { "glutGetProcAddress", (const void *) glutGetProcAddress },
138 { "glutBitmapCharacter", (const void *) glutBitmapCharacter },
139 { "glutBitmapWidth", (const void *) glutBitmapWidth },
140 { "glutStrokeCharacter", (const void *) glutStrokeCharacter },
141 { "glutStrokeWidth", (const void *) glutStrokeWidth },
142 { "glutBitmapLength", (const void *) glutBitmapLength },
143 { "glutStrokeLength", (const void *) glutStrokeLength },
144 { "glutWireSphere", (const void *) glutWireSphere },
145 { "glutSolidSphere", (const void *) glutSolidSphere },
146 { "glutWireCone", (const void *) glutWireCone },
147 { "glutSolidCone", (const void *) glutSolidCone },
148 { "glutWireCube", (const void *) glutWireCube },
149 { "glutSolidCube", (const void *) glutSolidCube },
150 { "glutWireTorus", (const void *) glutWireTorus },
151 { "glutSolidTorus", (const void *) glutSolidTorus },
152 { "glutWireDodecahedron", (const void *) glutWireDodecahedron },
153 { "glutSolidDodecahedron", (const void *) glutSolidDodecahedron },
154 { "glutWireTeapot", (const void *) glutWireTeapot },
155 { "glutSolidTeapot", (const void *) glutSolidTeapot },
156 { "glutWireOctahedron", (const void *) glutWireOctahedron },
157 { "glutSolidOctahedron", (const void *) glutSolidOctahedron },
158 { "glutWireTetrahedron", (const void *) glutWireTetrahedron },
159 { "glutSolidTetrahedron", (const void *) glutSolidTetrahedron },
160 { "glutWireIcosahedron", (const void *) glutWireIcosahedron },
161 { "glutSolidIcosahedron", (const void *) glutSolidIcosahedron },
162 { "glutVideoResizeGet", (const void *) glutVideoResizeGet },
163 { "glutSetupVideoResizing", (const void *) glutSetupVideoResizing },
164 { "glutStopVideoResizing", (const void *) glutStopVideoResizing },
165 { "glutVideoResize", (const void *) glutVideoResize },
166 { "glutVideoPan", (const void *) glutVideoPan },
167 { "glutReportErrors", (const void *) glutReportErrors },
168 { "glutIgnoreKeyRepeat", (const void *) glutIgnoreKeyRepeat },
169 { "glutSetKeyRepeat", (const void *) glutSetKeyRepeat },
170 { "glutForceJoystickFunc", (const void *) glutForceJoystickFunc },
171 { "glutGameModeString", (const void *) glutGameModeString },
172 { "glutEnterGameMode", (const void *) glutEnterGameMode },
173 { "glutLeaveGameMode", (const void *) glutLeaveGameMode },
174 { "glutGameModeGet", (const void *) glutGameModeGet },
175 { NULL, NULL }
176 };
177
178
179 /* XXX This isn't an official GLUT function, yet */
180 void * GLUTAPIENTRY
181 glutGetProcAddress(const char *procName)
182 {
183 /* Try GLUT functions first */
184 int i;
185 for (i = 0; glut_functions[i].name; i++) {
186 if (strcmp(glut_functions[i].name, procName) == 0)
187 return (void *) glut_functions[i].address;
188 }
189
190 /* Try core GL functions */
191 #if defined(_WIN32)
192 return (void *) wglGetProcAddress((LPCSTR) procName);
193
194 #elif defined(__OS2PM__)
195 return (void *) wglGetProcAddress((char *) procName);
196 #elif defined(GLX_ARB_get_proc_address)
197 return (void *) glXGetProcAddressARB((const GLubyte *) procName);
198 #else
199 return NULL;
200 #endif
201 }
202
203
204 /* ENDCENTRY */