<commit_before>//
//  ansilove.c
//  AnsiLove/C
//
//  Copyright (c) 2011, <NAME>. All rights reserved.
//  http://byteproject.net
//
//  Use of this source code is governed by a MIT-style license.
//  See the file LICENSE for details.
//

#if defined(__APPLE__) && defined(__MACH__)
#import "ansilove.h"
#else
#include <stdbool.h>
#include "ansilove.h"
#endif

///*****************************************************************************/
///* CREATE THUMBNAIL                                                          */
///*****************************************************************************/
//
//function thumbnail($source,$output,$columns,font_size_y,$position_y_max)
//{
//   $columns=min($columns,80);
//
//   if (THUMBNAILS_SIZE<=0)
//   {
//      $size=1;
//   }
//   else
//   {
//      $size=THUMBNAILS_SIZE;
//   }
//
//   if (THUMBNAILS_HEIGHT==0)
//   {
//      $height=$position_y_max*(font_size_y/8);
//      $height_source=$position_y_max*font_size_y;
//   }
//   else
//   {
//      $height=min($position_y_max*(font_size_y/8),THUMBNAILS_HEIGHT);
//      $height_source=$height*8;
//   }
//
//   $width_source=$columns*8;
//   $height*=$size;
//   $columns*=$size;
//
//   if (!$thumbnail = imagecreatetruecolor($columns,$height))
//   {
//      error("Can't allocate buffer image memory");
//   }
//
//   imagecopyresampled($thumbnail,$source,0,0,0,0,$columns,$height,$width_source,$height_source);
//
//   if ($output=='online')
//   {
//      Header("Content-type: image/png");
//      ImagePNG($thumbnail);
//   }
//   else
//   {
//      ImagePNG($thumbnail,$output);
//   }
//
//   imagedestroy($thumbnail);
//}
//
//
//

// load ANSi file and generate output PNG
void alAnsiLoader(char *input, char output[], char font[], char bits[], char icecolors[], char *fext)
{
    // ladies and gentlemen, it's type declaration time
    int64_t columns = 80;
    int64_t font_size_x;
    int64_t font_size_y;
    char *font_file;
    bool isAmigaFont = false;
    bool ced = false;
    bool thumbnail = false;
    bool transparent = false;
    bool workbench = false;
    
    // determine the font we use to render the output
    if (strcmp(font, "80x25") == 0) {
        font_file = "ansilove_font_pc_80x25.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "80x50") == 0) {
        font_file = "ansilove_font_pc_80x50.png";
        font_size_x = 9;
        font_size_y = 8;
    }
    else if (strcmp(font, "terminus") == 0) {
        font_file = "ansilove_font_pc_terminus.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "armenian") == 0) {
        font_file = "ansilove_font_pc_armenian.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "baltic") == 0) {
        font_file = "ansilove_font_pc_baltic.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "cyrillic") == 0) {
        font_file = "ansilove_font_pc_cyrillic.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "french-canadian") == 0) {
        font_file = "ansilove_font_pc_french_canadian.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "greek") == 0) {
        font_file = "ansilove_font_pc_greek.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "greek-869") == 0) {
        font_file = "ansilove_font_pc_greek_869.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "hebrew") == 0) {
        font_file = "ansilove_font_pc_hebrew.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "icelandic") == 0) {
        font_file = "ansilove_font_pc_icelandic.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "latin1") == 0) {
        font_file = "ansilove_font_pc_latin1.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "latin2") == 0) {
        font_file = "ansilove_font_pc_latin2.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "nordic") == 0) {
        font_file = "ansilove_font_pc_nordic.png";
        font_size_x = 9;
        font_size_y = 16; 
    }
    else if (strcmp(font, "persian") == 0) {
        font_file = "ansilove_font_pc_persian.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "portuguese") == 0) {
        font_file = "ansilove_font_pc_portuguese.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "russian") == 0) {
        font_file = "ansilove_font_pc_russian.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "turkish") == 0) {
        font_file = "ansilove_font_pc_turkish.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "amiga") == 0) {
        isAmigaFont = true;
        font_file = "ansilove_font_amiga_topaz_1200.png";
        font_size_x = 8;
        font_size_y = 16;
    }
    else if (strcmp(font, "b-strict") == 0) {
        isAmigaFont = true;
        font_file = "ansilove_font_amiga_b-strict.png";
        font_size_x = 8;
        font_size_y = 8;
    }
    else if (strcmp(font, "b-struct") == 0) {
        isAmigaFont = true;
        font_file = "ansilove_font_amiga_b-struct.png";
        font_size_x = 8;
        font_size_y = 8;
    }
    else if (strcmp(font, "microknight") == 0) {
        isAmigaFont = true;
        font_file = "ansilove_font_amiga_microknight.png";
        font_size_x = 8;
        font_size_y = 16;
    }
    else if (strcmp(font, "microknight+") == 0) {
        isAmigaFont = true;
        font_file = "ansilove_font_amiga_microknight+.png";
        font_size_x = 8;
        font_size_y = 16;
    }
    else if (strcmp(font, "microknightplus") == 0) {
        isAmigaFont = true;
        font_file = "ansilove_font_amiga_microknight+.png";
        font_size_x = 8;
        font_size_y = 16;
    }
    else if (strcmp(font, "mosoul") == 0) {
        isAmigaFont = true;
        font_file = "ansilove_font_amiga_mosoul.png";
        font_size_x = 8;
        font_size_y = 16;
    }
    else if (strcmp(font, "pot-noodle") == 0) {
        isAmigaFont = true;
        font_file = "ansilove_font_amiga_pot-noodle.png";
        font_size_x = 8;
        font_size_y = 16;
    }
    else if (strcmp(font, "topaz") == 0) {
        isAmigaFont = true;
        font_file = "ansilove_font_amiga_topaz_1200.png";
        font_size_x = 8;
        font_size_y = 16;   
    }
    else if (strcmp(font, "topaz+") == 0) {
        isAmigaFont = true;
        font_file = "ansilove_font_amiga_topaz_1200+.png";
        font_size_x = 8;
        font_size_y = 16;
    }
    else if (strcmp(font, "topazplus") == 0) {
        isAmigaFont = true;
        font_file = "ansilove_font_amiga_topaz_1200+.png";
        font_size_x = 8;
        font_size_y = 16;
    }
    else if (strcmp(font, "topaz500") == 0) {
        isAmigaFont = true;
        font_file = "ansilove_font_amiga_topaz_500.png";
        font_size_x = 8;
        font_size_y = 16;
    }
    else if (strcmp(font, "topaz500+") == 0) {
        isAmigaFont = true;
        font_file = "ansilove_font_amiga_topaz_500+.png";
        font_size_x = 8;
        font_size_y = 16;
    }
    else if (strcmp(font, "topaz500plus") == 0) {
        isAmigaFont = true;
        font_file = "ansilove_font_amiga_topaz_500+.png";
        font_size_x = 8;
        font_size_y = 16;
    }
    else {
        // in all other cases use the standard DOS font
        font_file = "ansilove_font_pc_80x25.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    
    // to deal with the bits flag, we declared handy bool types   
    if (strcmp(bits, "ced") == 0) {
        ced = true;
    }
    else if (strcmp(bits, "thumbnail") == 0) {
        thumbnail = true;
    }
    else if (strcmp(bits, "transparent") == 0) {
        transparent = true;
    }
    else if (strcmp(bits, "workbench") == 0) {
        workbench = true;
    }
    else if (strcmp(bits, "workbench-transparent") == 0) {
        workbench = true;
        transparent = true;
    }
    // force defaults if necessary
    else if ((strcmp(bits, "8") != 0 && strcmp(bits, "9") != 0) || isAmigaFont == true) {
        sprintf(bits, "%s", "8");
    }
    
    // purpose: surpressing Clang warnings of unused font / columns variables :)
    // gonna remove that pretty soon! 
    printf("font file: %s / ANSi columns: %lld\n", font_file, columns);
    
    // this is for testing my explode() function I ported (and enhanced) from PHP.
    // will be wiped from the codebase again...!
    char **dizArray;
    int64_t dizCount, i;
    
    dizCount = explode(&dizArray, ',', DIZ_EXTENSIONS);
    
    for (i = 0; i < dizCount; ++i) {
        printf("DIZ-extension %lld: %s\n", i+1, dizArray[i]);
    }
    
} // < -- REMINDER: Remove this when enabling the ANSi code below again!

    // load the input file
    
//   if (!$input_file = fopen($input,'r'))
//   {
//      error("Can't open file $input");
//   }
//
//   $input_file_sauce=load_sauce($input);
//
//   if ($input_file_sauce!=NULL)
//   {
//      $input_file_size=$input_file_sauce['FileSize'];
//   }
//   else
//   {
//      $input_file_size=filesize($input);
//   }
//
//   if (!$input_file_buffer = fread($input_file,$input_file_size))
//   {
//      error("Can't read file $input");
//   }
//
//   fclose($input_file);
//
//   $diz_extensions_exploded=explode(",",DIZ_EXTENSIONS);
//
//   for ($loop=0;$loop<sizeof($diz_extensions_exploded);$loop++)
//   {
//      $diz_extension_length=strlen($diz_extensions_exploded[$loop]);
//
//      if (strtolower(substr($input,(strlen($input)-$diz_extension_length),$diz_extension_length))==$diz_extensions_exploded[$loop] || strtolower(substr($input,strlen($input)-($diz_extension_length+9),($diz_extension_length+9)))==$diz_extensions_exploded[$loop].'.ansilove')
//      {
//         $input_file_buffer=preg_replace("/^(\s+[\r\n])+/","",$input_file_buffer);
//         $input_file_buffer=rtrim($input_file_buffer);
//         $input_file_size=strlen($input_file_buffer);
//      }
//   }
//
///*****************************************************************************/
///* LOAD BACKGROUND/FONT                                                      */
///*****************************************************************************/
//
//   if (!$background = imagecreatefrompng(dirname(__FILE__).'/fonts/ansilove_background.png'))
//   {
//      error("Can't open file ansilove_background.png");
//   }
//
//   if (!$font = imagecreatefrompng(dirname(__FILE__).'/fonts/'.font_file))
//   {
//      error("Can't open file font_file");
//   }
//
//   imagecolortransparent($font,20);
//
//
//
///*****************************************************************************/
///* PROCESS ANSI                                                              */
///*****************************************************************************/
//
//   $color_background=0;
//   $color_foreground=7;
//
//   $loop=0;
//
//   $position_x=0;
//   $position_y=0;
//
//   $position_x_max=0;
//   $position_y_max=0;
//
//   while ($loop<$input_file_size)
//   {
//      $current_character=ord($input_file_buffer[$loop]);
//      $next_character=ord($input_file_buffer[$loop+1]);
//
//      if ($position_x==80 && WRAP_COLUMN_80)
//      {
//         $position_y++;
//         $position_x=0;
//      }
//
///*****************************************************************************/
///* CR+LF                                                                     */
///*****************************************************************************/
//
//      if ($current_character==13)
//      {
//         if ($next_character==10)
//         {
//            $position_y++;
//            $position_x=0;
//            $loop++;
//         }
//      }
//
///*****************************************************************************/
///* LF                                                                        */
///*****************************************************************************/
//
//      if ($current_character==10)
//      {
//         $position_y++;
//         $position_x=0;
//      }
//
///*****************************************************************************/
///* TAB                                                                       */
///*****************************************************************************/
//
//      if ($current_character==9)
//      {
//         $position_x+=8;
//      }
//
///*****************************************************************************/
///* SUB                                                                       */
///*****************************************************************************/
//
//      if ($current_character==26 && SUBSTITUTE_BREAK)
//      {
//         break;
//      }
//
//
//
///*****************************************************************************/
///* ANSI SEQUENCE                                                             */
///*****************************************************************************/
//
//      if ($current_character==27 && $next_character==91)
//      {
//         unset($ansi_sequence);
//
//         for ($ansi_sequence_loop=0;$ansi_sequence_loop<12;$ansi_sequence_loop++)
//         {
//            $ansi_sequence_character=$input_file_buffer[$loop+2+$ansi_sequence_loop];
//
///*****************************************************************************/
///* CURSOR POSITION                                                           */
///*****************************************************************************/
//
//            if ($ansi_sequence_character=='H' || $ansi_sequence_character=='f')
//            {
//               $ansi_sequence_exploded=explode(";",$ansi_sequence);
//               $position_y=$ansi_sequence_exploded[0]-1;
//               $position_x=$ansi_sequence_exploded[1]-1;
//
//               $loop+=$ansi_sequence_loop+2;
//               break;
//            }
//
///*****************************************************************************/
///* CURSOR UP                                                                 */
///*****************************************************************************/
//
//            if ($ansi_sequence_character=='A')
//            {
//               if ($ansi_sequence=='')
//               {
//                  $ansi_sequence=1;
//               }
//
//               $position_y=$position_y-$ansi_sequence;
//
//               $loop+=$ansi_sequence_loop+2;
//               break;
//            }
//
///*****************************************************************************/
///* CURSOR DOWN                                                               */
///*****************************************************************************/
//
//            if ($ansi_sequence_character=='B')
//            {
//               if ($ansi_sequence=='')
//               {
//                  $ansi_sequence=1;
//               }
//
//               $position_y=$position_y+$ansi_sequence;
//
//               $loop+=$ansi_sequence_loop+2;
//               break;
//            }
//
///*****************************************************************************/
///* CURSOR FORWARD                                                            */
///*****************************************************************************/
//
//            if ($ansi_sequence_character=='C')
//            {
//               if ($ansi_sequence=='')
//               {
//                  $ansi_sequence=1;
//               }
//
//               $position_x=$position_x+$ansi_sequence;
//               if ($position_x>80)
//               {
//                  $position_x=80;
//               }
//
//               $loop+=$ansi_sequence_loop+2;
//               break;
//            }
//
///*****************************************************************************/
///* CURSOR BACKWARD                                                           */
///*****************************************************************************/
//
//            if ($ansi_sequence_character=='D')
//            {
//               if ($ansi_sequence=='')
//               {
//                  $ansi_sequence=1;
//               }
//
//               $position_x=$position_x-$ansi_sequence;
//               if ($position_x<0)
//               {
//                  $position_x=0;
//               }
//
//               $loop+=$ansi_sequence_loop+2;
//               break;
//            }
//
///*****************************************************************************/
///* SAVE CURSOR POSITION                                                      */
///*****************************************************************************/
//
//            if ($ansi_sequence_character=='s')
//            {
//               $saved_position_y=$position_y;
//               $saved_position_x=$position_x;
//
//               $loop+=$ansi_sequence_loop+2;
//               break;
//            }
//
///*****************************************************************************/
///* RESTORE CURSOR POSITION                                                   */
///*****************************************************************************/
//
//            if ($ansi_sequence_character=='u')
//            {
//               $position_y=$saved_position_y;
//               $position_x=$saved_position_x;
//
//               $loop+=$ansi_sequence_loop+2;
//               break;
//            }
//
///*****************************************************************************/
///* ERASE DISPLAY                                                             */
///*****************************************************************************/
//
//            if ($ansi_sequence_character=='J')
//            {
//               if ($ansi_sequence==2)
//               {
//                  unset($ansi_buffer);
//
//                  $position_x=0;
//                  $position_y=0;
//
//                  $position_x_max=0;
//                  $position_y_max=0;
//               }
//
//               $loop+=$ansi_sequence_loop+2;
//               break;
//            }
//
///*****************************************************************************/
///* SET GRAPHIC RENDITION                                                     */
///*****************************************************************************/
//
//            if ($ansi_sequence_character=='m')
//            {
//               $ansi_sequence_exploded=explode(";",$ansi_sequence);
//
//               sort($ansi_sequence_exploded);
//
//               for ($loop_ansi_sequence=0;$loop_ansi_sequence<sizeof($ansi_sequence_exploded);$loop_ansi_sequence++)
//               {
//                  $ansi_sequence_value=$ansi_sequence_exploded[$loop_ansi_sequence];
//
//                  if ($ansi_sequence_value==0)
//                  {
//                     $color_background=0;
//                     $color_foreground=7;
//                     $bold=FALSE;
//                     $underline=FALSE;
//                     $italics=FALSE;
//                     $blink=FALSE;
//                  }
//
//                  if ($ansi_sequence_value==1)
//                  {
//                     if (!$workbench)
//                     {
//                        $color_foreground+=8;
//					 }
//                     $bold=TRUE;
//                  }
//
//                  if ($ansi_sequence_value==3)
//                  {
//                     $italics=TRUE;
//                  }
//
//                  if ($ansi_sequence_value==4)
//                  {
//                     $underline=TRUE;
//                  }
//
//                  if ($ansi_sequence_value==5)
//                  {
//                     if (!$workbench)
//                     {
//                        $color_background+=8;
//					 }
//                     $blink=TRUE;
//                  }
//
//                  if ($ansi_sequence_value>29 && $ansi_sequence_value<38)
//                  {
//                     $color_foreground=$ansi_sequence_value-30;
//
//                     if ($bold)
//                     {
//                        $color_foreground+=8;
//                     }
//                  }
//
//                  if ($ansi_sequence_value>39 && $ansi_sequence_value<48)
//                  {
//                     $color_background=$ansi_sequence_value-40;
//
//                     if ($blink && $icecolors)
//                     {
//                        $color_background+=8;
//                     }
//                  }
//               }
//
//               $loop+=$ansi_sequence_loop+2;
//               break;
//            }
//
///*****************************************************************************/
///* CURSOR DE/ACTIVATION (AMIGA ANSI)                                         */
///*****************************************************************************/
//
//            if ($ansi_sequence_character=='p')
//            {
//               $loop+=$ansi_sequence_loop+2;
//               break;
//            }
//
//            $ansi_sequence.=$ansi_sequence_character;
//         }
//      }
//      elseif ($current_character!=10 && $current_character!=13 && $current_character!=9)
//      {
//
///*****************************************************************************/
///* RECORD NUMBER OF COLUMNS AND LINES USED                                   */
///*****************************************************************************/
//
//         if ($position_x>$position_x_max)
//         {
//            $position_x_max=$position_x;
//         }
//
//         if ($position_y>$position_y_max)
//         {
//            $position_y_max=$position_y;
//         }
//
//
//
///*****************************************************************************/
///* WRITE CURRENT CHARACTER INFO IN A TEMPORARY ARRAY                         */
///*****************************************************************************/
//
//         if (!$font_amiga || ($current_character!=12 && $current_character!=13))
//         {
//            $ansi_buffer.=chr($color_background);
//            $ansi_buffer.=chr($color_foreground);
//            $ansi_buffer.=chr($current_character);
//            $ansi_buffer.=chr($bold);
//            $ansi_buffer.=chr($italics);
//            $ansi_buffer.=chr($underline);
//            $ansi_buffer.=chr($position_x);
//            $ansi_buffer.=chr($position_y & 0xFF);
//            $ansi_buffer.=chr($position_y>>8);
//
//            $position_x++;
//         }
//      }
//      $loop++;
//   }
//
//
//
///*****************************************************************************/
///* ALLOCATE IMAGE BUFFER MEMORY                                              */
///*****************************************************************************/
//
//   $position_x_max++;
//   $position_y_max++;
//
//   if ($ced)
//   {
//      $columns=78;
//   }
//
//   for ($loop=0;$loop<sizeof($diz_extensions_exploded);$loop++)
//   {
//      $diz_extension_length=strlen($diz_extensions_exploded[$loop]);
//
//      if (strtolower(substr($input,(strlen($input)-$diz_extension_length),$diz_extension_length))==$diz_extensions_exploded[$loop] || strtolower(substr($input,strlen($input)-($diz_extension_length+9),($diz_extension_length+9)))==$diz_extensions_exploded[$loop].'.ansilove')
//      {
//         $columns=min($position_x_max,80);
//      }
//   }
//
//   if (!$ansi = imagecreate($columns*$bits,($position_y_max)*font_size_y))
//   {
//      error("Can't allocate buffer image memory");
//   }
//
//   if ($ced)
//   {
//      $ced_background_color=explode(",",CED_BACKGROUND_COLOR);
//      $ced_foreground_color=explode(",",CED_FOREGROUND_COLOR);
//
//      imagecolorallocate($ansi,$ced_background_color[0],$ced_background_color[1],$ced_background_color[2]);
//
//      $ced_color=imagecolorallocate($ansi,$ced_background_color[0],$ced_background_color[1],$ced_background_color[2]);
//      $ced_color=imagecolorallocate($background,$ced_background_color[0],$ced_background_color[1],$ced_background_color[2]);
//
//      imagefill($ansi,0,0,$ced_color);
//      imagefilledrectangle($background,0,0,144,16,$ced_color);
//
//      for ($loop=0;$loop<16;$loop++)
//      {
//         imagecolorset($font,$loop,$ced_foreground_color[0],$ced_foreground_color[1],$ced_foreground_color[2]);
//      }
//   }
//   else if ($workbench)
//   {
//      $workbench_color[0]=explode(",",WORKBENCH_COLOR_0);
//      $workbench_color[1]=explode(",",WORKBENCH_COLOR_4);
//      $workbench_color[2]=explode(",",WORKBENCH_COLOR_2);
//      $workbench_color[3]=explode(",",WORKBENCH_COLOR_6);
//      $workbench_color[4]=explode(",",WORKBENCH_COLOR_1);
//      $workbench_color[5]=explode(",",WORKBENCH_COLOR_5);
//      $workbench_color[6]=explode(",",WORKBENCH_COLOR_3);
//      $workbench_color[7]=explode(",",WORKBENCH_COLOR_7);
//
//      imagecolorallocate($ansi,$workbench_color[0][0],$workbench_color[0][1],$workbench_color[0][2]);
//
//      $workbench_background=imagecolorallocate($ansi,$workbench_color[0][0],$workbench_color[0][1],$workbench_color[0][2]);
//      $workbench_background=imagecolorallocate($background,$workbench_color[0][0],$workbench_color[0][1],$workbench_color[0][2]);
//
//      imagefill($ansi,0,0,$workbench_background);
//
//      for ($loop=0; $loop<8; $loop++)
//      {
//         imagecolorset($background,$loop,$workbench_color[$loop][0],$workbench_color[$loop][1],$workbench_color[$loop][2]);
//         imagecolorset($background,$loop+8,$workbench_color[$loop][0],$workbench_color[$loop][1],$workbench_color[$loop][2]);
//         imagecolorset($font,$loop,$workbench_color[$loop][0],$workbench_color[$loop][1],$workbench_color[$loop][2]);
//         imagecolorset($font,$loop+8,$workbench_color[$loop][0],$workbench_color[$loop][1],$workbench_color[$loop][2]);
//      }
//   }
//   else
//   {
//      $background_canvas=imagecolorallocate($ansi,0,0,0);
//   }
//
//   for ($loop=0; $loop<16; $loop++)
//   {
//	  /* Generating ANSI colors array in order to be able to draw underlines */
//      $color_index=imagecolorsforindex($background,$loop);
//      $colors[$loop]=imagecolorallocate($ansi,$color_index['red'],$color_index['green'],$color_index['blue']);
//   }
//
//
//
///*****************************************************************************/
///* RENDER ANSI                                                               */
///*****************************************************************************/
//
//   for ($loop=0;$loop<strlen($ansi_buffer);$loop+=9)
//   {
//      $color_background=ord($ansi_buffer[$loop]);
//      $color_foreground=ord($ansi_buffer[$loop+1]);
//      $character=ord($ansi_buffer[$loop+2]);
//      $bold=ord($ansi_buffer[$loop+3]);
//      $italics=ord($ansi_buffer[$loop+4]);
//      $underline=ord($ansi_buffer[$loop+5]);
//      $position_x=ord($ansi_buffer[$loop+6]);
//      $position_y=ord($ansi_buffer[$loop+7])+(ord($ansi_buffer[$loop+8])<<8);
//
//      if (!$font_amiga)
//      {
//         imagecopy($ansi,$background,$position_x*$bits,$position_y*font_size_y,$color_background*9,0,$bits,font_size_y);
//         imagecopy($ansi,$font,$position_x*$bits,$position_y*font_size_y,$character*font_size_x,$color_foreground*font_size_y,$bits,font_size_y);
//      }
//      else
//      {
//         if ($color_background!=0 || !$italics)
//         {
//            imagecopy($ansi,$background,$position_x*$bits,$position_y*font_size_y,$color_background*9,0,$bits,font_size_y);
//         }
//
//         if (!$italics)
//         {
//            imagecopy($ansi,$font,$position_x*$bits,$position_y*font_size_y,$character*font_size_x,$color_foreground*font_size_y,$bits,font_size_y);
//         }
//         else
//         {
//            imagecopy($ansi,$font,$position_x*$bits+3,$position_y*font_size_y,$character*font_size_x,$color_foreground*font_size_y,$bits,2);
//            imagecopy($ansi,$font,$position_x*$bits+2,$position_y*font_size_y+2,$character*font_size_x,$color_foreground*font_size_y+2,$bits,4);
//            imagecopy($ansi,$font,$position_x*$bits+1,$position_y*font_size_y+6,$character*font_size_x,$color_foreground*font_size_y+6,$bits,4);
//            imagecopy($ansi,$font,$position_x*$bits,$position_y*font_size_y+10,$character*font_size_x,$color_foreground*font_size_y+10,$bits,4);
//            imagecopy($ansi,$font,$position_x*$bits-1,$position_y*font_size_y+14,$character*font_size_x,$color_foreground*font_size_y+14,$bits,2);
//         }
//            
//         if ($italics && $bold)
//         {
//            imagecopy($ansi,$font,$position_x*$bits+3+1,$position_y*font_size_y,$character*font_size_x,$color_foreground*font_size_y,$bits,2);
//            imagecopy($ansi,$font,$position_x*$bits+2+1,$position_y*font_size_y+2,$character*font_size_x,$color_foreground*font_size_y+2,$bits,4);
//            imagecopy($ansi,$font,$position_x*$bits+1+1,$position_y*font_size_y+6,$character*font_size_x,$color_foreground*font_size_y+6,$bits,4);
//            imagecopy($ansi,$font,$position_x*$bits+1,$position_y*font_size_y+10,$character*font_size_x,$color_foreground*font_size_y+10,$bits,4);
//            imagecopy($ansi,$font,$position_x*$bits-1+1,$position_y*font_size_y+14,$character*font_size_x,$color_foreground*font_size_y+14,$bits,2);
//         }
//
//         if ($bold && !$italics)
//         {
//            imagecopy($ansi,$font,1+$position_x*$bits,$position_y*font_size_y,$character*font_size_x,$color_foreground*font_size_y,$bits,font_size_y);
//         }
//
//         if ($underline)
//         {
//            $loop_column=0;
//            $character_size_x=8;
//
//            if ($bold)
//            {
//               $character_size_x++;
//            }
//
//            if ($italics)
//            {
//               $loop_column=-1;
//               $character_size_x=11;
//            }
//
//            while ($loop_column<$character_size_x)
//            {
//               if (imagecolorat($ansi,$position_x*$bits+$loop_column,$position_y*font_size_y+15)==$color_background && imagecolorat($ansi,$position_x*$bits+$loop_column+1,$position_y*font_size_y+15)==$color_background)
//               {
//                  imagesetpixel($ansi,$position_x*$bits+$loop_column,$position_y*font_size_y+14,$colors[$color_foreground]);
//                  imagesetpixel($ansi,$position_x*$bits+$loop_column,$position_y*font_size_y+15,$colors[$color_foreground]);
//               }
//               else if (imagecolorat($ansi,$position_x*$bits+$loop_column,$position_y*font_size_y+15)!=$color_background && imagecolorat($ansi,$position_x*$bits+$loop_column+1,$position_y*font_size_y+15)==$color_background)
//               {
//                  $loop_column++;
//               }
//               
//               $loop_column++;
//            }
//
//            if ($pixel_carry)
//            {
//               imagesetpixel($ansi,$position_x*$bits,$position_y*font_size_y+14,$colors[$color_foreground]);
//               imagesetpixel($ansi,$position_x*$bits,$position_y*font_size_y+15,$colors[$color_foreground]);
//               $pixel_carry=FALSE;
//            }
//
//            if (imagecolorat($font,$character*font_size_x,$color_foreground*font_size_y+15)!=20)
//            {
//               imagesetpixel($ansi,$position_x*$bits-1,$position_y*font_size_y+14,$colors[$color_foreground]);
//               imagesetpixel($ansi,$position_x*$bits-1,$position_y*font_size_y+15,$colors[$color_foreground]);
//            }
//
//            if (imagecolorat($font,$character*font_size_x+$character_size_x-1,$color_foreground*font_size_y+15)!=20)
//            {
//               $pixel_carry=TRUE;
//            }
//         }
//      }
//   }
//
//
//
///*****************************************************************************/
///* CREATE OUTPUT FILE                                                        */
///*****************************************************************************/
//
//   if ($transparent)
//   {
//      imagecolortransparent($ansi,$background_canvas);
//   }
//
//   if ($thumbnail)
//   {
//      thumbnail($ansi,$output,$columns,font_size_y,$position_y_max);
//   }
//   else
//   {
//      if ($output=='online')
//      {
//         Header("Content-type: image/png");
//         ImagePNG($ansi);
//      }
//      else
//      {
//         if (!SPLIT)
//         {
//            ImagePNG($ansi,$output);
//         }
//         else
//         {
//            $image_size_y=$position_y_max*font_size_y;
//            $split_size_y=SPLIT_HEIGHT;
//
//            $loop_max=($image_size_y/$split_size_y);
//
//            for ($loop=0; $loop<$loop_max; $loop++)
//            {
//               if (($image_size_y-($split_size_y*$loop))<$split_size_y)
//               {
//                  $height=($image_size_y-($split_size_y*$loop));
//               }
//               else
//               {
//                  $height=$split_size_y;
//               }
//
//               if (!$split = imagecreate($columns*$bits,$height))
//               {
//                  error("Can't allocate buffer image memory");
//               }
//
//               imagecolorallocate($split,0,0,0);
//               imagecopy($split,$ansi,0,0,0,($loop*$split_size_y),$columns*$bits,$height);
//
//               if ($loop_max>=1)
//               {
//                  $output_file=$output.SPLIT_SEPARATOR.str_pad($loop,4,"0",STR_PAD_LEFT).".png";
//               }
//               else
//               {
//                  $output_file=$output.".png";
//               }
//
//               $output_files[]=$output_file;
//
//               if ($transparent)
//               {
//                  imagecolortransparent($split,$background_canvas);
//               }
//
//               ImagePNG($split,$output_file);
//               imagedestroy($split);
//            }
//         }
//      }
//   }
//
//
//
///*****************************************************************************/
///* FREE MEMORY                                                               */
///*****************************************************************************/
//
//   imagedestroy($ansi);
//   imagedestroy($background);
//   imagedestroy($font);
//   
//   return $output_files;
//}
//
//
//
///*****************************************************************************/
///* LOAD PCBOARD                                                              */
///*****************************************************************************/
//
//function load_pcboard($input,$output,$font,$bits)
//{
//   check_libraries();
//
///*****************************************************************************/
///* CHECK PARAMETERS AND FORCE DEFAULT VALUES IF INVALID INPUT IS DETECTED    */
///*****************************************************************************/
//
//   $columns=80;
//
//   if ($bits=='thumbnail')
//   {
//      $thumbnail=TRUE;
//   }
//   if ($bits!=8 && $bits!=9)
//   {
//      $bits=8;
//   }
//
//   switch($font)
//   {
//   case '80x25':
//      font_file = "ansilove_font_pc_80x25.png';
//      font_size_x = 9;
//      font_size_y = 16;
//      break;
//
//   case '80x50':
//      font_file = "ansilove_font_pc_80x50.png';
//      font_size_x = 9;
//      font_size_y = 8;
//      break;
//
//   default:
//      font_file = "ansilove_font_pc_80x25.png';
//      font_size_x = 9;
//      font_size_y = 16;
//   }
//
//
//
///*****************************************************************************/
///* LOAD INPUT FILE                                                           */
///*****************************************************************************/
//
//   if (!$input_file = fopen($input,'r'))
//   {
//      error("Can't open file $input");
//   }
//
//   $input_file_sauce=load_sauce($input);
//
//   if ($input_file_sauce!=NULL)
//   {
//      $input_file_size=$input_file_sauce['FileSize'];
//   }
//   else
//   {
//      $input_file_size=filesize($input);
//   }
//
//   if (!$input_file_buffer = fread($input_file,$input_file_size))
//   {
//      error("Can't read file $input");
//   }
//
//   fclose($input_file);
//
//
//
///*****************************************************************************/
///* LOAD BACKGROUND/FONT                                                      */
///*****************************************************************************/
//
//   if (!$background = imagecreatefrompng(dirname(__FILE__).'/fonts/ansilove_background.png'))
//   {
//      error("Can't open file ansilove_background.png");
//   }
//
//   if (!$font = imagecreatefrompng(dirname(__FILE__).'/fonts/'.font_file))
//   {
//      error("Can't open file font_file");
//   }
//
//   imagecolortransparent($font,20);
//
//
//
///*****************************************************************************/
///* ALLOCATE BACKGROUND/FOREGROUND COLOR ARRAYS                               */
///*****************************************************************************/
//
//   $pcb_colors[48]=0; $pcb_colors[49]=4; $pcb_colors[50]=2; $pcb_colors[51]=6; $pcb_colors[52]=1; $pcb_colors[53]=5; $pcb_colors[54]=3; $pcb_colors[55]=7; $pcb_colors[56]=8; $pcb_colors[57]=12; $pcb_colors[65]=10; $pcb_colors[66]=14; $pcb_colors[67]=9; $pcb_colors[68]=13; $pcb_colors[69]=11; $pcb_colors[70]=15;
//
//
//
///*****************************************************************************/
///* STRIP UNWANTED PCBOARD CODES (DEFINED IN CONFIG FILE)                     */
///*****************************************************************************/
//
//   $pcboard_strip_codes_exploded=explode(",",PCBOARD_STRIP_CODES);
//
//   for ($loop=0;$loop<sizeof($pcboard_strip_codes_exploded);$loop++)
//   {
//      $input_file_buffer=preg_replace("/(".$pcboard_strip_codes_exploded[$loop].")/","",$input_file_buffer);
//   }
//
//
//
///*****************************************************************************/
///* PROCESS PCB                                                               */
///*****************************************************************************/
//
//   $color_background=0;
//   $color_foreground=7;
//
//   $loop=0;
//
//   $position_x=0;
//   $position_y=0;
//
//   $position_x_max=0;
//   $position_y_max=0;
//
//   while ($loop<$input_file_size)
//   {
//      $current_character=ord($input_file_buffer[$loop]);
//      $next_character=ord($input_file_buffer[$loop+1]);
//
//      if ($position_x==80)
//      {
//         $position_y++;
//         $position_x=0;
//      }
//
///*****************************************************************************/
///* CR+LF                                                                     */
///*****************************************************************************/
//
//      if ($current_character==13)
//      {
//         if ($next_character==10)
//         {
//            $position_y++;
//            $position_x=0;
//            $loop++;
//         }
//      }
//
///*****************************************************************************/
///* LF                                                                        */
///*****************************************************************************/
//
//      if ($current_character==10)
//      {
//         $position_y++;
//         $position_x=0;
//      }
//
///*****************************************************************************/
///* TAB                                                                       */
///*****************************************************************************/
//
//      if ($current_character==9)
//      {
//         $position_x+=8;
//      }
//
///*****************************************************************************/
///* SUB                                                                       */
///*****************************************************************************/
//
//      if ($current_character==26)
//      {
//         break;
//      }
//
///*****************************************************************************/
///* PCB SEQUENCE                                                              */
///*****************************************************************************/
//
//      if ($current_character==64 & $next_character==88)
//      {
//
///*****************************************************************************/
///* SET GRAPHIC RENDITION                                                     */
///*****************************************************************************/
//
//            $color_background=$pcb_colors[ord($input_file_buffer[$loop+2])];
//            $color_foreground=$pcb_colors[ord($input_file_buffer[$loop+3])];
//
//            $loop+=3;
//      }
//      elseif ($current_character==64 & $next_character==67 & $input_file_buffer[$loop+2]=='L' & $input_file_buffer[$loop+3]=='S')
//      {
//
///*****************************************************************************/
///* ERASE DISPLAY                                                             */
///*****************************************************************************/
//
//         unset($pcboard_buffer);
//
//         $position_x=0;
//         $position_y=0;
//
//         $position_x_max=0;
//         $position_y_max=0;
//
//         $loop+=4;
//      }
//      elseif ($current_character==64 & $next_character==80 & $input_file_buffer[$loop+2]=='O' & $input_file_buffer[$loop+3]=='S' & $input_file_buffer[$loop+4]==':')
//      {
//
///*****************************************************************************/
///* CURSOR POSITION                                                           */
///*****************************************************************************/
//
//         if ($input_file_buffer[$loop+6]=='@')
//         {
//            $position_x=(ord($input_file_buffer[$loop+5])-48)-1;
//            $loop+=5;
//         }
//         else
//         {
//            $position_x=(10*(ord($input_file_buffer[$loop+5])-48)+ord($input_file_buffer[$loop+6])-48)-1;
//            $loop+=6;
//         }
//      }     
//      elseif ($current_character!=10 && $current_character!=13 && $current_character!=9)
//      {
//
///*****************************************************************************/
///* RECORD NUMBER OF COLUMNS AND LINES USED                                   */
///*****************************************************************************/
//
//         if ($position_x>$position_x_max)
//         {
//            $position_x_max=$position_x;
//         }
//
//         if ($position_y>$position_y_max)
//         {
//            $position_y_max=$position_y;
//         }
//
//
//
///*****************************************************************************/
///* WRITE CURRENT CHARACTER INFO IN A TEMPORARY ARRAY                         */
///*****************************************************************************/
//
//         $pcboard_buffer[]=$position_x;
//         $pcboard_buffer[]=$position_y;
//         $pcboard_buffer[]=$color_background;
//         $pcboard_buffer[]=$color_foreground;
//         $pcboard_buffer[]=$current_character;
//
//         $position_x++;
//      }
//      $loop++;
//   }
//
//
//
///*****************************************************************************/
///* ALLOCATE IMAGE BUFFER MEMORY                                              */
///*****************************************************************************/
//
//   $position_x_max++;
//   $position_y_max++;
//
//   if (!$pcboard = imagecreate($columns*$bits,($position_y_max)*font_size_y))
//   {
//      error("Can't allocate buffer image memory");
//   }
//
//   imagecolorallocate($pcboard,0,0,0);
//
//
//
///*****************************************************************************/
///* RENDER PCB                                                                */
///*****************************************************************************/
//
//   for ($loop=0;$loop<sizeof($pcboard_buffer);$loop+=5)
//   {
//      $position_x=$pcboard_buffer[$loop];
//      $position_y=$pcboard_buffer[$loop+1];
//      $color_background=$pcboard_buffer[$loop+2];
//      $color_foreground=$pcboard_buffer[$loop+3];
//      $character=$pcboard_buffer[$loop+4];
//
//      imagecopy($pcboard,$background,$position_x*$bits,$position_y*font_size_y,$color_background*9,0,$bits,font_size_y);
//      imagecopy($pcboard,$font,$position_x*$bits,$position_y*font_size_y,$character*font_size_x,$color_foreground*font_size_y,$bits,font_size_y);
//   }
//
//
//
///*****************************************************************************/
///* CREATE OUTPUT FILE                                                        */
///*****************************************************************************/
//
//   if ($thumbnail)
//   {
//      thumbnail($pcboard,$output,$columns,font_size_y,$position_y_max);
//   }
//   else
//   {
//      if ($output=='online')
//      {
//         Header("Content-type: image/png");
//         ImagePNG($pcboard);
//      }
//      else
//      {
//         ImagePNG($pcboard,$output);
//      }
//   }
//
//
//
///*****************************************************************************/
///* FREE MEMORY                                                               */
///*****************************************************************************/
//
//   imagedestroy($pcboard);
//   imagedestroy($background);
//   imagedestroy($font);
//}

// load BINARY file and generate output PNG
void alBinaryLoader(char *input, char output[], char columns[], char font[], char bits[], char icecolors[])
{
    // some type declarations
    int64_t font_size_x;
    int64_t font_size_y;
    char *font_file;
    bool thumbnail = false;
    
    // let's see what font we should use to render output
    if (strcmp(font, "80x25") == 0) {
        font_file = "ansilove_font_pc_80x25.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "80x50") == 0) {
        font_file = "ansilove_font_pc_80x50.png";
        font_size_x = 9;
        font_size_y = 8;
    }
    else if (strcmp(font, "terminus") == 0) {
        font_file = "ansilove_font_pc_terminus.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else {
        // in all other cases use the standard DOS font
        font_file = "ansilove_font_pc_80x25.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    
    // in case bits is equal "thumbnail" set our bool flag 
    if (strcmp(bits, "thumbnail") == 0) {
        thumbnail = true;
    }
    
    // now set bits to 8 if not already value 8 or 9
    if (strcmp(bits, "8") != 0 && strcmp(bits, "9") != 0) {
        sprintf(bits, "%s", "8");
    }

    // load input file
    FILE *input_file = fopen(input, "r");
    if (input_file == NULL) { 
        fputs("\nFile error.\n\n", stderr); exit (1);
    }
    
    // get the file size (bytes)
    int64_t input_file_size = filesize(input);
    
    // just for testing the filesize() function we ported from PHP
    printf("\nSize of this file is: %lld bytes.\n", input_file_size);
    
    // next up is loading our file into a dynamically allocated memory buffer
    unsigned char *input_file_buffer;
    size_t result;
    
    // allocate memory to contain the whole file
    input_file_buffer = (unsigned char *) malloc(sizeof(unsigned char)*input_file_size);
    if (input_file_buffer == NULL) {
        fputs ("\nMemory error.\n\n", stderr); exit (2);
    }
    
    // copy the file into the buffer
    result = fread(input_file_buffer, 1, input_file_size, input_file);
    if (result != input_file_size) {
        fputs ("\nReading error.\n\n", stderr); exit (3);
    } // whole file is now loaded into input_file_buffer
    
    // close input file, we don't need it anymore
    rewind(input_file);
    fclose(input_file);
    
    // libgd image pointer
    gdImagePtr im_Binary, im_Backgrnd, im_Font;
            
    // additional libgd related declarations
    FILE *file_Backgrnd, *file_Font;
    char path_Backgrnd[1000] = { 0 };
    char path_Font[1000] = { 0 };
    
    // resolve paths for font and background image
    sprintf(path_Backgrnd, "%sansilove_background.png", ANSILOVE_FONTS_DIRECTORY);<commit_msg>surprising nasty compiler warnings when building on Linux<commit_after>//
//  ansilove.c
//  AnsiLove/C
//
//  Copyright (c) 2011, <NAME>. All rights reserved.
//  http://byteproject.net
//
//  Use of this source code is governed by a MIT-style license.
//  See the file LICENSE for details.
//

#if defined(__APPLE__) && defined(__MACH__)
#import "ansilove.h"
#else
#include <stdbool.h>
#include "ansilove.h"
#endif

///*****************************************************************************/
///* CREATE THUMBNAIL                                                          */
///*****************************************************************************/
//
//function thumbnail($source,$output,$columns,font_size_y,$position_y_max)
//{
//   $columns=min($columns,80);
//
//   if (THUMBNAILS_SIZE<=0)
//   {
//      $size=1;
//   }
//   else
//   {
//      $size=THUMBNAILS_SIZE;
//   }
//
//   if (THUMBNAILS_HEIGHT==0)
//   {
//      $height=$position_y_max*(font_size_y/8);
//      $height_source=$position_y_max*font_size_y;
//   }
//   else
//   {
//      $height=min($position_y_max*(font_size_y/8),THUMBNAILS_HEIGHT);
//      $height_source=$height*8;
//   }
//
//   $width_source=$columns*8;
//   $height*=$size;
//   $columns*=$size;
//
//   if (!$thumbnail = imagecreatetruecolor($columns,$height))
//   {
//      error("Can't allocate buffer image memory");
//   }
//
//   imagecopyresampled($thumbnail,$source,0,0,0,0,$columns,$height,$width_source,$height_source);
//
//   if ($output=='online')
//   {
//      Header("Content-type: image/png");
//      ImagePNG($thumbnail);
//   }
//   else
//   {
//      ImagePNG($thumbnail,$output);
//   }
//
//   imagedestroy($thumbnail);
//}
//
//
//

// load ANSi file and generate output PNG
void alAnsiLoader(char *input, char output[], char font[], char bits[], char icecolors[], char *fext)
{
    // ladies and gentlemen, it's type declaration time
    int64_t columns = 80;
    int64_t font_size_x;
    int64_t font_size_y;
    char *font_file;
    bool isAmigaFont = false;
    bool ced = false;
    bool thumbnail = false;
    bool transparent = false;
    bool workbench = false;
    
    // determine the font we use to render the output
    if (strcmp(font, "80x25") == 0) {
        font_file = "ansilove_font_pc_80x25.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "80x50") == 0) {
        font_file = "ansilove_font_pc_80x50.png";
        font_size_x = 9;
        font_size_y = 8;
    }
    else if (strcmp(font, "terminus") == 0) {
        font_file = "ansilove_font_pc_terminus.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "armenian") == 0) {
        font_file = "ansilove_font_pc_armenian.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "baltic") == 0) {
        font_file = "ansilove_font_pc_baltic.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "cyrillic") == 0) {
        font_file = "ansilove_font_pc_cyrillic.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "french-canadian") == 0) {
        font_file = "ansilove_font_pc_french_canadian.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "greek") == 0) {
        font_file = "ansilove_font_pc_greek.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "greek-869") == 0) {
        font_file = "ansilove_font_pc_greek_869.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "hebrew") == 0) {
        font_file = "ansilove_font_pc_hebrew.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "icelandic") == 0) {
        font_file = "ansilove_font_pc_icelandic.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "latin1") == 0) {
        font_file = "ansilove_font_pc_latin1.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "latin2") == 0) {
        font_file = "ansilove_font_pc_latin2.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "nordic") == 0) {
        font_file = "ansilove_font_pc_nordic.png";
        font_size_x = 9;
        font_size_y = 16; 
    }
    else if (strcmp(font, "persian") == 0) {
        font_file = "ansilove_font_pc_persian.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "portuguese") == 0) {
        font_file = "ansilove_font_pc_portuguese.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "russian") == 0) {
        font_file = "ansilove_font_pc_russian.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "turkish") == 0) {
        font_file = "ansilove_font_pc_turkish.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "amiga") == 0) {
        isAmigaFont = true;
        font_file = "ansilove_font_amiga_topaz_1200.png";
        font_size_x = 8;
        font_size_y = 16;
    }
    else if (strcmp(font, "b-strict") == 0) {
        isAmigaFont = true;
        font_file = "ansilove_font_amiga_b-strict.png";
        font_size_x = 8;
        font_size_y = 8;
    }
    else if (strcmp(font, "b-struct") == 0) {
        isAmigaFont = true;
        font_file = "ansilove_font_amiga_b-struct.png";
        font_size_x = 8;
        font_size_y = 8;
    }
    else if (strcmp(font, "microknight") == 0) {
        isAmigaFont = true;
        font_file = "ansilove_font_amiga_microknight.png";
        font_size_x = 8;
        font_size_y = 16;
    }
    else if (strcmp(font, "microknight+") == 0) {
        isAmigaFont = true;
        font_file = "ansilove_font_amiga_microknight+.png";
        font_size_x = 8;
        font_size_y = 16;
    }
    else if (strcmp(font, "microknightplus") == 0) {
        isAmigaFont = true;
        font_file = "ansilove_font_amiga_microknight+.png";
        font_size_x = 8;
        font_size_y = 16;
    }
    else if (strcmp(font, "mosoul") == 0) {
        isAmigaFont = true;
        font_file = "ansilove_font_amiga_mosoul.png";
        font_size_x = 8;
        font_size_y = 16;
    }
    else if (strcmp(font, "pot-noodle") == 0) {
        isAmigaFont = true;
        font_file = "ansilove_font_amiga_pot-noodle.png";
        font_size_x = 8;
        font_size_y = 16;
    }
    else if (strcmp(font, "topaz") == 0) {
        isAmigaFont = true;
        font_file = "ansilove_font_amiga_topaz_1200.png";
        font_size_x = 8;
        font_size_y = 16;   
    }
    else if (strcmp(font, "topaz+") == 0) {
        isAmigaFont = true;
        font_file = "ansilove_font_amiga_topaz_1200+.png";
        font_size_x = 8;
        font_size_y = 16;
    }
    else if (strcmp(font, "topazplus") == 0) {
        isAmigaFont = true;
        font_file = "ansilove_font_amiga_topaz_1200+.png";
        font_size_x = 8;
        font_size_y = 16;
    }
    else if (strcmp(font, "topaz500") == 0) {
        isAmigaFont = true;
        font_file = "ansilove_font_amiga_topaz_500.png";
        font_size_x = 8;
        font_size_y = 16;
    }
    else if (strcmp(font, "topaz500+") == 0) {
        isAmigaFont = true;
        font_file = "ansilove_font_amiga_topaz_500+.png";
        font_size_x = 8;
        font_size_y = 16;
    }
    else if (strcmp(font, "topaz500plus") == 0) {
        isAmigaFont = true;
        font_file = "ansilove_font_amiga_topaz_500+.png";
        font_size_x = 8;
        font_size_y = 16;
    }
    else {
        // in all other cases use the standard DOS font
        font_file = "ansilove_font_pc_80x25.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    
    // to deal with the bits flag, we declared handy bool types   
    if (strcmp(bits, "ced") == 0) {
        ced = true;
    }
    else if (strcmp(bits, "thumbnail") == 0) {
        thumbnail = true;
    }
    else if (strcmp(bits, "transparent") == 0) {
        transparent = true;
    }
    else if (strcmp(bits, "workbench") == 0) {
        workbench = true;
    }
    else if (strcmp(bits, "workbench-transparent") == 0) {
        workbench = true;
        transparent = true;
    }
    // force defaults if necessary
    else if ((strcmp(bits, "8") != 0 && strcmp(bits, "9") != 0) || isAmigaFont == true) {
        sprintf(bits, "%s", "8");
    }
    
    // purpose: surpressing Clang warnings of unused font / columns variables :)
    // gonna remove that pretty soon! 
    printf("font file: %s / ANSi columns: %jd\n", font_file, columns);
    
    // this is for testing my explode() function I ported (and enhanced) from PHP.
    // will be wiped from the codebase again...!
    char **dizArray;
    int64_t dizCount, i;
    
    dizCount = explode(&dizArray, ',', DIZ_EXTENSIONS);
    
    for (i = 0; i < dizCount; ++i) {
        printf("DIZ-extension %jd: %s\n", i+1, dizArray[i]);
    }
    
} // < -- REMINDER: Remove this when enabling the ANSi code below again!

    // load the input file
    
//   if (!$input_file = fopen($input,'r'))
//   {
//      error("Can't open file $input");
//   }
//
//   $input_file_sauce=load_sauce($input);
//
//   if ($input_file_sauce!=NULL)
//   {
//      $input_file_size=$input_file_sauce['FileSize'];
//   }
//   else
//   {
//      $input_file_size=filesize($input);
//   }
//
//   if (!$input_file_buffer = fread($input_file,$input_file_size))
//   {
//      error("Can't read file $input");
//   }
//
//   fclose($input_file);
//
//   $diz_extensions_exploded=explode(",",DIZ_EXTENSIONS);
//
//   for ($loop=0;$loop<sizeof($diz_extensions_exploded);$loop++)
//   {
//      $diz_extension_length=strlen($diz_extensions_exploded[$loop]);
//
//      if (strtolower(substr($input,(strlen($input)-$diz_extension_length),$diz_extension_length))==$diz_extensions_exploded[$loop] || strtolower(substr($input,strlen($input)-($diz_extension_length+9),($diz_extension_length+9)))==$diz_extensions_exploded[$loop].'.ansilove')
//      {
//         $input_file_buffer=preg_replace("/^(\s+[\r\n])+/","",$input_file_buffer);
//         $input_file_buffer=rtrim($input_file_buffer);
//         $input_file_size=strlen($input_file_buffer);
//      }
//   }
//
///*****************************************************************************/
///* LOAD BACKGROUND/FONT                                                      */
///*****************************************************************************/
//
//   if (!$background = imagecreatefrompng(dirname(__FILE__).'/fonts/ansilove_background.png'))
//   {
//      error("Can't open file ansilove_background.png");
//   }
//
//   if (!$font = imagecreatefrompng(dirname(__FILE__).'/fonts/'.font_file))
//   {
//      error("Can't open file font_file");
//   }
//
//   imagecolortransparent($font,20);
//
//
//
///*****************************************************************************/
///* PROCESS ANSI                                                              */
///*****************************************************************************/
//
//   $color_background=0;
//   $color_foreground=7;
//
//   $loop=0;
//
//   $position_x=0;
//   $position_y=0;
//
//   $position_x_max=0;
//   $position_y_max=0;
//
//   while ($loop<$input_file_size)
//   {
//      $current_character=ord($input_file_buffer[$loop]);
//      $next_character=ord($input_file_buffer[$loop+1]);
//
//      if ($position_x==80 && WRAP_COLUMN_80)
//      {
//         $position_y++;
//         $position_x=0;
//      }
//
///*****************************************************************************/
///* CR+LF                                                                     */
///*****************************************************************************/
//
//      if ($current_character==13)
//      {
//         if ($next_character==10)
//         {
//            $position_y++;
//            $position_x=0;
//            $loop++;
//         }
//      }
//
///*****************************************************************************/
///* LF                                                                        */
///*****************************************************************************/
//
//      if ($current_character==10)
//      {
//         $position_y++;
//         $position_x=0;
//      }
//
///*****************************************************************************/
///* TAB                                                                       */
///*****************************************************************************/
//
//      if ($current_character==9)
//      {
//         $position_x+=8;
//      }
//
///*****************************************************************************/
///* SUB                                                                       */
///*****************************************************************************/
//
//      if ($current_character==26 && SUBSTITUTE_BREAK)
//      {
//         break;
//      }
//
//
//
///*****************************************************************************/
///* ANSI SEQUENCE                                                             */
///*****************************************************************************/
//
//      if ($current_character==27 && $next_character==91)
//      {
//         unset($ansi_sequence);
//
//         for ($ansi_sequence_loop=0;$ansi_sequence_loop<12;$ansi_sequence_loop++)
//         {
//            $ansi_sequence_character=$input_file_buffer[$loop+2+$ansi_sequence_loop];
//
///*****************************************************************************/
///* CURSOR POSITION                                                           */
///*****************************************************************************/
//
//            if ($ansi_sequence_character=='H' || $ansi_sequence_character=='f')
//            {
//               $ansi_sequence_exploded=explode(";",$ansi_sequence);
//               $position_y=$ansi_sequence_exploded[0]-1;
//               $position_x=$ansi_sequence_exploded[1]-1;
//
//               $loop+=$ansi_sequence_loop+2;
//               break;
//            }
//
///*****************************************************************************/
///* CURSOR UP                                                                 */
///*****************************************************************************/
//
//            if ($ansi_sequence_character=='A')
//            {
//               if ($ansi_sequence=='')
//               {
//                  $ansi_sequence=1;
//               }
//
//               $position_y=$position_y-$ansi_sequence;
//
//               $loop+=$ansi_sequence_loop+2;
//               break;
//            }
//
///*****************************************************************************/
///* CURSOR DOWN                                                               */
///*****************************************************************************/
//
//            if ($ansi_sequence_character=='B')
//            {
//               if ($ansi_sequence=='')
//               {
//                  $ansi_sequence=1;
//               }
//
//               $position_y=$position_y+$ansi_sequence;
//
//               $loop+=$ansi_sequence_loop+2;
//               break;
//            }
//
///*****************************************************************************/
///* CURSOR FORWARD                                                            */
///*****************************************************************************/
//
//            if ($ansi_sequence_character=='C')
//            {
//               if ($ansi_sequence=='')
//               {
//                  $ansi_sequence=1;
//               }
//
//               $position_x=$position_x+$ansi_sequence;
//               if ($position_x>80)
//               {
//                  $position_x=80;
//               }
//
//               $loop+=$ansi_sequence_loop+2;
//               break;
//            }
//
///*****************************************************************************/
///* CURSOR BACKWARD                                                           */
///*****************************************************************************/
//
//            if ($ansi_sequence_character=='D')
//            {
//               if ($ansi_sequence=='')
//               {
//                  $ansi_sequence=1;
//               }
//
//               $position_x=$position_x-$ansi_sequence;
//               if ($position_x<0)
//               {
//                  $position_x=0;
//               }
//
//               $loop+=$ansi_sequence_loop+2;
//               break;
//            }
//
///*****************************************************************************/
///* SAVE CURSOR POSITION                                                      */
///*****************************************************************************/
//
//            if ($ansi_sequence_character=='s')
//            {
//               $saved_position_y=$position_y;
//               $saved_position_x=$position_x;
//
//               $loop+=$ansi_sequence_loop+2;
//               break;
//            }
//
///*****************************************************************************/
///* RESTORE CURSOR POSITION                                                   */
///*****************************************************************************/
//
//            if ($ansi_sequence_character=='u')
//            {
//               $position_y=$saved_position_y;
//               $position_x=$saved_position_x;
//
//               $loop+=$ansi_sequence_loop+2;
//               break;
//            }
//
///*****************************************************************************/
///* ERASE DISPLAY                                                             */
///*****************************************************************************/
//
//            if ($ansi_sequence_character=='J')
//            {
//               if ($ansi_sequence==2)
//               {
//                  unset($ansi_buffer);
//
//                  $position_x=0;
//                  $position_y=0;
//
//                  $position_x_max=0;
//                  $position_y_max=0;
//               }
//
//               $loop+=$ansi_sequence_loop+2;
//               break;
//            }
//
///*****************************************************************************/
///* SET GRAPHIC RENDITION                                                     */
///*****************************************************************************/
//
//            if ($ansi_sequence_character=='m')
//            {
//               $ansi_sequence_exploded=explode(";",$ansi_sequence);
//
//               sort($ansi_sequence_exploded);
//
//               for ($loop_ansi_sequence=0;$loop_ansi_sequence<sizeof($ansi_sequence_exploded);$loop_ansi_sequence++)
//               {
//                  $ansi_sequence_value=$ansi_sequence_exploded[$loop_ansi_sequence];
//
//                  if ($ansi_sequence_value==0)
//                  {
//                     $color_background=0;
//                     $color_foreground=7;
//                     $bold=FALSE;
//                     $underline=FALSE;
//                     $italics=FALSE;
//                     $blink=FALSE;
//                  }
//
//                  if ($ansi_sequence_value==1)
//                  {
//                     if (!$workbench)
//                     {
//                        $color_foreground+=8;
//					 }
//                     $bold=TRUE;
//                  }
//
//                  if ($ansi_sequence_value==3)
//                  {
//                     $italics=TRUE;
//                  }
//
//                  if ($ansi_sequence_value==4)
//                  {
//                     $underline=TRUE;
//                  }
//
//                  if ($ansi_sequence_value==5)
//                  {
//                     if (!$workbench)
//                     {
//                        $color_background+=8;
//					 }
//                     $blink=TRUE;
//                  }
//
//                  if ($ansi_sequence_value>29 && $ansi_sequence_value<38)
//                  {
//                     $color_foreground=$ansi_sequence_value-30;
//
//                     if ($bold)
//                     {
//                        $color_foreground+=8;
//                     }
//                  }
//
//                  if ($ansi_sequence_value>39 && $ansi_sequence_value<48)
//                  {
//                     $color_background=$ansi_sequence_value-40;
//
//                     if ($blink && $icecolors)
//                     {
//                        $color_background+=8;
//                     }
//                  }
//               }
//
//               $loop+=$ansi_sequence_loop+2;
//               break;
//            }
//
///*****************************************************************************/
///* CURSOR DE/ACTIVATION (AMIGA ANSI)                                         */
///*****************************************************************************/
//
//            if ($ansi_sequence_character=='p')
//            {
//               $loop+=$ansi_sequence_loop+2;
//               break;
//            }
//
//            $ansi_sequence.=$ansi_sequence_character;
//         }
//      }
//      elseif ($current_character!=10 && $current_character!=13 && $current_character!=9)
//      {
//
///*****************************************************************************/
///* RECORD NUMBER OF COLUMNS AND LINES USED                                   */
///*****************************************************************************/
//
//         if ($position_x>$position_x_max)
//         {
//            $position_x_max=$position_x;
//         }
//
//         if ($position_y>$position_y_max)
//         {
//            $position_y_max=$position_y;
//         }
//
//
//
///*****************************************************************************/
///* WRITE CURRENT CHARACTER INFO IN A TEMPORARY ARRAY                         */
///*****************************************************************************/
//
//         if (!$font_amiga || ($current_character!=12 && $current_character!=13))
//         {
//            $ansi_buffer.=chr($color_background);
//            $ansi_buffer.=chr($color_foreground);
//            $ansi_buffer.=chr($current_character);
//            $ansi_buffer.=chr($bold);
//            $ansi_buffer.=chr($italics);
//            $ansi_buffer.=chr($underline);
//            $ansi_buffer.=chr($position_x);
//            $ansi_buffer.=chr($position_y & 0xFF);
//            $ansi_buffer.=chr($position_y>>8);
//
//            $position_x++;
//         }
//      }
//      $loop++;
//   }
//
//
//
///*****************************************************************************/
///* ALLOCATE IMAGE BUFFER MEMORY                                              */
///*****************************************************************************/
//
//   $position_x_max++;
//   $position_y_max++;
//
//   if ($ced)
//   {
//      $columns=78;
//   }
//
//   for ($loop=0;$loop<sizeof($diz_extensions_exploded);$loop++)
//   {
//      $diz_extension_length=strlen($diz_extensions_exploded[$loop]);
//
//      if (strtolower(substr($input,(strlen($input)-$diz_extension_length),$diz_extension_length))==$diz_extensions_exploded[$loop] || strtolower(substr($input,strlen($input)-($diz_extension_length+9),($diz_extension_length+9)))==$diz_extensions_exploded[$loop].'.ansilove')
//      {
//         $columns=min($position_x_max,80);
//      }
//   }
//
//   if (!$ansi = imagecreate($columns*$bits,($position_y_max)*font_size_y))
//   {
//      error("Can't allocate buffer image memory");
//   }
//
//   if ($ced)
//   {
//      $ced_background_color=explode(",",CED_BACKGROUND_COLOR);
//      $ced_foreground_color=explode(",",CED_FOREGROUND_COLOR);
//
//      imagecolorallocate($ansi,$ced_background_color[0],$ced_background_color[1],$ced_background_color[2]);
//
//      $ced_color=imagecolorallocate($ansi,$ced_background_color[0],$ced_background_color[1],$ced_background_color[2]);
//      $ced_color=imagecolorallocate($background,$ced_background_color[0],$ced_background_color[1],$ced_background_color[2]);
//
//      imagefill($ansi,0,0,$ced_color);
//      imagefilledrectangle($background,0,0,144,16,$ced_color);
//
//      for ($loop=0;$loop<16;$loop++)
//      {
//         imagecolorset($font,$loop,$ced_foreground_color[0],$ced_foreground_color[1],$ced_foreground_color[2]);
//      }
//   }
//   else if ($workbench)
//   {
//      $workbench_color[0]=explode(",",WORKBENCH_COLOR_0);
//      $workbench_color[1]=explode(",",WORKBENCH_COLOR_4);
//      $workbench_color[2]=explode(",",WORKBENCH_COLOR_2);
//      $workbench_color[3]=explode(",",WORKBENCH_COLOR_6);
//      $workbench_color[4]=explode(",",WORKBENCH_COLOR_1);
//      $workbench_color[5]=explode(",",WORKBENCH_COLOR_5);
//      $workbench_color[6]=explode(",",WORKBENCH_COLOR_3);
//      $workbench_color[7]=explode(",",WORKBENCH_COLOR_7);
//
//      imagecolorallocate($ansi,$workbench_color[0][0],$workbench_color[0][1],$workbench_color[0][2]);
//
//      $workbench_background=imagecolorallocate($ansi,$workbench_color[0][0],$workbench_color[0][1],$workbench_color[0][2]);
//      $workbench_background=imagecolorallocate($background,$workbench_color[0][0],$workbench_color[0][1],$workbench_color[0][2]);
//
//      imagefill($ansi,0,0,$workbench_background);
//
//      for ($loop=0; $loop<8; $loop++)
//      {
//         imagecolorset($background,$loop,$workbench_color[$loop][0],$workbench_color[$loop][1],$workbench_color[$loop][2]);
//         imagecolorset($background,$loop+8,$workbench_color[$loop][0],$workbench_color[$loop][1],$workbench_color[$loop][2]);
//         imagecolorset($font,$loop,$workbench_color[$loop][0],$workbench_color[$loop][1],$workbench_color[$loop][2]);
//         imagecolorset($font,$loop+8,$workbench_color[$loop][0],$workbench_color[$loop][1],$workbench_color[$loop][2]);
//      }
//   }
//   else
//   {
//      $background_canvas=imagecolorallocate($ansi,0,0,0);
//   }
//
//   for ($loop=0; $loop<16; $loop++)
//   {
//	  /* Generating ANSI colors array in order to be able to draw underlines */
//      $color_index=imagecolorsforindex($background,$loop);
//      $colors[$loop]=imagecolorallocate($ansi,$color_index['red'],$color_index['green'],$color_index['blue']);
//   }
//
//
//
///*****************************************************************************/
///* RENDER ANSI                                                               */
///*****************************************************************************/
//
//   for ($loop=0;$loop<strlen($ansi_buffer);$loop+=9)
//   {
//      $color_background=ord($ansi_buffer[$loop]);
//      $color_foreground=ord($ansi_buffer[$loop+1]);
//      $character=ord($ansi_buffer[$loop+2]);
//      $bold=ord($ansi_buffer[$loop+3]);
//      $italics=ord($ansi_buffer[$loop+4]);
//      $underline=ord($ansi_buffer[$loop+5]);
//      $position_x=ord($ansi_buffer[$loop+6]);
//      $position_y=ord($ansi_buffer[$loop+7])+(ord($ansi_buffer[$loop+8])<<8);
//
//      if (!$font_amiga)
//      {
//         imagecopy($ansi,$background,$position_x*$bits,$position_y*font_size_y,$color_background*9,0,$bits,font_size_y);
//         imagecopy($ansi,$font,$position_x*$bits,$position_y*font_size_y,$character*font_size_x,$color_foreground*font_size_y,$bits,font_size_y);
//      }
//      else
//      {
//         if ($color_background!=0 || !$italics)
//         {
//            imagecopy($ansi,$background,$position_x*$bits,$position_y*font_size_y,$color_background*9,0,$bits,font_size_y);
//         }
//
//         if (!$italics)
//         {
//            imagecopy($ansi,$font,$position_x*$bits,$position_y*font_size_y,$character*font_size_x,$color_foreground*font_size_y,$bits,font_size_y);
//         }
//         else
//         {
//            imagecopy($ansi,$font,$position_x*$bits+3,$position_y*font_size_y,$character*font_size_x,$color_foreground*font_size_y,$bits,2);
//            imagecopy($ansi,$font,$position_x*$bits+2,$position_y*font_size_y+2,$character*font_size_x,$color_foreground*font_size_y+2,$bits,4);
//            imagecopy($ansi,$font,$position_x*$bits+1,$position_y*font_size_y+6,$character*font_size_x,$color_foreground*font_size_y+6,$bits,4);
//            imagecopy($ansi,$font,$position_x*$bits,$position_y*font_size_y+10,$character*font_size_x,$color_foreground*font_size_y+10,$bits,4);
//            imagecopy($ansi,$font,$position_x*$bits-1,$position_y*font_size_y+14,$character*font_size_x,$color_foreground*font_size_y+14,$bits,2);
//         }
//            
//         if ($italics && $bold)
//         {
//            imagecopy($ansi,$font,$position_x*$bits+3+1,$position_y*font_size_y,$character*font_size_x,$color_foreground*font_size_y,$bits,2);
//            imagecopy($ansi,$font,$position_x*$bits+2+1,$position_y*font_size_y+2,$character*font_size_x,$color_foreground*font_size_y+2,$bits,4);
//            imagecopy($ansi,$font,$position_x*$bits+1+1,$position_y*font_size_y+6,$character*font_size_x,$color_foreground*font_size_y+6,$bits,4);
//            imagecopy($ansi,$font,$position_x*$bits+1,$position_y*font_size_y+10,$character*font_size_x,$color_foreground*font_size_y+10,$bits,4);
//            imagecopy($ansi,$font,$position_x*$bits-1+1,$position_y*font_size_y+14,$character*font_size_x,$color_foreground*font_size_y+14,$bits,2);
//         }
//
//         if ($bold && !$italics)
//         {
//            imagecopy($ansi,$font,1+$position_x*$bits,$position_y*font_size_y,$character*font_size_x,$color_foreground*font_size_y,$bits,font_size_y);
//         }
//
//         if ($underline)
//         {
//            $loop_column=0;
//            $character_size_x=8;
//
//            if ($bold)
//            {
//               $character_size_x++;
//            }
//
//            if ($italics)
//            {
//               $loop_column=-1;
//               $character_size_x=11;
//            }
//
//            while ($loop_column<$character_size_x)
//            {
//               if (imagecolorat($ansi,$position_x*$bits+$loop_column,$position_y*font_size_y+15)==$color_background && imagecolorat($ansi,$position_x*$bits+$loop_column+1,$position_y*font_size_y+15)==$color_background)
//               {
//                  imagesetpixel($ansi,$position_x*$bits+$loop_column,$position_y*font_size_y+14,$colors[$color_foreground]);
//                  imagesetpixel($ansi,$position_x*$bits+$loop_column,$position_y*font_size_y+15,$colors[$color_foreground]);
//               }
//               else if (imagecolorat($ansi,$position_x*$bits+$loop_column,$position_y*font_size_y+15)!=$color_background && imagecolorat($ansi,$position_x*$bits+$loop_column+1,$position_y*font_size_y+15)==$color_background)
//               {
//                  $loop_column++;
//               }
//               
//               $loop_column++;
//            }
//
//            if ($pixel_carry)
//            {
//               imagesetpixel($ansi,$position_x*$bits,$position_y*font_size_y+14,$colors[$color_foreground]);
//               imagesetpixel($ansi,$position_x*$bits,$position_y*font_size_y+15,$colors[$color_foreground]);
//               $pixel_carry=FALSE;
//            }
//
//            if (imagecolorat($font,$character*font_size_x,$color_foreground*font_size_y+15)!=20)
//            {
//               imagesetpixel($ansi,$position_x*$bits-1,$position_y*font_size_y+14,$colors[$color_foreground]);
//               imagesetpixel($ansi,$position_x*$bits-1,$position_y*font_size_y+15,$colors[$color_foreground]);
//            }
//
//            if (imagecolorat($font,$character*font_size_x+$character_size_x-1,$color_foreground*font_size_y+15)!=20)
//            {
//               $pixel_carry=TRUE;
//            }
//         }
//      }
//   }
//
//
//
///*****************************************************************************/
///* CREATE OUTPUT FILE                                                        */
///*****************************************************************************/
//
//   if ($transparent)
//   {
//      imagecolortransparent($ansi,$background_canvas);
//   }
//
//   if ($thumbnail)
//   {
//      thumbnail($ansi,$output,$columns,font_size_y,$position_y_max);
//   }
//   else
//   {
//      if ($output=='online')
//      {
//         Header("Content-type: image/png");
//         ImagePNG($ansi);
//      }
//      else
//      {
//         if (!SPLIT)
//         {
//            ImagePNG($ansi,$output);
//         }
//         else
//         {
//            $image_size_y=$position_y_max*font_size_y;
//            $split_size_y=SPLIT_HEIGHT;
//
//            $loop_max=($image_size_y/$split_size_y);
//
//            for ($loop=0; $loop<$loop_max; $loop++)
//            {
//               if (($image_size_y-($split_size_y*$loop))<$split_size_y)
//               {
//                  $height=($image_size_y-($split_size_y*$loop));
//               }
//               else
//               {
//                  $height=$split_size_y;
//               }
//
//               if (!$split = imagecreate($columns*$bits,$height))
//               {
//                  error("Can't allocate buffer image memory");
//               }
//
//               imagecolorallocate($split,0,0,0);
//               imagecopy($split,$ansi,0,0,0,($loop*$split_size_y),$columns*$bits,$height);
//
//               if ($loop_max>=1)
//               {
//                  $output_file=$output.SPLIT_SEPARATOR.str_pad($loop,4,"0",STR_PAD_LEFT).".png";
//               }
//               else
//               {
//                  $output_file=$output.".png";
//               }
//
//               $output_files[]=$output_file;
//
//               if ($transparent)
//               {
//                  imagecolortransparent($split,$background_canvas);
//               }
//
//               ImagePNG($split,$output_file);
//               imagedestroy($split);
//            }
//         }
//      }
//   }
//
//
//
///*****************************************************************************/
///* FREE MEMORY                                                               */
///*****************************************************************************/
//
//   imagedestroy($ansi);
//   imagedestroy($background);
//   imagedestroy($font);
//   
//   return $output_files;
//}
//
//
//
///*****************************************************************************/
///* LOAD PCBOARD                                                              */
///*****************************************************************************/
//
//function load_pcboard($input,$output,$font,$bits)
//{
//   check_libraries();
//
///*****************************************************************************/
///* CHECK PARAMETERS AND FORCE DEFAULT VALUES IF INVALID INPUT IS DETECTED    */
///*****************************************************************************/
//
//   $columns=80;
//
//   if ($bits=='thumbnail')
//   {
//      $thumbnail=TRUE;
//   }
//   if ($bits!=8 && $bits!=9)
//   {
//      $bits=8;
//   }
//
//   switch($font)
//   {
//   case '80x25':
//      font_file = "ansilove_font_pc_80x25.png';
//      font_size_x = 9;
//      font_size_y = 16;
//      break;
//
//   case '80x50':
//      font_file = "ansilove_font_pc_80x50.png';
//      font_size_x = 9;
//      font_size_y = 8;
//      break;
//
//   default:
//      font_file = "ansilove_font_pc_80x25.png';
//      font_size_x = 9;
//      font_size_y = 16;
//   }
//
//
//
///*****************************************************************************/
///* LOAD INPUT FILE                                                           */
///*****************************************************************************/
//
//   if (!$input_file = fopen($input,'r'))
//   {
//      error("Can't open file $input");
//   }
//
//   $input_file_sauce=load_sauce($input);
//
//   if ($input_file_sauce!=NULL)
//   {
//      $input_file_size=$input_file_sauce['FileSize'];
//   }
//   else
//   {
//      $input_file_size=filesize($input);
//   }
//
//   if (!$input_file_buffer = fread($input_file,$input_file_size))
//   {
//      error("Can't read file $input");
//   }
//
//   fclose($input_file);
//
//
//
///*****************************************************************************/
///* LOAD BACKGROUND/FONT                                                      */
///*****************************************************************************/
//
//   if (!$background = imagecreatefrompng(dirname(__FILE__).'/fonts/ansilove_background.png'))
//   {
//      error("Can't open file ansilove_background.png");
//   }
//
//   if (!$font = imagecreatefrompng(dirname(__FILE__).'/fonts/'.font_file))
//   {
//      error("Can't open file font_file");
//   }
//
//   imagecolortransparent($font,20);
//
//
//
///*****************************************************************************/
///* ALLOCATE BACKGROUND/FOREGROUND COLOR ARRAYS                               */
///*****************************************************************************/
//
//   $pcb_colors[48]=0; $pcb_colors[49]=4; $pcb_colors[50]=2; $pcb_colors[51]=6; $pcb_colors[52]=1; $pcb_colors[53]=5; $pcb_colors[54]=3; $pcb_colors[55]=7; $pcb_colors[56]=8; $pcb_colors[57]=12; $pcb_colors[65]=10; $pcb_colors[66]=14; $pcb_colors[67]=9; $pcb_colors[68]=13; $pcb_colors[69]=11; $pcb_colors[70]=15;
//
//
//
///*****************************************************************************/
///* STRIP UNWANTED PCBOARD CODES (DEFINED IN CONFIG FILE)                     */
///*****************************************************************************/
//
//   $pcboard_strip_codes_exploded=explode(",",PCBOARD_STRIP_CODES);
//
//   for ($loop=0;$loop<sizeof($pcboard_strip_codes_exploded);$loop++)
//   {
//      $input_file_buffer=preg_replace("/(".$pcboard_strip_codes_exploded[$loop].")/","",$input_file_buffer);
//   }
//
//
//
///*****************************************************************************/
///* PROCESS PCB                                                               */
///*****************************************************************************/
//
//   $color_background=0;
//   $color_foreground=7;
//
//   $loop=0;
//
//   $position_x=0;
//   $position_y=0;
//
//   $position_x_max=0;
//   $position_y_max=0;
//
//   while ($loop<$input_file_size)
//   {
//      $current_character=ord($input_file_buffer[$loop]);
//      $next_character=ord($input_file_buffer[$loop+1]);
//
//      if ($position_x==80)
//      {
//         $position_y++;
//         $position_x=0;
//      }
//
///*****************************************************************************/
///* CR+LF                                                                     */
///*****************************************************************************/
//
//      if ($current_character==13)
//      {
//         if ($next_character==10)
//         {
//            $position_y++;
//            $position_x=0;
//            $loop++;
//         }
//      }
//
///*****************************************************************************/
///* LF                                                                        */
///*****************************************************************************/
//
//      if ($current_character==10)
//      {
//         $position_y++;
//         $position_x=0;
//      }
//
///*****************************************************************************/
///* TAB                                                                       */
///*****************************************************************************/
//
//      if ($current_character==9)
//      {
//         $position_x+=8;
//      }
//
///*****************************************************************************/
///* SUB                                                                       */
///*****************************************************************************/
//
//      if ($current_character==26)
//      {
//         break;
//      }
//
///*****************************************************************************/
///* PCB SEQUENCE                                                              */
///*****************************************************************************/
//
//      if ($current_character==64 & $next_character==88)
//      {
//
///*****************************************************************************/
///* SET GRAPHIC RENDITION                                                     */
///*****************************************************************************/
//
//            $color_background=$pcb_colors[ord($input_file_buffer[$loop+2])];
//            $color_foreground=$pcb_colors[ord($input_file_buffer[$loop+3])];
//
//            $loop+=3;
//      }
//      elseif ($current_character==64 & $next_character==67 & $input_file_buffer[$loop+2]=='L' & $input_file_buffer[$loop+3]=='S')
//      {
//
///*****************************************************************************/
///* ERASE DISPLAY                                                             */
///*****************************************************************************/
//
//         unset($pcboard_buffer);
//
//         $position_x=0;
//         $position_y=0;
//
//         $position_x_max=0;
//         $position_y_max=0;
//
//         $loop+=4;
//      }
//      elseif ($current_character==64 & $next_character==80 & $input_file_buffer[$loop+2]=='O' & $input_file_buffer[$loop+3]=='S' & $input_file_buffer[$loop+4]==':')
//      {
//
///*****************************************************************************/
///* CURSOR POSITION                                                           */
///*****************************************************************************/
//
//         if ($input_file_buffer[$loop+6]=='@')
//         {
//            $position_x=(ord($input_file_buffer[$loop+5])-48)-1;
//            $loop+=5;
//         }
//         else
//         {
//            $position_x=(10*(ord($input_file_buffer[$loop+5])-48)+ord($input_file_buffer[$loop+6])-48)-1;
//            $loop+=6;
//         }
//      }     
//      elseif ($current_character!=10 && $current_character!=13 && $current_character!=9)
//      {
//
///*****************************************************************************/
///* RECORD NUMBER OF COLUMNS AND LINES USED                                   */
///*****************************************************************************/
//
//         if ($position_x>$position_x_max)
//         {
//            $position_x_max=$position_x;
//         }
//
//         if ($position_y>$position_y_max)
//         {
//            $position_y_max=$position_y;
//         }
//
//
//
///*****************************************************************************/
///* WRITE CURRENT CHARACTER INFO IN A TEMPORARY ARRAY                         */
///*****************************************************************************/
//
//         $pcboard_buffer[]=$position_x;
//         $pcboard_buffer[]=$position_y;
//         $pcboard_buffer[]=$color_background;
//         $pcboard_buffer[]=$color_foreground;
//         $pcboard_buffer[]=$current_character;
//
//         $position_x++;
//      }
//      $loop++;
//   }
//
//
//
///*****************************************************************************/
///* ALLOCATE IMAGE BUFFER MEMORY                                              */
///*****************************************************************************/
//
//   $position_x_max++;
//   $position_y_max++;
//
//   if (!$pcboard = imagecreate($columns*$bits,($position_y_max)*font_size_y))
//   {
//      error("Can't allocate buffer image memory");
//   }
//
//   imagecolorallocate($pcboard,0,0,0);
//
//
//
///*****************************************************************************/
///* RENDER PCB                                                                */
///*****************************************************************************/
//
//   for ($loop=0;$loop<sizeof($pcboard_buffer);$loop+=5)
//   {
//      $position_x=$pcboard_buffer[$loop];
//      $position_y=$pcboard_buffer[$loop+1];
//      $color_background=$pcboard_buffer[$loop+2];
//      $color_foreground=$pcboard_buffer[$loop+3];
//      $character=$pcboard_buffer[$loop+4];
//
//      imagecopy($pcboard,$background,$position_x*$bits,$position_y*font_size_y,$color_background*9,0,$bits,font_size_y);
//      imagecopy($pcboard,$font,$position_x*$bits,$position_y*font_size_y,$character*font_size_x,$color_foreground*font_size_y,$bits,font_size_y);
//   }
//
//
//
///*****************************************************************************/
///* CREATE OUTPUT FILE                                                        */
///*****************************************************************************/
//
//   if ($thumbnail)
//   {
//      thumbnail($pcboard,$output,$columns,font_size_y,$position_y_max);
//   }
//   else
//   {
//      if ($output=='online')
//      {
//         Header("Content-type: image/png");
//         ImagePNG($pcboard);
//      }
//      else
//      {
//         ImagePNG($pcboard,$output);
//      }
//   }
//
//
//
///*****************************************************************************/
///* FREE MEMORY                                                               */
///*****************************************************************************/
//
//   imagedestroy($pcboard);
//   imagedestroy($background);
//   imagedestroy($font);
//}

// load BINARY file and generate output PNG
void alBinaryLoader(char *input, char output[], char columns[], char font[], char bits[], char icecolors[])
{
    // some type declarations
    int64_t font_size_x;
    int64_t font_size_y;
    char *font_file;
    bool thumbnail = false;
    
    // let's see what font we should use to render output
    if (strcmp(font, "80x25") == 0) {
        font_file = "ansilove_font_pc_80x25.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else if (strcmp(font, "80x50") == 0) {
        font_file = "ansilove_font_pc_80x50.png";
        font_size_x = 9;
        font_size_y = 8;
    }
    else if (strcmp(font, "terminus") == 0) {
        font_file = "ansilove_font_pc_terminus.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    else {
        // in all other cases use the standard DOS font
        font_file = "ansilove_font_pc_80x25.png";
        font_size_x = 9;
        font_size_y = 16;
    }
    
    // in case bits is equal "thumbnail" set our bool flag 
    if (strcmp(bits, "thumbnail") == 0) {
        thumbnail = true;
    }
    
    // now set bits to 8 if not already value 8 or 9
    if (strcmp(bits, "8") != 0 && strcmp(bits, "9") != 0) {
        sprintf(bits, "%s", "8");
    }

    // load input file
    FILE *input_file = fopen(input, "r");
    if (input_file == NULL) { 
        fputs("\nFile error.\n\n", stderr); exit (1);
    }
    
    // get the file size (bytes)
    int64_t input_file_size = filesize(input);
    
    // just for testing the filesize() function we ported from PHP
    printf("\nSize of this file is: %jd bytes.\n", input_file_size);
    
    // next up is loading our file into a dynamically allocated memory buffer
    unsigned char *input_file_buffer;
    size_t result;
    
    // allocate memory to contain the whole file
    input_file_buffer = (unsigned char *) malloc(sizeof(unsigned char)*input_file_size);
    if (input_file_buffer == NULL) {
        fputs ("\nMemory error.\n\n", stderr); exit (2);
    }
    
    // copy the file into the buffer
    result = fread(input_file_buffer, 1, input_file_size, input_file);
    if (result != input_file_size) {
        fputs ("\nReading error.\n\n", stderr); exit (3);
    } // whole file is now loaded into input_file_buffer
    
    // close input file, we don't need it anymore
    rewind(input_file);
    fclose(input_file);
    
    // libgd image pointer
    gdImagePtr im_Binary, im_Backgrnd, im_Font;
            
    // additional libgd related declarations
    FILE *file_Backgrnd, *file_Font;
    char path_Backgrnd[1000] = { 0 };
    char path_Font[1000] = { 0 };
    
    // resolve paths for font and background image
    sprintf(path_Backgrnd, "%sansilove_background.png", ANSILOVE_FONTS_DIRECTORY);
{'fraction_non_alphanumeric': 0.29729038593332857, 'fraction_numerical': 0.015691007845503924, 'mean_word_length': 2.032194032628249, 'pattern_counts': {'":': 0, '<': 53, '<?xml version=': 0, '>': 27, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 166, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1026046', 'n_tokens_mistral': 30151, 'n_tokens_neox': 28371, 'n_words': 3458}