## prelude-plugin prelude-plugin |

## Synopsis

    #define             PRELUDE_PLUGIN_API_VERSION
    typedef             prelude_plugin_entry_t;
    typedef             prelude_plugin_instance_t;
    #define             PRELUDE_PLUGIN_GENERIC
                        prelude_plugin_generic_t;
    #define             PRELUDE_PLUGIN_SET_PRELOADED_SYMBOLS()
    #define             PRELUDE_PLUGIN_OPTION_DECLARE_STRING_CB(prefix, type, name)
    #define             prelude_plugin_get_name             (p)
    #define             prelude_plugin_set_name             (p, str)
    #define             prelude_plugin_set_destroy_func     (p, func)
    void                prelude_plugin_entry_set_plugin     (prelude_plugin_entry_t *pe,
                                                             prelude_plugin_generic_t *pl);
    int                 prelude_plugin_set_activation_option
                                                            (prelude_plugin_entry_t *pe,
                                                             prelude_option_t *opt,
                                                             int (*commit) (prelude_plugin_instance_t *pi, prelude_string_t *err));
    int                 prelude_plugin_instance_subscribe   (prelude_plugin_instance_t *pi);
    int                 prelude_plugin_instance_unsubscribe (prelude_plugin_instance_t *pi);
    int                 prelude_plugin_new_instance         (prelude_plugin_instance_t **pi,
                                                             prelude_plugin_generic_t *plugin,
                                                             const char *name,
                                                             void *data);
    prelude_plugin_generic_t* prelude_plugin_search_by_name (prelude_list_t *head,
                                                             const char *name);
    prelude_plugin_instance_t* prelude_plugin_search_instance_by_name
                                                            (prelude_list_t *head,
                                                             const char *pname,
                                                             const char *iname);
    void                prelude_plugin_instance_set_data    (prelude_plugin_instance_t *pi,
                                                             void *data);
    void*               prelude_plugin_instance_get_data    (prelude_plugin_instance_t *pi);
    void                prelude_plugin_instance_set_plugin_data
                                                            (prelude_plugin_instance_t *pi,
                                                             void *data);
    void*               prelude_plugin_instance_get_plugin_data
                                                            (prelude_plugin_instance_t *pi);
    const char*         prelude_plugin_instance_get_name    (prelude_plugin_instance_t *pi);
    prelude_plugin_generic_t* prelude_plugin_instance_get_plugin
                                                            (prelude_plugin_instance_t *pi);
    int                 prelude_plugin_load_from_dir        (prelude_list_t *head,
                                                             const char *dirname,
                                                             const char *symbol,
                                                             void *ptr,
                                                             int (*subscribe) (prelude_plugin_instance_t *p),
                                                             void (*unsubscribe) (prelude_plugin_instance_t *pi));
    int                 prelude_plugin_instance_add         (prelude_plugin_instance_t *pi,
                                                             prelude_list_t *h);
    void                prelude_plugin_instance_del         (prelude_plugin_instance_t *pi);
    void                prelude_plugin_instance_compute_time
                                                            (prelude_plugin_instance_t *pi,
                                                             struct timeval *start,
                                                             struct timeval *end);
    int                 prelude_plugin_instance_call_commit_func
                                                            (prelude_plugin_instance_t *pi,
                                                             prelude_string_t *err);
    prelude_bool_t      prelude_plugin_instance_has_commit_func
                                                            (prelude_plugin_instance_t *pi);
    void                prelude_plugin_set_preloaded_symbols
                                                            (void *symlist);
    prelude_plugin_generic_t* prelude_plugin_get_next       (prelude_list_t *head,
                                                             prelude_list_t **iter);
    void                prelude_plugin_unload               (prelude_plugin_generic_t *plugin);
    #define             prelude_plugin_compute_stats        (pi, func)
    #define             prelude_plugin_run                  (pi, type, member, ...)

## Description

## Details

### PRELUDE_PLUGIN_API_VERSION

    #define PRELUDE_PLUGIN_API_VERSION 1

### prelude_plugin_entry_t

    typedef struct prelude_plugin_entry prelude_plugin_entry_t;

### prelude_plugin_instance_t

    typedef struct prelude_plugin_instance prelude_plugin_instance_t;

### PRELUDE_PLUGIN_GENERIC

    #define             PRELUDE_PLUGIN_GENERIC

### prelude_plugin_generic_t

    typedef struct {
            PRELUDE_PLUGIN_GENERIC;
    } prelude_plugin_generic_t;

### PRELUDE_PLUGIN_SET_PRELOADED_SYMBOLS()

    #define             PRELUDE_PLUGIN_SET_PRELOADED_SYMBOLS()

### PRELUDE_PLUGIN_OPTION_DECLARE_STRING_CB()

    #define             PRELUDE_PLUGIN_OPTION_DECLARE_STRING_CB(prefix, type, name)

`prefix` : |
`type` : |
`name` : |

### prelude_plugin_get_name()

    #define prelude_plugin_get_name(p) (p)->name

`p` : |

### prelude_plugin_set_name()

    #define prelude_plugin_set_name(p, str) (p)->name = (str)

`p` : |
`str` : |

### prelude_plugin_set_destroy_func()

    #define prelude_plugin_set_destroy_func(p, func) (p)->destroy = func

`p` : |
`func` : |

### prelude_plugin_entry_set_plugin ()

    void                prelude_plugin_entry_set_plugin     (prelude_plugin_entry_t *pe,
                                                             prelude_plugin_generic_t *pl);

`pe` : |
`pl` : |

### prelude_plugin_set_activation_option ()

    int                 prelude_plugin_set_activation_option
                                                            (prelude_plugin_entry_t *pe,
                                                             prelude_option_t *opt,
                                                             int (*commit) (prelude_plugin_instance_t *pi, prelude_string_t *err));

`pe` : |
`opt` : |
`commit` : |
Returns : |

### prelude_plugin_instance_subscribe ()

    int                 prelude_plugin_instance_subscribe   (prelude_plugin_instance_t *pi);

`pi` : |
Returns : |

### prelude_plugin_instance_unsubscribe ()

    int                 prelude_plugin_instance_unsubscribe (prelude_plugin_instance_t *pi);

Set `pi` to be inactive.

The unsubscribe function specified in `plugin_load_from_dir()` is called for plugin un-registration and the instance for this plugin is freed.

`pi` : | Pointer to a plugin instance.
Returns : | 0 on success, -1 if an error occured.

### prelude_plugin_new_instance ()

    int                 prelude_plugin_new_instance         (prelude_plugin_instance_t **pi,
                                                             prelude_plugin_generic_t *plugin,
                                                             const char *name,
                                                             void *data);

`pi` : |
`plugin` : |
`name` : |
`data` : |
Returns : |

### prelude_plugin_search_by_name ()

    prelude_plugin_generic_t* prelude_plugin_search_by_name (prelude_list_t *head,
                                                             const char *name);

Search `head` list of plugin for a plugin with name `name`.

`head` : | List where to search the plugin from.
`name` : | Name of the plugin to search.
Returns : | the a prelude_plugin_t on success, or NULL if the plugin does not exist.

### prelude_plugin_search_instance_by_name ()

    prelude_plugin_instance_t* prelude_plugin_search_instance_by_name
                                                            (prelude_list_t *head,
                                                             const char *pname,
                                                             const char *iname);

`head` : |
`pname` : |
`iname` : |
Returns : |

### prelude_plugin_instance_set_data ()

    void                prelude_plugin_instance_set_data    (prelude_plugin_instance_t *pi,
                                                             void *data);

`pi` : |
`data` : |

### prelude_plugin_instance_get_data ()

    void*               prelude_plugin_instance_get_data    (prelude_plugin_instance_t *pi);

`pi` : |
Returns : |

### prelude_plugin_instance_set_plugin_data ()

    void                prelude_plugin_instance_set_plugin_data
                                                            (prelude_plugin_instance_t *pi,
                                                             void *data);

`pi` : |
`data` : |

### prelude_plugin_instance_get_plugin_data ()

    void*               prelude_plugin_instance_get_plugin_data
                                                            (prelude_plugin_instance_t *pi);

`pi` : |
Returns : |

### prelude_plugin_instance_get_name ()

    const char*         prelude_plugin_instance_get_name    (prelude_plugin_instance_t *pi);

`pi` : |
Returns : |

### prelude_plugin_instance_get_plugin ()

    prelude_plugin_generic_t* prelude_plugin_instance_get_plugin
                                                            (prelude_plugin_instance_t *pi);

`pi` : |
Returns : |

### prelude_plugin_load_from_dir ()

    int                 prelude_plugin_load_from_dir        (prelude_list_t *head,
                                                             const char *dirname,
                                                             const char *symbol,
                                                             void *ptr,
                                                             int (*subscribe) (prelude_plugin_instance_t *p),
                                                             void (*unsubscribe) (prelude_plugin_instance_t *pi));

Load all plugins in directory 'dirname', using `symbol` entry point. Each plugin have a `subscribe` and `unsubscribe` callback associated with it.

The plugins are loaded, but not active, until someone call `prelude_plugin_subscribe()` on one of the plugin. Which'll call `subscribe` in order to register it.

`ptr` is an extra argument provided to the plugin at initialization time.

`head` : | List where the loaded plugin should be added.
`dirname` : | The directory to load the plugin from.
`symbol` : | Symbol to lookup within loaded plugin.
`ptr` : | Extra pointer to provide to the plugin initialization function.
`subscribe` : | Pointer to a callback function for plugin subscribtion.
`unsubscribe` : | Pointer to a callback function for plugin un-subscribtion.
Returns : | The number of loaded plugins on success, -1 on error.

### prelude_plugin_instance_add ()

    int                 prelude_plugin_instance_add         (prelude_plugin_instance_t *pi,
                                                             prelude_list_t *h);

This function add the plugin instance associated with `pi` to the linked list specified by `h`. If this instance is already used somewhere else, a copy is made, since instance does not share information).

`pi` : | Pointer to a plugin instance
`h` : | Pointer to a linked list
Returns : | 0 on success or -1 if an error occured.

### prelude_plugin_instance_del ()

    void                prelude_plugin_instance_del         (prelude_plugin_instance_t *pi);

Delete `pi` from the list specified at `prelude_plugin_instance_add()` time.

`pi` : | Pointer to a plugin instance.

### prelude_plugin_instance_compute_time ()

    void                prelude_plugin_instance_compute_time
                                                            (prelude_plugin_instance_t *pi,
                                                             struct timeval *start,
                                                             struct timeval *end);

`pi` : |
`start` : |
`end` : |

### prelude_plugin_instance_call_commit_func ()

    int                 prelude_plugin_instance_call_commit_func
                                                            (prelude_plugin_instance_t *pi,
                                                             prelude_string_t *err);

`pi` : |
`err` : |
Returns : |

### prelude_plugin_instance_has_commit_func ()

    prelude_bool_t      prelude_plugin_instance_has_commit_func
                                                            (prelude_plugin_instance_t *pi);

`pi` : |
Returns : |

### prelude_plugin_set_preloaded_symbols ()

    void                prelude_plugin_set_preloaded_symbols
                                                            (void *symlist);

`symlist` : |

### prelude_plugin_get_next ()

    prelude_plugin_generic_t* prelude_plugin_get_next       (prelude_list_t *head,
                                                             prelude_list_t **iter);

`head` : |
`iter` : |
Returns : |

### prelude_plugin_unload ()

    void                prelude_plugin_unload               (prelude_plugin_generic_t *plugin);

`plugin` : |

### prelude_plugin_compute_stats()

    #define             prelude_plugin_compute_stats(pi, func)

`pi` : |
`func` : |

### prelude_plugin_run()

    #define             prelude_plugin_run(pi, type, member, ...)

`pi` : |
`type` : |
`member` : |
`...` : |