#include #include #include #include #ifdef WIN32 #define buildmsg() char msg[256];va_list argptr;va_start(argptr,fmt);_vsnprintf(msg,sizeof(msg),fmt,argptr);va_end(argptr);msg[255] = '\0'; #else #define buildmsg() char msg[256];va_list argptr;va_start(argptr,fmt);vsprintf(msg,fmt,argptr);va_end(argptr) #endif // @doc EXTERNAL // @msg fatal_box | Crea una finestra di ERRORE FATALE con il relativo messaggio bool fatal_box( const char* fmt, ...) // @parm Messaggio da stampare nella finestra // (il formato e' come nella printf del C) // @comm Il programma viene interrotto al momento in cui si e' verificato l'errore. { buildmsg(); xvt_dm_post_fatal_exit(msg); return false; } // @doc EXTERNAL // @msg error_box | Crea una finestra di ERRORE con il relativo messaggio bool error_box( const char* fmt, // @parm Messaggio da stampare nella finestra ...) // @parmvar Uno o piu' parametri corrispondenti ai codici in

// @comm Se si opera in ambiente Windows crea la finestra con il bottone OK // e l'icona punto esclamativo. { buildmsg(); xvt_dm_post_error(msg); return false; } // @doc EXTERNAL // @msg warning_box | Crea una finestra di ATTENZIONE con il relativo messaggio bool warning_box( const char* fmt, // @parm Messaggio da stampare nella finestra ...) // @parmvar Uno o piu' parametri corrispondenti ai codici in

// @comm Se si opera in ambiente Windows crea la finestra con il bottone OK // e l'icona punto di domanda. { buildmsg(); xvt_dm_post_warning(msg); return 0; } // @doc EXTERNAL // @msg message_box | Crea una finestra di INFORMAZIONE con relativo il messaggio bool message_box( const char* fmt, // @parm Messaggio da stampare nella finestra ...) // @parmvar Uno o piu' parametri corrispondenti ai codici in

// @comm Se si opera in ambiente Windows crea la finestra con il bottone OK // e l'icona informazioni. { buildmsg(); xvt_dm_post_message(msg); return false; } // @doc EXTERNAL // @msg sorry_box | Crea una finestra di SCUSE con il relativo messaggio bool sorry_box( const char* fmt, // @parm Messaggio da stampare nella finestra ...) // @parmvar Uno o piu' parametri corrispondenti ai codici in

// @comm Se si opera in ambiente Windows crea la finestra con il bottone OK // e l'icona informazioni. { buildmsg(); xvt_dm_post_note(msg); return false; } // @msg yesno_box | Crea una finestra di RICHIESTA con il relativo messaggio bool noyes_box( const char* fmt, // @parm Messaggio da stampare nella finestra ...) // @parmvar Uno o piu' parametri corrispondenti ai codici in

{ buildmsg(); ASK_RESPONSE r = xvt_dm_post_ask("No", "Si", NULL, msg); return r == RESP_DEFAULT; } // @msg noyesall_box | Crea una finestra di RICHIESTA con il relativo messaggio int noyesall_box( const char* fmt, // @parm Messaggio da stampare nella finestra ...) // @parmvar Uno o piu' parametri corrispondenti ai codici in

{ buildmsg(); ASK_RESPONSE r = xvt_dm_post_ask("No", "Si", "Si Tutti", msg); return r == RESP_DEFAULT ? K_NO : (r == RESP_2 ? K_YES : K_SPACE); } // @doc EXTERNAL // @msg yesno_box | Crea una finestra di RICHIESTA con il relativo messaggio bool yesno_box( const char* fmt, // @parm Messaggio da stampare nella finestra ...) // @parmvar Uno o piu' parametri corrispondenti ai codici in

// @comm Se si opera in ambiente Windows crea la finestra con i bottni SI e NO // e l'icona col punto di domanda. // // @rdesc Ritorna il risultato della richiesta: // // @flag 1 | Se viene premuto il taso SI // @flag 0 | Se viene premuto il taso NO { buildmsg(); ASK_RESPONSE r = xvt_dm_post_ask("Si", "No", NULL, msg); return r == RESP_DEFAULT; } // @msg yesnoall_box | Crea una finestra di RICHIESTA con il relativo messaggio int yesnoall_box( const char* fmt, // @parm Messaggio da stampare nella finestra ...) // @parmvar Uno o piu' parametri corrispondenti ai codici in

{ buildmsg(); ASK_RESPONSE r = xvt_dm_post_ask("No", "Si", "No Tutti", msg); return r == RESP_DEFAULT ? K_NO : (r == RESP_2 ? K_YES : K_SPACE); } // @doc EXTERNAL // @msg yesnofatal_box | Crea una finestra di RICHIESTA con il relativo // messaggio, ma permette di terminare il programma bool yesnofatal_box( const char* fmt, // @parm Messaggio da stampare nella finestra ...) // @parmvar Uno o piu' parametri corrispondenti ai codici in

// @comm Se si opera in ambiente Windows crea la finestra con i bottoni SI e NO // e l'icona col punto di domanda. // A differenza della permette di terminare il programma // se viene premuto il tasto SI // // @rdesc Ritorna il risultato della richiesta: // // @flag 1 | Se viene premuto il tasto SI // @flag 0 | Se viene premuto il tasto NO // // @xref { buildmsg(); #ifdef DBG char user[32]; xvt_sys_get_user_name(user, 32); char s[256]; sprintf(s, "Ma lo sai %s cos'e' successo?\n%s\nVuoi perseverare?", user, msg); const bool ret = yesno_box(s); if (!ret) #endif fatal_box(msg); return false; } // @doc EXTERNAL // @msg yesnocancel_box | Crea una finestra di RICHIESTA con il relativo messaggio int yesnocancel_box( const char* fmt, // @parm Messaggio da stampare nella finestra ...) // @parmvar Uno o piu' parametri corrispondenti ai codici in

// @comm Se si opera in ambiente Windows crea la finestra con i bottoni SI e NO // e l'icona col punto di domanda. // // @rdesc Ritorna il risultato della richiesta: // // @flag K_YES | Se viene premuto il tasto SI // @flag K_NO | Se viene premuto il tasto NO // @flag K_ESC | Se viene premuto il tosto ESC // // @xref { buildmsg(); ASK_RESPONSE r = xvt_dm_post_ask("Si", "No", "Annulla", msg); return r == RESP_DEFAULT ? K_YES : (r == RESP_2 ? K_NO : K_ESC); } bool cantread_box(const char* filename) { return error_box(FR("Impossibile leggere '%s'"), filename); } bool cantwrite_box(const char* filename) { return error_box(FR("Impossibile scrivere '%s'"), filename); } // @doc EXTERNAL // @msg __trace | Permette di mandare dei messaggi nel file trace.log bool __trace( const char* fmt, // @parm Messaggio da stampare ...) // @parmvar Uno o piu' parametri corrispondenti ai codici in

// @comm Usato in fase di debug, permette di vedere se il programma ha // fatto certe operazioni (deve essere definito il simbolo TRC in // fase di compilazione). // // @rdesc Ritorna non 0 se riesca ad aprire il file trace.log { static FILE* f = NULL; if (f == NULL) f = fopen("trace.log", "w"); if (f != NULL) { buildmsg(); fprintf(f, "%s\n", msg); fflush(f); } return f != NULL; } bool __tracemem(const char* msg) { unsigned long mem = xvt_sys_get_free_memory_kb(); return __trace("%5lu Kb - %s", mem, msg); }