Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 25-10-2006, 17:43   #1
c&c
Senior Member
 
L'Avatar di c&c
 
Iscritto dal: Apr 2005
Città: Brianza (MB)
Messaggi: 2958
[C] Richiesta programma - Gestione File

Ciao a tutti mi servirebbe un programmino in C che apre un file *.txt e quando trova il carattere "\n" lo sostituisce con "" (nulla), in modo che non ci siano gli a capo. piccolo accorgimento se "\n" è preceduto da "-" cancellerà anche "-", il risultato in un nuovo file *.txt.

Ex:
------------ prova.txt -------
Ciao come va? Spero
tutto bene. Ti va di uscire
con me in set-
timana a bere qualcosa
di fres-
co.

----------- ris.txt ---------
Ciao come va? Spero tutto bene. Ti va di uscire con me in settimana a bere qualcosa di fresco.
__________________
Trattative forum: +50 # Feedback E-Bay: 206 100% Positivi
iPhone 5S 16Gb # Macbook Pro late 2013, 2.3GHz i7, 16Gb DDR3, 500Gb, OSX 10.9.5
c&c è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2006, 19:42   #2
TuLKaS85
Senior Member
 
L'Avatar di TuLKaS85
 
Iscritto dal: Nov 2004
Città: Napoli
Messaggi: 999
carica il file in un array di caratteri a , quindi

Codice:
i=0;
while (a[i]!='\n'&&a[i]!='-'&&a[i]!=EOF)
{
if(a[i]=='\n'||a[i]=='-')
    a[i]='';
i++;
}
__________________
Intel Pentium IV 3,0 GHz, Asus P5SD2-X , 1.0 Gb ddr2, Radeon X550 , Maxtor 160Gb sata, Hitachi 100 gb pata,Piooner Dvr-109 ,Microsoft Windows XP Professional Service Pack 2
TuLKaS85 è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2006, 20:48   #3
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da c&c
----------- ris.txt ---------
Ciao come va? Spero tutto bene. Ti va di uscire con me in settimana a bere qualcosa di fresco.
veramente in questo esempio non hai rimosso i newlines, li hai sostituiti con uno spazio (tranne ovviamente dove c'era il "-"). ed inoltre dimentichi che solo su Linux i newlines sono semplici "\n": su Mac sono "\r", mentre su Windows sono coppie "\r\n".
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2006, 20:52   #4
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da TuLKaS85
carica il file in un array di caratteri a , quindi

Codice:
i=0;
while (a[i]!='\n'&&a[i]!='-'&&a[i]!=EOF)
{
if(a[i]=='\n'||a[i]=='-')
    a[i]='';
i++;
}
non funziona correttamente: appena trova un newline o un trattino lo sostituisce (non si sa con cosa visto che '' non è un carattere valido) ed esce senza sostituire tutti i successivi. ed inoltre non è così che c&c intendeva gestire i trattini.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2006, 21:07   #5
TuLKaS85
Senior Member
 
L'Avatar di TuLKaS85
 
Iscritto dal: Nov 2004
Città: Napoli
Messaggi: 999
giustamente
così xò dovrebbe andare
Codice:
i=0;
while (a[i]!=EOF)
{
if(a[i]=='\n')//mette spazio al posto d'invio probabile ke escono 2 spazi quando c'è l'invio
    a[i]=' ';
if(a[i]=='-')
{
// slitta l'array unendo le parole accapo
  j=i;
 while (a[i]!=EOF)
   {
       a[j]=a[j+1];
       j++;
   }
    
    
}
i++;
}
questo dovrebbe andare se invio viene memorizzato come \n
__________________
Intel Pentium IV 3,0 GHz, Asus P5SD2-X , 1.0 Gb ddr2, Radeon X550 , Maxtor 160Gb sata, Hitachi 100 gb pata,Piooner Dvr-109 ,Microsoft Windows XP Professional Service Pack 2
TuLKaS85 è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2006, 23:15   #6
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
no, non va neanche quello perché EOF non è un char, occupa 2 bytes; ed inoltre la fread non te lo mette nell'array, devi mettercelo manualmente.

EDIT: anche se EOF fosse un byte singolo non andrebbe lo stesso perché l'algoritmo per slittare l'array è bacato (off-by-one, non slitta l'EOF), ed inoltre non elimini il newline dopo il trattino.

Ultima modifica di 71104 : 25-10-2006 alle 23:18.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2006, 09:08   #7
TuLKaS85
Senior Member
 
L'Avatar di TuLKaS85
 
Iscritto dal: Nov 2004
Città: Napoli
Messaggi: 999
Quote:
Originariamente inviato da 71104
no, non va neanche quello perché EOF non è un char, occupa 2 bytes; ed inoltre la fread non te lo mette nell'array, devi mettercelo manualmente.

EDIT: anche se EOF fosse un byte singolo non andrebbe lo stesso perché l'algoritmo per slittare l'array è bacato (off-by-one, non slitta l'EOF), ed inoltre non elimini il newline dopo il trattino.
beh il newline lo elimina mettendoci spazio al prossimo ciclo, quando fa il primo if, per quanto riguarda l'eof mi ricordo che lo usavo anche con le strighe poi non saperei.... cmq è facile modificare l'idea....
Codice:
i=0;
while (a[i]!=EOF)
{
if(a[i]=='\n')//mette spazio al posto d'invio probabile ke escono 2 spazi quando c'è l'invio
    a[i]=' ';
if(a[i]=='-')
{
// slitta l'array unendo le parole accapo
  j=i;
 while (a[j]!=EOF)
   {
       a[j]=a[j+1];
       j++;
   }
a[j-1]=a[j];  //copia l'eof
    
    
}
i++;
}
vediamo un pò
__________________
Intel Pentium IV 3,0 GHz, Asus P5SD2-X , 1.0 Gb ddr2, Radeon X550 , Maxtor 160Gb sata, Hitachi 100 gb pata,Piooner Dvr-109 ,Microsoft Windows XP Professional Service Pack 2
TuLKaS85 è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2006, 09:15   #8
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
@c&c: certo che du' righe potevi almeno provare a tirarle giú

Codice:
#include <stdio.h>

int main(void)
{
   FILE *pIn  = fopen( "input.txt" , "r" ),
        *pOut = fopen( "output.txt", "w" );

   if (!pIn)
      puts("errore apertura file di input"), exit(1);

   if (!pOut)
      puts("errore apertura file di output"), exit(1);

   while (1) // SE FAI while(!feof(pIn)) DEVI RICONTROLLARE DOPO LA LETTURA
   {
      int c = fgetc(pIn); // LEGGO

      if ( feof(pIn) )
         break;

      if (c == '\n' || c == '\r' || c == '-' ) // SALTO IL CARATTERE
         continue;

      fputc( c, pOut ); // SCRIVO
   }
   fputc( '\n', pOut );
   
   fclose(pIn);
   fclose(pOut);
   
   return 0;
}
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2006, 11:16   #9
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16212
Quote:
Originariamente inviato da c&c
Ciao a tutti mi servirebbe un programmino in C che apre un file *.txt e quando trova il carattere "\n" lo sostituisce con "" (nulla), in modo che non ci siano gli a capo. piccolo accorgimento se "\n" è preceduto da "-" cancellerà anche "-", il risultato in un nuovo file *.txt.
Fare tu i tuoi compiti proprio no, eh?
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2006, 12:03   #10
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
Non mi sembra didattico postare subito il codice giusto, forse è meglio che lo fate prima ragionare (è evidentemente un esercizio di programmazione che deve fare come compito...)
__________________

- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale.
- A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson
-fidel- è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2006, 15:30   #11
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da TuLKaS85
beh il newline lo elimina mettendoci spazio al prossimo ciclo,
no: al prossimo ciclo lo sostituisci con uno spazio, mentre in quel caso lo devi proprio eliminare.

Quote:
per quanto riguarda l'eof mi ricordo che lo usavo anche con le strighe poi non saperei....
chiunque te lo può confermare

Quote:
cmq è facile modificare l'idea....
Codice:
[cut]
vediamo un pò
rimane il fatto che EOF occupa 2 bytes, non 1. ed inoltre non elimini il newline dopo il trattino.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2006, 15:40   #12
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
@trallallero: il tuo codice ha un paio di problemi:
1) non scrive lo spazio se incontra un newline non preceduto dal trattino
2) mettere fgetc prima di feof secondo me è sbagliato perché se siamo in condizione di EOF fgetc stessa ritorna EOF; ovvero, se feof ti ritorna non-zero vuol dire che sicuramente fgetc ritornerà EOF (almeno così ho capito da www.linuxmanpages.com)

ed infine questa parte di codice:
Codice:
FILE *pIn  = fopen( "input.txt" , "r" ),
        *pOut = fopen( "output.txt", "w" );

   if (!pIn)
      puts("errore apertura file di input"), exit(1);

   if (!pOut)
      puts("errore apertura file di output"), exit(1);
nel caso specifico non da' problemi, ma in generale può causare leak. il discorso che in questo caso non badi ai leak perché tanto il programma termina subito non vale, perché in tal caso il codice manca di metodologia coerente (perché alla fine fai fclose...?)
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2006, 16:05   #13
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da -fidel-
Non mi sembra didattico postare subito il codice giusto, forse è meglio che lo fate prima ragionare (è evidentemente un esercizio di programmazione che deve fare come compito...)
me culpa
che poi sono il primo a criticare chi chiede tutto e subito.
Ma stamattina non avevo 'na ceppa da fare e tra il parlar male di Prodi in politica e fare un mini C ho optato per la seconda
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2006, 16:06   #14
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
Quote:
Originariamente inviato da 71104
nel caso specifico non da' problemi, ma in generale può causare leak. il discorso che in questo caso non badi ai leak perché tanto il programma termina subito non vale, perché in tal caso il codice manca di metodologia coerente (perché alla fine fai fclose...?)
Normalmente, se non per abitudine nello scrivere buon codice, è inutile chiudere i vari riferimenti, handle, file descriptors ecc. prima di terminare (anche se, effettivamente, nel codice che hai quitato lo si fa a metà: o tutto o niente, condivido ). Certo, è buona norma ricordarsene perché poi c'é il rischio di non chiuderli mai (anche quando il programma non deve terminare) andando incontro facilmente a memory leaks (e situazioni simili, come dangling pointers).
Sono in cerca di situazioni che causano memory leaks anche dopo la terminazione di un programma (insomma, funzioni che si riservano memoria nel loro spazio dei processi (ma non solo), e che non viene liberata (se non esplicitamente) anche dopo aver terminato.
Forse la shared memory?
__________________

- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale.
- A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson

Ultima modifica di -fidel- : 26-10-2006 alle 16:12.
-fidel- è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2006, 16:29   #15
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da 71104
@trallallero: il tuo codice ha un paio di problemi:
1) non scrive lo spazio se incontra un newline non preceduto dal trattino
vero. L'ho anche testato ma non mi sono accorto

Quote:
Originariamente inviato da 71104
2) mettere fgetc prima di feof secondo me è sbagliato perché se siamo in condizione di EOF fgetc stessa ritorna EOF; ovvero, se feof ti ritorna non-zero vuol dire che sicuramente fgetc ritornerà EOF (almeno così ho capito da www.linuxmanpages.com)
dici ? quindi forse é meglio:
Codice:
      int c = fgetc(pIn); 

      if ( c == EOF || feof(pIn) )
         break;
Quote:
Originariamente inviato da 71104
ed infine questa parte di codice:
Codice:
FILE *pIn  = fopen( "input.txt" , "r" ),
        *pOut = fopen( "output.txt", "w" );

   if (!pIn)
      puts("errore apertura file di input"), exit(1);

   if (!pOut)
      puts("errore apertura file di output"), exit(1);
nel caso specifico non da' problemi, ma in generale può causare leak. il discorso che in questo caso non badi ai leak perché tanto il programma termina subito non vale, perché in tal caso il codice manca di metodologia coerente
eh la madonna su un programma che aggiusta 3 righe di testo mi vieni a parlare di metodologia coerente ?
Cosa intendi per leak ? il fatto che non chiudo il primo file se fallisce il secondo ? si é una svista


Quote:
Originariamente inviato da 71104
(perché alla fine fai fclose...?)
sono abituato a chiudere la porta quando esco
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2006, 16:41   #16
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da trallallero
dici ? quindi forse é meglio:
Codice:
      int c = fgetc(pIn); 

      if ( c == EOF || feof(pIn) )
         break;
no, io dicevo proprio di mettere feof come condizione nel while...

perché non ce l'hai messa? che male ti faceva?

Quote:
[...] si é una svista


Quote:
sono abituato a chiudere la porta quando esco
e se hai due porte ne chiudi solo una?
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2006, 17:09   #17
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da 71104
no, io dicevo proprio di mettere feof come condizione nel while...
perché non ce l'hai messa? che male ti faceva?
perché se lo metti nella condizione poi lo devi ricontrollare quando leggi.
L'ho messo nel commento

Quote:
Originariamente inviato da 71104
e se hai due porte ne chiudi solo una?
guarda oggi sto vicino ad una crisi di nervi ( voglio il divorzio )
giá tanto che sia riuscito ad aprire e leggere un file
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z Mb - Win Eight SP (1 > yours) 16 Valve
trallallero è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2006, 19:01   #18
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da -fidel-
Sono in cerca di situazioni che causano memory leaks anche dopo la terminazione di un programma (insomma, funzioni che si riservano memoria nel loro spazio dei processi (ma non solo), e che non viene liberata (se non esplicitamente) anche dopo aver terminato.
Forse la shared memory?
hmm, no... secondo me in Win32 di simile trovi sostanzialmente solo gli handle User e GDI (finestre e oggetti grafici).
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2006, 19:05   #19
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da trallallero
perché se lo metti nella condizione poi lo devi ricontrollare quando leggi.
L'ho messo nel commento
ma perché...? scusa eh...
- se non siamo a EOF, prima feof restituisce 0 e poi fgetc resituisce un carattere
- se siamo a EOF, feof restituisce non-zero facendoti uscire dal ciclo perché se entrassi fgetc restituirebbe EOF

perché mai devi ricontrollare dopo la fgetc...?

Quote:
guarda oggi sto vicino ad una crisi di nervi ( voglio il divorzio )
ok, allora consiglio da amico: sbattitene ampiamente del C (che non può che peggiorare la tua situazione nervosa) e rappacificati con la muliere

dai su, che quando avete fatto pace vi amate ancora più di prima ("l'amore non è bello se non è litigarello", ti giuro che è vero )
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2006, 20:42   #20
Qu@ker
Member
 
Iscritto dal: Apr 2004
Messaggi: 130
<e a questo punto il Docente, bonariamente, giocherella con il libretto e chiede>
Quando è, secondo Lei, che viene settato l'indicatore di eof, in C (e non, poniamo, in Pascal)?
Qu@ker è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
Crisi delle memorie: ASUS torna al passa...
Le console next-generation potrebbero es...
Gemini cresce ancora: la quota di mercat...
Samsung sfida TSMC: la capacità produtti...
Iliad alza il prezzo della fibra ottica ...
Il prossimo low cost di POCO sarà il più...
The Elder Scrolls VI: ecco le ultime sul...
Ecco i saldi di fine anno Amazon, 34 off...
iPhone Fold: scorte limitate al lancio m...
OpenAI porterà la pubblicità in ChatGPT ...
TSMC aumenterà ancora i prezzi: nel 2026...
Marvel pubblica anche il secondo teaser ...
Nuovo accordo tra xAI e il Pentagono: l'...
La famiglia Xiaomi 17 sta per registrare...
Nuove auto elettriche che vedremo sul me...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 16:24.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v