#include <stdio.h>
#include <stdlib.h>

/*
From zaphod.mps.ohio-state.edu!sol.ctr.columbia.edu!cunixf.cc.columbia.edu!
cs.columbia.edu!cooper Tue Jan 29 22:07:41 EST 1991


oops, forgot something important.  here it is:
*/

/* Directory entry in GL file */
#if 0
struct s_entry {
  long bignum;
  char name[13];
}
#endif

/* We don't use it, since some C's make it more than 17 bytes... */

main()
{
  short top;  /* size of directory */
  unsigned char *entry;  /* list of directory entries */
  char glfile[100], listfile[100];
  FILE *fp;   /* list of files to join */
  FILE *newfp;  /* the created gl file */
  FILE *oldfp;  /* File we're currently adding */
  int num_ents = 0;  /* number of files to assemble */
  int i;
  short bsize;  /* Size of buffer (see below) */
  long rsize;  /* Size of current file */
  char buff[1024];
  long sofar;  /* Number of bytes written so far */
  /* For referencing fileds in entry table: */
  long *bignum;
  unsigned char *name;

  /* Open required files */

  printf("GL file to create? "); scanf("%s",glfile);
  printf("list file? "); scanf("%s",listfile);

  fp = fopen(listfile,"r");
  if (fp == NULL)
    {
      printf("couldn't open list file %s\n", listfile);
      exit(-1);
    }
  newfp = fopen(glfile,"w");
  if (newfp == NULL)
    {
      fclose(fp);
      printf("couldn't create GL file %s\n", glfile);
      exit(-1);
    }

  /* Just count the number of files, to make directory */
  while(1)
    {
      i = fscanf(fp,"%s",buff);
      if (i <= 0 || buff[0] == 0)
	break;
      num_ents++;
    }

  rewind(fp);

  top = (num_ents+1) * 17;
  /* Allocate space for directory */
  entry = (unsigned char *)calloc(top, 1);

  /* Write directory size... */
  fwrite(&top, 2, 1, newfp);
  /* But leave blank until we get all info */
  fseek(newfp, (long)top, 1);
  sofar = top+2;

  /* Process each file */
  bignum = (long *)entry;
  name = entry+4;
  for (i = 0; i < num_ents; i++, name+=17, bignum = (long *)(name-4))
    {
      fscanf(fp,"%s",buff);  /* read file naame */
      oldfp = fopen(buff,"r");  /* open the file */
      if (oldfp == NULL)
	{
	  fclose(fp);
	  fclose(newfp);
	  free(name);
	  free(bignum);
	  printf("Can't read file %s : aborting \n", buff);
	  exit(-1);
	}
      /* Make directory entry */
      strcpy(name, buff);
      *bignum = sofar;

      /* Copy file to gl file, one buffer at a time, */
      /* Accumulating size */
      rsize = 0;
      while(1)
	{
	  bsize = fread(buff, 1, sizeof(buff), oldfp);
	  fwrite(buff, bsize, 1, newfp);
	  rsize += bsize;
	  if (bsize < sizeof(buff))
	    break;
	}
      sofar += rsize;
      fclose(oldfp);
    }

  fclose(fp);

  /* Now write directory */
  fseek(newfp, 2L, 0);
  fwrite(entry, top, 1, newfp);

  fclose(newfp);
  free(entry);
}

