La mancanza della coppia CR/LF nei
file di testo UNIX causa anche un altro inconveniente, questa volta più grave: poiché anche la Shell DOS si basa sulla presenza di tale coppia di caratteri per distinguere le varie righe dei file batch, eseguendo questi ultimi per compilare il pacchetto SPICE giustamente l'interprete dei comandi entra in crisi.
Occorre quindi convertire tutti i file dell'archivio contente i sorgenti di SPICE, sostituendo al carattere LF presente in ogni fine riga, la coppia CR/LF, cosa che può sembrare banale, ma che in realtà implica la modifica di centinaia di file (praticamente tutti). Tuttavia, il compilatore Microsoft C 6.0 interpreta correttamente anche i file sorgenti che utilizzano la convenzione UNIX, quindi occorre solamente sistemare i file batch (qualche decina) per le varie fasi di compilazione.
A questo punto le soluzioni possono essere diverse: ad esempio, si potrebbero caricare i file da modificare in un qualsiasi text editor, e salvarli come file di testo: se l'editor carica correttamente i file, generalmente nel salvataggio provvede ad aggiungere le coppie CR/LF mancanti. Alcuni editor prevedono espressamente tale situazione, come quelli utilizzati dai programmatori: Emacs,
Multi-Edit, QEdit e tanti altri. Resta il fatto che caricare e risalvare decine di file BAT non è propriamente un lavoro veloce.
Detto
en passant, tale problema risulta un utile esercizio per coloro che iniziano a programmare in C; si può infatti realizzare un piccolo programa, veramente minuscolo, che legge in input un file di testo, e aggiunge a fine riga il carattere CR (0x0A) mancante. Ne ho realizzato uno circa venticinque anni fa, chiamandolo
addcr, insieme a un altro programma che effettuava l'operazione inversa, ovvero eliminava il carattere CR da ogni riga, per convertire file DOS in UNIX (
stripcr). Ritornando al problema iniziale, esso è risolvibile copiando i file da convertire su un PC con Linux, ed eseguendo questo semplice comando shell per ognuno di essi:
sed sta per
stream editor, ed è una utility UNIX per effettuare il parsing di file di testo e applicarvi modifiche se necessario. La stringa di comando per
sed 's/$/^M/' sostituisce (
s) ogni occorrenza del carattere
$ (è un
metacarattere che indica
end-of-line, EOL) con il carattere
^M (che rappresenta il CR).
In UNIX il terminatore di fine riga è il carattere LF; leggiamo il file, a fine riga gli sostituiamo il carattere CR in sua vece, e UNIX di suo ci riaggiunge il carattere LF per terminare la riga. Risultato: il file avrà ogni riga terminata da una coppia CR/LF. Nulla di tutto ciò esiste sotto Windows (o DOS), e ciò la dice lunga sulle differenze tra i due mondi.