Qualche anno fa mi sono convertito con successo un patrimonio di 300.000 LOC 23-year-old base di codice per camelCase. Ci sono voluti solo due giorni. Ma c'erano alcuni effetti persistenti che impiegarono un paio di mesi per sistemare. Ed è un molto buon modo per infastidire i vostri compagni di programmatori.
credo che un semplice muto, approccio, sed-come ha vantaggi.IDE basato su strumenti e simili, non può, per quanto ne so:
- codice cambiamento non compilato via
- codice di cambiamento # di ifdef nei commenti
E il codice legacy avuto da mantenere su diverse piattaforme compilatore/OS (= molti #ifdefs).
Lo svantaggio principale di un approccio stupido e seducente è che le stringhe (come le parole chiave) possono essere inavvertitamente modificate. E l'ho fatto solo per C; Il C++ potrebbe essere un altro bollitore di pesce.
ci sono circa cinque fasi:
1) Generate a list of tokens that you wish to change, and manually edit.
2) For each token in that list, determine the new token.
3) Apply these changes to your code base.
4) Compile.
5) Double-check via a manual diff, and do a final clean-up.
Per la fase 1, per generare un elenco di token che si desidera modificare, il comando:
cat *.[ch] | sed 's/\([_A-Za-z0-9][_A-Za-z0-9]*\)/\nzzz \1\n/g' | grep -w zzz | sed 's/^zzz //' | grep '_[a-z]' | sort -u > list1
produrrà in lista1:
st_atime
time_t
...
In questo esempio, davvero non si desidera modificare questi due token, quindi modificare manualmente l'elenco per eliminarli . Ma probabilmente ti mancherai un po ', quindi per questo esempio, supponiamo che tu mantenga questi.
Il passaggio successivo, 2, consiste nel generare uno script per eseguire le modifiche. Ad esempio, il comando:
cat list1 | sed 's/\(.*\)/glob_sub "\\<\1\\>" xxxx_\1/;s/\(xxxx_.*\)_a/\1A/g;s/\(xxxx_.*\)_b/\1B/g;s/\(xxxx_.*\)_a/\1C/g;s/\(xxxx_.*\)_t/\1T/g' | sed 's/zzz //' > list2
cambierà _a, _B, _C, e _t ad A, B, C e T, per la produzione di:
glob_sub "\<st_atime\>" xxxx_stAtime
glob_sub "\<time_t\>" xxxx_timeT
Devi solo estenderlo a copertina d, e, f, ..., x, y, z,
Suppongo che tu abbia già scritto qualcosa come "glob_sub" per il tuo ambiente di sviluppo. (In caso contrario, mollare ora.) La mia versione (csh, Cygwin) assomiglia:
#!/bin/csh
foreach file (`grep -l "$1" */*.[ch] *.[ch]`)
/bin/mv -f $file $file.bak
/bin/sed "s/$1/$2/g" $file.bak > $file
end
(Alcuni dei miei sed di non supportano l'opzione --in-posto, quindi devo usare un mv .)
Il terzo passaggio consiste nell'applicare questo script in list2 al codice base. Ad esempio, in csh utilizzare source list2
.
Il quarto passaggio è la compilazione. Il compilatore (si spera!) Obietterà su xxxx_timeT
. In effetti, probabilmente dovrebbe obiettare al solo timeT
ma il supplemento xxx_
aggiunge assicurazione. Quindi per tempo hai commesso un errore. Annullalo con, ad es.
glob_sub "\<xxxx_timeT\>" time_t
Il quinto e ultimo passo è quello di fare un controllo manuale delle modifiche utilizzando l'utility diff preferito, e poi pulizia eliminando tutti i indesiderati xxx_
prefissi. Grepping for "xxx_
aiuterà anche a verificare i token nelle stringhe. (Infatti, aggiungere un suffisso _xxx è probabilmente una buona idea.)
ci sono dei caratteri di sottolineatura nel codice oltre a quelli nei nomi delle variabili? – drfrogsplat
umm sì in costanti, ad es.SOME_CONSTANT, questi non dovrebbero essere soggetti ad alcuna modifica. – radman