// SIMULA - PROGRAMMA GESTIONE CARRIERE UNIVERSITARIE //////////////////////////////////////////////////////////////////////////// //HEADER PRECOMPILATI #include #include #include #include #include //DICHIARAZIONE VARIABILI *CLASSI GLOBALI int MAXBUFFERLENGTH = 1000; //grandezza buffer per accesso ai file (standard 1000); #include "display.cpp" //CLASSE Display Display VIDEO; #include "develop.cpp" //CLASSE Develop Develop LOG("simula.log"); char *rule_file = NULL; //file ordinamento char *activity_file = NULL; //file offerta char *exam_file = NULL; //file carriera char *currentfile = NULL; //ultimo file caricato come script (evita le chiamate ricorsive allo stesso script) //COMPILAZIONE FILE DI OGGETTI E FUNZIONI A BASSO LIVELLO #include "fileman.cpp" //CLASS Fileman #include "service.cpp" //SERVICE FUNCTIONS (GETWORD, QUESTION, ...) #include "list.cpp" //CLASS List (CLASS List & CLASS Node) + function InList(list, element) #include "string.cpp" //CLASS String #include "command.cpp" //CLASS Command #include "rule.cpp" //CLASS Rule #include "exam.cpp" //CLASS Exam #include "activity.cpp" //CLASS Activity //DICHIARAZIONE VARIABILI GLOBALI List string_list("STRING_LIST", "STRINGA", "QUEUE"); //struttura dati obsoleta (test only) List rule_list("RULE_LIST", "OBIETT/VINC BOUND (BOUND_ORIGINALE) AMBITO"); List activity_list("ACTIVITY_LIST","CODICE, TIPO, CREDITI, SETTORE, ANNO_MINIMO { PROPEDEUTICITA' }"); List noprop_activity_list("NOPROP_ACTIVITY_LIST", "CODICE, TIPO, CREDITI, SETTORE, ANNO_MINIMO { PROPEDEUTICITA' }"); List exam_list("EXAM_LIST", "CODICE, ANNO"); List command_list("COMMAND_LIST", "STRINGA = COMANDO", "FAST"); List menu_list("MENU_LIST", "MAIN MENU"); int errors; //errori nella carriera int violations; //violazioni dell'ordinamento int tot_obj; //numero di obiettivi totali int obj; //numero obiettivi completati //COMPILAZIONE FUNZIONI-PROCEDURE AD ALTO LIVELLO #include "check.cpp" #include "konsole.cpp" //MAIN int main(int argc, char*argv[]) { //SETTAGGIO VALORI DI DEFAULT---------------------------------------- Bind ("~ konsole"); //comando per l'accesso alla konsole errors=0; //inoltre, alla creazione degli oggetti Develop e Display abbiamo: //LOG.level = 1 (stampa su video di livello 1) //LOG.logon = 3 (o 2 a seconda che possa o meno scrivere il file log) //VIDEO.pausize = 1 (fermati ad ogni fine schermo) //FASE DI INIZIALIZZAZIONE PER L'UTENTE------------------------------ Exec ("simula.inf"); //script di inizializzazione //ripristino file corrente di script per accesso da konsole delete [] currentfile; currentfile=NULL; //CONTROLLO ARGOMENTI------------------------------------------------ //viene data la precedenza ai nomi dei file indicati nella riga di comando if(argc>1) //ordinamento (2) { rule_file = new char[strlen(argv[1])+1]; strcpy(rule_file, argv[1]); } if(!ValidFile(rule_file)) { LOG.DEV("ERRORE: file specificato non esiste: ",0,0); LOG.DEV(rule_file,1,0); Exec("simula.err"); } if(argc>2) //offerta (3) { activity_file = new char[strlen(argv[2])+1]; strcpy(activity_file,argv[2]); } if(!ValidFile(activity_file)) { LOG.DEV("ERRORE: file specificato non esiste: ",0,0); LOG.DEV(activity_file,1,0); Exec("simula.err"); } if(argc>3) //carriera (4) { exam_file = new char[strlen(argv[3])+1]; strcpy(exam_file,argv[3]); //se la carriera non e' valida non bisogna uscire visto che e' opzionale //si salva comunque il nome del file per referenza al momento di un eventuale salvataggio } //FASE DI CARICAMENTO AUTOMATICA--------------------------------------- int loaded=0; if(menu_list.IsEmpty()) { LOG.DEV("Caricamento ",1,1); Load("simula.menu", menu_list,0); //caricamento menu di dafault } if(rule_list.IsEmpty()) { LOG.DEV("Caricamento ", 1,1); if(!Load(rule_file, rule_list,1,"ORDINAMENTO")) //carica l'ordinamento { LOG.DEV("ERRORE: file non contiene regole valide"); Exec("simula.err"); } loaded=1; } if(activity_list.IsEmpty()) { LOG.DEV("Caricamento ", 1,1); if(!Load(activity_file, activity_list,1,"OFFERTA_DIDATTICA")) //carica l'offerta { LOG.DEV("ERRORE: file non contiene attività valide"); Exec("simula.err"); } loaded=2; } //se e' stata specificata la carriera e se e' non gia' stata caricata, devo caricare la carriera if((exam_file!=NULL)&&(exam_list.IsEmpty())) { LOG.DEV("Caricamento ",1,1); if(Load(exam_file, exam_list)) //no id per la carriera :? loaded=2; } //CONTROLLO PRELIMINARE if(loaded==1) CheckOrder(); //devo controllare solo l'ordinamento perchè non e' stato controllato nello script if(loaded>1) { Check(); //devo controllare tutto } //se non ho caricato nulla in automatico significa che tutti i controlli li ha fatti lo script //ESECUZIONE INTERATTIVA DEL PROGRAMMA----------------------------- int q=1; //serve per le scelte dell'utente in casi anomali if (errors) { LOG.DEV("ATTENZIONE: Carriera non corretta"); q=question("Proseguire ugualmente?"); } if(q==1) do { InterfaceKonsole(); if(exam_list.modified) { if((q=question("Carriera modificata: salvare la carriera?"))==1) { if(exam_file==NULL) exam_file = Ask4File(); Save(exam_file, exam_list); } } } while(q==0); //se cancel quando chiedi di salvare la carriera allora continuo //CHIUSURA--------------------------------------------------------- VIDEO.Out("CHIUSURA IN CORSO...",1); if (exam_file!=NULL) delete [] exam_file; if (rule_file!=NULL) delete [] rule_file; if (activity_file!=NULL) delete [] activity_file; if (currentfile!=NULL) delete [] currentfile; //distruttori degli oggetti in stack chiamati adesso return 0; }