Hallo Forum, für dokumentarische Zwecke (arbeit) suche ich nach einer Möglichkeit, alle Funktionen einer C/C++ Datei (also die dort implementierten) automatisiert (Python) aufzulisten. Mit nm bekomme ich aus den Objektdateien fast alle Funktionen, aber static/inline Funktionen fehlen, logischer Weise. Diese sollen aber mit aufgelistet werden. Die Funktionen stehen im Map-File, aber das Map-File zu parsen ist nicht unerheblicher Aufwand. Habt ihr vielleicht eine Idee? Grüße
Μαtthias W. schrieb: > Doxygen Hätte ich auch als erstes versucht. XML Output und dann sollte das relativ leicht parsbar sein in Python. Ansonsten scheint es auch Header Parser zu geben: https://cppheaderparser.readthedocs.io/en/stable/api.html
:
Bearbeitet durch User
Kaj G. schrieb: > für dokumentarische Zwecke (arbeit) suche ich nach einer Möglichkeit, > alle Funktionen einer C/C++ Datei (also die dort implementierten) > automatisiert (Python) aufzulisten. Mit nm bekomme ich aus den > Objektdateien fast alle Funktionen, aber static/inline Funktionen > fehlen, logischer Weise. static-Symbole sollte bei nm aber mit drin sein. Wenns inline unbedingt bedürfen soll (wofür auch immer), musste halt entweder den Code parsen (für C99 gibts nen pycparser oder so), oder eben über Mapfiles/Debug-Symboldaten gehen (pdb). > Diese sollen aber mit aufgelistet werden. Die > Funktionen stehen im Map-File, aber das Map-File zu parsen ist nicht > unerheblicher Aufwand. Ich würds erstmal per Shell versuchen zu parsen (grep/sed), wenn's zu kompliziert wird für Python, merkt mer das dann recht schnell. Persönlich würd ich empfehlen, die inlines zu knicken und darauf zu verzichten - lohnt imho den Aufwand nicht ggü. der nm-basierten Lösung.
Kaj G. schrieb: > für dokumentarische Zwecke (arbeit) suche ich nach einer Möglichkeit, > alle Funktionen einer C/C++ Datei (also die dort implementierten) > automatisiert (Python) aufzulisten. Dazu fallen mir die ctags von vim ein. Siehe z.B. https://kulkarniamit.github.io/whatwhyhow/howto/use-vim-ctags.html oder http://ctags.sourceforge.net/whatis.html oder https://linux.die.net/man/1/ctags Die tag Datei sollte die Infos enthalten, ich habe aber gerade kein Beispiel zur Hand.
Beachte: durch Preprozessor Mechanismen können Funktionen aktiviert/deaktiviert werden. Daher statt grep Tools eher Tools nutzen die Preprozessor Befehle verstehen, z. B. Doxygen...
Alexander S. schrieb: > Dazu fallen mir die ctags von vim ein. Siehe z.B. > https://kulkarniamit.github.io/whatwhyhow/howto/use-vim-ctags.html > oder http://ctags.sourceforge.net/whatis.html oder > https://linux.die.net/man/1/ctags > Die tag Datei sollte die Infos enthalten, ich habe aber gerade kein > Beispiel zur Hand. Besser: Universal Ctags (https://github.com/universal-ctags/ctags) Das wird auch aktuell gehalten. Einfache Kommandzeile (ggf anpassen):
1 | find . -name \*.cc | xargs ctags --kinds-c++=f |
Das Ergebnis steht in der Datei tags.
Kaj G. schrieb: > alle Funktionen einer C/C++ Datei (also die dort implementierten) > automatisiert (Python) aufzulisten. in meiner ide habe ich das so gelöst:
1 | private void sub_functiond_find(string searchtext1, string searchtext2, Color col) |
2 | {
|
3 | searchtext1 = "{"; |
4 | searchtext2 = "}"; |
5 | string text = TextArea.Text; |
6 | listBox2.Items.Clear(); |
7 | // text = text.Replace("){", ")\n{");
|
8 | |
9 | |
10 | //text = text.Replace(") {", ")\n{");
|
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | // text = text.Replace("\n\n{", ")\n{");
|
18 | // text = text.Replace("\n\n{", ")\n{");
|
19 | StringBuilder sb = new StringBuilder(); |
20 | string[] splitStrings = { "\r\n", "\r", "\n" }; |
21 | string[] lines = text.Split(splitStrings, StringSplitOptions.None); |
22 | int lineCounter = 0, stufe = 0, stufe_alt=8; |
23 | string line_alt = "", funktion=""; |
24 | foreach (string s in lines) |
25 | {
|
26 | |
27 | if (s.IndexOf("{") > -1 && s.IndexOf("}") == -1) |
28 | {
|
29 | if (s.IndexOf("//") > s.IndexOf("{") || s.IndexOf("//") == -1) |
30 | {
|
31 | stufe++;//start funktion |
32 | }
|
33 | |
34 | }
|
35 | |
36 | if (s.IndexOf("}") > -1 && s.IndexOf("{") == -1) |
37 | {
|
38 | if (s.IndexOf("//") > s.IndexOf("}") || s.IndexOf("//") == -1) |
39 | {
|
40 | stufe--;//start funktion |
41 | }
|
42 | }
|
43 | |
44 | |
45 | |
46 | |
47 | if(stufe==1 && stufe_alt == 0) |
48 | {
|
49 | for (int i = 0; i < 5; i++) |
50 | {
|
51 | if (lines[lineCounter-i].IndexOf(')') > -1) |
52 | {
|
53 | funktion = lines[lineCounter - i].Substring(0, lines[lineCounter - i].IndexOf(')') + 1); |
54 | listBox2.Items.Add((lineCounter - i+1).ToString()+"_"+ funktion); |
55 | break; |
56 | }
|
57 | |
58 | }
|
59 | |
60 | |
61 | }
|
62 | stufe_alt = stufe; |
63 | //line_alt = s;
|
64 | |
65 | |
66 | |
67 | |
68 | |
69 | sb.Append("/*" + lineCounter.ToString().PadLeft(4, '_') + "_" + stufe.ToString() + "_*/"); |
70 | sb.Append("\t"); |
71 | sb.Append(s); |
72 | sb.Append(Environment.NewLine); |
73 | lineCounter++; |
74 | }
|
75 | }
|
Es werden jeweils die Ebenen geschweifter Klammern festgestellt. Auf der untersten Ebene stehen geschweifte Klammern vor Funktionen. Die werden dann festgestellt und aufgelistet. Kompliziert - aber funktioniert.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.