/* pino.c */
/* SJ 080598 */

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

#include "pino.h"

/* pinon toteutukset */

/* talletusrakenne */
struct pino_rakenne {
	pino_TYYPPI alkio;
	struct pino_rakenne *edellinen;
};

/* luodaan tyhjä pino, palautetaan se */
pino pino_luo()
{
  return (pino)NULL;
}

/* lisätään pinoon kokonaisluku */
void pino_push(pino *kohdepino, pino_TYYPPI luku)
{
  pino uusi_alkio;
  
  uusi_alkio = (pino)malloc(sizeof(struct pino_rakenne));
  uusi_alkio->edellinen = *kohdepino;
  uusi_alkio->alkio = luku;
  *kohdepino = uusi_alkio;
} /* pino_push() */

/* poistetaan pinosta päällimmäinen */
pino_TYYPPI pino_pop(pino *kohdepino)
{
  pino_TYYPPI alkio;
  pino edellinen;

  if (kohdepino && *kohdepino) {

	  alkio = (*kohdepino)->alkio;
	  edellinen = (*kohdepino)->edellinen;
	  free(*kohdepino);
	  *kohdepino = edellinen;

	  return alkio;

  } else {
	  printf("Varoitus, yritys poistaa tyhjästä tai \
luomattomasta pinosta!\n");
	  return 0;
  }
	  
} /* pino_pop() */

/* testataan pinon tila */
int pino_onko_alkioita(pino *kohdepino)
{
  if (kohdepino && *kohdepino)
	  return 1;
  else if (kohdepino)
	  return 0;
  else {
	  printf("Varoitus, yritys testata luomatonta \
pinoa!\n"); 
	  return 0;
  }

} /* pino_onko_alkioita() */

