@@ -630,6 +630,7 @@ def output_struct_decl(
630
630
, parametertypes = None # ctx.parametertypes
631
631
, sections = None # ctx.sections
632
632
, purpose = None # ctx.decl_purpose
633
+ , definition = None # ctx.definition
633
634
, ):
634
635
raise NotImplementedError
635
636
@@ -1010,6 +1011,7 @@ def output_struct_decl(
1010
1011
, parametertypes = None # ctx.parametertypes
1011
1012
, sections = None # ctx.sections
1012
1013
, purpose = None # ctx.decl_purpose
1014
+ , definition = None # ctx.definition
1013
1015
, ):
1014
1016
self .parser .ctx .offset = self .parser .ctx .decl_offset
1015
1017
self .write_anchor (decl_name )
@@ -1034,32 +1036,20 @@ def output_struct_decl(
1034
1036
self .write ("\n .. code-block:: c\n \n " )
1035
1037
self .write (self .INDENT , decl_type , " " , decl_name , " {\n " )
1036
1038
1037
- for p_name in parameterlist :
1038
- p_type = parametertypes [p_name ]
1039
-
1040
- if MACRO .match (p_name ):
1041
- self .write (self .INDENT , "%s\n " % p_name )
1042
-
1043
- elif self .FUNC_PTR .search (p_type ):
1044
- # pointer to function
1045
- self .write (
1046
- self .INDENT * 2
1047
- , "%s%s)(%s);\n " % (self .FUNC_PTR [0 ], p_name , self .FUNC_PTR [1 ]))
1048
-
1049
- elif self .BITFIELD .match (p_type ):
1050
- self .write (
1051
- self .INDENT * 2
1052
- , "%s %s%s;\n " % (self .BITFIELD [0 ], p_name , self .BITFIELD [1 ]))
1053
- elif p_type .endswith ("*" ):
1054
- # pointer
1055
- self .write (
1056
- self .INDENT * 2
1057
- , "%s%s;\n " % (p_type , p_name ))
1058
-
1039
+ definition = re .sub (r"(([{;]))" , r"\1\n" , definition )
1040
+ level = 2
1041
+ for clause in definition .split ('\n ' ):
1042
+ clause = normalize_ws (clause )
1043
+ if not clause :
1044
+ continue
1045
+ if clause [0 ] == "}" and level > 2 :
1046
+ level -= 1
1047
+ if MACRO .match (clause ):
1048
+ self .write (self .INDENT , clause [:- 1 ].strip (), '\n ' )
1059
1049
else :
1060
- self .write (
1061
- self . INDENT * 2
1062
- , "%s %s; \n " % ( p_type , p_name ))
1050
+ self .write (self . INDENT * level , clause , ' \n ' )
1051
+ if clause [ - 1 ] == "{" :
1052
+ level += 1
1063
1053
1064
1054
self .write (self .INDENT , "}\n " )
1065
1055
@@ -2188,7 +2178,7 @@ def process_state3_type(self, line):
2188
2178
2189
2179
if MACRO .match (line ):
2190
2180
# To distinguish preprocessor directive from regular declaration
2191
- # later.
2181
+ # later (drop-semicolon) .
2192
2182
line += ";"
2193
2183
2194
2184
m = RE (r"([^{};]*)([{};])(.*)" )
@@ -2388,7 +2378,7 @@ def dump_function(self, proto):
2388
2378
, self .ctx .decl_type
2389
2379
, self .ctx .sectcheck
2390
2380
, self .ctx .parameterlist
2391
- , "" )
2381
+ )
2392
2382
if hasRetVal :
2393
2383
self .check_return_section (self .ctx .decl_name , self .ctx .return_type )
2394
2384
@@ -2426,7 +2416,8 @@ def dump_union(self, proto):
2426
2416
, parameterdescs = self .ctx .parameterdescs
2427
2417
, parametertypes = self .ctx .parametertypes
2428
2418
, sections = self .ctx .sections
2429
- , purpose = self .ctx .decl_purpose )
2419
+ , purpose = self .ctx .decl_purpose
2420
+ , definition = self .ctx .definition )
2430
2421
2431
2422
def dump_struct (self , proto ):
2432
2423
@@ -2447,14 +2438,14 @@ def dump_struct(self, proto):
2447
2438
, parameterdescs = self .ctx .parameterdescs
2448
2439
, parametertypes = self .ctx .parametertypes
2449
2440
, sections = self .ctx .sections
2450
- , purpose = self .ctx .decl_purpose )
2441
+ , purpose = self .ctx .decl_purpose
2442
+ , definition = self .ctx .definition )
2451
2443
2452
2444
def prepare_struct_union (self , proto ):
2453
2445
self .debug ("prepare_struct_union(): '%(proto)s'" , proto = proto )
2454
2446
2455
2447
retVal = False
2456
2448
members = ""
2457
- nested = ""
2458
2449
2459
2450
if C_STRUCT_UNION .match (proto ):
2460
2451
@@ -2464,32 +2455,14 @@ def prepare_struct_union(self, proto):
2464
2455
% (C_STRUCT_UNION [0 ], self .ctx .decl_type , proto ))
2465
2456
return False
2466
2457
2458
+
2467
2459
self .ctx .decl_name = C_STRUCT_UNION [1 ]
2468
- members = C_STRUCT_UNION [2 ]
2469
-
2470
- if "{" in members :
2471
- # ignore embedded structs or unions
2472
- m = members
2473
- members = ""
2474
- c = 0
2475
- for x in m :
2476
- if x == "{" :
2477
- c += 1
2478
- if c == 0 :
2479
- members += x
2480
- else :
2481
- nested += x
2482
- if x == "}" :
2483
- c -= 1
2460
+ self .ctx .definition = members = C89_comments .sub ("" , C_STRUCT_UNION [2 ])
2484
2461
2485
2462
# ignore members marked private:
2486
2463
members = re .sub (r"/\*\s*private:.*?/\*\s*public:.*?\*/" , "" , members , flags = re .I )
2487
2464
members = re .sub (r"/\*\s*private:.*" , "" , members , flags = re .I )
2488
2465
2489
- # strip comments:
2490
- members = C89_comments .sub ("" , members )
2491
- nested = C89_comments .sub ("" , nested )
2492
-
2493
2466
# strip kmemcheck_bitfield_{begin,end}.*;
2494
2467
members = re .sub (r"kmemcheck_bitfield_.*?;" , "" , members )
2495
2468
@@ -2508,12 +2481,19 @@ def prepare_struct_union(self, proto):
2508
2481
, r"unsigned long \1[1 << ((\2) - 1)]"
2509
2482
, members )
2510
2483
2484
+ # Split nested struct/union elements as newer ones
2485
+ NESTED = RE (r"(struct|union)\s+{([^{}]*)}(\s*[^\s;]\s*)" )
2486
+ while NESTED .search (members ):
2487
+ members = NESTED .sub (r'\1 \3 \2 ' , members )
2488
+
2489
+ # ignore other nested elements, like enums
2490
+ members = re .sub (r"({[^\{\}]*})" , '' , members )
2511
2491
self .create_parameterlist (members , ';' )
2512
2492
self .check_sections (self .ctx .decl_name
2513
2493
, self .ctx .decl_type
2514
2494
, self .ctx .sectcheck
2515
2495
, self .ctx .parameterlist # self.ctx.struct_actual.split(" ")
2516
- , nested )
2496
+ )
2517
2497
retVal = True
2518
2498
2519
2499
else :
@@ -2557,8 +2537,7 @@ def dump_enum(self, proto):
2557
2537
self .check_sections (self .ctx .decl_name
2558
2538
, self .ctx .decl_type
2559
2539
, self .ctx .sectcheck
2560
- , self .ctx .parameterlist
2561
- , "" )
2540
+ , self .ctx .parameterlist )
2562
2541
2563
2542
self .output_decl (
2564
2543
self .ctx .decl_name , "enum_decl"
@@ -2601,8 +2580,7 @@ def dump_typedef(self, proto):
2601
2580
self .check_sections (self .ctx .decl_name
2602
2581
, self .ctx .decl_type
2603
2582
, self .ctx .sectcheck
2604
- , self .ctx .parameterlist
2605
- , "" )
2583
+ , self .ctx .parameterlist )
2606
2584
self .output_decl (
2607
2585
self .ctx .decl_name , "function_decl"
2608
2586
, function = self .ctx .decl_name
@@ -2634,8 +2612,7 @@ def dump_typedef(self, proto):
2634
2612
self .check_sections (self .ctx .decl_name
2635
2613
, self .ctx .decl_type
2636
2614
, self .ctx .sectcheck
2637
- , self .ctx .parameterlist
2638
- , "" )
2615
+ , self .ctx .parameterlist )
2639
2616
self .output_decl (
2640
2617
self .ctx .decl_name , "typedef_decl"
2641
2618
, typedef = self .ctx .decl_name
@@ -2661,7 +2638,6 @@ def create_parameterlist(self, parameter, splitchar):
2661
2638
2662
2639
self .debug ("create_parameterlist(): params='%(y)s'" , y = parameter )
2663
2640
for c , p in enumerate (parameter .split (splitchar )):
2664
-
2665
2641
p = C99_comments .sub ("" , p )
2666
2642
p = p .strip ()
2667
2643
@@ -2772,7 +2748,7 @@ def push_parameter(self, p_name, p_type):
2772
2748
# handle unnamed (anonymous) union or struct:
2773
2749
p_type = p_name
2774
2750
p_name = "{unnamed_" + p_name + "}"
2775
- self .ctx .parameterdescs [p_name ] = "anonymous\n "
2751
+ self .ctx .parameterdescs [p_name ] = "anonymous"
2776
2752
self .anon_struct_union = True
2777
2753
2778
2754
self .debug (
@@ -2826,10 +2802,10 @@ def push_parameter(self, p_name, p_type):
2826
2802
2827
2803
2828
2804
def check_sections (self , decl_name , decl_type
2829
- , sectcheck , parameterlist , nested ):
2805
+ , sectcheck , parameterlist ):
2830
2806
self .debug ("check_sections(): decl_name='%(n)s' / decl_type='%(t)s' /"
2831
- " sectcheck=%(sc)s / parameterlist=%(pl)s / nested='%(nested)s' "
2832
- , n = decl_name , t = decl_type , sc = sectcheck , pl = parameterlist , nested = nested )
2807
+ " sectcheck=%(sc)s / parameterlist=%(pl)s"
2808
+ , n = decl_name , t = decl_type , sc = sectcheck , pl = parameterlist )
2833
2809
2834
2810
for sect in sectcheck :
2835
2811
sub_sect = re .sub (r"\..*" , "" , sect ) # take @foo.bar sections as "foo" sub-section
@@ -2846,7 +2822,7 @@ def check_sections(self, decl_name, decl_type
2846
2822
"excess function parameter '%(sect)s' description in '%(decl_name)s'"
2847
2823
, sect = sect , decl_name = decl_name
2848
2824
, line_no = self .ctx .decl_offset )
2849
- elif not re . search ( r"\b(" + sect + ")[^a-zA-Z0-9]" , nested ) :
2825
+ else :
2850
2826
self .warn (
2851
2827
"excess %(decl_type)s member '%(sect)s' description in '%(decl_name)s'"
2852
2828
, decl_type = decl_type , decl_name = decl_name , sect = sect
0 commit comments