Articolo pubblicato sul n. 84 di MCmicrocomputer (Edizioni Technimedia Srl - Roma) nell'aprile 1989

MCmicrocomputer


Software Amiga:
Replace

di Andrea de Prisco

Prima di commentare il listato, e' necessario definire con precisione cosa "combina" il programma Replace. Innanzitutto si tratta di un comando CLI che potremo aggiungere alla nostra directory "c:" per rendererlo disponibile come vero e proprio comando di sistema. E' stato compilato col Lattice C 4.0 direttamente col comando LC seguito dall'opzione -L che, come noto, provvede anche alla chiamata del Linker. Piu' semplice di cosi'...Copertina del numero di MCmicrocomputer contenente l'articolo

Come i piu' attenti avranno capito, Replace permette la ricerca e sostituzione di stringhe all'interno di un file, creandone uno nuovo con le modifiche attuate. La sintassi e' molto semplice:

 

Replace SourceFile DestFile str1 str2

 

Dove SourceFile e' il file da modificare (quindi gia' esistente) DestFile e' un nome per il file modificato (va bene anche lo stesso nome, ma, attenzione, cosi' perdiamo l'originale!!!) mentre str1 e str2 sono la stringa da ricercare e la stringa da sostituire per ogni occorrenza della prima. Ovviamente le due stringhe possono avere anche lunghezze diverse nonche' contenere anche codici esadecimali per individuare caratteri piu' ostici. E' anche possibile inserire una stringa vuota in modo da eliminare stringhe dal testo senza sostituirle con alcunche'. Il carattere di controllo per queste selezioni "strane" e' il simbolo del dollaro '$'. Un dollaro seguito da una coppia numerica esadecimale individua il carattere dal codice indicato. Se invece intendiamo cercare o sostituire proprio il carattere dollaro bastera' usare la coppia $$. Facciamo qualche esempio: sul nostro disco abbiamo il file denominato "testo". Decidiamo, ad esempio, di sostituire tutte le occorrenze della parola "pero'" con occorrenze di "ma". Il nuovo file, come al solito, lo chiameremo "pippo". Scriveremo:

 

Replace testo pippo pero' ma

 

Come vi avevo detto il tutto e' molto intuitivo. Proviamo ora a sostituire tutti i Carriage Return ($0D) con piu' amighevoli New Line ($0A):

 

Replace testo pippo $0D $0A

 

oppure a togliere tutte le occorrenze della parola "buongiorno":

 

Replace testo pippo buongiorno $

 

Ovviamente qualsiasi codice esadecimale puo' trovarsi anche in mezzo a caratteri piu' "unami", ad esempio possiamo fare la sostituzione:

 

Replace testo pippo ciao$20cara bye$20bye

 

dove, come e' noto, $20 rappresenta il codice ascii di uno spazio. Attenzione ad usare sempre maiuscole per le cifre alfabetiche dei caratteri esadecimali: nessun controllo e' eseguito per questi input

 

Descrizione del programma

 

Le prime linee del programma C listato in queste pagine, sono classici include che ci permettono di utilizzare tipi e definizioni all'interno del programma. La prima serie di dichiarazioni sono poste fuori dal corpo del programma essendo globali tanto al main quanto alle due subruotine utilizzate. Dopo il controllo e la traduzione dell'input il file sorgente viene caricato in una zona di memoria allocata col comando AllocMem e analizzato e scaricato nel file destinazione man mano che avvengono le sostituzioni. Con "traduzione" degli input si intende la trasformazione di eventuali codici preceduti dal simbolo '$' negli effettivi valori ascii.
Per allocare una quantita' di memoria sufficiente a contenere l'intero file sorgente, la cosa piu' semplice da fare e' vedere quanto e' lungo il file in questione ed allocare una pari quantita' di memoria. Per fare questo utilizziamo la struttura FileInfoBlock relativa al file, dapprima utilizzando la funzione Lock (per... acchiapparla) e poi la funzione Examine per saperne di piu.
Segue l'apertura del file sorgente e l'allocazione della giusta quantita' di memoria. Con le linee successive (ma state seguendo sul listato ?) non facciamo altro che trasferire quanto ottenuto dal file nella memoria all'uopo allocata. Il rimanente listato, che non commenteremo ulteriormente, non fa altro che effettuare le sostituzioni avvalendosi della subroutine Search (definita di seguito) la quale accetta quattro parametri in ingresso e restituisce un valore numerico. I parametri sono: array nel quale cercare, stringa da cercare, posizione iniziale e posizione finale in cui effettuare la ricerca. Il valore ritornato e' naturalmente la posizione in cui la stringa e' stata trovata oppure la posizione finale piu' uno se non viene trovata la stringa nel range indicato.
L'ultima funzione Abort, serve per uscire dal programma in caso di fallimento e chiudere le cose lasciate aperte o occupate. Nella fattispecie memoria allocata e file d'ingresso. I parametri passati a questa funzione sono due, messaggio d'errore che sara' stampato su video e codice d'errore che sara' restituito dal programma e serve per sapere cosa e' rimasto "aperto". Credo di aver detto tutto: alla prossima...

 


Articolo pubblicato su www.digiTANTO.it - per ulteriori informazioni clicca qui