//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("&amp;"));
  else if ($myChar[0] == '"')
    rb_str_concat(escapeString, rb_str_new2("&quot;"));
  else if ($myChar[0] == '>')
    rb_str_concat(escapeString, rb_str_new2("&gt;"));
  else if ($myChar[0] == '<') 
    rb_str_concat(escapeString, rb_str_new2("&lt;"));
  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);
}