/* numfilt 0.1 - Copyright (c) 1997 Michael Binder                  */
/*                                                                  */
/* License                                                          */
/* -------                                                          */
/* see the file README distributed with this file.                  */

/* translation to dutch by Eric Auer <eric@coli.uni-sb.REMOVEthisIFyouAREnoSPAMMER.de> 2002 */

/* note on the license: this was and is freeware, but the       */
/* license is not GPL - sorry for the rough info, but please    */
/* see the original numfilt for more exact license information! */

#define RECLEN 16384

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define TRUE 1
#define FALSE 0

int CheckDigits();
char *DigitToWord();
char *TenToNintynine(); 

static char inpbuf[RECLEN+2];
static int  i, offset;
static int  rawflg, nlflg;

int main(int argc, char *argv[])
{
     rawflg=FALSE;
     nlflg=FALSE;
     for (i=2; i<=argc; i++)
     {
        if (strchr(argv[i-1],'r') != 0) rawflg=TRUE;
        if (strchr(argv[i-1],'n') != 0) nlflg=TRUE;
     }

     for(;;)
     {
         if (!fgets(inpbuf,RECLEN,stdin))
         {
             if (nlflg == FALSE) fprintf(stdout,"\n");
             break;
         }
         if (nlflg == FALSE) sprintf(inpbuf+strlen(inpbuf)-1," ");
         for (i=0; i<strlen(inpbuf); i++)
         {
            if (isdigit(inpbuf[i]) == 0)
               fprintf(stdout,"%c",inpbuf[i]);
            else
            {
               if (rawflg == TRUE) fprintf(stdout," %s ",DigitToWord(inpbuf[i]));
               else
               {
                  offset=CheckDigits(&inpbuf[i]);
                  i=i+offset;
               }
            }
         }
     }
     return 0;
}


int CheckDigits(char *dg)
{
   static char nums[128], word[9];
   static int  i, j, k;

   nums[0]=0;
   for (i=0; i<strlen(dg); i++)
   {
      if ((nums[0] == '\0') && (dg[i] == '0')) continue;
      if (isdigit(dg[i]) == 0) break;
         else sprintf(nums+strlen(nums),"%c",dg[i]);
   }
   if (strlen(nums) == 0) sprintf(nums,"0");
   k=strlen(nums);
   if (k>12)
   { for (j=0; j<k; j++)
         fprintf(stdout," %s ",DigitToWord(dg[j]));
     return(i -1);
   }

   if (strlen(nums) > 1)
   {
      for (j=0; j<strlen(nums); j++)
      {
         sprintf(word,"%s",DigitToWord(nums[j]));
         if ((k>1) && (nums[j] == '1')) sprintf(word,"een");
         switch(k)
         {
            case 12 : if (nums[j] != '0') fprintf(stdout," %shondert ",word); break;
            case 11 : { fprintf(stdout," %s miljaard ",TenToNintynine(nums[j],nums[j+1]));
                        j++; k--;
                      } break;
            case 10 : { if (strlen(nums) == 10)
                        {  if (strcmp(word,"ein") == 0)
                              fprintf(stdout," een miljaard " /* ,word */);
                           else
                              fprintf(stdout," %s miljoen ",word);
                        }
                      } break;
            case  9 : if (nums[j] != '0')
                        fprintf(stdout," %shondert ",word); break;
            case  8 : { fprintf(stdout," %s miljoen ",TenToNintynine(nums[j],nums[j+1]));
                        j++; k--;
                      } break;
            case  7 : { if (strlen(nums) == 7)
                        {  if (strcmp(word,"ein") == 0)
                              fprintf(stdout," een miljoen " /* ,word */);
                           else
                              fprintf(stdout," %s miljoen ",word);
                        }
                      } break;
            case  6 : if (nums[j] != '0') fprintf(stdout," %shondert ",word); break;
            case  5 : { fprintf(stdout," %s duizend ",TenToNintynine(nums[j],nums[j+1]));
                        j++; k--;
                      } break;
            case  4 : { if (strlen(nums) == 4)
                           fprintf(stdout," %sduizend ",word);
                      } break;
            case  3 : if (nums[j] != '0')
                        fprintf(stdout," %shondert ",word); break;
            case  2 : { fprintf(stdout," %s ",TenToNintynine(nums[j],nums[j+1]));
                        j=j+2;
                      } break;
         }
         k--;
      } 
   }

   if ((dg[i] == '.') &&
       ((dg[i+1] == ' ') || (dg[i+1] == '\0') || (dg[i+1] == '\n')))
   {
      if (strcmp(nums,"1") == 0) fprintf(stdout," eerste ");
         else
      if (strcmp(nums,"3") == 0) fprintf(stdout," derde ");
         else
      if (strcmp(nums,"7") == 0) fprintf(stdout," zevende ");
         else
      if (strlen(nums) == 1) fprintf(stdout,"%sde ",DigitToWord(nums[0]));
         else fprintf(stdout,"tens ");
   }
   else
   {
      if (strlen(nums) == 1)
      fprintf(stdout," %s ",DigitToWord(nums[0]));
   }

   if ((dg[i] == '.') && (isdigit(dg[i+1]) != 0))
   {
      fprintf(stdout," punt ");
   }

   if ((dg[i] == ',') && (isdigit(dg[i+1]) != 0))
   {
      fprintf(stdout," koma ");
   }
   return((i-1));
}

char *DigitToWord(int c)
{
     static char word[9];

     switch(c)
     {
        case '0' : sprintf(word,"null"); break;
        case '1' : sprintf(word,"een"); break;
        case '2' : sprintf(word,"twee"); break; 
        case '3' : sprintf(word,"drie"); break;
        case '4' : sprintf(word,"vier"); break;
        case '5' : sprintf(word,"vijf"); break;
        case '6' : sprintf(word,"zes"); break;
        case '7' : sprintf(word,"zeven"); break;
        case '8' : sprintf(word,"acht"); break;
        case '9' : sprintf(word,"negen"); break;
     }
     return(word);
}

char *TenToNintynine(int c1, int c2)
{
   static char german_number[128];

   if ((c1 == '1') && (c2 == '1'))
   {  sprintf(german_number,"elf");
      return(german_number);
   }
   if ((c1 == '1') && (c2 == '2'))
   {  sprintf(german_number,"twaalf");
      return(german_number);
   }
   if ((c1 == '1') && (c2 == '7'))
   {  sprintf(german_number,"zeventien");
      return(german_number);
   }
   german_number[0]=0;
   if (c2 != '0')
   {  if ((c2 == '1') && (c1 != '0'))
         sprintf(german_number,"een");
      else
         sprintf(german_number,"%s",DigitToWord(c2));
   }
   if ((c1 > '1') && (c2 != '0'))
     sprintf(german_number+strlen(german_number),"en");
   switch(c1)
   {
      case '1' : sprintf(german_number+strlen(german_number),"tien"); break;
      case '2' : sprintf(german_number+strlen(german_number),"twintig"); break;
      case '3' : sprintf(german_number+strlen(german_number),"dertig"); break;
      case '4' : sprintf(german_number+strlen(german_number),"viertig"); break;
      case '5' : sprintf(german_number+strlen(german_number),"vijftig"); break;
      case '6' : sprintf(german_number+strlen(german_number),"zestig"); break;
      case '7' : sprintf(german_number+strlen(german_number),"zeventig"); break;
      case '8' : sprintf(german_number+strlen(german_number),"tachtig"); break;
      case '9' : sprintf(german_number+strlen(german_number),"negentig"); break;
   }
   return(german_number);
}
