Pro un explication, vide illac.

/* Le . Variante plus simplice de lfn-cyr.c
   Face solo interlingua al scriptura grec secunde le schema 3.
   Vide https://rudhar.com/lingtics/intrlnga/scrptura/ia023.htm#Schema3 .
   Usa entitates symbolic in vice de numeric, ubi possibile.
  */

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

char *conv_table[] =
{
   /* a */ "alpha",
   /* b */ "beta",
   /* c */ "#x3f2", /* lunate sigma */
   /* d */ "delta",
   /* e */ "epsilon",
   /* f */ "phi",
   /* g */ "gamma",
   /* h */ "eta",
   /* i */ "iota",
   /* j */ "chi",
   /* k */ "kappa",
   /* l */ "lambda",
   /* m */ "mu",
   /* n */ "nu",
   /* o */ "omicron",
   /* p */ "pi",
   /* q */ "#x3d9", /* qoppa */
   /* r */ "rho",
   /* s */ "sigma",
   /* t */ "tau",
   /* u */ "omega",
   /* v */ "upsilon",
   /* w */ "#x3dd", /* digamma */
   /* x */ "xi",
   /* y */ "psi",
   /* z */ "zeta",
   /* safety stop */ NULL
};

static int convert (int c, FILE *fpi, FILE *fpo);

int  main (int argc, char **argv)
{
   FILE *fpi = stdin, *fpo = stdout;
   int c;
   int intag = 0, inentity = 0;

   while ((c = getc(fpi)) != EOF)
   {
      if (!intag && c == '<')
         intag = 1;
      else if (intag && c == '>')
         intag = 0;
      else if (!inentity && c == '&')
         inentity = 1;
      else if (inentity && c == ';')
         inentity = 0;

      if (intag || inentity)
         putc(c, fpo);
      else
         convert(c, fpi, fpo);
   }

   return 0;
}

static int convert (int c, FILE *fpi, FILE *fpo)
{
   if (!isascii(c) || !isalpha(c))
   {
      putc(c, fpo);
   }
   else
   {
      int index; char *tabval; char buf[16];

      index = c - (isupper(c) ? 'A' : 'a');

      /* Safety first */
      if (index >= 26)
          index = 26;

      tabval = conv_table[index];
      if (!tabval)
      {
         putc(c, fpo);
      }
      else
      {
         int n;

         sprintf(buf, "&%s;", tabval);

         if (isascii(c) && isupper(c))
         {
             if (c == 'C')
                strcpy(buf, "&#x3f9;");
             else if (c == 'Q')
                strcpy(buf, "&#x3d8;");
             else if (c == 'W')
                strcpy(buf, "&#x3dc;");
             else
                buf[1] = toupper(buf[1]);
         }

         if (c == 's')
         {
            n = getc(fpi);

            if (!isalpha(n))
            {
               /* Final lowercase sigma as in real Greek */
               strcpy(buf, "&#x3c2;");
            }
            ungetc(n, fpi);
         }
         fprintf(fpo, "%s", buf);
      }
   }

   return 0;
}