program deadEnd;

uses
  dos, crt;

{$I headers.inc}

var {globals}
  space     : TheVoid;
  bbsname   : string;
  s         : sector;
  len, maxlen : integer;
  distrib   : array [1..8] of integer;

{$I misc.inc }
{$I GSDATA.INC}
{$I queue.inc }

procedure CheckBackDoor( base : sector );
{ verify no back doors into path }
var
  previous, current, NextUp : sector;
begin
  previous := base;
  write( base );
  if AppearanceCount( base ) = space.sectors[base].number then
    write(' ok ')
  else
    write(' back door ');
  current := space.sectors[base].data[1];
  while (space.sectors[current].number = 2) do
    begin
      write( current );
      if AppearanceCount( current ) = space.sectors[current].number then
        write(' ok ')
      else
        write(' back door ');
      NextUp := space.sectors[current].data[1];
      if NextUp = previous then
        NextUp := space.sectors[current].data[2];
      previous := current;
      current := nextUp;
    end; {while}
  writeln;
end;

begin
  initspace( space );
  if paramCount > 0 then
    BBSName := ParamStr( 1 )
  else
    BBSName := '';
  GetData( space, BBSName );
  for len := 1 to 8 do
    distrib[ len ] := 0;
  maxlen := 0;
  for s := 1 to MaxSector do
    if space.sectors[s].number = 1 then
      begin
        len := howfar( s );
        if len > maxlen then
          maxlen := len;
        distrib[ len ] := distrib[ len ] + 1;
      end; {for if}
  writeln('Distributions:');
  for len := 1 to 8 do
    write( len : 2, ': ', distrib[len] : 3, '.  ');
  readln;
  writeln('Sectors with maximum trails:');
  for s := 1 to MaxSector do
    if space.sectors[s].number = 1 then
      if howfar(s) = maxlen then
        write( s : 5 );
  readln;
  repeat
    write('Which lengths do you want to check for back doors? (0 to abort) ');
    readln( len );
    if len > 0 then
      for s := 1 to MaxSector do
        if space.sectors[s].number = 1 then
          if howfar(s) = len then
            checkBackDoor( s );
  until len = 0;
end.