/*

$FILE		:	oopc.h
$VERSIONE	:	1.00
$DATA		:	Novembre 1991
$PROGETTO	:	Tecniche OOP in C, prima soluzione
$AUTORE		:	Paolo Sommaruga
$RUOLO		:	Header standard per Programmazione Orientata all'Oggetto.
				Definisce i  tipi fondamentali,  i messaggi generali, la
				macro SEND, dichiara le funzioni di base e quelle per la
				gestione dei messaggi di errore.
$USO		:	Includere in tutti i files relativi ad oggetti T1, come
				base. NON include a catena altri files LOCALI.

*/

#include "libraries/dos.h"

/*----------------------------------------------------------------------
	SEZIONE UNGHERESE:
	Sono qui definiti i tipi base necessari per seguire le indicazioni
	della convenzione ungherese per la redazione del codice:

	SZ			= stringa zero-terminated, prefisso del nome di una
				  variabile di tipo SZ: sz_
	FUNCTIONP	= puntatore a funzione che ritorna int. Prefisso: pf_
	CADDR		= puntatore generico (void). Prefisso p_

	Convenzioni per i tipi predefiniti:

	flag		= f_
	carattere	= ch_
	indice		= i_
	contatore	= c_
	differenza	= d_
	vettore		= rgT1_		( RanGe, specificare tipo T1 se e` typedef )
	vettore (2)	= mpT1T2_	( MaP, array[ T1 ] di tipo T2 )

/* SZ : ptr a stringa C (ZeroTerminated) */
typedef char* SZ;

/* FUNCTIONP : tipo ptr a funzione che restituisce int */
typedef int(*FUNCTIONP)();

/* CADDR : indirizzo generico in C */
typedef void* CADDR;

/* ------------------------------------------- FINE SEZIONE UNGHERESE */

/*------------------------------------------------------------------------
	Funzioni per la gestione di due linee di messaggio e loro output.

INFO_SET
Riceve e custodisce due stringhe da 75 caratteri; se piu` lunghe le tronca
automaticamente.

INFORMA
Invoca  la  funzione  passata  come  parametro  con le due stringhe di cui
sopra.   In  tale  modo,  le  funzioni che hanno un messaggio da inoltrare
usano  le  due  stringhe  (tipicamente un errore), ritornano un valore non
nullo,  quindi  il  programma  principale  puo`  visualizzare  le stringhe
secondo   una   propria   modalita`.    (Per   SZ   come   tipo   "Stringa
Zero-Terminated" vedi la SEZIONE UNGHERESE negli haders )

     NOTA  IMPORTANTE:  Questo sistema e` propriamente un gestore
     di  MESSAGGI  di  ERRORE,  non  degli errori stessi.  Questo
     perche` ogni funzione possa contenere i messaggi appropriati
     senza  costringere  il  programma a mappare gli errori con i
     messaggi.   In  assenza  (per  ora) di una codifica omogenea
     degli  errori  (cioe`  anche  non  sovrapposta  agli  errori
     predefiniti  di  Amiga),  si  rende necessario un sistema di
     output  che  permetta  all'utente la scelta tra continuare o
     terminare,  eventualmente  specificando,  come e` il caso di
     ALLOCA_BUFFER, che tale errore non e` rimediabile.
     Attualmente e` utilizzata la definizione  di quattro tipi di
     errore, includendo   <libraries/dos.h>  , con le definizioni
     RETURN_OK, _WARN, _ERROR, _FAIL.  Questo da`  l'entita`  del
     danno, i messaggi ne spiegano la natura.

Tutte le funzioni di questa libreria sono conformi alla convenzione qui
indicata. Le due righe devono contenere:
    1) "Funzione ... ( descrizione cosa fa la funzione, o quale e`)"
    2) "ERRORE: [FATALE] (e` accaduta la tal cosa)"; FATALE optional.
La funzione restituisce un intero RETURN_xxx come deinito sopra.

*/

extern void INFO_SET();     /* void INFO_SET( SZ , SZ ) */
extern int  INFORMA();      /*  int INFORMA( int (*fn)( SZ , SZ ) */

/* --------------------------------------------- FINE SEZIONE INFORMA */

/* OGGETTO : ptr a struttura il cui primo campo e` ptr a FUNCTIONP */
typedef struct oggetto {
    FUNCTIONP ogt_pfDispatch;	/* ogt_pf = ptr a funzione in struct OGT */
    CADDR     ogt_pDati;		/* ogt_p  = ptr in struct OGT */
} OGT;

/* HANDLE : ptr alla truttura di controllo di un oggetto */
typedef OGT* HANDLE;
typedef OGT* POGT;

#define MSG_NEW_r   0x4000  /* 0100 0000 0000 0000 binario */
#define MSG_OFF     0x4001  /* 0100 0000 0000 0001 binario */

#define SEND(obj, m, p, r) ((*(obj->ogt_pfDispatch,))(obj, m, p, r))

POGT NUOVO();   /*  POGT NUOVO( FUNCTIONP ) */
int NSC();      /*  int NSC( POGT ) */
int BASE();     /*  int BASE( POGT, int, CADDR, CADDR ) */

/* fine del file */
