#define DBG 0
#define ARG 0
#include "frmwrk/inc/main.h"
/* ---------------------------------------------------------------------- */
#include "ed/inc/fic.h"

#include <errno.h>
#include <stdio.h>
#include <string.h>

/* macros ============================================================== */

#define FIC1 "TEST.FIC"
#define FIC2 "TEST.SVG"

/* constants =========================================================== */
/* types =============================================================== */
/* structures ========================================================== */

typedef struct
{
   unsigned char x;
   unsigned y;
   char z[10];
}
data_s;

typedef struct
{
   unsigned long count;
   char const *sprompt;
}
user_s;

/* private data ======================================================== */
/* private functions =================================================== */

/* ---------------------------------------------------------------------
   fFIC_SCANTEXT()
   ---------------------------------------------------------------------
   FIC_scantext callback
   ---------------------------------------------------------------------
   E : user context
   E : line
   E : line read status
   S : 0 = continue 1 = stop
   --------------------------------------------------------------------- */
static int cb_scantext (void *puser, char *sline, eFIC_ERR line_sts)
{
   user_s *pdata = puser;

   if (pdata)
   {
      pdata->count++;

      printf ("%s:%08lu:%02lu> %s\n"
              ,(char *) pdata->sprompt
              ,(unsigned long) pdata->count
              ,(unsigned long) line_sts
              ,(char *) sline
         );

   }
   return 0;
}



/* ---------------------------------------------------------------------
   tu()
   ---------------------------------------------------------------------

   ---------------------------------------------------------------------
   E :
   S :
   --------------------------------------------------------------------- */
static int tu (void)
{
   data_s Data =
   {0};

   Data.x = 10;
   Data.y = 2359;
   strcpy (Data.z, "Test");

   printf ("x=%d y=%d z='%s'\n", Data.x, Data.y, Data.z);

   if (!FIC_exist (FIC1))
   {
      FIC_save (FIC1, &Data, sizeof (Data));
   }

   {
      data_s const z =
      {0};
      Data = z;
   }

   strcpy (Data.z, "");

   printf ("x=%d y=%d z='%s'\n", Data.x, Data.y, Data.z);

   FIC_copy (FIC1, FIC2);

   FIC_load (FIC2, &Data, sizeof (Data));

   printf ("x=%d y=%d z='%s'\n", Data.x, Data.y, Data.z);

   {
      char sdate[FIC_DATE_SIZE];
      char stime[FIC_TIME_SIZE];
      char ssize[FIC_SIZE_SIZE];

      FIC_str_date (FIC2, sdate, sizeof sdate);
      FIC_str_time (FIC2, stime, sizeof stime);
      FIC_str_size (FIC2, ssize, sizeof ssize);

      printf ("Fic='%s' date='%s' time='%s' size='%s'\n"
              ,FIC2
              ,sdate
              ,stime
              ,ssize
         );

   }

   {
      user_s data;

      data.count = 0;
      data.sprompt = "SC>";

      {
         int ret = FIC_scantext ("c:/autoexec.bat", cb_scantext, &data);
         printf ("%d <- FIC_scantext()\n", ret);
      }
   }

   return 0;
}

/* ---------------------------------------------------------------------
   --------------------------------------------------------------------- */
static void tu_date (void)
{
   const char sfile[] = "../../main.c";

   char s[] = "dd-mm-yyyy";

   FIC_str_date (sfile, s, sizeof s);

   if (!errno)
   {
      printf ("%s\n", s);
   }
   else
   {
      perror (sfile);
   }

   FIC_str_time (sfile, s, sizeof s);

   if (!errno)
   {
      printf ("%s\n", s);
   }
   else
   {
      perror (sfile);
   }
}

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

/* ---------------------------------------------------------------------
   --------------------------------------------------------------------- */
int main (void)
{
   printf ("Test de [%s Ver %s]\n", FIC_sid (), FIC_sver ());

   tu ();

   tu_date ();

   return 0;
}
