2011-07-25 18 views
9

C'è un modo per ctags per gestire prototipi di funzione multilinea in C?prototipi funzione Ctag multi-linea

Ho cercato in giro e la --fields=+S è supposto per fare prototipi più righe, ma non riesco a farlo funzionare:

ctags -x --c-kinds=pf --fields=+S file 

di file:

int 
foo(int 
    x, int y 
    ); 

ctags restituisce solo:

foo(int 

(nota che manca anche il tipo di ritorno)

In ultima analisi vorrei ottenere un output simile a

int foo(int x, int y); 

o

int foo(int x, int y 

non è --fields=+S il modo corretto? Ci sono parte dei campi di ctag che mi mancano? Eventuali puntatori in generale?

Se non c'è un modo per farlo in ctags, qualsiasi programma consigliato? (Attualmente sto cercando di non accusare)

risposta

0

non sono riuscito a trovare nulla con ctags così ho scritto uno script python per ri-organizzare il mio file in modo che ctags potessero catturare i prototipi.

Nota: il mio codice conteneva commenti e molto di questo si occupa della loro rimozione (altrimenti si metterebbe in mezzo ai ctags).

Manipolazioni sono stati fatti in questo ordine:

# concat to one line 
file_str = '' 
for line in read_from.readlines(): 
    file_str += line 

# remove all /* */ comments 
file_str = re.sub('/\*(.|[\r\n])*?\*/', '', file_str) 

# remove '//' comments 
file_str = re.sub('//.*', '', file_str) 

# split on '\n' 
file_as_list = file_str.splitlines(True) 

# strip everything 
for index in range(len(file_as_list)): 
    file_as_list[index] = file_as_list[index].strip() 

# add in newlines where appropriate 
for line in file_as_list: 
    # if the line ends in ';' or '}' 
    if line.endswith(';') or line.endswith('}'): 
     # append a newline to the stripped line 
     write_to.write(line.strip() + '\n') 
    else: 
     # append a space to the stripped line 
     write_to.write(line.strip() + ' ') 
-1

È possibile rimuovere interruzioni di riga non necessarie con un filtro semplice, ad es.

tr '\n' ' ' | sed 's/\([{};]\)/\1\n/g' 
1

Ho avuto lo stesso problema con il mio codice, ma non ho potuto modificarlo. Quando uso il parametro --fields = + S, sembra funzionare perché ottengo una riga aggiuntiva nel file di tag. La firma: la parte contiene tutti i parametri della funzione.

CopyToTX26 D: \ bisel \ My Dropbox \ Work \ 0_BSW \ PKG_CMD \ memory.c/^ vuoto CopyToTX26 (uint16 memory_ID, Uint32 ** pt_data_address, Uint32 nb_recover, $ /;" firma f :(uint16 memory_ID, uint32 ** pt_data_address, Uint32 nb_recover, Uint32 * nb_copied, max_length uint32)

0
opzione

--_ xformat possono aiutare.

[[email protected] ~]$ cat /tmp/foo.h 
int 
foo(int 
    x, int y 
    ); 
[[email protected] ~]$ ~/var/ctags/ctags -x --c-kinds=pf --_xformat="%-16N %4n %-16F %C %S" /tmp/foo.h 
foo     2 /tmp/foo.h  foo(int (int x,int y)