/******************************************************************************
*
*    Projet   : DilibXml
*    Module   : XmlNode
*    Fichier  : XmlRecordTail.c
*    Auteur   : Francois PARMENTIER
*    Date     : Novembre 2002
*    Cvs      : $Id: XmlRecordTail.c,v 1.1.1.1 2003/01/13 16:03:48 dilib Exp $
*
******************************************************************************/
#include <stdlib.h>
#include "BufferParserXml.h"
#include "Except.h"

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

int main(int argc, char **argv) {
  int      numberRecords;
  Buffer      **recordTable;
  Buffer       *lastOne;
  int           i,j,ind;
  Buffer       *bIn;
  BufferParser *bp;
  
  /* Arguments' treatment */
    numberRecords = 10;
  if (argc > 2) usage();
  else if (argc == 2) {
    numberRecords = atoi(argv[1]+1);
  }
  
  if(!(recordTable = malloc(numberRecords * sizeof(Buffer *)))) {
    ExceptSetError("XmlRecordTail",
		   "MA",
		   "Memory allocation error ",
		   "","!",
		   2);
  }
  
  /* Initializations */
  for(i=0; i<numberRecords; i++) recordTable[i] = NULL;
  lastOne = NULL;
  bp      = BufferParserCreate();
  BufferParserSetFile(bp,stdin);

  i=0;
  /* For all the XmlRecords on the BufferParser */
  while ((bIn = BufferParserGetNextXmlRecord (bp))) {
    recordTable[i] = bIn;
    
    /* Free the next record */
    i = (i+1)%numberRecords;
    if((recordTable[i])) {
      if(lastOne) 
	BufferFree(lastOne);
      lastOne = recordTable[i];
      recordTable[i] = NULL;
    }
  }
  
  recordTable[i] = lastOne;

  /* Display the last XmlRecords read */
  for(j = 0; 
      j < numberRecords; 
      j++) {
    ind = (i+j)%numberRecords;
    if(recordTable[ind]) {
      printf("%s\n",BufferString(recordTable[ind]));
      BufferFree(recordTable[ind]);
      recordTable[ind] = NULL;
    }
  }
  
  /* Free resources */
  BufferParserFree(bp);
  free(recordTable);
  exit(0);
  return 0;
} /* main */
