/************************************************/
/* 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) */