90 lines
2.6 KiB
Python
90 lines
2.6 KiB
Python
|
#!/usr/bin/env python3
|
||
|
|
||
|
import sys
|
||
|
import cffi
|
||
|
|
||
|
builder = cffi.FFI()
|
||
|
|
||
|
# hexchat-plugin.h
|
||
|
with open(sys.argv[1]) as f:
|
||
|
output = []
|
||
|
eat_until_endif = 0
|
||
|
# This is very specific to hexchat-plugin.h, it is not a cpp
|
||
|
for line in f:
|
||
|
if line.startswith('#define'):
|
||
|
continue
|
||
|
elif line.endswith('HEXCHAT_PLUGIN_H\n'):
|
||
|
continue
|
||
|
elif 'time.h' in line:
|
||
|
output.append('typedef int... time_t;')
|
||
|
elif line.startswith('#if'):
|
||
|
eat_until_endif += 1
|
||
|
elif line.startswith('#endif'):
|
||
|
eat_until_endif -= 1
|
||
|
elif eat_until_endif and '_hexchat_context' not in line:
|
||
|
continue
|
||
|
else:
|
||
|
output.append(line)
|
||
|
builder.cdef(''.join(output))
|
||
|
|
||
|
builder.embedding_api('''
|
||
|
extern "Python" int _on_py_command(char **, char **, void *);
|
||
|
extern "Python" int _on_load_command(char **, char **, void *);
|
||
|
extern "Python" int _on_unload_command(char **, char **, void *);
|
||
|
extern "Python" int _on_reload_command(char **, char **, void *);
|
||
|
extern "Python" int _on_say_command(char **, char **, void *);
|
||
|
|
||
|
extern "Python" int _on_command_hook(char **, char **, void *);
|
||
|
extern "Python" int _on_print_hook(char **, void *);
|
||
|
extern "Python" int _on_print_attrs_hook(char **, hexchat_event_attrs *, void *);
|
||
|
extern "Python" int _on_server_hook(char **, char **, void *);
|
||
|
extern "Python" int _on_server_attrs_hook(char **, char **, hexchat_event_attrs *, void *);
|
||
|
extern "Python" int _on_timer_hook(void *);
|
||
|
|
||
|
extern "Python" int _on_plugin_init(char **, char **, char **, char *, char *);
|
||
|
extern "Python" int _on_plugin_deinit(void);
|
||
|
|
||
|
static hexchat_plugin *ph;
|
||
|
''')
|
||
|
|
||
|
builder.set_source('_hexchat_embedded', '''
|
||
|
/* Python's header defines these.. */
|
||
|
#undef HAVE_MEMRCHR
|
||
|
#undef HAVE_STRINGS_H
|
||
|
|
||
|
#include "config.h"
|
||
|
#include "hexchat-plugin.h"
|
||
|
|
||
|
static hexchat_plugin *ph;
|
||
|
CFFI_DLLEXPORT int _on_plugin_init(char **, char **, char **, char *, char *);
|
||
|
CFFI_DLLEXPORT int _on_plugin_deinit(void);
|
||
|
|
||
|
int hexchat_plugin_init(hexchat_plugin *plugin_handle,
|
||
|
char **name_out, char **description_out,
|
||
|
char **version_out, char *arg)
|
||
|
{
|
||
|
if (ph != NULL)
|
||
|
{
|
||
|
puts ("Python plugin already loaded\\n");
|
||
|
return 0; /* Prevent loading twice */
|
||
|
}
|
||
|
|
||
|
ph = plugin_handle;
|
||
|
return _on_plugin_init(name_out, description_out, version_out, arg, HEXCHATLIBDIR);
|
||
|
}
|
||
|
|
||
|
int hexchat_plugin_deinit(void)
|
||
|
{
|
||
|
int ret = _on_plugin_deinit();
|
||
|
ph = NULL;
|
||
|
return ret;
|
||
|
}
|
||
|
''')
|
||
|
|
||
|
# python.py
|
||
|
with open(sys.argv[2]) as f:
|
||
|
builder.embedding_init_code(f.read())
|
||
|
|
||
|
# python.c
|
||
|
builder.emit_c_code(sys.argv[3])
|