/******************************
*	list.c
*	15.04.2002
******************************/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

#define	DELKA_RADKU 80
#define PAGE 24

typedef struct struct_info {
		int pocet;
		char *slovo;
		struct struct_info *dalsi;
	       } info;

void pridej_slovo(info **prvni, char *s)
{
 info *prvek;
 prvek = *prvni;
 /* dokud neni na konci, porovnava nove s ulozenym */
 while (prvek != NULL) 
   {
    /* shoda nalezena, pocet se zvetsil */
    if (strcmp(s, prvek->slovo) == 0)	  
      {
       (prvek->pocet)++;
       return;
      }
    prvek = prvek->dalsi;		/* prejdi na naslednika */
   }
 /* shoda nenalezena je nutno vytvorit novy prvek */  
 prvek = malloc(sizeof(info)); 
 /* naalokovat i misto pro kopii slova */
 prvek->slovo = malloc(strlen(s) + 1); 
 strcpy(prvek->slovo, s);
 /* nastavi pocet vyskytu na jedna,prida prvek na zacatek seznamu */
 prvek->pocet = 1;
 prvek->dalsi = *prvni;
 *prvni = prvek;
} 

void tiskni(info *prvni)
{
 int vytisknuto = 0;
 while (prvni != NULL)	/* dokud nejsme na konci seznamu */
    {
    printf("%4d..%s\n", prvni->pocet, prvni->slovo);
    prvni = prvni->dalsi;
    vytisknuto++;
	/* tiskne stukturu prvek a pocita, kolikrat kontroluje 
	totoz vystup na obrazovku kvuli pozastaveni vypisu */
    if ((vytisknuto % PAGE) == 0)	  
      {
       printf("pro pokracovani stiskni enter");
       getchar();
       printf("\n");
      }
   }
}

int main(int argc, char **argv)
{
 info *prvni = NULL;
 char radek[DELKA_RADKU + 1], *slovo;
 /* retezec obsahuje mezeru TAB NL a CR */
 char oddelovace[] = " \t\\n\\r"; 
 FILE *f;

 if (argc != 1)
   f = fopen(argv[1], "rt"); /* otevreni textoveho streamu */
 else
   f = stdin;  /* pouzije standardni vstup */
 if (f == NULL)
   return(1);
 /* dokud neni konec vstupu cte radek za radkem a vybira z nej slova */  
 while (fgets(radek, DELKA_RADKU, f) != NULL) 
    {
	/* nastaveni funkce,navrat prvniho slova z radku */
    slovo = strtok(radek, oddelovace);
    while (slovo != NULL)
      {
       pridej_slovo(&prvni, slovo);  /* slovo do seznamu */
       slovo = strtok(NULL, oddelovace); /* ziskani dalsiho slova z radku */
      }
   }
 tiskni(prvni);
 return 0;
}