3 #include "gs/gs_private.h"
6 gras_dict_t *p_type_driver_dict = NULL;
9 gs_type_drivers_init(void) {
10 gras_dict_insert(p_type_driver_dict, "rl", gs_rl_type_driver(), NULL);
14 struct s_gs_type_driver *
15 gs_type_driver_init(const char *name) {
17 struct s_gs_type_driver_ops *type_driver_ops = NULL;
18 struct s_gs_type_driver *p_type_driver = NULL;
20 gras_dict_retrieve(p_type_driver_dict, name, (void **)&type_driver_ops);
22 GS_FAILURE("type driver not found");
24 p_type_driver = calloc(1, sizeof (struct s_gs_type_driver));
25 p_type_driver->type_ops = type_driver_ops;
26 p_type_driver->specific = NULL;
28 if (type_driver_ops->_init) {
29 type_driver_ops->_init(p_type_driver);
38 gs_type_driver_exit(struct s_gs_type_driver *p_type_driver){
40 struct s_gs_type_driver_ops *type_driver_ops = NULL;
42 type_driver_ops = p_type_driver->type_ops;
43 if (type_driver_ops->_exit) {
44 type_driver_ops->_exit(p_type_driver);
47 p_type_driver->type_ops = NULL;
49 if (p_type_driver->specific) {
50 free(p_type_driver->specific);
51 p_type_driver->specific = NULL;
57 struct s_gs_type_bag *
58 gs_type_bag_alloc(struct s_gs_type_driver *p_driver) {
60 struct s_gs_type_bag *p_bag = NULL;
61 struct s_gs_type_bag_ops *bag_ops = p_driver->bag_ops;
63 p_bag = calloc(1, sizeof(struct s_gs_type_bag));
65 p_bag->bag_ops = bag_ops;
66 p_bag->p_type_driver = p_driver;
67 p_bag->specific = NULL;
70 bag_ops->_init(p_bag);
77 gs_type_bag_free(struct s_gs_type_bag *p_bag) {
79 struct s_gs_type_bag_ops *bag_ops = p_bag->bag_ops;
82 bag_ops->_exit(p_bag);
85 if (p_bag->specific) {
86 free(p_bag->specific);
87 p_bag->specific = NULL;