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

#include "ed/inc/sysalloc.h"
#include "ed/inc/sys.h"
#include "ed/inc/io.h"

#include "app.h"

/* macros ============================================================== */
/* constants =========================================================== */
/* types =============================================================== */
/* structures ========================================================== */
/* private variables =================================================== */
/* private functions =================================================== */

/* ---------------------------------------------------------------------
   --------------------------------------------------------------------- */
static int cb_out (void *p_user, char const *s)
{
   int err = 0;
   FILE *fp = p_user;

   if (fp != NULL)
   {
      fprintf (fp, "%s", s);
      fflush (fp);
      SYS_dump (s, strlen (s));
   }
   else
   {
      err = 1;
   }
   return err;
}

/* ---------------------------------------------------------------------
   --------------------------------------------------------------------- */
static void print_prompt (void)
{
   printf ("\n> ");
   fflush (stdout);
}

/* ---------------------------------------------------------------------
   --------------------------------------------------------------------- */
static void print_err (ci_err_e err)
{
   printf ("CI.ERR: %s\n", ci_serr (err));
}

/* ---------------------------------------------------------------------
   --------------------------------------------------------------------- */
static void test (void)
{
   ci_s ci;

   static ci_cfg_s const a_cfg[] =
      {
         {"date", date_man, date_cde},
         {"time", time_man, time_cde},
      };

   char s_user[] = "User";

   ci_err_e err = ci_init (&ci, a_cfg, NELEM (a_cfg));

   if (err == CI_OK)
   {
      ci_install_out (&ci, cb_out, stdout);
      {
         int end = 0;
         while (!end)
         {
            print_prompt ();
            {
               char *s_line = get_line ();
               if (s_line != NULL)
               {
                  err = ci_in (&ci, s_line, s_user);
                  end = err == CI_ERR_QUIT;
                  FREE (s_line);
                  if (err && !end)
                  {
                     print_err ();
                  }
               }
               else
               {
                  end = 1;
               }
            }
         }
      }
   }
   else
   {
      print_err (err);
   }
}

/* ---------------------------------------------------------------------
   --------------------------------------------------------------------- */
static int main_ (void)
{
   test ();

   return 0;
}

/* entry points ======================================================== */

/* ---------------------------------------------------------------------
   --------------------------------------------------------------------- */
int main (void)
{
   int ret;
   static char Trace[1 << 8];

   SYS_INIT (Trace, OFF);

   ret = main_ ();

   sys_mem_trace ();

   return ret;
}
