/*

ITALIANE
Paolo Sommaruga, 17.08.90, 14.07.91, MANX AztecC 3.6a + arp.library

*/

#include <exec/exec.h>
#include <libraries/ArpBase.h>
#include <libraries/dos.h>
#include <functions.h>
#include <workbench/startup.h>

#include "italiane.h"

extern struct WBStartup *WBenchMsg;

char *CLI_Template = "FROM/S";
char *CLI_Help = "Uso: Italiane [ input_file ].\n";

struct GfxBase *GfxBase;

static BPTR olddir = NULL;  /* per ripristino directory se partito da WB */

static char titolo[]        = { "Italiane 1.00" };
static struct List t_list   = { NULL, NULL, NULL, 0, 0 };
static BUFD d_buff          = { NULL, 0 };
static BUST s_buff          = { 0, 0L, 0, 0, BS_VOID };
static ICTB iblock          = { &t_list,
                                &d_buff,
                                &s_buff,
                                0,
                                CMD_NULL,
                                NULL,
                                NULL,
                                0
                              };

#define ARG_FROM 1

/*-----------------------------  FUNZIONI  -----------------------------*/
/*************************************************************************

CHIUDI: Libera il buffer ed esce.

*/

void CHIUDI( c )
ICTB *c;

{
LIBERA_BUFFER();

if ( olddir )    (void)CurrentDir( (struct FileLock *)olddir );

exit( c->icb_er );
} /* Fine di CHIUDI */

/*************************************************************************

P_ERR: Primi ERRori. Funzione per la notifica di messaggi prima che
       l'interfaccia utente sia stata attivata.

*/

int P_ERR( t , m )
char *t;
char *m;

{
FPrintf( Output() , "%s\n%s\n" , t , m );
return 0;
} /* Fine di P_ERR */

/*************************************************************************

PARTITO_DA_CLI:

*/

BOOL PARTITO_DA_CLI( cargc, cargv )
int    cargc;
char **cargv;

{
#define MODULO_LCMD "Funzione di scansione linea comandi"
#define E_ERROPT "ERRORE: Serve un nome di file come unico parametro."
#define E_NOFILE "ERRORE: Il file indicato non esiste."

BOOL r_val = FALSE;

if ( cargc > 2 ) {
    FPrintf( Output() , "%s\n%s" , MODULO_LCMD , E_ERROPT );
    exit( 0 );
} /* if cargc > 2 */

else if ( cargc == 2 ) {
    if ( ( *cargv[ ARG_FROM ] ) == '?' ) {
        FPrintf( Output() , "%s\n%s" , MODULO_LCMD , CLI_Help );
        exit( 0 );
    } /* if */

    if ( !ESISTE_FILE( cargv[ ARG_FROM ] ) ) {
        FPrintf( Output() , "%s\n%s" , MODULO_LCMD , E_NOFILE );
        exit( 0 );
    } /* if */

    r_val = TRUE;

} /* else if cargc == 2 */

else if ( cargc == 1 ) {
    r_val = FALSE;
} /* else if cargc = 1 */

else {
    FPrintf( Output() , "%s\n%s" , MODULO_LCMD , E_ERROPT );
    exit( 0 );
} /* else */

return r_val;

} /* Fine di PARTITO_DA_CLI */

/*************************************************************************

PARTITO_DA_WB:

*/

BOOL PARTITO_DA_WB( wargc , wargv , largv )
LONG          wargc;
struct WBArg *wargv;
char        **largv;

{
BOOL r_val = FALSE;
BPTR newdir;

newdir = (BPTR)wargv[ ARG_FROM ].wa_Lock;

if ( wargc == 2 ) {
    olddir = (BPTR)CurrentDir( (struct FileLock *)newdir );
    largv[ ARG_FROM ] = (BYTE *)wargv[ ARG_FROM ].wa_Name;
    ReplyMsg( WBenchMsg );
    r_val = TRUE;
} /* if */

return r_val;

} /* Fine di PARTITO_DA_WB */

/*************************************************************************

LINEA_CMD: Scandisce la linea comandi, assegna il nome del file al path se
           il nome e` sulla linea e ritorna TRUE; altrimenti ritorna FALSE
           Si assume che questa funzione venga inocata DOPO aver testato
           l'alternativa CLI - WB startup, ed aver rilevato CLI.

*/

BOOL LINEA_CMD( largc , largv )
int    largc;
char **largv;

{
if ( largc )    return PARTITO_DA_CLI( largc , largv );
else            return PARTITO_DA_WB( WBenchMsg->sm_NumArgs,\
                                      WBenchMsg->sm_ArgList , largv );
} /* Fine di LINEA_CMD */

/*************************************************************************

NUOVO_FILE e SALVA_BUFFER: Informazioni valide per entrambe.

1 - Dall'interfaccia deve ricevere un icb_cpb ( c)ommand p)arameter b)lock
    )  di  tipo  LFPB, per conoscere il nome del file da aprire.  Il campo
    nome_vuoto  puo`  essere posto a FALSE, in modo che LEGGI_FILE accetti
    il  nome  passato  senza  usare indipendentemente il File Requester di
    ARP.  Cosi` la interfaccia puo` usare un proprio sistema di input.

2 - SCRIVI_FILE  ritorna  un  errore, ma e` necessario occuparsi del fatto
    che  puo`  essere  un  errore  non  irrecuperabile,  tipo disco pieno.
    Bisogna  offrire  una  via  di  uscita  (senza contare che si dovrebbe
    dettagliare   l'errore,   a  beneficio  dell'utente;  di  questo  puo`
    occuparsi  SCRIVI_FILE,  ma  e`  necessaria  allora  una disciplina di
    codice di errore distinti tra fatali e non.

*/

/*************************************************************************

RESETTA: Ripristina la situazione di partenza, senza buffer a senza
          titolo.

*/

void RESETTA( dp )
ICTB *dp;

{
LIBERA_BUFFER();

/* ora invalidiamo i campi relativi al buffer */
dp->icb_bufd->bd_buf = NULL;
dp->icb_bufd->bd_len = 0L;

/* ed ora quelli relativi ai dati display del buffer */
SPrintf( dp->icb_bust->bs_nome , "%-34s" , "Nessun file selezionato." );
dp->icb_bust->bs_size   = 0L;
dp->icb_bust->bs_tot39  = 0;
dp->icb_bust->bs_tot96  = 0;
dp->icb_bust->bs_status = BS_VOID;

dp->icb_command = CMD_NULL;

} /* Fine di RESETTA */

/*************************************************************************

SALVA_BUFFER: Scrive su disco il buffer corrente.

              Invoca: SCRIVI_FILE
*/

void SALVA_BUFFER( sp )
ICTB *sp;

{
sp->icb_er = SCRIVI_FILE( sp->icb_cpb , sp->icb_crb );
    if ( sp->icb_er )   return;

RESETTA( sp );
} /* Fine di SALVA_BUFFER */

/*************************************************************************

NUOVO_FILE: Carica un nuovo file nel buffer.

            Invoca: LIBERA_BUFFER
                    LEGGI_FILE
                    PASSO_1
                    PASSO_2
*/

void NUOVO_FILE( np )
ICTB *np;

{
LFPB *lp;
char *nm;
long  ct;
UBYTE cr;

if ( np->icb_bufd->bd_buf )    LIBERA_BUFFER();

lp = (LFPB *)np->icb_cpb;
nm = lp->lf_nome;

np->icb_er = LEGGI_FILE( np->icb_cpb , np->icb_crb );
    if ( np->icb_er )   return;

SPrintf( np->icb_bust->bs_nome , "%-34s" , BaseName( nm ) );

np->icb_bust->bs_size   = np->icb_bufd->bd_len;
np->icb_bust->bs_tot39  = 0;
np->icb_bust->bs_tot96  = 0;
np->icb_bust->bs_status = BS_PROC;

for( ct = 0 ; ct < np->icb_bufd->bd_len ; ct++ ) {
    cr = *(np->icb_bufd->bd_buf + ct);

    if ( cr == 39 )         np->icb_bust->bs_tot39++;
    else if ( cr == 96 )    np->icb_bust->bs_tot96++;
    else                    continue;
} /* for */

PASSI( np->icb_bufd );

np->icb_command = CMD_NULL;

np->icb_bust->bs_tot39  = 0;
np->icb_bust->bs_tot96  = 0;

for( ct = 0 ; ct < np->icb_bufd->bd_len ; ct++ ) {
    cr = *(np->icb_bufd->bd_buf + ct);

    if ( cr == 39 )         np->icb_bust->bs_tot39++;
    else if ( cr == 96 )    np->icb_bust->bs_tot96++;
    else                    continue;

} /* for */

np->icb_bust->bs_status = BS_DONE;

} /* Fine di NUOVO_FILE */

/*************************************************************************

PRIMOFILE: Processa il primo file se indicato sulla linea comandi.

*/

void PRIMOFILE( pf , t )
ICTB *pf;
char *t;

{
LFPB primofile;

primofile.lf_nome = t;
primofile.nome_vuoto = FALSE;

pf->icb_cpb = &primofile;
pf->icb_crb = pf->icb_bufd;

NUOVO_FILE( pf );

    if ( pf->icb_er ) {         /*lint -e534 */
        INFORMA( P_ERR );       /*lint +e534 */
        CHIUDI( &iblock );
    } /* if */

} /* Fine di PRIMOFILE */

/*************************************************************************

MANAGE_CMD: Esegue la funzione appropriata, secondo il comando ricevuto.

*/

void MANAGE_CMD( mcb )
ICTB *mcb;

{
switch( mcb->icb_command ) {
    case CMD_NULL :
        return;

    case CMD_CLOSE :
        CHIUDI( mcb );
        return;

    case CMD_NEWF :
        NUOVO_FILE( mcb );
        return;

    case CMD_SAVE :
        SALVA_BUFFER( mcb );
        return;

    case CMD_RSTRT :
        RESETTA( mcb );
        return;

    default :
        return;

} /* switch */

} /* Fine di MANAGE_CMD */

/*************************************************************************/
/*-------------------------------  MAIN  --------------------------------*/

void main( argc, argv )
int    argc;
char **argv;

{
BOOL lc = FALSE;

lc = LINEA_CMD( argc , argv );           /* FALSE se linea comandi vuota */

if ( lc != FALSE ) {
    PRIMOFILE( &iblock , argv[ARG_FROM] );
}

iblock.icb_er = INTERF_INIT( titolo );
    if ( iblock.icb_er ) {                      /*lint -e534 */
        INFORMA( P_ERR );                       /*lint +e534 */
        CHIUDI( &iblock );
    } /* if */

for ( ; ; ) {

INTERFACCIA( &iblock );     /* qui dovrebbe innescare tutta la UI */
MANAGE_CMD( &iblock );      /* ciclo gestione funzioni eseguibili dal prg */

} /* for */

} /* Fine di ITALIANE */
