//Ruby header einbinden <- das ist ein Muss #include "ruby.h" //unser Modul VALUE modExtension; //HELPER var static VALUE escapeString; char $myChar[1]; //// //HELPER met static void check_char(char character) { //HELPER var $myChar[0] = character; //wir schauen was für ein char übergeben wurde und konkatinieren es mit der //Ruby methode 'rb_str_concat' an das Ruby Objekt 'escapeString' heran if ($myChar[0] == '&') rb_str_concat(escapeString, rb_str_new2("&")); else if ($myChar[0] == '"') rb_str_concat(escapeString, rb_str_new2(""")); else if ($myChar[0] == '>') rb_str_concat(escapeString, rb_str_new2(">")); else if ($myChar[0] == '<') rb_str_concat(escapeString, rb_str_new2("<")); else rb_str_concat(escapeString, rb_str_new2($myChar)); } //// //HELPER met static void iterate_over(VALUE original_str) { //HELPER var int i; char *p; //wir holen uns den Pointer auf das übergebene Ruby String Objekt VALUE str = StringValue(original_str); p = RSTRING(str)->ptr; //über alle zeichen iterien for (i = 0; i < RSTRING(str)->len; i++, p++) { //aktuelles zeichen prüfen check_char(*p); } } //// //das ist unsere Entwerter Methode static VALUE escape_html_from_c(VALUE self, VALUE string) { //wir erzeugen ein Ruby String Objekt escapeString = rb_str_new2(""); //hier iterieren wir über den übergebenen String un schreiben //den entwerteten String in das Objekt 'escapeString' iterate_over(string); //diese Methode gibt den entwerteten String zurück return StringValue(escapeString); } //// // Initialisierung der Extension void Init_new_escape() { // Modul wird definiert modExtension = rb_define_module("BovisExtension"); // Methode wird dem Modul hinzugefügt rb_define_module_function(modExtension, "escape_html_from_c", escape_html_from_c, 1); }