/* Copyright 2014 by R. Harmsen.

   For a full explanation see
   https://rudhar.com/sfreview/truncexp/en.htm
 */

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

enum shorten_mode_e {MV, CAT, WRI, RPLUS};

int emulate (char *mode);

int main (int argc, char **argv)
{
   FILE *fpi, *fpo;
   enum shorten_mode_e mode = CAT;

   if (argc > 1 && strcmp(argv[1], "-m") == 0)
   {
      /* Shorten by means of mv */
      mode = MV;
   }
   else if (argc > 1 && strcmp(argv[1], "-c") == 0)
   {
      /* Shorten by means of cat (normal write mode) */
      mode = CAT;
   }
   else if (argc > 1 && strcmp(argv[1], "-w") == 0)
   {
      /* Emulate cat, open in write mode */
      mode = WRI;
   }
   else if (argc > 1 && strcmp(argv[1], "-p") == 0)
   {
      /* Write in r+ mode */
      mode = RPLUS;
   }

// system("ls -lti");
   system("stat -f \"Born %SB, modified %Sm, inode %6i, %6Dz bytes: %N\" *");

   /* Extract last few hundred lines of logfile, meanwhile created by
      loglines, which writes 600 and then some */
   system("tail -400 logfile > f");

   sleep(23);

   switch (mode)
   {
      case MV:
         system("mv f logfile");
         break;

      case CAT:
         system("cat f > logfile");
         break;

      case WRI:
         emulate("w");
         break;

      case RPLUS:
         emulate("r+");
         break;
   }

// system("ls -lti");
   fprintf(stdout, "\nAfter:\n");
   system("stat -f \"Born %SB, modified %Sm, inode %6i, %6Dz bytes: %N\" *");

   sleep(12);

   fprintf(stdout, "\nLater still:\n");
   system("stat -f \"Born %SB, modified %Sm, inode %6i, %6Dz bytes: %N\" *");

   return 0;
}

int emulate (char *mode)
{
   /* Nothing just yet */
   char linebuf[129];
   FILE *fpi = NULL, *fpo = NULL;

   fpi = fopen("f", "r");
   if (!fpi)
   {
      fprintf(stderr, "Error in progline %d\n", __LINE__);
      return 1;
   }

   fpo = fopen("logfile", mode);
   if (!fpo)
   {
      fprintf(stderr, "Error in progline %d\n", __LINE__);
      return 2;
   }

   while (fgets(linebuf, sizeof linebuf, fpi) != NULL)
   {
      fputs(linebuf, fpo);
   }

   if (fpi) fclose(fpi);
   if (fpo) fclose(fpo);

   return 0;
}

/* Copyright 2014 by R. Harmsen.

   For a full explanation see
   https://rudhar.com/sfreview/truncexp/en.htm
 */