rem: long int len;
context: tsort (const char *file){  struct item *root;  struct item *j = NULL;  struct item *k = NULL;  register FILE *fp;  token_buffer tokenbuffer;  /* Intialize the head of the tree will hold the strings we're sorting.  */  root = new_item (NULL);  if (STREQ (file, "-"))    {      fp = stdin;      have_read_stdin = 1;    }  else    {      fp = fopen (file, "r");      if (fp == NULL)	error (EXIT_FAILURE, errno, "%s", file);    }  init_tokenbuffer (&tokenbuffer);  while (1)    {      long int len;      /* T2. Next Relation.  */      len = readtoken (fp, DELIM, sizeof (DELIM) - 1, &tokenbuffer);      if (len < 0)	break;      assert (len != 0);      k = search_item (root, tokenbuffer.buffer);      if (j)	{	  /* T3. Record the relation.  */	  record_relation (j, k);	  k = NULL;	}      j = k;    }  /* T1. Initialize (N <- n).  */  walk_tree (root, count_items);  while (n_strings > 0)    {      /* T4. Scan for zeros.  */      walk_tree (root, scan_zeros);      while (head)	{	  struct successor *p = head->top;	  /* T5. Output front of queue.  */	  printf ("%s\n", head->str);	  head->str = NULL;	/* Avoid printing the same string twice.  */	  n_strings--;	  /* T6. Erase relations.  */	  while (p)	    {	      p->suc->count--;	      if (p->suc->count == 0)		{		  zeros->qlink = p->suc;		  zeros = p->suc;		}	      p = p->next;	    }	  /* T7. Remove from queue.  */	  head = head->qlink;	}      /* T8.  End of process.  */      assert (n_strings >= 0);      if (n_strings > 0)	{	  /* The input contains a loop.  */	  error (0, 0, _("%s: input contains a loop:"),		 (have_read_stdin ? "-" : file));	  exit_status = 1;	  /* Print the loop and remove a relation to break it.  */	  do	    walk_tree (root, detect_loop);	  while (loop);	}    }}