/*----------------------------------------------
  
  permut.c

  (P) 1993 Laurentiu Cristofor

  a permutation generator program; 

  one of my first C programs 
  (no goto's in this one, must be the second!),
  it's been originally built for MS-DOS 
  using a Borland C compiler and
  non-ANSI I/O functions in 1993,
  and transfered to Unix in 1997

------------------------------------------------*/

#include <stdio.h>

#define N 11

void clrscr(void);
void prompt(void);
unsigned long int factorial(int);
void permute(int,int);
void print_tab(int);
void finale(void);
char table[N];
int n=0;
unsigned long int r,m=1,nr=0;

int main(void)
{
  prompt();

  clrscr();
  r=factorial(n);
  printf("There are %lu permutations:\n",r);
  putchar('\n');
  puts("Press q to quit, Enter to continue!");
  if(getchar()=='q') 
    {
      finale();
      exit(0);
    }
  fflush(stdin);
  
  putchar('\n');
  putchar('\n');

  permute(1,n);

  putchar('\n');
  putchar('\n');
  puts("Press Enter to end program.");
  getchar();
  fflush(stdin);
  finale();
}

/* high level clear screen procedure :-) */
void clrscr(void)
{
  int i;
  
  for(i=0;i<=80;i++) puts("");
}

void prompt(void)
{
  char c;
  
  clrscr();
  printf("This program computes the permutations of a string\n");
  printf("containing at most %d characters\n\n",N-1);
  printf("Enter character string (press Enter to signal end of input): ");
  while(n < N-1)
    {
      c=getchar();
      if(c=='\x0A') break;
      n=n+1;
      table[n-1]=c;
    }
  fflush(stdin);
}

unsigned long int factorial(int n)
{
  if(n==0) return 1;
  else return n*factorial(n-1);
}

void permute(int i,int n)
{
  int k,j;
  char t,tab[N];
  
  if(i==n)
    print_tab(n);
  else
    {
      for(j=0;j<n;j++) tab[j]=table[j];
      for(k=i;k<=n;k++)
	{
	  permute(i+1,n);
	  if(k != n)
	    {
	      t=tab[i-1];
	      tab[i-1]=tab[k];
	      tab[k]=t;
	      for(j=0;j<n;j++) table[j]=tab[j];
	    }
	}
    }
}

void print_tab(int n)
{
  int j;
  
  nr++;
  printf("Permutation no. %lu : ",nr);
  for(j=0;j<n;j++) putchar(table[j]);
  putchar('\n');
  if(nr==20*m && nr!=r)
    {
      m++;
      putchar('\n');
      printf("There are %lu permutations left.\n",r-nr);
      puts("Press q to quit, Enter to continue !");
      putchar('\n');
      if(getchar()=='q')
	{
	  fflush(stdin);
	  finale();
	  exit(0);
	}
      fflush(stdin);
    }
}

void finale(void)
{
  clrscr();
  puts("Permutation generator (P) 1993 Cristofor Laurentiu Bogdan");
}

