# libfips, while all other symbols are private.
# We have two different patterns for identifying wrapped
-# functions. The first is a call to a macro ending in "DEFER" (such as
-# DEFER or TIMED_DEFER). In this case, the first argument to the macro
-# is the name of the wrapped function.
+# functions. The first is a call to one of the DEFER macros
+# (GLWRAP_DEFER, TIMED_DEFER, WGLWRAP_DEFER_WITH_RETURN, etc.). In
+# this case, the name of the wrapped function appears as the first or
+# second argument to the macro, (second for the case of of
+# _WITH_RETURN macro).
deferred=`grep 'DEFER[ (]*e*gl' $@ | sed -s 's/.*DEFER *(\([^,)]*\).*/\1/'`
+deferred_return=`grep 'DEFER_WITH_RETURN *([^,]*, *e*gl' $@ | sed -s 's/.*DEFER_WITH_RETURN *([^,]*, *\([^,)]*\).*/\1/'`
+
# The second-case is functions for which we either implement or call
# the underlying "real" function. In these cases, the code uses the
# convention of having a function or a function-pointer with a name of
EOF
echo "$deferred
+$deferred_return
$wrapped" | sort | uniq | sed -e 's/\(.*\)/ \1;/'
cat <<EOF
real_ ## function(__VA_ARGS__); \
} while (0);
+/* As GLWRAP_DEFER, but also set 'ret' to the return value */
+#define GLWRAP_DEFER_WITH_RETURN(ret, function,...) do { \
+ static typeof(&function) real_ ## function; \
+ if (! real_ ## function) \
+ real_ ## function = glwrap_lookup (#function); \
+ (ret) = real_ ## function(__VA_ARGS__); \
+} while (0);
+
#endif
*/
void (*glXGetProcAddressARB (const GLubyte *func))(void)
{
- void *ptr;
- static typeof(&glXGetProcAddressARB) glxwrap_real_glXGetProcAddressARB = NULL;
- char *name = "glXGetProcAddressARB";
-
- if (! glxwrap_real_glXGetProcAddressARB) {
- glxwrap_real_glXGetProcAddressARB = glwrap_lookup (name);
- if (! glxwrap_real_glXGetProcAddressARB) {
- fprintf (stderr, "Error: Failed to find function %s.\n",
- name);
- return NULL;
- }
- }
+ void *ret;
/* If our library has this symbol, that's what we want to give. */
- ptr = dlwrap_real_dlsym (NULL, (const char *) func);
- if (ptr)
- return ptr;
+ ret = dlwrap_real_dlsym (NULL, (const char *) func);
+ if (ret)
+ return ret;
/* Otherwise, just defer to the real glXGetProcAddressARB. */
- return glxwrap_real_glXGetProcAddressARB (func);
+ GLWRAP_DEFER_WITH_RETURN (ret, glXGetProcAddressARB, func);
+
+ return ret;
}