#include<stdio.h>

#define STR_SIZE 4096 
/* may need to be increased

/* dog: like cat, but the other way ;) */

main(int argc, char **argv)
{
  int i, j;
  int success, offset;
  int *fstatus;
  FILE *fp;
  FILE **gp;
  char **buffer;
  char sep[STR_SIZE];
  int multflag = 0;
  fp=stdout;

  offset = 1;
  sprintf(sep, " "); /* simple space separator */

  gp = (FILE **) malloc((argc-offset)*sizeof(FILE *));
  buffer = (char **) malloc((argc-offset)*sizeof(char *));
  fstatus = (int *) malloc((argc-offset)*sizeof(int));

  for(i=offset; i < argc; i++)
    {
      if((gp[i-offset] = fopen(argv[i], "r")) == NULL)
	{
	  fprintf(stderr, "\n%s: Can't open file %s\n", argv[0], argv[i]);
	}
      buffer[i-offset] = (char *) malloc(STR_SIZE*sizeof(char));
      fstatus[i-offset] = 1;
    }

  success = 1;
  while(success)
    {
      success=0;
      for(i=offset; i < argc; i++)
	{
	  j = i - offset;
	  if(fstatus[j])
	    {
	      if(!fgets(buffer[j], STR_SIZE-1, gp[j]))
		{
		  fstatus[j] = 0;
		  continue;
		}
	      
	      if(buffer[j][strlen(buffer[j])-1] == '\n')
		{
		  buffer[j][strlen(buffer[j])-1] = '\0';  
		}
	      
	      fprintf(fp, "%s", buffer[j]);
	      if(i < (argc-1))
		{
		  fprintf(fp, "%s", sep);
		}
	    }
	  if(fstatus[j] > success) { success = fstatus[j]; }
	}

      if(success)
	{
	  fprintf(fp, "\n");
	}

    }

  for(i=offset; i < argc; i++)
    {
      free(buffer[i-offset]);
      fclose(gp[i-offset]);      
    }
  free(buffer);
  free(gp);
  free(fstatus);
  fclose(fp); 

}
