#include "utilita.h"
/*==============================================================================
"Recupera" il puntatore alla struttura contenente i dati globali del programma,
memorizzato nel campo GWL_USERDATA della finestra principale.
==============================================================================*/
GLOBALE *RicavaDatiGlobali( HWND hwnd ) {
return ((GLOBALE*)GetWindowLong(hwnd,GWL_USERDATA));
}
/*==============================================================================
"tipoFile" identifica il tipo di file che sara' riconosciuto dalla finestra di
navigazione e che sarà usato come estensione di default, se del caso. Se e' NULL
saranno accettati file di ogni tipo e non sara' attribuita alcuna estensione di
default.
"nomeFileDef" identifica il nome del file usato come default nella finestra del
tipo "Salva". Se "nomeFileDef" e' un puntatore valido, la finestra usata sara'
una finestra del tipo "Salva"; se e' NULL, la finestra usata sarà una finestra
del tipo "Apri".
==============================================================================*/
const char *IdentificaFile( HWND hwnd, const char *tipoFile,
const char *nomeFileDef ) {
OPENFILENAME ofn;
char filtro[32];
char *p = filtro;
char *nomeFile;
DWORD esito;
ZeroMemory(&ofn, sizeof(ofn));
if( tipoFile != NULL ) {
p += wsprintf( p, "Tipo file: %s", tipoFile ) + 1;
p += wsprintf( p, "*.%s", tipoFile ) + 1;
*p = '\0';
}
else {
p += wsprintf( p, "Tutti i file (*.*)" ) + 1;
p += wsprintf( p, "*.*" ) + 1;
*p = '\0';
}
try {
nomeFile = new char[4*MAX_PATH];
*nomeFile = '\0';
} catch( ... ) {
return NULL;
}
if( nomeFileDef != NULL )
lstrcpy( nomeFile, nomeFileDef );
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hwnd;
ofn.lpstrFilter = filtro;
ofn.lpstrFile = nomeFile;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
ofn.lpstrDefExt = tipoFile;
if( nomeFileDef != NULL )
esito = GetSaveFileName( &ofn );
else esito = GetOpenFileName( &ofn );
if ( esito == FALSE ) {
if( CommDlgExtendedError() != 0 )
Errore( kErrSceltaFileNonValida, hwnd );
delete[] nomeFile;
return NULL;
}
return nomeFile;
}
char *CaricaFileDiTesto( const char *percFile ) {
FILE *f = fopen( percFile, "r" );
int i=0, c=0;
if( f == NULL ) return NULL;
while( fgetc(f) != EOF ) ++i;
rewind( f ); // torna all'inizio
try {
char *dati = new char[i+1];
for( c=fgetc(f), i=0; c!=EOF; c=fgetc(f), ++i )
dati[i] = c;
dati[i] = '\0';
fclose( f );
return dati;
} catch( ... ) {
fclose( f );
return NULL;
}
}
/*==============================================================================
NOTA BENE: il puntatore restituito da questa funzione si riferisce a uno spazio
di memoria allocato dinamicamente tramite l'operatore "new". Lo spazio allocato
deve quindi essere liberato per mezzo dell'operatore "delete[]".
==============================================================================*/
const char *RicavaPrimoFileTrascinato( LPSTR lpszArgs ) {
char *esito, *e, *inizio, *fine;
if( *lpszArgs == '\0' ) {
try {
esito = new char[1];
*esito = '\0';
} catch( ... ) {
return NULL;
}
}
else {
if( *lpszArgs == '\"' ) {
// trova l'inizio e la fine del virgolettato
for( inizio = lpszArgs; *inizio == '\"'; ++inizio );
for( fine = inizio; *fine != '\"'; ++fine );
}
else {
for( inizio=fine=lpszArgs; *fine!=' ' && *fine!='\0'; ++fine );
}
try {
esito = new char[(fine-inizio)+1];
} catch( ... ) {
return NULL;
}
// copia il primo parametro della command line
for( e = esito; fine > inizio; *e++ = *inizio++ );
*e = '\0';
}
return esito;
}
/*==============================================================================
Compone una stringa informativa sul programma in un buffer statico e ne
restituisce il puntatore.
==============================================================================*/
const char *ComponiStrInfo( void ) {
static char info[64] = "";
char *p = info;
p += wsprintf( p, "%s\n", kStrNomeProgramma );
p += wsprintf( p, "v %d", kVersioneProgramma );
p += wsprintf( p, ".%d", kSottoversioneProgramma );
if( kRevisioneProgramma != 0 )
p += wsprintf( p, ".%d", kRevisioneProgramma );
p += wsprintf( p, " %s", kStrCopyright );
return info;
}
/*==============================================================================
Copia la stringa passata tramite il parametro "s" in uno spazio di memoria
dinamico appositamente allocato tramite "new". Se il parametro "tipo" ha valore
1, la copia della stringa viene convertita in maiuscolo; se il parametro "tipo"
ha valore -1, la copia della stringa viene convertita in minuscolo; se il
parametro "tipo" ha valore 0, la copia della stringa e' identica all'originale.
Il chiamante DEVE liberare tramite "delete[]" la memoria dinamica allocata.
Se la copia non e' possibile, la funzione restituisce NULL.
==============================================================================*/
char *DuplicaStringa( const char *s, int tipo ) {
if( s == NULL ) return NULL;
try {
unsigned long l = lstrlen( s );
char *dup = new char[l+1];
memcpy( dup, s, l+1 );
switch( tipo ) {
case -1: CharLowerBuff( dup, l ); break;
case 1: CharUpperBuff( dup, l ); break;
default: break;
}
return dup;
} catch( ... ) {
return NULL;
}
}