New debug scheme with explicit debug channels declaration.
[wine/testsucceed.git] / graphics / driver.c
blob9fc239b9b6644863e79ce966305db9dc35c4fc35
1 /*
2 * Graphics driver management functions
4 * Copyright 1996 Alexandre Julliard
5 */
7 #include "gdi.h"
8 #include "heap.h"
9 #include "debug.h"
11 DEFAULT_DEBUG_CHANNEL(driver)
12 #include <string.h>
14 typedef struct tagGRAPHICS_DRIVER
16 struct tagGRAPHICS_DRIVER *next;
17 LPSTR name;
18 const DC_FUNCTIONS *funcs;
19 } GRAPHICS_DRIVER;
21 static GRAPHICS_DRIVER *firstDriver = NULL;
22 static GRAPHICS_DRIVER *genericDriver = NULL;
24 /**********************************************************************
25 * DRIVER_RegisterDriver
27 BOOL DRIVER_RegisterDriver( LPCSTR name, const DC_FUNCTIONS *funcs )
29 GRAPHICS_DRIVER *driver = HeapAlloc( SystemHeap, 0, sizeof(*driver) );
30 if (!driver) return FALSE;
31 driver->funcs = funcs;
32 if (name)
34 driver->name = HEAP_strdupA( SystemHeap, 0, name );
35 driver->next = firstDriver;
36 firstDriver = driver;
37 return TRUE;
39 /* No name -> it's the generic driver */
40 if (genericDriver)
42 WARN(driver, " already a generic driver\n" );
43 HeapFree( SystemHeap, 0, driver );
44 return FALSE;
46 driver->name = NULL;
47 genericDriver = driver;
48 return TRUE;
52 /**********************************************************************
53 * DRIVER_FindDriver
55 const DC_FUNCTIONS *DRIVER_FindDriver( LPCSTR name )
57 GRAPHICS_DRIVER *driver = firstDriver;
59 while (driver && name)
61 if (!strcasecmp( driver->name, name )) return driver->funcs;
62 driver = driver->next;
64 return genericDriver ? genericDriver->funcs : NULL;
68 /**********************************************************************
69 * DRIVER_UnregisterDriver
71 BOOL DRIVER_UnregisterDriver( LPCSTR name )
73 if (name)
75 GRAPHICS_DRIVER **ppDriver = &firstDriver;
76 while (*ppDriver)
78 if (!strcasecmp( (*ppDriver)->name, name ))
80 GRAPHICS_DRIVER *driver = *ppDriver;
81 (*ppDriver) = driver->next;
82 HeapFree( SystemHeap, 0, driver->name );
83 HeapFree( SystemHeap, 0, driver );
84 return TRUE;
86 ppDriver = &(*ppDriver)->next;
88 return FALSE;
90 else
92 if (!genericDriver) return FALSE;
93 HeapFree( SystemHeap, 0, genericDriver );
94 genericDriver = NULL;
95 return TRUE;