# Copyright (c) 2001, Stanford University # All rights reserved. # # See the file LICENSE.txt for information on redistributing this software. import sys import apiutil apiutil.CopyrightC() print """ /* DO NOT EDIT - THIS FILE AUTOMATICALLY GENERATED BY dispatch.py SCRIPT */ #include "cr_spu.h" #include "cr_string.h" #include "cr_error.h" static SPUGenericFunction __findFunc( char *name, SPU *spu ) { SPUNamedFunctionTable *temp; if (spu == NULL) return NULL; for (temp = spu->function_table->table ; temp->name != NULL ; temp++) { if (!crStrcmp( name, temp->name ) ) { return temp->fn; } } return __findFunc( name, spu->superSPU ); } /* * This function is not public outside the loader SPU. */ extern void __buildDispatch( SPU *spu ); void __buildDispatch( SPU *spu ) {""" keys = apiutil.GetDispatchedFunctions(sys.argv[1]+"/APIspec.txt") for func_name in keys: print '\tspu->dispatch_table.%s = (%sFunc_t) __findFunc( "%s", spu );' % (func_name,func_name,func_name) print '}' print """ /* * Public function: * Search a SPU named function table for a specific function. Return * a pointer to it or NULL if not found. */ SPUGenericFunction crSPUFindFunction( const SPUNamedFunctionTable *table, const char *fname ) { const SPUNamedFunctionTable *temp; for (temp = table ; temp->name != NULL ; temp++) { if (!crStrcmp( fname, temp->name ) ) { return temp->fn; } } return NULL; } /* * Public function: * Initializes the pointers in an SPUDispatchTable by looking for functions * in an SPUNamedFunctionTable. * It doesn't know anything about SPUs and SPU inheritance. */ void crSPUInitDispatch( SPUDispatchTable *dispatch, const SPUNamedFunctionTable *table ) {""" for func_name in keys: print '\tdispatch->%s = (%sFunc_t) crSPUFindFunction(table, "%s");' % (func_name, func_name, func_name) print '}' print """ /* * Generic no-op function */ static int NopFunction(void) { /* crWarning("Calling generic no-op function in dispatch.c"); */ return 0; } /* * Scan the given dispatch table for NULL pointers. Hook in the generic * no-op function wherever we find a NULL pointer. */ void crSPUInitDispatchNops(SPUDispatchTable *table) { /* * This is a bit tricky. We walk over all the function pointers in * the SPUDispatchTable struct, checking for NULL and setting NULL * pointers to point to NopFunction(). * But we have to stop when we get to the copyList pointer! */ const int numEntries = (void **) &(table->copyList) - (void **) &(table->Accum); void **ptr = (void **) table; int i; for (i = 0; i < numEntries; i++) { if (ptr[i] == NULL) { /*printf("!!!!!!!Warning entry[%d] = NULL\n", i);*/ ptr[i] = (void *)NopFunction; } } } """