diff options
Diffstat (limited to 'plugins/nonbmp')
-rw-r--r-- | plugins/nonbmp/makefile.mak | 18 | ||||
-rw-r--r-- | plugins/nonbmp/nonbmp.c | 87 |
2 files changed, 105 insertions, 0 deletions
diff --git a/plugins/nonbmp/makefile.mak b/plugins/nonbmp/makefile.mak new file mode 100644 index 00000000..1c28610d --- /dev/null +++ b/plugins/nonbmp/makefile.mak @@ -0,0 +1,18 @@ +include "..\..\src\makeinc.mak" + +all: nonbmp.obj nonbmp.def + link $(LDFLAGS) $(LIBS) /dll /out:xcnonbmp.dll /def:nonbmp.def nonbmp.obj + +nonbmp.def: + echo EXPORTS > nonbmp.def + echo xchat_plugin_init >> nonbmp.def + echo xchat_plugin_deinit >> nonbmp.def + +nonbmp.obj: nonbmp.c makefile.mak + cl $(CFLAGS) $(GLIB) /I.. nonbmp.c + +clean: + del *.obj + del *.dll + del *.exp + del *.lib diff --git a/plugins/nonbmp/nonbmp.c b/plugins/nonbmp/nonbmp.c new file mode 100644 index 00000000..fe9571b7 --- /dev/null +++ b/plugins/nonbmp/nonbmp.c @@ -0,0 +1,87 @@ +#include <stdlib.h> +#include <glib.h> +#include <string.h> + +#include "xchat-plugin.h" + +static xchat_plugin *ph; +static const char name[] = "Non-BMP"; +static const char desc[] = "Replace non-BMP characters with replacment characters"; +static const char version[] = "1.0000"; +static int recursing = 0; + +static int filter( + char *word[], + char *word_eol[], + void *unused +) { + gunichar *line; + gchar *utf8_line; + glong length; + glong index; + + if( recursing ) { + return XCHAT_EAT_NONE; + } + + /* the input has already been checked so we can use the _fast version */ + line = g_utf8_to_ucs4_fast( + (char *)word_eol[1], + -1, /* NUL terminated input */ + &length + ); + + for( index = 0; index < length; index++ ) { + if( line[ index ] > 0xFFFF ) { + line[ index ] = 0xFFFD; /* replacement character */ + } + } + + utf8_line = g_ucs4_to_utf8( + line, + -1, /* NUL terminated input */ + NULL, /* items read */ + NULL, /* items written */ + NULL /* ignore conversion error */ + ); + + if( utf8_line == NULL ) { + /* conversion failed ... I guess we are screwed? */ + g_free( line ); + return XCHAT_EAT_NONE; + } + + recursing = 1; + xchat_commandf( ph, "RECV %s", utf8_line ); + recursing = 0; + + g_free( line ); + g_free( utf8_line ); + return XCHAT_EAT_ALL; +} + +int xchat_plugin_init( + xchat_plugin *plugin_handle, + char **plugin_name, + char **plugin_desc, + char **plugin_version, + char *arg +) { +/* int index = 0;*/ + + ph = plugin_handle; + *plugin_name = name; + *plugin_desc = desc; + *plugin_version = version; + + xchat_hook_server( ph, "RAW LINE", XCHAT_PRI_HIGHEST, filter, (void *)NULL ); + xchat_printf (ph, "%s plugin loaded\n", name); + return 1; +} + +int +xchat_plugin_deinit (void) +{ + xchat_printf (ph, "%s plugin unloaded\n", name); + return 1; +} \ No newline at end of file |