/*
Problema 20.  Ocorrência de uma palavra em um texto (variante do
Problema 14).

- Escreva um programa que recebe uma palavra na linha de comando e lê
  um texto da entrada padrão, e que imprime o número de ocorrências da
  palavra no texto.  Não imponha nenhuma limitação no tamanho do
  texto.
 */

#include <stdio.h>
#include <stdlib.h>

#define FALSE 0
#define TRUE 1

int ocorre(char u[], char v[], int i);
char *leia_texto();

void *mallocc(size_t nbytes);
void *reallocc(void *v, size_t nbytes);

int main(int argc, char *argv[])
{
  int i, N = 0;
  char *t = leia_texto();

  /* printf("texto:\n--->%s<---\n", t); */

  for (i = 0; t[i] != '\0'; i++) 
    if (ocorre(argv[1], t, i))
      N++;

  printf("Ocorrencias: %d\n", N);
  return 0;
}

int ocorre(char u[], char v[], int i)
{
  int j = 0;

  while (u[j] == v[i + j] && u[j] != '\0') 
    j++;

  if (u[j] == '\0')
    return TRUE;

  return FALSE;
}

char *leia_texto()
{
  char *v, c;
  int t = 4, i = 0;

  v = mallocc(t * sizeof(char));

  while (scanf("%c", &c) > 0) {
    if (i > t - 2) {
      t *= 2;
      v = reallocc(v, t * sizeof(char));
    }
    v[i++] = c;
  }

  v[i] = '\0';
  return v;
}

void *mallocc(size_t nbytes)
{
  void *ptr;
  ptr = malloc(nbytes);
  if (ptr == NULL) {
    printf ("Socorro! malloc devolveu NULL!\n");
    exit(EXIT_FAILURE); /* EXIT_FAILURE: definido pelo sistema */
  }
  return ptr;
}

void *reallocc(void *v, size_t nbytes)
{
  void *ptr;
  ptr = realloc(v, nbytes);
  if (ptr == NULL) {
    printf ("Socorro! realloc devolveu NULL!\n");
    exit(EXIT_FAILURE); /* EXIT_FAILURE: definido pelo sistema */
  }
  return ptr;
}
