/************************************************/
/* soubor STR_ARRY.C				*/
/* ze standardniho vstupu cte radky, alokuje	*/
/* pro ne pamet a ukazatele na tuto kopii	*/
/* nacteneho radku uklada do pole ukazatelu	*/
/* pole ukazatelu ma pocatecni velikost, ktera	*/
/* se ovsem v pripade potreby zmeni - realloc()	*/
/* po ukonceni vstupu nactene radky vytiskne	*/
/************************************************/

/********************************/
/* obvykle navratove hodnoty:	*/
/* 	O.K.	0		*/
/*	error	!0 (casto -1)	*/
/********************************/

#include <stdio.h>
#include <alloc.h>
#include <string.h>

#define LADENI

#define	START		2
#define	PRIRUSTEK	1
#define	DELKA_RADKU	100

typedef char * 		retezec;
typedef retezec * 	pole_retezcu;

#if defined(LADENI)
 void volno(void)
 {
  printf("\nje volnych %10lu bajtu\n", coreleft()); /* LARGE */
 } /* void volno(void) */

 void uvolni(pole_retezcu *p_r, int pocet)
 {
  int i;
  for (i = 0; i < pocet; i++)
    {
     free((*p_r)[i]);
    }
  free(*p_r);
 } /* void uvolni(pole_retezcu *p_r, int pocet) */
#endif /* defined(LADENI) */

int alokace(pole_retezcu *p_r, int pocet)
{
 *p_r = malloc(pocet * sizeof(retezec));
 return (*p_r == NULL) ? -1 : 0;
} /* int alokace(pole_retezcu *p_r, int pocet) */

int re_alokace(pole_retezcu *p_r, int novy_pocet)
{
 pole_retezcu pom;
 if (*p_r == NULL)
   if (alokace(p_r, novy_pocet))
     return -1;	/* chyba */
 pom = realloc(*p_r, sizeof(retezec) * novy_pocet);
 if (pom == NULL)
    return -1;
 else
   {
    *p_r = pom;
    return 0;
   }
} /* int re_alokace(pole_retezcu *p_r, int novy_pocet) */

int pridej_radek(pole_retezcu *p_r, retezec s, int index)
{
 int delka = strlen(s) + 1;
 if (((*p_r)[index] = malloc(delka)) == NULL)
   return -1;
 strcpy((*p_r)[index], s);
 return 0;
} /* int pridej_radek(pole_retezcu *p_r, retezec s, int index) */

int cti_a_pridavej(pole_retezcu *p_r, int *pocet, int *alokovano, int prir)
{
 char radek[DELKA_RADKU], *pom;
 puts("Zadavej retezce, posledni CTRL-Z na novem radku");
 do
   {
    if ((pom = gets(radek)) != NULL)
      {
       if (*pocet + 1 > *alokovano)
	 {
	  if (re_alokace(p_r, *alokovano + prir))
	    {
	     puts("nedostatek pameti");
	     return -1;
	    }
	  *alokovano += prir;
	 }
       if (pridej_radek(p_r, radek, *pocet))
	 {
	  puts("nedostatek pameti");
	  return 1;
	 }
       (*pocet)++;
      }
   } while (pom != NULL);
 return 0;
} /* int cti_a_pridavej(pole_retezcu *p_r, int *pocet,	*/
  /* 	int *alokovano, int prir)			*/

void zobrazuj(pole_retezcu p_r, int pocet)
{
 while (pocet--)
   {
    puts(*p_r++);
   }
} /* void zobrazuj(pole_retezcu p_r, int pocet) */

int main(void)
{
 int	pocet	  = 0,
	alokovano = START,
	prirustek = PRIRUSTEK;
 pole_retezcu p_ret = NULL;

#if defined(LADENI)
 volno();
#endif /* defined(LADENI) */
 if (alokace(&p_ret, alokovano))
   {
    puts("nedostatek pameti");
    return 1;
   }
 if (cti_a_pridavej(&p_ret, &pocet, &alokovano, prirustek))
   return 1;
 zobrazuj(p_ret, pocet);

#if defined(LADENI)
 uvolni(&p_ret, pocet);
 volno();
#endif /* defined(LADENI) */

 return 0;
} /* int main(void) */