kernel-doc from all-in-a-tumble.[ch]
¶
Below you find the reST markup, generated from kernel-doc comments of the example files source all-in-a-tumble.h and source all-in-a-tumble.c. This markup will be produced by the kernel-doc parser and inserted in the document by using the following directives:
.. kernel-doc:: ./all-in-a-tumble.c
:module: foo
.. kernel-doc:: ./all-in-a-tumble.h
:module: foo
The option :module:
is optional, to find out why we use this option here,
see kernel-doc options.
kernel-doc from all-in-a-tumble.h
¶
1.. c:namespace-push:: foo
2
3.. _`foo.about-examples`:
4
5About Examples
6==============
7
8The files :ref:`all-in-a-tumble.c-src` and :ref:`all-in-a-tumble.h-src` are
9including all examples of the :ref:`linuxdoc-howto` documentation. These
10files are also used as a test of the kernel-doc parser, to see how kernel-doc
11content will be rendered and where the parser might fail.
12
13And ... The content itself is nonsense / don’t look to close ;-)
14
15.. _`foo.callback`:
16
17callback
18========
19
20.. c:function:: void callback(void (*fct_ptr)(void *))
21
22 Callback function with a function pointer argument
23
24 :param fct\_ptr:
25 Function to call.
26 :type fct\_ptr: void (\*)(void \*)
27
28.. _`foo.trace_block_touch_buffer`:
29
30trace_block_touch_buffer
31========================
32
33.. c:function:: void trace_block_touch_buffer(struct buffer_head *bh)
34
35 mark a buffer accessed
36
37 :param bh:
38 buffer_head being touched
39 :type bh: struct buffer\_head \*
40
41.. _`foo.trace_block_touch_buffer.description`:
42
43Description
44-----------
45
46Called from \ :c:func:`touch_buffer`\ .
47
48.. _`foo.trace_block_dirty_buffer`:
49
50trace_block_dirty_buffer
51========================
52
53.. c:function:: void trace_block_dirty_buffer(struct buffer_head *bh)
54
55 mark a buffer dirty
56
57 :param bh:
58 buffer_head being dirtied
59 :type bh: struct buffer\_head \*
60
61.. _`foo.trace_block_dirty_buffer.description`:
62
63Description
64-----------
65
66Called from \ :c:func:`mark_buffer_dirty`\ .
67
68.. _`foo.theory-of-operation`:
69
70Theory of Operation
71===================
72
73The whizbang foobar is a dilly of a gizmo. It can do whatever you
74want it to do, at any time. It reads your mind. Here's how it works.
75
76foo bar splat
77-------------
78
79The only drawback to this gizmo is that it can sometimes damage hardware,
80software, or its subject(s).
81
82.. _`foo.multiple-doc-sections`:
83
84multiple DOC sections
85=====================
86
87It's not recommended to place more than one "DOC:" section in the same
88comment block. To insert a new "DOC:" section, create a new comment block and
89to create a sub-section use the reST markup for headings, see documentation
90of function \ :c:func:`rst_mode`\
91
92.. _`foo.lorem-ipsum`:
93
94lorem ipsum
95===========
96
97Lorem ipsum dolor sit amet, consectetur adipisici elit, sed eiusmod tempor
98incidunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
99nostrud exercitation ullamco laboris nisi ut aliquid ex ea commodi
100consequat. Quis aute iure reprehenderit in voluptate velit esse cillum dolore
101eu fugiat nulla pariatur. Excepteur sint obcaecat cupiditat non proident,
102sunt in culpa qui officia deserunt mollit anim id est laborum.
103
104.. _`foo.my_struct`:
105
106struct my_struct
107================
108
109.. c:struct:: my_struct
110
111 a struct with nested unions and structs
112
113.. _`foo.my_struct.definition`:
114
115Definition
116----------
117
118.. code-block:: c
119
120 struct my_struct {
121 union {
122 struct {
123 char arg1 : 1;
124 char arg2 : 3;
125 } ;
126 struct {
127 int arg1b;
128 int arg2b;
129 } ;
130 struct {
131 void *arg3;
132 int arg4;
133 int (*f1)(char foo, int bar);
134 } ;
135 } ;
136 union {
137 struct {
138 int arg1;
139 int arg2;
140 } st1;
141 struct {
142 void *arg1;
143 int arg2;
144 int (*f2)(char foo, int bar);
145 } st2, st3;
146 int (*f3)(char foo, int bar);
147 } bar;
148 enum {
149 FOO,
150 BAR,
151 } undoc_public;
152 }
153
154.. _`foo.my_struct.members`:
155
156Members
157-------
158
159{unnamed_union}
160 anonymous
161
162{unnamed_struct}
163 anonymous
164
165arg1
166 first argument of anonymous union/anonymous struct
167 lorem ipsum ...
168
169arg2
170 second argument of anonymous union/anonymous struct
171
172{unnamed_struct}
173 anonymous
174
175arg1b
176 first argument of anonymous union/anonymous struct
177
178arg2b
179 second argument of anonymous union/anonymous struct
180
181{unnamed_struct}
182 anonymous
183
184arg3
185 third argument of anonymous union/anonymous struct
186
187arg4
188 fourth argument of anonymous union/anonymous struct
189
190f1
191 nested function on anonimous union/struct
192
193bar
194 non-anonymous union
195
196bar.st1
197 struct st1 inside \ ``bar``\
198
199bar.st1.arg1
200 first argument of struct st1 on union bar
201
202bar.st1.arg2
203 second argument of struct st1 on union bar
204
205bar.st2
206 struct st2 inside \ ``bar``\
207
208bar.st2.arg1
209 first argument of struct st2 on union bar
210
211bar.st2.arg2
212 second argument of struct st2 on union bar
213
214bar.st3
215 struct st3 inside \ ``bar``\
216
217bar.st3.arg2
218 second argument of struct st3 on union bar
219
220bar.st2.f2
221 nested function on named union/struct
222
223undoc_public
224 *undescribed*
225
226.. _`foo.my_long_struct`:
227
228struct my_long_struct
229=====================
230
231.. c:struct:: my_long_struct
232
233 short description with \ :c:type:`my_struct->a <my_struct>`\ and \ :c:type:`my_struct->b <my_struct>`\
234
235.. _`foo.my_long_struct.definition`:
236
237Definition
238----------
239
240.. code-block:: c
241
242 struct my_long_struct {
243 int foo;
244 int bar;
245 int baz;
246 union {
247 int foobar;
248 } ;
249 struct {
250 int barbar;
251 } bar2;
252 }
253
254.. _`foo.my_long_struct.members`:
255
256Members
257-------
258
259foo
260 The Foo member.
261
262bar
263 The Bar member,
264 lorem ipsum ..
265
266baz
267 The Baz member,
268 lorem ipsum ..
269
270 Here, the member description may contain several paragraphs.
271
272{unnamed_union}
273 anonymous
274
275foobar
276 Single line description.
277
278bar2
279 Description for struct \ ``bar2``\ inside \ ``my_long_struct``\
280
281bar2.barbar
282 Description for \ ``barbar``\ inside \ ``my_long_struct.bar2``\
283
284.. _`foo.my_long_struct.description`:
285
286Description
287-----------
288
289Longer description
290
291.. _`foo.my_union`:
292
293union my_union
294==============
295
296.. c:union:: my_union
297
298 short description
299
300.. _`foo.my_union.definition`:
301
302Definition
303----------
304
305.. code-block:: c
306
307 union my_union {
308 int a;
309 int b;
310 }
311
312.. _`foo.my_union.members`:
313
314Members
315-------
316
317a
318 first member
319
320b
321 second member
322
323.. _`foo.my_union.description`:
324
325Description
326-----------
327
328Longer description
329
330.. _`foo.my_enum`:
331
332enum my_enum
333============
334
335.. c:enum:: my_enum
336
337 log level
338
339.. _`foo.my_enum.definition`:
340
341Definition
342----------
343
344.. code-block:: c
345
346 enum my_enum {
347 QUIET,
348 INFO,
349 WARN,
350 DEBUG
351 };
352
353.. _`foo.my_enum.constants`:
354
355Constants
356---------
357
358QUIET
359 logs nothing
360
361INFO
362 logs info messages
363
364WARN
365 logs warn and info messages
366
367DEBUG
368 logs debug, warn and info messages
369
370.. _`foo.my_typedef`:
371
372typedef my_typedef
373==================
374
375.. c:type:: my_typedef
376
377 useless typdef of int
378
379.. _`foo.rst_mode`:
380
381rst_mode
382========
383
384.. c:function:: int rst_mode(int a, char *b)
385
386 dummy to demonstrate reST & kernel-doc markup in comments
387
388 :param a:
389 first argument
390 :type a: int
391
392 :param b:
393 second argument
394 Context: :c:func:`in_gizmo_mode`.
395 :type b: char \*
396
397.. _`foo.rst_mode.description`:
398
399Description
400-----------
401
402Long description. This function has two integer arguments. The first is
403``parameter_a`` and the second is ``parameter_b``.
404
405As long as the reST / sphinx-doc toolchain uses `intersphinx
406<http://www.sphinx-doc.org/en/stable/ext/intersphinx.html>`__ you can refer
407definitions *outside* like :c:type:`struct media_device <media_device>`. If
408the description of ``media_device`` struct is found in any of the intersphinx
409locations, a hyperref to this target is generated a build time.
410
411.. _`foo.rst_mode.example`:
412
413Example
414-------
415
416.. code-block:: c
417
418 int main() {
419 printf("Hello World\n");
420 return 0;
421 }
422
423
424.. _`foo.rst_mode.return`:
425
426Return
427------
428
429Sum of ``parameter_a`` and the second is ``parameter_b``.
430
431.. _`foo.rst_mode.highlighting`:
432
433highlighting
434------------
435
436The highlight pattern, are non regular reST markups. They are only available
437within kernel-doc comments, helping C developers to write short and compact
438documentation.
439
440- \ :c:func:`user_function`\ : function
441- \ ``a``\ : name of a parameter
442- \ :c:type:`struct my_struct <my_struct>`\ : name of a structure (including the word struct)
443- \ :c:type:`union my_union <my_union>`\ : name of a union
444- \ :c:type:`my_struct->a <my_struct>`\ or \ :c:type:`my_struct.b <my_struct>`\ - member of a struct or union.
445- \ :c:type:`enum my_enum <my_enum>`\ : name of a enum
446- \ :c:type:`typedef my_typedef <my_typedef>`\ : name of a typedef
447- \ ``CONST``\ : name of a constant.
448- \ ``$ENVVAR``\ : environmental variable
449
450The kernel-doc parser translates the pattern above to the corresponding reST
451markups. You don't have to use the *highlight* pattern, if you prefer *pure*
452reST, use the reST markup.
453
454- :c:func:`user_function` : function
455- ``a`` : name of a parameter
456- :c:type:`struct my_struct <my_struct>` : name of a structure (including the word struct)
457- :c:type:`union my_union <my_union>` : name of a union
458- :c:type:`my_struct->a <my_struct>` or :c:type:`my_struct.b <my_struct>` - member of a struct or union.
459- :c:type:`enum my_enum <my_enum>` : name of a enum
460- :c:type:`typedef my_typedef <my_typedef>` : name of a typedef
461- ``CONST`` : name of a constant.
462- ``$ENVVAR`` : environmental variable
463
464Since the prefixes ``$...``, ``&...`` and ``@...`` are used to markup the
465highlight pattern, you have to escape them in other uses: $lorem, &lorem,
466%lorem and @lorem. To esacpe from function highlighting, use lorem().
467
468.. _`foo.rst_mode.parser-mode`:
469
470Parser Mode
471-----------
472
473This is an example with activated reST additions, in this section you will
474find some common inline markups.
475
476Within the *reST mode* the kernel-doc parser pass through all markups to the
477reST toolchain, except the *vintage highlighting* but including any
478whitespace. With this, the full reST markup is available in the comments.
479
480This is a link to the `Linux kernel source tree
481<https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/>`_.
482
483This description is only to show some reST inline markups like *emphasise*
484and **emphasis strong**. The following is a demo of a reST list markup:
485
486.. _`foo.rst_mode.definition-list`:
487
488Definition list
489---------------
490
491:def1: lorem
492:def2: ipsum
493
494.. _`foo.rst_mode.ordered-list`:
495
496Ordered List
497------------
498
499- item one
500- item two
501- item three with
502 a linebreak
503
504.. _`foo.rst_mode.literal-blocks`:
505
506Literal blocks
507--------------
508
509The next example shows a literal block::
510
511 +------+ +------+
512 |\ |\ /| /|
513 | +----+-+ +-+----+ |
514 | | | | | | | |
515 +-+----+ | | +----+-+
516 \| \| |/ |/
517 +------+ +------+
518 foo() bar()
519
520.. _`foo.rst_mode.highlighted-code-blocks`:
521
522Highlighted code blocks
523-----------------------
524
525The next example shows a code block, with highlighting C syntax in the
526output.
527
528.. code-block:: c
529
530 // Hello World program
531 #include<stdio.h>
532 int main()
533 {
534 printf("Hello World");
535 }
536
537.. _`foo.rst_mode.rest-sectioning`:
538
539reST sectioning
540---------------
541
542
543colon markup: sectioning by colon markup in reST mode is less ugly. ;-)
544
545A kernel-doc section like *this* section is translated into a reST
546*subsection*. This means, you can only use the following *sub-levels* within a
547kernel-doc section.
548
549a subsubsection
550^^^^^^^^^^^^^^^
551
552lorem ipsum
553
554a paragraph
555"""""""""""
556
557lorem ipsum
558
559.. _`foo.vintage`:
560
561vintage
562=======
563
564.. c:function:: int vintage(int parameter_a, char parameter_b)
565
566 short description of this function
567
568 :param parameter\_a:
569 first argument
570 :type parameter\_a: int
571
572 :param parameter\_b:
573 second argument
574 :type parameter\_b: char
575
576.. _`foo.vintage.context`:
577
578Context
579-------
580
581\ :c:func:`in_gizmo_mode`\ .
582
583.. _`foo.vintage.description`:
584
585Description
586-----------
587
588This is a test of a typical markup from \*vintage\* kernel-doc. Don't look to
589close here, it is only for testing some kernel-doc parser stuff.
590
591Long description. This function has two integer arguments. The first is
592\ ``parameter_a``\ and the second is \ ``parameter_b``\ .
593
594.. _`foo.vintage.example`:
595
596Example
597-------
598
599.. code-block:: c
600
601 user_function(22);
602
603
604.. _`foo.vintage.return`:
605
606Return
607------
608
609Sum of \ ``parameter_a``\ and \ ``parameter_b``\ .
610
611.. _`foo.vintage.highlighting`:
612
613highlighting
614------------
615
616
617- \ :c:func:`vintage`\ : function
618- \ ``parameter_a``\ : name of a parameter
619- \ ``$ENVVAR``\ : environmental variable
620- \ :c:type:`struct my_struct <my_struct>`\ : name of a structure (up to two words including \`\`struct\`\`)
621- \ ``CONST``\ : name of a constant.
622
623.. _`foo.vintage.parser-mode`:
624
625Parser Mode
626-----------
627
628\*vintage\* kernel-doc mode
629
630Within the \*vintage kernel-doc mode\* ignores any whitespace or inline
631markup.
632
633- Inline markup like \*emphasis\* or \*\*emphasis strong\*\*
634- Literals and/or block indent:
635
636a + b
637
638In kernel-doc \*vintage\* mode, there are no special block or inline markups
639available. Markups like the one above result in ambiguous reST markup which
640could produce error messages in the subsequently sphinx-build
641process. Unexpected outputs are mostly the result.
642
643This is a link https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/
644to the Linux kernel source tree
645
646.. _`foo.vintage.colon-markup`:
647
648colon markup
649------------
650
651sectioning by colon markup in vintage mode is partial ugly. ;-)
652
653.. _`foo.nfp_flower_priv`:
654
655struct nfp_flower_priv
656======================
657
658.. c:struct:: nfp_flower_priv
659
660 Flower APP per-vNIC priv data
661
662.. _`foo.nfp_flower_priv.definition`:
663
664Definition
665----------
666
667.. code-block:: c
668
669 struct nfp_flower_priv {
670 struct nfp_net *nn;
671 u32 mask_id_seed;
672 u64 flower_version;
673 struct nfp_fl_mask_id mask_ids;
674 DECLARE_HASHTABLE(mask_table, NFP_FLOWER_MASK_HASH_BITS);
675 DECLARE_HASHTABLE(flow_table, NFP_FLOWER_HASH_BITS);
676 }
677
678.. _`foo.nfp_flower_priv.members`:
679
680Members
681-------
682
683nn
684 Pointer to vNIC
685
686mask_id_seed
687 Seed used for mask hash table
688
689flower_version
690 HW version of flower
691
692mask_ids
693 List of free mask ids
694
695mask_table
696 Hash table used to store masks
697
698flow_table
699 Hash table used to store flower rules
700
701.. _`foo.foo`:
702
703enum foo
704========
705
706.. c:enum:: foo
707
708 foo
709
710.. _`foo.foo.definition`:
711
712Definition
713----------
714
715.. code-block:: c
716
717 enum foo {
718 F1,
719 F2
720 };
721
722.. _`foo.foo.constants`:
723
724Constants
725---------
726
727F1
728 f1
729
730F2
731 f2
732
733.. _`foo.something`:
734
735struct something
736================
737
738.. c:struct:: something
739
740 Lorem ipsum dolor sit amet.
741
742.. _`foo.something.definition`:
743
744Definition
745----------
746
747.. code-block:: c
748
749 struct something {
750 struct foo foofoo;
751 struct bar barbar;
752 }
753
754.. _`foo.something.members`:
755
756Members
757-------
758
759foofoo
760 lorem
761
762barbar
763 ipsum
764
765.. _`foo.lineevent_state`:
766
767struct lineevent_state
768======================
769
770.. c:struct:: lineevent_state
771
772 contains the state of a userspace event
773
774.. _`foo.lineevent_state.definition`:
775
776Definition
777----------
778
779.. code-block:: c
780
781 struct lineevent_state {
782 struct gpio_device *gdev;
783 const char *label;
784 struct gpio_desc *desc;
785 u32 eflags;
786 int irq;
787 wait_queue_head_t wait;
788 DECLARE_KFIFO(events, struct gpioevent_data, 16);
789 DECLARE_KFIFO_PTR(foobar, struct lirc_scancode);
790 struct mutex read_lock;
791 }
792
793.. _`foo.lineevent_state.members`:
794
795Members
796-------
797
798gdev
799 the GPIO device the event pertains to
800
801label
802 consumer label used to tag descriptors
803
804desc
805 the GPIO descriptor held by this event
806
807eflags
808 the event flags this line was requested with
809
810irq
811 the interrupt that trigger in response to events on this GPIO
812
813wait
814 wait queue that handles blocking reads of events
815
816events
817 KFIFO for the GPIO events (testing DECLARE_KFIFO)
818
819foobar
820 testing DECLARE_KFIFO_PTR
821
822read_lock
823 mutex lock to protect reads from colliding with adding
824 new events to the FIFO
825
826.. _`foo.genpool_algo_t`:
827
828typedef genpool_algo_t
829======================
830
831.. c:function:: unsigned long genpool_algo_t(unsigned long *map, unsigned long size, unsigned long start, unsigned int nr, void *data, struct gen_pool *pool, unsigned long start_addr)
832
833 Allocation callback function type definition
834
835 :param map:
836 Pointer to bitmap
837 :type map: unsigned long \*
838
839 :param size:
840 The bitmap size in bits
841 :type size: unsigned long
842
843 :param start:
844 The bitnumber to start searching at
845 :type start: unsigned long
846
847 :param nr:
848 The number of zeroed bits we're looking for
849 :type nr: unsigned int
850
851 :param data:
852 optional additional data used by the callback
853 :type data: void \*
854
855 :param pool:
856 the pool being allocated from
857 :type pool: struct gen\_pool \*
858
859 :param start\_addr:
860 *undescribed*
861 :type start\_addr: unsigned long
862
863.. _`foo.v4l2_check_dv_timings_fnc`:
864
865typedef v4l2_check_dv_timings_fnc
866=================================
867
868.. c:function:: bool v4l2_check_dv_timings_fnc(const struct v4l2_dv_timings *t, void *handle)
869
870 timings check callback
871
872 :param t:
873 the v4l2_dv_timings struct.
874 :type t: const struct v4l2\_dv\_timings \*
875
876 :param handle:
877 a handle from the driver.
878 :type handle: void \*
879
880.. _`foo.v4l2_check_dv_timings_fnc.description`:
881
882Description
883-----------
884
885Returns true if the given timings are valid.
886
887.. _`foo.add`:
888
889macro ADD
890=========
891
892.. c:macro:: ADD( first, second)
893
894 Function like macro to add two values
895
896 :param first:
897 first value
898
899 :param second:
900 second value
901
902.. _`foo.add.description`:
903
904Description
905-----------
906
907Is replaced by a addition of \ ``first``\ and \ ``second``\ .
908
909.. _`foo.iosys_map_wr_field`:
910
911macro iosys_map_wr_field
912========================
913
914.. c:macro:: iosys_map_wr_field( map__, struct_offset__, struct_type__, field__, val__)
915
916 Write to a member of a struct in the iosys_map
917
918 :param map\_\_:
919 The iosys_map structure
920
921 :param struct\_offset\_\_:
922 Offset from the beggining of the map, where the struct
923 is located
924
925 :param struct\_type\_\_:
926 The struct describing the layout of the mapping
927
928 :param field\_\_:
929 Member of the struct to read
930
931 :param val\_\_:
932 Value to write
933
934.. _`foo.iosys_map_wr_field.description`:
935
936Description
937-----------
938
939Write a value to the iosys_map considering its layout is described by a C
940struct starting at \ ``struct_offset__``\ . The field offset and size is calculated
941and the \ ``val_``\ \_ is written. If the field access would incur in un-aligned
942access, then either \ :c:func:`iosys_map_memcpy_to`\ needs to be used or the
943architecture must support it. Refer to \ :c:func:`iosys_map_rd_field`\ for expected
944usage and memory layout.
945
946.. c:namespace-pop::
kernel-doc from all-in-a-tumble.c
¶
1.. c:namespace-push:: foo
2
3.. _`foo.user_function`:
4
5user_function
6=============
7
8.. c:function:: int user_function(int a, ...)
9
10 function that can only be called in user context
11
12 :param a:
13 some argument
14 :type a: int
15
16 :param ellipsis ellipsis:
17 ellipsis operator
18
19.. _`foo.user_function.description`:
20
21Description
22-----------
23
24This function makes no sense, it's only a kernel-doc demonstration.
25
26.. _`foo.user_function.example`:
27
28Example
29-------
30
31.. code-block:: c
32
33 x = user_function(22);
34
35
36.. _`foo.user_function.return`:
37
38Return
39------
40
41Returns first argument
42
43.. _`foo.user_sum`:
44
45user_sum
46========
47
48.. c:function:: API_EXPORTED int user_sum(int a, int b)
49
50 another function that can only be called in user context
51
52 :param a:
53 first argument
54 :type a: int
55
56 :param b:
57 second argument
58 :type b: int
59
60.. _`foo.user_sum.description`:
61
62Description
63-----------
64
65This function makes no sense, it's only a kernel-doc demonstration.
66
67.. _`foo.user_sum.example`:
68
69Example
70-------
71
72.. code-block:: c
73
74 x = user_sum(1, 2);
75
76
77.. _`foo.user_sum.return`:
78
79Return
80------
81
82Returns the sum of the \ ``a``\ and \ ``b``\
83
84.. _`foo.sys_tgkill`:
85
86sys_tgkill
87==========
88
89.. c:function:: long sys_tgkill(pid_t tgid, pid_t pid, int sig)
90
91 send signal to one specific thread
92
93 :param tgid:
94 the thread group ID of the thread
95 :type tgid: pid\_t
96
97 :param pid:
98 the PID of the thread
99 :type pid: pid\_t
100
101 :param sig:
102 signal to be sent
103 :type sig: int
104
105.. _`foo.sys_tgkill.description`:
106
107Description
108-----------
109
110 This syscall also checks the \ ``tgid``\ and returns -ESRCH even if the PID
111 exists but it's not belonging to the target process anymore. This
112 method solves the problem of threads exiting and PIDs getting reused.
113
114.. _`foo.rarely_enum`:
115
116enum rarely_enum
117================
118
119.. c:enum:: rarely_enum
120
121 enum to test parsing rarely code styles
122
123.. _`foo.rarely_enum.definition`:
124
125Definition
126----------
127
128.. code-block:: c
129
130 enum rarely_enum {
131 F1,
132 F2
133 };
134
135.. _`foo.rarely_enum.constants`:
136
137Constants
138---------
139
140F1
141 f1
142
143F2
144 f2
145
146.. _`foo.rarely_struct`:
147
148struct rarely_struct
149====================
150
151.. c:struct:: rarely_struct
152
153 struct to test parsing rarely code styles
154
155.. _`foo.rarely_struct.definition`:
156
157Definition
158----------
159
160.. code-block:: c
161
162 struct rarely_struct {
163 struct foo foofoo;
164 struct bar barbar;
165 }
166
167.. _`foo.rarely_struct.members`:
168
169Members
170-------
171
172foofoo
173 lorem
174
175barbar
176 ipsum
177
178.. c:namespace-pop::