/*

$FILE		:	oopc.c
$VERSIONE	:	1.00
$DATA		:	Novembre 1991
$PROGETTO	:	Tecniche OOP in C, prima soluzione
$AUTORE		:	Paolo Sommaruga
$RUOLO		:	Funzioni standard per la creazione e la distruzione
				di oggetti.
$USO		:	Linking in ogni programma che usi oggetti T1.

*/

#include "exec/exec.h"
#include "stdio.h"

#include "oopc.h"

/*
	BASE: Funzione al momento nulla. Serve per cercare il metodo nell'oggetto
		  genitore quando sara` supportato un sistema di ereditarieta`.
*/

int BASE( h_ogtBase, msg, pParam, pResult)
POGT  h_ogtBase;
int   msg;
CADDR pParam;
CADDR pResult;

{
#define METODO_BASE "Metodo di BASE generale OGGETTI."
#define E_NOMETHOD  "ERRORE: Metodo non trovato."

INFO_SET( METODO_BASE , E_NOMETHOD );

return RETURN_FAIL;
} /* Fine di BASE */

/*
	NSC: Nuova Struttura di Controllo. Alloca la memoria per l'handle dello
		 oggetto. Chiamata dal metodo MSG_NEW_r dell'oggetto puntato, a sua
		 volta invocato da NUOVO.
*/

int NSC( h_ogtNsc )
POGT h_ogtNsc;

{
#define METODO_CO "Metodo di creazione OGGETTO generico."
#define E_NOMEM_O "ERRORE: Fallita AllocMem per Struttura Controllo OGGETTO."

h_ogtNsc = (POGT)AllocMem( sizeof( OGT ) , MEMF_PUBLIC|MEMF_CLEAR );

if ( !h_ogtNsc ) {
    INFO_SET( METODO_CO , E_NOMEM_O );
    return RETURN_FAIL;
} /* if */

return RETURN_OK;
} /* Fine di NSC */

/*
	NUOVO: Invoca la FUNCTIONP f_dispatch dell'oggetto invocato, restituendo il
		   ptr all'handle dell'oggetto.

				h_ogt_nuovoggetto = NUOVO( BUFFER );
            	                         ( FILE );
                	                     ( FINESTRA );
                    	                 ( ... );
*/

POGT NUOVO( fpDispatch )
FUNCTIONP fpDispatch;

{
POGT h_ogtNew = NULL;
int errore;

/*  lint -e522 */
errore = ( (*fpDispatch) ( NULL , MSG_NEW_r , NULL , h_ogtNew ) );
/*  lint +e522 */

if (errore)
    return NULL;

return h_ogtNew;
} /* Fine di NUOVO */

/*
	DSC: Distruggi Struttura di Controllo. De-alloca la memoria della Struttura
		 di Controllo dell'oggetto. Chiamata per ultima dal metodo MSG_OFF
		 dell'oggetto puntato.
*/

void DSC( h_ogtDsc )
POGT h_ogtDsc;

{
FreeMem( h_ogtDsc , sizeof (OGT ) );
} /* Fine di DSC */
