PDA

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

fek
04-07-2005, 15:10
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