/******************************************************************************
*
*               Projet   : DilibUnix
*               Module   : Buffer
*               Fichier  : DilibTail.c
*               Auteur   : J. DUCLOY
*               Date     : December 96
*               Modif    : January 2002
************************************************************************************
*
* Copyright (c) 1996 CNRS/CRIN & INRIA Lorraine
* 
******************************************************************************/

/************************************************************

usage: see 
        man 1 DilibTail

understanding code :
        classic using of Buffer interface
    This command uses a Buffer circular list (tabBuffer)      
************************************************************/

#include <stdio.h>
#include "Buffer.h"

void exit();
void perror();
int atoi();


int numberRecords;   /* number of records to be printed */

Buffer **tabBuffer;  /* circular list */

void writeFromBottom(n)
    int n;
     /* ecrit les n premiers */
{
  int i;
  i=-1;
  while (++i<=n) printf("%s\n", BufferString(tabBuffer[i]));
}

void writeToTop(n)
      int n;
{
  int i;
  i=n-1;
  while (++i<numberRecords) printf("%s\n", BufferString(tabBuffer[i]));
}

void usage()
{
  perror ("usage: DilibTail [-n] <inputFile \n");
  exit(1);
}

int main(argc,argv)
     int argc;
     char **argv;
{
  int i;     /* indice position of current buffer in circular list */
  
  if (argc > 2) usage();
  else 
    {if (argc==2) 
          {
            numberRecords=atoi(argv[1]+1);
     	}
     else numberRecords=10;
   }

  tabBuffer = (Buffer **)malloc(numberRecords*sizeof(Buffer*));

  i=-1;
  while (++i<numberRecords)
    {
       tabBuffer[i]=BufferCreate(100,100);
       if(!BufferGets(tabBuffer[i]))
           {
	     writeFromBottom(i-1);
             exit(0);
           }
    }

  /* at this point:
        input file has more than numberRecords line 
        and the first numberRecords ones have been readed */

  while(1)
    {
      i=-1;
      while (++i<numberRecords)
          {
             if(!BufferGets(tabBuffer[i]))
                {
		  writeToTop(i);
		  writeFromBottom(i-1);
		  exit(0);
                }
          }
    }

  /* this part only for avoiding compilation warnings */  
  exit (0);
  return (0);
}

