View Full Version : Refactoring in C++
Cecilia76
04-07-2005, 12:23
Ciao a tutti, ecco il problema.
Ho scritto nell'ultimo anno una libreria che si chiama Proton per la generazione di audio digitale. Si tratta di una 40ina di files in C++ in cui le implementazioni sono nei file .h (ovvero c'è un solo file .cpp).
Tutte le variabili membro iniziano con il prefisso _ (underline) ; ora vorrei convertire quel prefisso in m_ cioè;
_var ----> m_var
qualcuno mi può suggerire come fare con qualche script (python?).
Tenete presente che il carattere _ è presente anche per altre ricorrenze come ad esempio
#define NOMECLASSE_H
Grazie
Prova questo:
http://www.ideat-solutions.com/index.htm
Ziosilvio
04-07-2005, 15:10
Tutte le variabili membro iniziano con il prefisso _ (underline) ; ora vorrei convertire quel prefisso in m_ cioè;
_var ----> m_var
qualcuno mi può suggerire come fare con qualche script (python?).
Tenete presente che il carattere _ è presente anche per altre ricorrenze come ad esempio
#define NOMECLASSE_H
Uhm... per essere il primo carattere del nome di una variabile, l'underscore deve essere preceduto da qualsiasi carattere che non sia una lettera o un numero... e credo basti questo, perché da solo non è un token valido...
...quindi una cosa "ignorante" potrebbe essere questa: anzitutto usi una funzione che ti dice se un carattere è una lettera o un numero, oppure nessuna delle due, per esempio questa (ne esiste quasi sicuramente una di libreria, ma non mi ricordo come si chiama :( questa però funziona se, come immagino, la codifica del testo è ASCII):
def isalnum(x):
return x in [chr(i) for i in range(ord('0'),ord('9')+1)] \
or x in [chr(i) for i in range(ord('A'),ord('Z')+1)] \
or x in [chr(i) for i in range(ord('a'),ord('z')+1)]
dopodiché sostituisci ogni riga del file con una in cui le cose del tipo "_var" sono sostituite dalle cose del tipo "m_var", ma solo se stanno all'inizio di un nome, e non in mezzo:
for s in oldfile.xreadlines():
i=0
while i<len(s):
if s[i]=='_' and (i==0 or not isalnum(s[i-1])):
s = s[:i]+'m_'+s[i+1:]
i=i+2
else:
i=i+1
newfile.write(s)
e questo ovviamente lo fai per ciascun file.
Prova, e fammi sapere se funziona.
E mi raccomando: lavora su una copia dei file originali!
Cecilia76
05-07-2005, 09:52
ZioSilvio,
grazie per lo snip. Al momento non riesco ad usare Python, ma la routine mi sembra facilmente implementabile anche in C++.
Appena ho notizie ti faccio sapere.
Cec
Cecilia76
05-07-2005, 12:16
Salve,
ho trovato una soluzione abbastanza efficace, che posto se dovesse servire a qualcuno. In sostanza ho creato un filtro per la console in C++:
// refact.cpp
//
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
void replaceChars (string& modifyMe) {
size_t i = 0;
while (i < modifyMe.size ()) {
if (modifyMe[i] == '_' && (i == 0 || !isalnum (modifyMe[i - 1]))) {
modifyMe.insert (i, "m");
}
else i++;
}
}
int main (int argc, char* argv[]) {
string text;
while (true) {
if (cin.eof ())
break;
getline (cin, text);
replaceChars (text);
cout << text << endl;
}
return 0;
}
// EOF
Basta fare un cat del file in pipe con il filtro e salvarlo su un nuovo file.
A presto
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.