public inbox for systemtap@sourceware.org
 help / color / mirror / Atom feed
* Start of Systemtap Tapset Reference manual
@ 2008-11-11 16:45 William Cohen
       [not found] ` <491CBA1C.4080108@redhat.com>
                   ` (2 more replies)
  0 siblings, 3 replies; 16+ messages in thread
From: William Cohen @ 2008-11-11 16:45 UTC (permalink / raw)
  To: SystemTAP, Don Domingo

[-- Attachment #1: Type: text/plain, Size: 1115 bytes --]

Hi all,

The infrastructure is in place to extract xml from the files in systemtap/tapset 
for the reference manual. I have taken the documentation from the timestamp 
functions and placed it in the timestamp.stp file. The xml in the timestamp.stp 
file is preceded by ///.

The process of generating the document is fairly simple. Go to the 
systemtap/doc/SystemTap_Tapset_Reference. If there have been changes to the 
tapset files, the xml can extracted from the tapset files with:

make extract-xml

You will need to have publican installed on the computer to build the pdf or 
html files. There are instructions on publican at:

http://sourceware.org/systemtap/wiki/PublicanQuikHowto

Once publican is installed make the pdf with:

make pdf-en-US

Or if HTML is desired:

make html-en-US

The resulting output will be in placed in the appropriate directory:

systemtap/doc/SystemTap_Tapset_Reference/tmp/pdf
systemtap/doc/SystemTap_Tapset_Reference/tmp/html

I have attached the current Tapset_Reference.pdf to get feedback on this process 
  and refine it, so I don't have to revise a bunch of entries.

-Will

[-- Attachment #2: Tapset_Reference.pdf --]
[-- Type: pdf, Size: 134598 bytes --]

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Start of Systemtap Tapset Reference manual
       [not found] ` <491CBA1C.4080108@redhat.com>
@ 2008-11-14 14:08   ` William Cohen
  0 siblings, 0 replies; 16+ messages in thread
From: William Cohen @ 2008-11-14 14:08 UTC (permalink / raw)
  To: Don Domingo; +Cc: SystemTAP

Don Domingo wrote:
> Hi Will,
> 
> Thanks for this. As far as format goes, everything is just perfect; I'll 
> be doing a proofread run soon. The only suggestion I have for everyone 
> working on this guide is that for "FIXME: needs description" 
> placeholders, use the <remark> tags so everybody can see  clearly which 
> tapsets still need to be defined. I've edited the ones for 
> module_name:string() and stp_pid:long() to demonstrate this.
> 
> ///<formalpara id="stp_pid">
> ///  <title>stp_pid:long()</title>
> ///  <indexterm><primary>stp_pid</primary></indexterm>
> ///  <para>
> ///    <remark>FIXME: need description.</remark>
> ///  </para>
> ///</formalpara>
> 
> To make <remark> work, I also added the SHOW_REMARKS=1 option in the 
> Makefile. This ensures that remarks are displayed by default.
> 
> Cheers,
> Don

Thanks for the feedback. Remarks would be a better way of handling that.

I find the xml to be rather verbose. The original comments in the tapsets were 
much more compact. I am considering having something generate the xml from the 
stylized comments rather than having all the raw xml in the tapsets.

-Will

> 
> William Cohen wrote:
>> Hi all,
>>
>> The infrastructure is in place to extract xml from the files in 
>> systemtap/tapset for the reference manual. I have taken the 
>> documentation from the timestamp functions and placed it in the 
>> timestamp.stp file. The xml in the timestamp.stp file is preceded by ///.
>>
>> The process of generating the document is fairly simple. Go to the 
>> systemtap/doc/SystemTap_Tapset_Reference. If there have been changes 
>> to the tapset files, the xml can extracted from the tapset files with:
>>
>> make extract-xml
>>
>> You will need to have publican installed on the computer to build the 
>> pdf or html files. There are instructions on publican at:
>>
>> http://sourceware.org/systemtap/wiki/PublicanQuikHowto
>>
>> Once publican is installed make the pdf with:
>>
>> make pdf-en-US
>>
>> Or if HTML is desired:
>>
>> make html-en-US
>>
>> The resulting output will be in placed in the appropriate directory:
>>
>> systemtap/doc/SystemTap_Tapset_Reference/tmp/pdf
>> systemtap/doc/SystemTap_Tapset_Reference/tmp/html
>>
>> I have attached the current Tapset_Reference.pdf to get feedback on 
>> this process  and refine it, so I don't have to revise a bunch of 
>> entries.
>>
>> -Will
> 

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Start of Systemtap Tapset Reference manual
  2008-11-11 16:45 Start of Systemtap Tapset Reference manual William Cohen
       [not found] ` <491CBA1C.4080108@redhat.com>
@ 2008-11-17  6:00 ` Peter Teoh
       [not found] ` <804dabb00811162156s7cc931deja89861e47571331f@mail.gmail.com>
  2 siblings, 0 replies; 16+ messages in thread
From: Peter Teoh @ 2008-11-17  6:00 UTC (permalink / raw)
  To: SystemTAP

(resent due to bounced email)

Not sure if my suggestion has any relevancy or unanticipated or not,
but I will just describe it.

what i am proposing is:   do the minimal work to create the
documentation, maximize the consistency with that of Linux Kernel, so
that UNIFICATION of systemtap with Linux Kernel source may one be
possible.

How?

a.   When create the documentation, for example, the current
systemtap/doc always assumed that the entire subdirectory can be moved
to become Linux Kernel's Documentation's subdirectory, perhaps
"systemtap" as the name.

b.   So when a user go to Linux Kernel source and enter "make
htmldocs", or "make pdfdocs", a htmlized or pdf-ized document will be
created under DocBook.  Ie, there will be ZERO scripting effort from
systemtap developer, and all existing infrastructure provided by Linux
Kernel source's "script" subdirectory can be reused.

On a wider scale, the above can be generalized further.   But I would
like some feedback before venturing too far.


On Wed, Nov 12, 2008 at 12:44 AM, William Cohen <wcohen@redhat.com> wrote:
>
> Hi all,
>
> The infrastructure is in place to extract xml from the files in systemtap/tapset for the reference manual. I have taken the documentation from the timestamp functions and placed it in the timestamp.stp file. The xml in the timestamp.stp file is preceded by ///.
>
> The process of generating the document is fairly simple. Go to the systemtap/doc/SystemTap_Tapset_Reference. If there have been changes to the tapset files, the xml can extracted from the tapset files with:
>
> make extract-xml
>
> You will need to have publican installed on the computer to build the pdf or html files. There are instructions on publican at:
>
> http://sourceware.org/systemtap/wiki/PublicanQuikHowto
>
> Once publican is installed make the pdf with:
>
> make pdf-en-US
>
> Or if HTML is desired:
>
> make html-en-US
>
> The resulting output will be in placed in the appropriate directory:
>
> systemtap/doc/SystemTap_Tapset_Reference/tmp/pdf
> systemtap/doc/SystemTap_Tapset_Reference/tmp/html
>
> I have attached the current Tapset_Reference.pdf to get feedback on this process  and refine it, so I don't have to revise a bunch of entries.
>
> -Will



--
Regards,
Peter Teoh

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Start of Systemtap Tapset Reference manual
       [not found] ` <804dabb00811162156s7cc931deja89861e47571331f@mail.gmail.com>
@ 2008-11-18 16:55   ` William Cohen
  2008-11-18 20:44     ` Randy Dunlap
  0 siblings, 1 reply; 16+ messages in thread
From: William Cohen @ 2008-11-18 16:55 UTC (permalink / raw)
  To: Peter Teoh; +Cc: SystemTAP, Don Domingo, Frank Ch. Eigler

Peter Teoh wrote:
> not sure if my suggestion has any relevancy or unanticipated or not, but 
> I will just describe it.
> 
> what i am proposing is:   do the minimal work to create the 
> documentation, maximize the consistency with that of Linux Kernel, so 
> that UNIFICATION of systemtap with Linux Kernel source may one be possible.

I haven't thought about the issue of pulling the documentation into the kernel 
at this time. I was just thinking about the short term describing all the probe 
points and functions in systemtap in a manner that will keep up to date with 
changes in the tapsets. Trying to make it so the documentation isn't totally 
separated from the code.

However, with markers/tracepoints there will need to have this type of 
description in the kernel documentation. There are text files in Documentation 
directory: markers.txt and tracepoints.txt. When specific markers and 
tracepoints are put in the kernel those would certainly should end up in Documents/.

 >
 > How?
> 
> a.   When create the documentation, for example, the current 
> systemtap/doc always assumed that the entire subdirectory can be moved 
> to become Linux Kernel's Documentation's subdirectory, perhaps 
> "systemtap" as the name.
 >
> b.   So when a user go to Linux Kernel source and enter "make htmldocs", 
> or "make pdfdocs", a htmlized or pdf-ized document will be created under 
> DocBook.  Ie, there will be ZERO scripting effort from systemtap 
> developer, and all existing infrastructure provided by Linux Kernel 
> source's "script" subdirectory can be reused.

I was able to do a "make htmldocs" on some kernels to take a look at the html on 
Fedora 9 machine (needed to have a number of "xmlto*" packages installed). 
However, unsuccessful with the "make pdfdocs". I got the following error:

! TeX capacity exceeded, sorry [hash size=60000].
\FlowObjectSetup ...x \csname x@\Label \endcsname
                                                   \@madelink \else \bgroup \...
l.342013 {9\p@}}
                 0\endSeq{}\endNode{} for success, <\/ \Node%
!  ==> Fatal error occurred, no output PDF file produced!
Transcript written on kernel-api.log.
make[1]: *** [Documentation/DocBook/kernel-api.pdf] Error 9


Looks like I might be running into the internal limits. Are there workaround for 
that?


> On a wider scale, the above can be generalized further.   But I would 
> like some feedback before venturing too far.


-Will

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Start of Systemtap Tapset Reference manual
  2008-11-18 16:55   ` William Cohen
@ 2008-11-18 20:44     ` Randy Dunlap
  2008-11-19  1:01       ` Peter Teoh
                         ` (2 more replies)
  0 siblings, 3 replies; 16+ messages in thread
From: Randy Dunlap @ 2008-11-18 20:44 UTC (permalink / raw)
  To: William Cohen; +Cc: Peter Teoh, SystemTAP, Don Domingo, Frank Ch. Eigler

William Cohen wrote:
> Peter Teoh wrote:
>> not sure if my suggestion has any relevancy or unanticipated or not,
>> but I will just describe it.
>>
>> what i am proposing is:   do the minimal work to create the
>> documentation, maximize the consistency with that of Linux Kernel, so
>> that UNIFICATION of systemtap with Linux Kernel source may one be
>> possible.
> 
> I haven't thought about the issue of pulling the documentation into the
> kernel at this time. I was just thinking about the short term describing
> all the probe points and functions in systemtap in a manner that will
> keep up to date with changes in the tapsets. Trying to make it so the
> documentation isn't totally separated from the code.
> 
> However, with markers/tracepoints there will need to have this type of
> description in the kernel documentation. There are text files in
> Documentation directory: markers.txt and tracepoints.txt. When specific
> markers and tracepoints are put in the kernel those would certainly
> should end up in Documents/.

I'd prefer that we move all debug/markers/tracing files to some Doc sub-dir,
like Documentation/debugging/ (or make up some other sub-dir name).

>>
>> How?
>>
>> a.   When create the documentation, for example, the current
>> systemtap/doc always assumed that the entire subdirectory can be moved
>> to become Linux Kernel's Documentation's subdirectory, perhaps
>> "systemtap" as the name.

OK, or a dedicated systemtap sub-dir.

>> b.   So when a user go to Linux Kernel source and enter "make
>> htmldocs", or "make pdfdocs", a htmlized or pdf-ized document will be
>> created under DocBook.  Ie, there will be ZERO scripting effort from
>> systemtap developer, and all existing infrastructure provided by Linux
>> Kernel source's "script" subdirectory can be reused.
> 
> I was able to do a "make htmldocs" on some kernels to take a look at the
> html on Fedora 9 machine (needed to have a number of "xmlto*" packages
> installed). However, unsuccessful with the "make pdfdocs". I got the
> following error:
> 
> ! TeX capacity exceeded, sorry [hash size=60000].
> \FlowObjectSetup ...x \csname x@\Label \endcsname
>                                                   \@madelink \else
> \bgroup \...
> l.342013 {9\p@}}
>                 0\endSeq{}\endNode{} for success, <\/ \Node%
> !  ==> Fatal error occurred, no output PDF file produced!
> Transcript written on kernel-api.log.
> make[1]: *** [Documentation/DocBook/kernel-api.pdf] Error 9
> 
> 
> Looks like I might be running into the internal limits. Are there
> workaround for that?

I haven't seen/found one, but I'd certainly like to.  Some people have
told me that make pdfdocs/psdocs works on some distros, but I haven't
been successful with those lately.  I verify current kernel-doc and
Documentation/DocBook/*.tmpl files by using 'make htmldocs' or
'make mandocs'.  The pdfdocs/psdocs problems are toolchain issues
AFAIK.  They need to be fixed, but I'm not the right person to do
that.  Or maybe I'll just remove those make targets...

IIRC, Alan Cox did tell me one time how to get around that hash
size problem, but I don't have that email now.
I have reduced the size of kernel-api.tmpl somewhat and I'm
considering doing more of that, but that's just another form of
workaround, even if it makes some logical sense to split that
<huge> file up.

Are you seeing this hash table size problem with an unmodified
kernel-api.tmpl or only after you add systemtap entries to it?
I'd say that systemtap info should be in a separate file, even
if there is no hash table problem.


>> On a wider scale, the above can be generalized further.   But I would
>> like some feedback before venturing too far.

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Start of Systemtap Tapset Reference manual
  2008-11-18 20:44     ` Randy Dunlap
@ 2008-11-19  1:01       ` Peter Teoh
  2008-11-19 16:33       ` William Cohen
  2008-11-20 21:31       ` William Cohen
  2 siblings, 0 replies; 16+ messages in thread
From: Peter Teoh @ 2008-11-19  1:01 UTC (permalink / raw)
  To: Randy Dunlap; +Cc: William Cohen, SystemTAP, Don Domingo, Frank Ch. Eigler

[-- Attachment #1: Type: text/plain, Size: 1315 bytes --]

On Wed, Nov 19, 2008 at 4:43 AM, Randy Dunlap <randy.dunlap@oracle.com> wrote:
> William Cohen wrote:
>> Peter Teoh wrote:
>> ! TeX capacity exceeded, sorry [hash size=60000].
>> \FlowObjectSetup ...x \csname x@\Label \endcsname
>>                                                   \@madelink \else
>> \bgroup \...
>> l.342013 {9\p@}}
>>                 0\endSeq{}\endNode{} for success, <\/ \Node%
>> !  ==> Fatal error occurred, no output PDF file produced!
>> Transcript written on kernel-api.log.
>> make[1]: *** [Documentation/DocBook/kernel-api.pdf] Error 9
>>
>>
>> Looks like I might be running into the internal limits. Are there
>> workaround for that?
>

Just for the record, not sure whoever can solve the problem, mine is
FC9 too.   "make pdfdocs" on linus git tree (v2.6.28-rc5), I was able
to proceed till a certain extent, but after that some errors occurred.

And it does not have the "hash size=60000" signature that you have.
As shown in the attached file "make_pdfdocs_bug".

Question is - if it were successful the first few round, then any
subsequent bugs/errors has a high likelihood, though not completely,
of errors on our side, not the toolkit itself?

Similar behavior too for my FC7 - make_pdcdocs_bug_fc7.   Both always
errored at kernel_hacking.pdf.   Clues?


-- 
Regards,
Peter Teoh

[-- Attachment #2: make_pdfdocs_bug --]
[-- Type: application/octet-stream, Size: 4416 bytes --]


/root/download/linux-2.6_latest>make pdfdocs
  PDF     Documentation/DocBook/wanbook.pdf
Making portrait pages on A4 paper (210mmx297mm)
  PDF     Documentation/DocBook/z8530book.pdf
Making portrait pages on A4 paper (210mmx297mm)
  PDF     Documentation/DocBook/mcabook.pdf
Making portrait pages on A4 paper (210mmx297mm)
  PDF     Documentation/DocBook/kernel-hacking.pdf
Making portrait pages on A4 paper (210mmx297mm)
This is pdfTeXk, Version 3.141592-1.40.3 (Web2C 7.5.6)
 %&-line parsing enabled.
entering extended mode
(./tmp.fo
LaTeX2e <2005/12/01>
Babel <v3.8h> and hyphenation patterns for english, usenglishmax, dumylang, noh
yphenation, arabic, basque, bulgarian, coptic, welsh, czech, slovak, german, ng
erman, danish, esperanto, spanish, catalan, galician, estonian, farsi, finnish,
 french, greek, monogreek, ancientgreek, croatian, hungarian, interlingua, ibyc
us, indonesian, icelandic, italian, latin, mongolian, dutch, norsk, polish, por
tuguese, pinyin, romanian, russian, slovenian, uppersorbian, serbian, swedish, 
turkish, ukenglish, ukrainian, loaded.
xmltex version: 2002/06/25 v1.9 (Exp):
(/usr/share/texmf/tex/xmltex/xmltex.cfg) 
No File: tmp.cfg (/usr/share/texmf/tex/xmltex/passivetex/fotex.xmt)
(/usr/share/texmf/tex/latex/base/article.cls
Document Class: article 2005/09/16 v1.4f Standard LaTeX document class
(/usr/share/texmf/tex/latex/base/size10.clo))
(/usr/share/texmf/tex/xmltex/passivetex/fotex.sty
)
No file tmp.aux.
(/usr/share/texmf/tex/latex/cyrillic/t2acmr.fd)
(/usr/share/texmf/tex/latex/base/ts1cmr.fd)
(/usr/share/texmf/tex/latex/psnfss/t1ptm.fd)
No file tmp.out.
No file tmp.out.
INFO: Using normal, i.e. nonfrench-spacing in document
(/usr/share/texmf/tex/latex/psnfss/t1phv.fd)
(/usr/share/texmf/tex/latex/psnfss/t1pcr.fd) [1{/usr/share/texmf/fonts/map/pdft
ex/updmap/pdftex.map}] (/usr/share/texmf/tex/latex/psnfss/ts1ptm.fd) [2]
(/usr/share/texmf/tex/latex/amsfonts/umsa.fd)
(/usr/share/texmf/tex/latex/amsfonts/umsb.fd)
(/usr/share/texmf/tex/latex/wasysym/uwasy.fd)
(/usr/share/texmf/tex/latex/stmaryrd/Ustmry.fd)
Overfull \hbox (7.99203pt too wide) in paragraph at lines 304--306
 [][][] []\T1/pcr/m/n/10 copy_[to/from]_user()[] \T1/ptm/m/n/10 / []\T1/pcr/m/n
/10 get_user()[] \T1/ptm/m/n/10 / []\T1/pcr/m/n/10 put_user()[] []include/asm/u
access.h[] 

Underfull \hbox (badness 10000) in paragraph at lines 319--321
 [][][][]\T1/pcr/m/n/10 cpu_to_be32()[]\T1/ptm/m/n/10 /[]\T1/pcr/m/n/10 be32_to
_cpu()[]\T1/ptm/m/n/10 /[]\T1/pcr/m/n/10 cpu_to_le32()[]\T1/ptm/m/n/10 /[]\T1/p
cr/m/n/10 le32_to_cpu()[] 
[3]

LaTeX Font Warning: Font shape `OT1/cmr/m/n' in size <12.44159> not available
(Font)              size <12> substituted on input line 434.


LaTeX Font Warning: Font shape `OML/cmm/m/it' in size <12.44159> not available
(Font)              size <12> substituted on input line 434.


LaTeX Font Warning: Font shape `OMS/cmsy/m/n' in size <12.44159> not available
(Font)              size <12> substituted on input line 434.


LaTeX Font Warning: Font shape `OMX/cmex/m/n' in size <12.44159> not available
(Font)              size <12> substituted on input line 434.


LaTeX Font Warning: Font shape `U/msa/m/n' in size <12.44159> not available
(Font)              size <12> substituted on input line 434.


LaTeX Font Warning: Font shape `U/msb/m/n' in size <12.44159> not available
(Font)              size <12> substituted on input line 434.


LaTeX Font Warning: Font shape `U/wasy/m/n' in size <12.44159> not available
(Font)              size <12> substituted on input line 434.


LaTeX Font Warning: Font shape `U/stmry/m/n' in size <12.44159> not available
(Font)              size <12> substituted on input line 434.

[1] [2]
Underfull \hbox (badness 10000) in paragraph at lines 579--582
 []\T1/ptm/m/n/10 You can tell you are in a softirq (or tasklet) us-ing the []\
T1/pcr/m/n/10 in_softirq()[] \T1/ptm/m/n/10 macro
[3] [4] [5] [6]
! Argument of \XML@getattrib has an extra }.
<inserted text> 
                \par 
l.870    </fo:marker>
                     <fo:block font-size="20.736pt">
? 
! Emergency stop.
<inserted text> 
                \par 
l.870    </fo:marker>
                     <fo:block font-size="20.736pt">
!  ==> Fatal error occurred, no output PDF file produced!
Transcript written on tmp.log.
make[1]: *** [Documentation/DocBook/kernel-hacking.pdf] 错误 1
make: *** [pdfdocs] 错误 2
/root/download/linux-2.6_latest>



[-- Attachment #3: make_pdfdocs_bug_fc7 --]
[-- Type: application/octet-stream, Size: 4098 bytes --]


/sda4/download/linux_linus/linux-2.6>make pdfdocs
  PDF     Documentation/DocBook/wanbook.pdf
Making portrait pages on USletter paper (8.5inx11in)
  PDF     Documentation/DocBook/z8530book.pdf
Making portrait pages on USletter paper (8.5inx11in)
  PDF     Documentation/DocBook/mcabook.pdf
Making portrait pages on USletter paper (8.5inx11in)
  PDF     Documentation/DocBook/kernel-hacking.pdf
Making portrait pages on USletter paper (8.5inx11in)
This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4)
entering extended mode
(./tmp.fo
LaTeX2e <2003/12/01>
Babel <v3.8d> and hyphenation patterns for american, french, german, ngerman, b
ahasa, basque, bulgarian, catalan, croatian, czech, danish, dutch, esperanto, e
stonian, finnish, greek, icelandic, irish, italian, latin, magyar, norsk, polis
h, portuges, romanian, russian, serbian, slovak, slovene, spanish, swedish, tur
kish, ukrainian, nohyphenation, loaded.
xmltex version: 2002/06/25 v1.9 (Exp):
(/usr/share/texmf/tex/xmltex/xmltex.cfg) 
No File: tmp.cfg (/usr/share/texmf/tex/xmltex/passivetex/fotex.xmt)
(/usr/share/texmf/tex/latex/base/article.cls
Document Class: article 2004/02/16 v1.4f Standard LaTeX document class
(/usr/share/texmf/tex/latex/base/size10.clo))
(/usr/share/texmf/tex/xmltex/passivetex/fotex.sty
)
No file tmp.aux.
(/usr/share/texmf/tex/latex/cyrillic/t2acmr.fd)
(/usr/share/texmf/tex/latex/base/ts1cmr.fd)
(/usr/share/texmf/tex/latex/psnfss/t1ptm.fd)
No file tmp.out.
No file tmp.out.
INFO: Using normal, i.e. nonfrench-spacing in document
(/usr/share/texmf/tex/latex/psnfss/t1phv.fd)
(/usr/share/texmf/tex/latex/psnfss/t1pcr.fd) [1{/usr/share/texmf-var/fonts/map/
pdftex/updmap/pdftex.map}] (/usr/share/texmf/tex/latex/psnfss/ts1ptm.fd)
[2] (/usr/share/texmf/tex/latex/amsfonts/umsa.fd)
(/usr/share/texmf/tex/latex/amsfonts/umsb.fd)
(/usr/share/texmf/tex/latex/wasysym/uwasy.fd)
(/usr/share/texmf/tex/latex/stmaryrd/ustmry.fd)
Overfull \hbox (62.48468pt too wide) in paragraph at lines 319--321
 [][][][]\T1/pcr/m/n/10 cpu_to_be32()[]\T1/ptm/m/n/10 /[]\T1/pcr/m/n/10 be32_to
_cpu()[]\T1/ptm/m/n/10 /[]\T1/pcr/m/n/10 cpu_to_le32()[]\T1/ptm/m/n/10 /[]\T1/p
cr/m/n/10 le32_to_cpu()[] []include/asm/byteorder.h[] 
[3]

LaTeX Font Warning: Font shape `OT1/cmr/m/n' in size <12.44159> not available
(Font)              size <12> substituted on input line 434.


LaTeX Font Warning: Font shape `OML/cmm/m/it' in size <12.44159> not available
(Font)              size <12> substituted on input line 434.


LaTeX Font Warning: Font shape `OMS/cmsy/m/n' in size <12.44159> not available
(Font)              size <12> substituted on input line 434.


LaTeX Font Warning: Font shape `OMX/cmex/m/n' in size <12.44159> not available
(Font)              size <12> substituted on input line 434.


LaTeX Font Warning: Font shape `U/msa/m/n' in size <12.44159> not available
(Font)              size <12> substituted on input line 434.


LaTeX Font Warning: Font shape `U/msb/m/n' in size <12.44159> not available
(Font)              size <12> substituted on input line 434.


LaTeX Font Warning: Font shape `U/wasy/m/n' in size <12.44159> not available
(Font)              size <12> substituted on input line 434.


LaTeX Font Warning: Font shape `U/stmry/m/n' in size <12.44159> not available
(Font)              size <12> substituted on input line 434.

[1] [2]
Overfull \hbox (44.30264pt too wide) in paragraph at lines 579--582
 []\T1/ptm/m/n/10 You can tell you are in a softirq (or tasklet) us-ing the []\
T1/pcr/m/n/10 in_softirq()[] \T1/ptm/m/n/10 macro ([]\T1/pcr/m/n/10 include/lin
ux/interrupt.h[]\T1/ptm/m/n/10 ). 
[3] [4] [5] [6]
! Argument of \XML@getattrib has an extra }.
<inserted text> 
                \par 
l.870    </fo:marker>
                     <fo:block font-size="20.736pt">
? 
! Emergency stop.
<inserted text> 
                \par 
l.870    </fo:marker>
                     <fo:block font-size="20.736pt">
!  ==> Fatal error occurred, the output PDF file is not finished!
Transcript written on tmp.log.
make[1]: *** [Documentation/DocBook/kernel-hacking.pdf] Error 1
make: *** [pdfdocs] Error 2


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Start of Systemtap Tapset Reference manual
  2008-11-18 20:44     ` Randy Dunlap
  2008-11-19  1:01       ` Peter Teoh
@ 2008-11-19 16:33       ` William Cohen
  2008-11-20 21:31       ` William Cohen
  2 siblings, 0 replies; 16+ messages in thread
From: William Cohen @ 2008-11-19 16:33 UTC (permalink / raw)
  To: Randy Dunlap; +Cc: Peter Teoh, SystemTAP, Don Domingo, Frank Ch. Eigler

Randy Dunlap wrote:

<snip>

> I'd prefer that we move all debug/markers/tracing files to some Doc sub-dir,
> like Documentation/debugging/ (or make up some other sub-dir name).

Having a subdir for marker/tracepoints makes sense.

<snip>

>> Looks like I might be running into the internal limits. Are there
>> workaround for that?
> 
> I haven't seen/found one, but I'd certainly like to.  Some people have
> told me that make pdfdocs/psdocs works on some distros, but I haven't
> been successful with those lately.  I verify current kernel-doc and
> Documentation/DocBook/*.tmpl files by using 'make htmldocs' or
> 'make mandocs'.  The pdfdocs/psdocs problems are toolchain issues
> AFAIK.  They need to be fixed, but I'm not the right person to do
> that.  Or maybe I'll just remove those make targets...

The "make htmldocs" worked fine, so I may stick with that for the time being.
> 
> IIRC, Alan Cox did tell me one time how to get around that hash
> size problem, but I don't have that email now.
> I have reduced the size of kernel-api.tmpl somewhat and I'm
> considering doing more of that, but that's just another form of
> workaround, even if it makes some logical sense to split that
> <huge> file up.

The following URL has some insight on how to deal with this: 
https://fcp.surfsite.org/modules/newbb/viewtopic.php?viewmode=threaded&order=DESC&topic_id=54372&forum=11&move=prev&topic_time=1206539822

Looking at the opensuse kernel-docs spec file it adds some defines in the %prep:

cp -av /etc/texmf/web2c/texmf.cnf .
cat << EOF >> texmf.cnf
main_memory.pdfjadetex = 2500000
hash_extra.pdfjadetex = 70000
max_strings.pdfjadetex = 120000
save_size.pdfjadetex = 10000
EOF


> 
> Are you seeing this hash table size problem with an unmodified
> kernel-api.tmpl or only after you add systemtap entries to it?
> I'd say that systemtap info should be in a separate file, even
> if there is no hash table problem.

This was an unmodified kernel-api. I am not yet to trying to merge the systemtap 
documentation into the  linux kernel document.

-Will

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Start of Systemtap Tapset Reference manual
  2008-11-18 20:44     ` Randy Dunlap
  2008-11-19  1:01       ` Peter Teoh
  2008-11-19 16:33       ` William Cohen
@ 2008-11-20 21:31       ` William Cohen
  2008-11-20 21:41         ` Randy Dunlap
  2 siblings, 1 reply; 16+ messages in thread
From: William Cohen @ 2008-11-20 21:31 UTC (permalink / raw)
  To: Randy Dunlap; +Cc: Peter Teoh, SystemTAP, Don Domingo, Frank Ch. Eigler

I took a look to see how the kernel uses kernel-doc to extract the information 
from the C files. I tried an experiment to see whether kernel-doc could extract 
the comments out of a systemtap tapset file. However, it appears that kernel-doc 
try to grock C syntax and looks for a prototype for the function. Thus, it 
chokes on the following example:

/**
  * vm.pagefault - Records that a page fault occurred.
  * Context: The process which triggered the fault
  *
  *  @address: The address of the faulting memory access.
  *  @write_access: Indicates whether this was a write.
  */
probe vm.pagefault = kernel.function("__handle_mm_fault@mm/memory.c") ?,
                      kernel.function("handle_mm_fault@mm/memory.c") ?
{
	write_access = $write_access
	address =  $address
}

Giving the following error message:

Error(/home/wcohen/research/profiling/systemtap_write/systemtap_ref//tapset/memory.stp:19): 
cannot understand prototype: 'probe vm.pagefault = 
kernel.function("__handle_mm_fault@mm/memory.c") ?, 
kernel.function("handle_mm_fault@mm/memory.c") ? '

kernel-doc is looking through the c code to try to extract additional 
information for enum/typedef/struct/function document comments. Would it be 
worthwhile to adapt kernel-doc so it can parse systemtap tapset files? Is there 
some way to make kernel-doc only pay attention to the comments?

-Will

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Start of Systemtap Tapset Reference manual
  2008-11-20 21:31       ` William Cohen
@ 2008-11-20 21:41         ` Randy Dunlap
  2008-11-21 14:54           ` William Cohen
                             ` (2 more replies)
  0 siblings, 3 replies; 16+ messages in thread
From: Randy Dunlap @ 2008-11-20 21:41 UTC (permalink / raw)
  To: William Cohen; +Cc: Peter Teoh, SystemTAP, Don Domingo, Frank Ch. Eigler

William Cohen wrote:
> I took a look to see how the kernel uses kernel-doc to extract the
> information from the C files. I tried an experiment to see whether
> kernel-doc could extract the comments out of a systemtap tapset file.
> However, it appears that kernel-doc try to grock C syntax and looks for
> a prototype for the function. Thus, it chokes on the following example:
> 
> /**
>  * vm.pagefault - Records that a page fault occurred.
>  * Context: The process which triggered the fault
>  *
>  *  @address: The address of the faulting memory access.
>  *  @write_access: Indicates whether this was a write.
>  */

kernel-doc also wants the @params: listed immediately after the function
name/description (first) line.  Then Context: or other info can be listed
after the params, usually with an intervening "blank" (i.e., " *") line.


> probe vm.pagefault = kernel.function("__handle_mm_fault@mm/memory.c") ?,
>                      kernel.function("handle_mm_fault@mm/memory.c") ?
> {
>     write_access = $write_access
>     address =  $address
> }
> 
> Giving the following error message:
> 
> Error(/home/wcohen/research/profiling/systemtap_write/systemtap_ref//tapset/memory.stp:19):
> cannot understand prototype: 'probe vm.pagefault =
> kernel.function("__handle_mm_fault@mm/memory.c") ?,
> kernel.function("handle_mm_fault@mm/memory.c") ? '
> 
> kernel-doc is looking through the c code to try to extract additional
> information for enum/typedef/struct/function document comments. Would it

It's looking for explicit parameter types and return type since the
@params comments & function name line don't include type info.

> be worthwhile to adapt kernel-doc so it can parse systemtap tapset
> files? Is there some way to make kernel-doc only pay attention to the
> comments?

Not currently, but I don't see why it couldn't be done.  Then the question
becomes:  is it the same scripts/kernel-doc file or is it scripts/stap-doc
(e.g. -- or some other name)?

-- 
~Randy

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Start of Systemtap Tapset Reference manual
  2008-11-20 21:41         ` Randy Dunlap
@ 2008-11-21 14:54           ` William Cohen
  2008-11-21 23:00           ` Tweaks for kernel-doc to parse systemtap tapsets William Cohen
  2008-11-24 16:48           ` Start of Systemtap Tapset Reference manual William Cohen
  2 siblings, 0 replies; 16+ messages in thread
From: William Cohen @ 2008-11-21 14:54 UTC (permalink / raw)
  To: Randy Dunlap; +Cc: Peter Teoh, SystemTAP, Don Domingo, Frank Ch. Eigler

Randy Dunlap wrote:
> William Cohen wrote:
>> I took a look to see how the kernel uses kernel-doc to extract the
>> information from the C files. I tried an experiment to see whether
>> kernel-doc could extract the comments out of a systemtap tapset file.
>> However, it appears that kernel-doc try to grock C syntax and looks for
>> a prototype for the function. Thus, it chokes on the following example:
>>
>> /**
>>  * vm.pagefault - Records that a page fault occurred.
>>  * Context: The process which triggered the fault
>>  *
>>  *  @address: The address of the faulting memory access.
>>  *  @write_access: Indicates whether this was a write.
>>  */
> 
> kernel-doc also wants the @params: listed immediately after the function
> name/description (first) line.  Then Context: or other info can be listed
> after the params, usually with an intervening "blank" (i.e., " *") line.

Thanks for the correction in the kernel-doc syntax.

>>
>> kernel-doc is looking through the c code to try to extract additional
>> information for enum/typedef/struct/function document comments. Would it
> 
> It's looking for explicit parameter types and return type since the
> @params comments & function name line don't include type info.

Ah the stuff that goes in the synopsis section of the output. I see now that 
some of the information is supplied by the C code itself.

>> be worthwhile to adapt kernel-doc so it can parse systemtap tapset
>> files? Is there some way to make kernel-doc only pay attention to the
>> comments?
> 
> Not currently, but I don't see why it couldn't be done.  Then the question
> becomes:  is it the same scripts/kernel-doc file or is it scripts/stap-doc
> (e.g. -- or some other name)?
> 

kernel-doc ignores most of the file. The exception is the material right after 
the kernel-doc documentation comment. The keywords "function", "struct", 
"union", and "enum" control how kernel-doc looks for additional information in 
the source. For systemtap SystemTap would have additional parsing to probes and 
systemtap functions; have process_state_3_probe() and process_state3_sfunction() 
when the appropriate keyword is used to describe the documentation.

Also need to have dump_probe(), dump_sfunction() and the associated variations 
of output_(probe|sfunction)_(html|man|text|xml|gnome) to generate the 
appropriate output for the Systemtap probes and functions.

-Will

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Tweaks for kernel-doc to parse systemtap tapsets
  2008-11-20 21:41         ` Randy Dunlap
  2008-11-21 14:54           ` William Cohen
@ 2008-11-21 23:00           ` William Cohen
  2008-11-24 16:48           ` Start of Systemtap Tapset Reference manual William Cohen
  2 siblings, 0 replies; 16+ messages in thread
From: William Cohen @ 2008-11-21 23:00 UTC (permalink / raw)
  To: Randy Dunlap; +Cc: Peter Teoh, SystemTAP, Don Domingo, Frank Ch. Eigler

[-- Attachment #1: Type: text/plain, Size: 1394 bytes --]

Randy Dunlap wrote:

>> be worthwhile to adapt kernel-doc so it can parse systemtap tapset
>> files? Is there some way to make kernel-doc only pay attention to the
>> comments?
> 
> Not currently, but I don't see why it couldn't be done.  Then the question
> becomes:  is it the same scripts/kernel-doc file or is it scripts/stap-doc
> (e.g. -- or some other name)?

Hi Randy,

I have some modifications to the kernel-doc script that allow it to parse the 
systemtap tapsets and generate some form of xml. I am not completely satisified 
with the current output (only generates xml at the moment and extra junk in the 
synopsis for the parameters for systemtap functions). However, I was hoping to 
get some feedback on the current state of this development.

For the experiment the systemtap sources are located in 
/home/wcohen/research/profiling/systemtap_write/systemtap_ref/. I have the 
kernel-doc script in systemtap_ref/scripts. The memory.stp is in 
systemtap_ref/tapsets. From the directory with the tapsets2.tmpl I was able to 
run the following commands to generate pdf:


SRCTREE=/home/wcohen/research/profiling/systemtap_write/systemtap_ref/ ./docproc 
doc tapsets2.tmpl > c.xml
xmlto pdf c.xml


I like the compactness of the kernel-doc comments. The resulting memory.stp 
looks like something that tapset developers would be likely to update when they 
make some change.

-Will

[-- Attachment #2: kernel-doc --]
[-- Type: text/plain, Size: 65001 bytes --]

#!/usr/bin/perl -w

use strict;

## Copyright (c) 1998 Michael Zucchi, All Rights Reserved        ##
## Copyright (C) 2000, 1  Tim Waugh <twaugh@redhat.com>          ##
## Copyright (C) 2001  Simon Huggins                             ##
## Copyright (C) 2005-2008  Randy Dunlap                         ##
## 								 ##
## #define enhancements by Armin Kuster <akuster@mvista.com>	 ##
## Copyright (c) 2000 MontaVista Software, Inc.			 ##
## 								 ##
## This software falls under the GNU General Public License.     ##
## Please read the COPYING file for more information             ##

# w.o. 03-11-2000: added the '-filelist' option.

# 18/01/2001 - 	Cleanups
# 		Functions prototyped as foo(void) same as foo()
# 		Stop eval'ing where we don't need to.
# -- huggie@earth.li

# 27/06/2001 -  Allowed whitespace after initial "/**" and
#               allowed comments before function declarations.
# -- Christian Kreibich <ck@whoop.org>

# Still to do:
# 	- add perldoc documentation
# 	- Look more closely at some of the scarier bits :)

# 26/05/2001 - 	Support for separate source and object trees.
#		Return error code.
# 		Keith Owens <kaos@ocs.com.au>

# 23/09/2001 - Added support for typedefs, structs, enums and unions
#              Support for Context section; can be terminated using empty line
#              Small fixes (like spaces vs. \s in regex)
# -- Tim Jansen <tim@tjansen.de>


#
# This will read a 'c' file and scan for embedded comments in the
# style of gnome comments (+minor extensions - see below).
#

# Note: This only supports 'c'.

# usage:
# kernel-doc [ -docbook | -html | -text | -man ] [ -no-doc-sections ]
#           [ -function funcname [ -function funcname ...] ] c file(s)s > outputfile
# or
#           [ -nofunction funcname [ -function funcname ...] ] c file(s)s > outputfile
#
#  Set output format using one of -docbook -html -text or -man.  Default is man.
#
#  -no-doc-sections
#	Do not output DOC: sections
#
#  -function funcname
#	If set, then only generate documentation for the given function(s) or
#	DOC: section titles.  All other functions and DOC: sections are ignored.
#
#  -nofunction funcname
#	If set, then only generate documentation for the other function(s)/DOC:
#	sections. Cannot be used together with -function (yes, that's a bug --
#	perl hackers can fix it 8))
#
#  c files - list of 'c' files to process
#
#  All output goes to stdout, with errors to stderr.

#
# format of comments.
# In the following table, (...)? signifies optional structure.
#                         (...)* signifies 0 or more structure elements
# /**
#  * function_name(:)? (- short description)?
# (* @parameterx: (description of parameter x)?)*
# (* a blank line)?
#  * (Description:)? (Description of function)?
#  * (section header: (section description)? )*
#  (*)?*/
#
# So .. the trivial example would be:
#
# /**
#  * my_function
#  **/
#
# If the Description: header tag is omitted, then there must be a blank line
# after the last parameter specification.
# e.g.
# /**
#  * my_function - does my stuff
#  * @my_arg: its mine damnit
#  *
#  * Does my stuff explained.
#  */
#
#  or, could also use:
# /**
#  * my_function - does my stuff
#  * @my_arg: its mine damnit
#  * Description: Does my stuff explained.
#  */
# etc.
#
# Beside functions you can also write documentation for structs, unions,
# enums and typedefs. Instead of the function name you must write the name
# of the declaration;  the struct/union/enum/typedef must always precede
# the name. Nesting of declarations is not supported.
# Use the argument mechanism to document members or constants.
# e.g.
# /**
#  * struct my_struct - short description
#  * @a: first member
#  * @b: second member
#  *
#  * Longer description
#  */
# struct my_struct {
#     int a;
#     int b;
# /* private: */
#     int c;
# };
#
# All descriptions can be multiline, except the short function description.
#
# You can also add additional sections. When documenting kernel functions you
# should document the "Context:" of the function, e.g. whether the functions
# can be called form interrupts. Unlike other sections you can end it with an
# empty line.
# Example-sections should contain the string EXAMPLE so that they are marked
# appropriately in DocBook.
#
# Example:
# /**
#  * user_function - function that can only be called in user context
#  * @a: some argument
#  * Context: !in_interrupt()
#  *
#  * Some description
#  * Example:
#  *    user_function(22);
#  */
# ...
#
#
# All descriptive text is further processed, scanning for the following special
# patterns, which are highlighted appropriately.
#
# 'funcname()' - function
# '$ENVVAR' - environmental variable
# '&struct_name' - name of a structure (up to two words including 'struct')
# '@parameter' - name of a parameter
# '%CONST' - name of a constant.

my $errors = 0;
my $warnings = 0;
my $anon_struct_union = 0;

# match expressions used to find embedded type information
my $type_constant = '\%([-_\w]+)';
my $type_func = '(\w+)\(\)';
my $type_param = '\@(\w+)';
my $type_struct = '\&((struct\s*)*[_\w]+)';
my $type_struct_xml = '\\&amp;((struct\s*)*[_\w]+)';
my $type_env = '(\$\w+)';

# Output conversion substitutions.
#  One for each output format

# these work fairly well
my %highlights_html = ( $type_constant, "<i>\$1</i>",
			$type_func, "<b>\$1</b>",
			$type_struct_xml, "<i>\$1</i>",
			$type_env, "<b><i>\$1</i></b>",
			$type_param, "<tt><b>\$1</b></tt>" );
my $local_lt = "\\\\\\\\lt:";
my $local_gt = "\\\\\\\\gt:";
my $blankline_html = $local_lt . "p" . $local_gt;	# was "<p>"

# XML, docbook format
my %highlights_xml = ( "([^=])\\\"([^\\\"<]+)\\\"", "\$1<quote>\$2</quote>",
			$type_constant, "<constant>\$1</constant>",
			$type_func, "<function>\$1</function>",
			$type_struct_xml, "<structname>\$1</structname>",
			$type_env, "<envar>\$1</envar>",
			$type_param, "<parameter>\$1</parameter>" );
my $blankline_xml = $local_lt . "/para" . $local_gt . $local_lt . "para" . $local_gt . "\n";

# gnome, docbook format
my %highlights_gnome = ( $type_constant, "<replaceable class=\"option\">\$1</replaceable>",
			 $type_func, "<function>\$1</function>",
			 $type_struct, "<structname>\$1</structname>",
			 $type_env, "<envar>\$1</envar>",
			 $type_param, "<parameter>\$1</parameter>" );
my $blankline_gnome = "</para><para>\n";

# these are pretty rough
my %highlights_man = ( $type_constant, "\$1",
		       $type_func, "\\\\fB\$1\\\\fP",
		       $type_struct, "\\\\fI\$1\\\\fP",
		       $type_param, "\\\\fI\$1\\\\fP" );
my $blankline_man = "";

# text-mode
my %highlights_text = ( $type_constant, "\$1",
			$type_func, "\$1",
			$type_struct, "\$1",
			$type_param, "\$1" );
my $blankline_text = "";


sub usage {
    print "Usage: $0 [ -v ] [ -docbook | -html | -text | -man ] [ -no-doc-sections ]\n";
    print "         [ -function funcname [ -function funcname ...] ]\n";
    print "         [ -nofunction funcname [ -nofunction funcname ...] ]\n";
    print "         c source file(s) > outputfile\n";
    print "         -v : verbose output, more warnings & other info listed\n";
    exit 1;
}

# read arguments
if ($#ARGV==-1) {
    usage();
}

my $verbose = 0;
my $output_mode = "man";
my $no_doc_sections = 0;
my %highlights = %highlights_man;
my $blankline = $blankline_man;
my $modulename = "Kernel API";
my $function_only = 0;
my $man_date = ('January', 'February', 'March', 'April', 'May', 'June',
		'July', 'August', 'September', 'October',
		'November', 'December')[(localtime)[4]] .
  " " . ((localtime)[5]+1900);

# Essentially these are globals
# They probably want to be tidied up made more localised or summat.
# CAVEAT EMPTOR!  Some of the others I localised may not want to be which
# could cause "use of undefined value" or other bugs.
my ($function, %function_table,%parametertypes,$declaration_purpose);
my ($type,$declaration_name,$return_type);
my ($newsection,$newcontents,$prototype,$filelist, $brcount, %source_map);

if (defined($ENV{'KBUILD_VERBOSE'})) {
	$verbose = "$ENV{'KBUILD_VERBOSE'}";
}

# Generated docbook code is inserted in a template at a point where
# docbook v3.1 requires a non-zero sequence of RefEntry's; see:
# http://www.oasis-open.org/docbook/documentation/reference/html/refentry.html
# We keep track of number of generated entries and generate a dummy
# if needs be to ensure the expanded template can be postprocessed
# into html.
my $section_counter = 0;

my $lineprefix="";

# states
# 0 - normal code
# 1 - looking for function name
# 2 - scanning field start.
# 3 - scanning prototype.
# 4 - documentation block
my $state;
my $in_doc_sect;

#declaration types: can be
# 'function', 'struct', 'union', 'enum', 'typedef', 'probe', 'sfunction'
my $decl_type;

my $doc_special = "\@\%\$\&";

my $doc_start = '^/\*\*\s*$'; # Allow whitespace at end of comment start.
my $doc_end = '\*/';
my $doc_com = '\s*\*\s*';
my $doc_decl = $doc_com.'(\w+)';
my $doc_sect = $doc_com.'(['.$doc_special.']?[\w\s]+):(.*)';
my $doc_content = $doc_com.'(.*)';
my $doc_block = $doc_com.'DOC:\s*(.*)?';

my %constants;
my %parameterdescs;
my @parameterlist;
my %sections;
my @sectionlist;

my $contents = "";
my $section_default = "Description";	# default section
my $section_intro = "Introduction";
my $section = $section_default;
my $section_context = "Context";

my $undescribed = "-- undescribed --";

reset_state();

while ($ARGV[0] =~ m/^-(.*)/) {
    my $cmd = shift @ARGV;
    if ($cmd eq "-html") {
	$output_mode = "html";
	%highlights = %highlights_html;
	$blankline = $blankline_html;
    } elsif ($cmd eq "-man") {
	$output_mode = "man";
	%highlights = %highlights_man;
	$blankline = $blankline_man;
    } elsif ($cmd eq "-text") {
	$output_mode = "text";
	%highlights = %highlights_text;
	$blankline = $blankline_text;
    } elsif ($cmd eq "-docbook") {
	$output_mode = "xml";
	%highlights = %highlights_xml;
	$blankline = $blankline_xml;
    } elsif ($cmd eq "-gnome") {
	$output_mode = "gnome";
	%highlights = %highlights_gnome;
	$blankline = $blankline_gnome;
    } elsif ($cmd eq "-module") { # not needed for XML, inherits from calling document
	$modulename = shift @ARGV;
    } elsif ($cmd eq "-function") { # to only output specific functions
	$function_only = 1;
	$function = shift @ARGV;
	$function_table{$function} = 1;
    } elsif ($cmd eq "-nofunction") { # to only output specific functions
	$function_only = 2;
	$function = shift @ARGV;
	$function_table{$function} = 1;
    } elsif ($cmd eq "-v") {
	$verbose = 1;
    } elsif (($cmd eq "-h") || ($cmd eq "--help")) {
	usage();
    } elsif ($cmd eq '-filelist') {
	    $filelist = shift @ARGV;
    } elsif ($cmd eq '-no-doc-sections') {
	    $no_doc_sections = 1;
    }
}

# get kernel version from env
sub get_kernel_version() {
    my $version = 'unknown kernel version';

    if (defined($ENV{'KERNELVERSION'})) {
	$version = $ENV{'KERNELVERSION'};
    }
    return $version;
}
my $kernelversion = get_kernel_version();

# generate a sequence of code that will splice in highlighting information
# using the s// operator.
my $dohighlight = "";
foreach my $pattern (keys %highlights) {
#   print STDERR "scanning pattern:$pattern, highlight:($highlights{$pattern})\n";
    $dohighlight .=  "\$contents =~ s:$pattern:$highlights{$pattern}:gs;\n";
}

##
# dumps section contents to arrays/hashes intended for that purpose.
#
sub dump_section {
    my $file = shift;
    my $name = shift;
    my $contents = join "\n", @_;

    if ($name =~ m/$type_constant/) {
	$name = $1;
#	print STDERR "constant section '$1' = '$contents'\n";
	$constants{$name} = $contents;
    } elsif ($name =~ m/$type_param/) {
#	print STDERR "parameter def '$1' = '$contents'\n";
	$name = $1;
	$parameterdescs{$name} = $contents;
    } else {
#	print STDERR "other section '$name' = '$contents'\n";
	if (defined($sections{$name}) && ($sections{$name} ne "")) {
		print STDERR "Error(${file}:$.): duplicate section name '$name'\n";
		++$errors;
	}
	$sections{$name} = $contents;
	push @sectionlist, $name;
    }
}

##
# dump DOC: section after checking that it should go out
#
sub dump_doc_section {
    my $file = shift;
    my $name = shift;
    my $contents = join "\n", @_;

    if ($no_doc_sections) {
        return;
    }

    if (($function_only == 0) ||
	( $function_only == 1 && defined($function_table{$name})) ||
	( $function_only == 2 && !defined($function_table{$name})))
    {
	dump_section($file, $name, $contents);
	output_blockhead({'sectionlist' => \@sectionlist,
			  'sections' => \%sections,
			  'module' => $modulename,
			  'content-only' => ($function_only != 0), });
    }
}

##
# output function
#
# parameterdescs, a hash.
#  function => "function name"
#  parameterlist => @list of parameters
#  parameterdescs => %parameter descriptions
#  sectionlist => @list of sections
#  sections => %section descriptions
#

sub output_highlight {
    my $contents = join "\n",@_;
    my $line;

#   DEBUG
#   if (!defined $contents) {
#	use Carp;
#	confess "output_highlight got called with no args?\n";
#   }

    if ($output_mode eq "html" || $output_mode eq "xml") {
	$contents = local_unescape($contents);
	# convert data read & converted thru xml_escape() into &xyz; format:
	$contents =~ s/\\\\\\/&/g;
    }
#   print STDERR "contents b4:$contents\n";
    eval $dohighlight;
    die $@ if $@;
#   print STDERR "contents af:$contents\n";

    foreach $line (split "\n", $contents) {
	if ($line eq ""){
	    print $lineprefix, local_unescape($blankline);
	} else {
	    $line =~ s/\\\\\\/\&/g;
	    if ($output_mode eq "man" && substr($line, 0, 1) eq ".") {
		print "\\&$line";
	    } else {
		print $lineprefix, $line;
	    }
	}
	print "\n";
    }
}

#output sections in html
sub output_section_html(%) {
    my %args = %{$_[0]};
    my $section;

    foreach $section (@{$args{'sectionlist'}}) {
	print "<h3>$section</h3>\n";
	print "<blockquote>\n";
	output_highlight($args{'sections'}{$section});
	print "</blockquote>\n";
    }
}

# output enum in html
sub output_enum_html(%) {
    my %args = %{$_[0]};
    my ($parameter);
    my $count;
    print "<h2>enum ".$args{'enum'}."</h2>\n";

    print "<b>enum ".$args{'enum'}."</b> {<br>\n";
    $count = 0;
    foreach $parameter (@{$args{'parameterlist'}}) {
	print " <b>".$parameter."</b>";
	if ($count != $#{$args{'parameterlist'}}) {
	    $count++;
	    print ",\n";
	}
	print "<br>";
    }
    print "};<br>\n";

    print "<h3>Constants</h3>\n";
    print "<dl>\n";
    foreach $parameter (@{$args{'parameterlist'}}) {
	print "<dt><b>".$parameter."</b>\n";
	print "<dd>";
	output_highlight($args{'parameterdescs'}{$parameter});
    }
    print "</dl>\n";
    output_section_html(@_);
    print "<hr>\n";
}

# output typedef in html
sub output_typedef_html(%) {
    my %args = %{$_[0]};
    my ($parameter);
    my $count;
    print "<h2>typedef ".$args{'typedef'}."</h2>\n";

    print "<b>typedef ".$args{'typedef'}."</b>\n";
    output_section_html(@_);
    print "<hr>\n";
}

# output struct in html
sub output_struct_html(%) {
    my %args = %{$_[0]};
    my ($parameter);

    print "<h2>".$args{'type'}." ".$args{'struct'}. " - " .$args{'purpose'}."</h2>\n";
    print "<b>".$args{'type'}." ".$args{'struct'}."</b> {<br>\n";
    foreach $parameter (@{$args{'parameterlist'}}) {
	if ($parameter =~ /^#/) {
		print "$parameter<br>\n";
		next;
	}
	my $parameter_name = $parameter;
	$parameter_name =~ s/\[.*//;

	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
	$type = $args{'parametertypes'}{$parameter};
	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
	    # pointer-to-function
	    print "&nbsp; &nbsp; <i>$1</i><b>$parameter</b>) <i>($2)</i>;<br>\n";
	} elsif ($type =~ m/^(.*?)\s*(:.*)/) {
	    # bitfield
	    print "&nbsp; &nbsp; <i>$1</i> <b>$parameter</b>$2;<br>\n";
	} else {
	    print "&nbsp; &nbsp; <i>$type</i> <b>$parameter</b>;<br>\n";
	}
    }
    print "};<br>\n";

    print "<h3>Members</h3>\n";
    print "<dl>\n";
    foreach $parameter (@{$args{'parameterlist'}}) {
	($parameter =~ /^#/) && next;

	my $parameter_name = $parameter;
	$parameter_name =~ s/\[.*//;

	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
	print "<dt><b>".$parameter."</b>\n";
	print "<dd>";
	output_highlight($args{'parameterdescs'}{$parameter_name});
    }
    print "</dl>\n";
    output_section_html(@_);
    print "<hr>\n";
}

# output function in html
sub output_function_html(%) {
    my %args = %{$_[0]};
    my ($parameter, $section);
    my $count;

    print "<h2>" .$args{'function'}." - ".$args{'purpose'}."</h2>\n";
    print "<i>".$args{'functiontype'}."</i>\n";
    print "<b>".$args{'function'}."</b>\n";
    print "(";
    $count = 0;
    foreach $parameter (@{$args{'parameterlist'}}) {
	$type = $args{'parametertypes'}{$parameter};
	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
	    # pointer-to-function
	    print "<i>$1</i><b>$parameter</b>) <i>($2)</i>";
	} else {
	    print "<i>".$type."</i> <b>".$parameter."</b>";
	}
	if ($count != $#{$args{'parameterlist'}}) {
	    $count++;
	    print ",\n";
	}
    }
    print ")\n";

    print "<h3>Arguments</h3>\n";
    print "<dl>\n";
    foreach $parameter (@{$args{'parameterlist'}}) {
	my $parameter_name = $parameter;
	$parameter_name =~ s/\[.*//;

	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
	print "<dt><b>".$parameter."</b>\n";
	print "<dd>";
	output_highlight($args{'parameterdescs'}{$parameter_name});
    }
    print "</dl>\n";
    output_section_html(@_);
    print "<hr>\n";
}

# output probe in html
sub output_probe_html(%) {
    my %args = %{$_[0]};
    my ($parameter, $section);
    my $count;

}

# output sfunction in html
sub output_sfunction_html(%) {
    my %args = %{$_[0]};
    my ($parameter, $section);
    my $count;

}

# output DOC: block header in html
sub output_blockhead_html(%) {
    my %args = %{$_[0]};
    my ($parameter, $section);
    my $count;

    foreach $section (@{$args{'sectionlist'}}) {
	print "<h3>$section</h3>\n";
	print "<ul>\n";
	output_highlight($args{'sections'}{$section});
	print "</ul>\n";
    }
    print "<hr>\n";
}

sub output_section_xml(%) {
    my %args = %{$_[0]};
    my $section;
    # print out each section
    $lineprefix="   ";
    foreach $section (@{$args{'sectionlist'}}) {
	print "<refsect1>\n";
	print "<title>$section</title>\n";
	if ($section =~ m/EXAMPLE/i) {
	    print "<informalexample><programlisting>\n";
	} else {
	    print "<para>\n";
	}
	output_highlight($args{'sections'}{$section});
	if ($section =~ m/EXAMPLE/i) {
	    print "</programlisting></informalexample>\n";
	} else {
	    print "</para>\n";
	}
	print "</refsect1>\n";
    }
}

# output function in XML DocBook
sub output_function_xml(%) {
    my %args = %{$_[0]};
    my ($parameter, $section);
    my $count;
    my $id;

    $id = "API-".$args{'function'};
    $id =~ s/[^A-Za-z0-9]/-/g;

    print "<refentry id=\"$id\">\n";
    print "<refentryinfo>\n";
    print " <title>LINUX</title>\n";
    print " <productname>Kernel Hackers Manual</productname>\n";
    print " <date>$man_date</date>\n";
    print "</refentryinfo>\n";
    print "<refmeta>\n";
    print " <refentrytitle><phrase>".$args{'function'}."</phrase></refentrytitle>\n";
    print " <manvolnum>9</manvolnum>\n";
    print " <refmiscinfo class=\"version\">" . $kernelversion . "</refmiscinfo>\n";
    print "</refmeta>\n";
    print "<refnamediv>\n";
    print " <refname>".$args{'function'}."</refname>\n";
    print " <refpurpose>\n";
    print "  ";
    output_highlight ($args{'purpose'});
    print " </refpurpose>\n";
    print "</refnamediv>\n";

    print "<refsynopsisdiv>\n";
    print " <title>Synopsis</title>\n";
    print "  <funcsynopsis><funcprototype>\n";
    print "   <funcdef>".$args{'functiontype'}." ";
    print "<function>".$args{'function'}." </function></funcdef>\n";

    $count = 0;
    if ($#{$args{'parameterlist'}} >= 0) {
	foreach $parameter (@{$args{'parameterlist'}}) {
	    $type = $args{'parametertypes'}{$parameter};
	    if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
		# pointer-to-function
		print "   <paramdef>$1<parameter>$parameter</parameter>)\n";
		print "     <funcparams>$2</funcparams></paramdef>\n";
	    } else {
		print "   <paramdef>".$type;
		print " <parameter>$parameter</parameter></paramdef>\n";
	    }
	}
    } else {
	print "  <void/>\n";
    }
    print "  </funcprototype></funcsynopsis>\n";
    print "</refsynopsisdiv>\n";

    # print parameters
    print "<refsect1>\n <title>Arguments</title>\n";
    if ($#{$args{'parameterlist'}} >= 0) {
	print " <variablelist>\n";
	foreach $parameter (@{$args{'parameterlist'}}) {
	    my $parameter_name = $parameter;
	    $parameter_name =~ s/\[.*//;

	    print "  <varlistentry>\n   <term><parameter>$parameter</parameter></term>\n";
	    print "   <listitem>\n    <para>\n";
	    $lineprefix="     ";
	    output_highlight($args{'parameterdescs'}{$parameter_name});
	    print "    </para>\n   </listitem>\n  </varlistentry>\n";
	}
	print " </variablelist>\n";
    } else {
	print " <para>\n  None\n </para>\n";
    }
    print "</refsect1>\n";

    output_section_xml(@_);
    print "</refentry>\n\n";
}

# output struct in XML DocBook
sub output_struct_xml(%) {
    my %args = %{$_[0]};
    my ($parameter, $section);
    my $id;

    $id = "API-struct-".$args{'struct'};
    $id =~ s/[^A-Za-z0-9]/-/g;

    print "<refentry id=\"$id\">\n";
    print "<refentryinfo>\n";
    print " <title>LINUX</title>\n";
    print " <productname>Kernel Hackers Manual</productname>\n";
    print " <date>$man_date</date>\n";
    print "</refentryinfo>\n";
    print "<refmeta>\n";
    print " <refentrytitle><phrase>".$args{'type'}." ".$args{'struct'}."</phrase></refentrytitle>\n";
    print " <manvolnum>9</manvolnum>\n";
    print " <refmiscinfo class=\"version\">" . $kernelversion . "</refmiscinfo>\n";
    print "</refmeta>\n";
    print "<refnamediv>\n";
    print " <refname>".$args{'type'}." ".$args{'struct'}."</refname>\n";
    print " <refpurpose>\n";
    print "  ";
    output_highlight ($args{'purpose'});
    print " </refpurpose>\n";
    print "</refnamediv>\n";

    print "<refsynopsisdiv>\n";
    print " <title>Synopsis</title>\n";
    print "  <programlisting>\n";
    print $args{'type'}." ".$args{'struct'}." {\n";
    foreach $parameter (@{$args{'parameterlist'}}) {
	if ($parameter =~ /^#/) {
	    print "$parameter\n";
	    next;
	}

	my $parameter_name = $parameter;
	$parameter_name =~ s/\[.*//;

	defined($args{'parameterdescs'}{$parameter_name}) || next;
	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
	$type = $args{'parametertypes'}{$parameter};
	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
	    # pointer-to-function
	    print "  $1 $parameter) ($2);\n";
	} elsif ($type =~ m/^(.*?)\s*(:.*)/) {
	    # bitfield
	    print "  $1 $parameter$2;\n";
	} else {
	    print "  ".$type." ".$parameter.";\n";
	}
    }
    print "};";
    print "  </programlisting>\n";
    print "</refsynopsisdiv>\n";

    print " <refsect1>\n";
    print "  <title>Members</title>\n";

    if ($#{$args{'parameterlist'}} >= 0) {
    print "  <variablelist>\n";
    foreach $parameter (@{$args{'parameterlist'}}) {
      ($parameter =~ /^#/) && next;

      my $parameter_name = $parameter;
      $parameter_name =~ s/\[.*//;

      defined($args{'parameterdescs'}{$parameter_name}) || next;
      ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
      print "    <varlistentry>";
      print "      <term>$parameter</term>\n";
      print "      <listitem><para>\n";
      output_highlight($args{'parameterdescs'}{$parameter_name});
      print "      </para></listitem>\n";
      print "    </varlistentry>\n";
    }
    print "  </variablelist>\n";
    } else {
	print " <para>\n  None\n </para>\n";
    }
    print " </refsect1>\n";

    output_section_xml(@_);

    print "</refentry>\n\n";
}

# output enum in XML DocBook
sub output_enum_xml(%) {
    my %args = %{$_[0]};
    my ($parameter, $section);
    my $count;
    my $id;

    $id = "API-enum-".$args{'enum'};
    $id =~ s/[^A-Za-z0-9]/-/g;

    print "<refentry id=\"$id\">\n";
    print "<refentryinfo>\n";
    print " <title>LINUX</title>\n";
    print " <productname>Kernel Hackers Manual</productname>\n";
    print " <date>$man_date</date>\n";
    print "</refentryinfo>\n";
    print "<refmeta>\n";
    print " <refentrytitle><phrase>enum ".$args{'enum'}."</phrase></refentrytitle>\n";
    print " <manvolnum>9</manvolnum>\n";
    print " <refmiscinfo class=\"version\">" . $kernelversion . "</refmiscinfo>\n";
    print "</refmeta>\n";
    print "<refnamediv>\n";
    print " <refname>enum ".$args{'enum'}."</refname>\n";
    print " <refpurpose>\n";
    print "  ";
    output_highlight ($args{'purpose'});
    print " </refpurpose>\n";
    print "</refnamediv>\n";

    print "<refsynopsisdiv>\n";
    print " <title>Synopsis</title>\n";
    print "  <programlisting>\n";
    print "enum ".$args{'enum'}." {\n";
    $count = 0;
    foreach $parameter (@{$args{'parameterlist'}}) {
	print "  $parameter";
	if ($count != $#{$args{'parameterlist'}}) {
	    $count++;
	    print ",";
	}
	print "\n";
    }
    print "};";
    print "  </programlisting>\n";
    print "</refsynopsisdiv>\n";

    print "<refsect1>\n";
    print " <title>Constants</title>\n";
    print "  <variablelist>\n";
    foreach $parameter (@{$args{'parameterlist'}}) {
      my $parameter_name = $parameter;
      $parameter_name =~ s/\[.*//;

      print "    <varlistentry>";
      print "      <term>$parameter</term>\n";
      print "      <listitem><para>\n";
      output_highlight($args{'parameterdescs'}{$parameter_name});
      print "      </para></listitem>\n";
      print "    </varlistentry>\n";
    }
    print "  </variablelist>\n";
    print "</refsect1>\n";

    output_section_xml(@_);

    print "</refentry>\n\n";
}

# output typedef in XML DocBook
sub output_typedef_xml(%) {
    my %args = %{$_[0]};
    my ($parameter, $section);
    my $id;

    $id = "API-typedef-".$args{'typedef'};
    $id =~ s/[^A-Za-z0-9]/-/g;

    print "<refentry id=\"$id\">\n";
    print "<refentryinfo>\n";
    print " <title>LINUX</title>\n";
    print " <productname>Kernel Hackers Manual</productname>\n";
    print " <date>$man_date</date>\n";
    print "</refentryinfo>\n";
    print "<refmeta>\n";
    print " <refentrytitle><phrase>typedef ".$args{'typedef'}."</phrase></refentrytitle>\n";
    print " <manvolnum>9</manvolnum>\n";
    print "</refmeta>\n";
    print "<refnamediv>\n";
    print " <refname>typedef ".$args{'typedef'}."</refname>\n";
    print " <refpurpose>\n";
    print "  ";
    output_highlight ($args{'purpose'});
    print " </refpurpose>\n";
    print "</refnamediv>\n";

    print "<refsynopsisdiv>\n";
    print " <title>Synopsis</title>\n";
    print "  <synopsis>typedef ".$args{'typedef'}.";</synopsis>\n";
    print "</refsynopsisdiv>\n";

    output_section_xml(@_);

    print "</refentry>\n\n";
}

# output in XML DocBook
sub output_blockhead_xml(%) {
    my %args = %{$_[0]};
    my ($parameter, $section);
    my $count;

    my $id = $args{'module'};
    $id =~ s/[^A-Za-z0-9]/-/g;

    # print out each section
    $lineprefix="   ";
    foreach $section (@{$args{'sectionlist'}}) {
	if (!$args{'content-only'}) {
		print "<refsect1>\n <title>$section</title>\n";
	}
	if ($section =~ m/EXAMPLE/i) {
	    print "<example><para>\n";
	} else {
	    print "<para>\n";
	}
	output_highlight($args{'sections'}{$section});
	if ($section =~ m/EXAMPLE/i) {
	    print "</para></example>\n";
	} else {
	    print "</para>";
	}
	if (!$args{'content-only'}) {
		print "\n</refsect1>\n";
	}
    }

    print "\n\n";
}

# output in XML DocBook
sub output_probe_xml(%) {
    my %args = %{$_[0]};
    my ($parameter, $section);
    my $count;
    my $id;

    $id = "API-".$args{'probe'};
    $id =~ s/[^A-Za-z0-9]/-/g;
    print "<refentry id=\"$id\">\n";
    print "<refentryinfo>\n";
    print " <title>LINUX</title>\n";
    print " <productname>Kernel Hackers Manual</productname>\n";
    print " <date>$man_date</date>\n";
    print "</refentryinfo>\n";
    print "<refmeta>\n";
    print " <refentrytitle><phrase>".$args{'probe'}."</phrase></refentrytitle>\n";
    print " <manvolnum>9</manvolnum>\n";
    print " <refmiscinfo class=\"version\">" . $kernelversion . "</refmiscinfo>\n";
    print "</refmeta>\n";
    print "<refnamediv>\n";
    print " <refname>".$args{'probe'}."</refname>\n";
    print " <refpurpose>\n";
    print "  ";
    output_highlight ($args{'purpose'});
    print " </refpurpose>\n";
    print "</refnamediv>\n";

    print "<refsynopsisdiv>\n";
    print " <title>Synopsis</title>\n";
    print "<synopsis>".$args{'probe'}." </synopsis>\n";
    print "</refsynopsisdiv>\n";

    # print parameters
    print "<refsect1>\n <title>Values</title>\n";
    if ($#{$args{'parameterlist'}} >= 0) {
	print " <variablelist>\n";
	foreach $parameter (@{$args{'parameterlist'}}) {
	    my $parameter_name = $parameter;
	    $parameter_name =~ s/\[.*//;

	    print "  <varlistentry>\n   <term><parameter>$parameter</parameter></term>\n";
	    print "   <listitem>\n    <para>\n";
	    $lineprefix="     ";
	    output_highlight($args{'parameterdescs'}{$parameter_name});
	    print "    </para>\n   </listitem>\n  </varlistentry>\n";
	}
	print " </variablelist>\n";
    } else {
	print " <para>\n  None\n </para>\n";
    }
    print "</refsect1>\n";

    output_section_xml(@_);
    print "</refentry>\n\n";
}

# output in XML DocBook
sub output_sfunction_xml(%) {
    my %args = %{$_[0]};
    my ($parameter, $section);
    my $count;
    my $id;

    $id = "API-".$args{'sfunction'};
    $id =~ s/[^A-Za-z0-9]/-/g;

    print "<refentry id=\"$id\">\n";
    print "<refentryinfo>\n";
    print " <title>LINUX</title>\n";
    print " <productname>Kernel Hackers Manual</productname>\n";
    print " <date>$man_date</date>\n";
    print "</refentryinfo>\n";
    print "<refmeta>\n";
    print " <refentrytitle><phrase>".$args{'sfunction'}."</phrase></refentrytitle>\n";
    print " <manvolnum>9</manvolnum>\n";
    print " <refmiscinfo class=\"version\">" . $kernelversion . "</refmiscinfo>\n";
    print "</refmeta>\n";
    print "<refnamediv>\n";
    print " <refname>".$args{'sfunction'}."</refname>\n";
    print " <refpurpose>\n";
    print "  ";
    output_highlight ($args{'purpose'});
    print " </refpurpose>\n";
    print "</refnamediv>\n";

    print "<refsynopsisdiv>\n";
    print " <title>Synopsis</title>\n";
    print "  <funcsynopsis><funcprototype>\n";
    print "   <funcdef><function>".$args{'sfunction'}.":";
    print $args{'functiontype'}."</function></funcdef>\n";

    if ($#{$args{'parameterlist'}} >= 0) {
	foreach $parameter (@{$args{'parameterlist'}}) {
	    $type = $args{'parametertypes'}{$parameter};
	    print "   <paramdef><parameter>".$parameter;
	    print ":".$type."</parameter></paramdef>\n";

	}
    } else {
	print "  <void/>\n";
    }
    print "  </funcprototype></funcsynopsis>\n";
    print "</refsynopsisdiv>\n";

    # print parameters
    print "<refsect1>\n <title>Arguments</title>\n";
    if ($#{$args{'parameterlist'}} >= 0) {
	print " <variablelist>\n";
	foreach $parameter (@{$args{'parameterlist'}}) {
	    my $parameter_name = $parameter;
	    $parameter_name =~ s/\[.*//;

	    print "  <varlistentry>\n   <term><parameter>$parameter</parameter></term>\n";
	    print "   <listitem>\n    <para>\n";
	    $lineprefix="     ";
	    output_highlight($args{'parameterdescs'}{$parameter_name});
	    print "    </para>\n   </listitem>\n  </varlistentry>\n";
	}
	print " </variablelist>\n";
    } else {
	print " <para>\n  None\n </para>\n";
    }
    print "</refsect1>\n";

    output_section_xml(@_);
    print "</refentry>\n\n";
}

# output in XML DocBook
sub output_function_gnome {
    my %args = %{$_[0]};
    my ($parameter, $section);
    my $count;
    my $id;

    $id = $args{'module'}."-".$args{'function'};
    $id =~ s/[^A-Za-z0-9]/-/g;

    print "<sect2>\n";
    print " <title id=\"$id\">".$args{'function'}."</title>\n";

    print "  <funcsynopsis>\n";
    print "   <funcdef>".$args{'functiontype'}." ";
    print "<function>".$args{'function'}." ";
    print "</function></funcdef>\n";

    $count = 0;
    if ($#{$args{'parameterlist'}} >= 0) {
	foreach $parameter (@{$args{'parameterlist'}}) {
	    $type = $args{'parametertypes'}{$parameter};
	    if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
		# pointer-to-function
		print "   <paramdef>$1 <parameter>$parameter</parameter>)\n";
		print "     <funcparams>$2</funcparams></paramdef>\n";
	    } else {
		print "   <paramdef>".$type;
		print " <parameter>$parameter</parameter></paramdef>\n";
	    }
	}
    } else {
	print "  <void>\n";
    }
    print "  </funcsynopsis>\n";
    if ($#{$args{'parameterlist'}} >= 0) {
	print " <informaltable pgwide=\"1\" frame=\"none\" role=\"params\">\n";
	print "<tgroup cols=\"2\">\n";
	print "<colspec colwidth=\"2*\">\n";
	print "<colspec colwidth=\"8*\">\n";
	print "<tbody>\n";
	foreach $parameter (@{$args{'parameterlist'}}) {
	    my $parameter_name = $parameter;
	    $parameter_name =~ s/\[.*//;

	    print "  <row><entry align=\"right\"><parameter>$parameter</parameter></entry>\n";
	    print "   <entry>\n";
	    $lineprefix="     ";
	    output_highlight($args{'parameterdescs'}{$parameter_name});
	    print "    </entry></row>\n";
	}
	print " </tbody></tgroup></informaltable>\n";
    } else {
	print " <para>\n  None\n </para>\n";
    }

    # print out each section
    $lineprefix="   ";
    foreach $section (@{$args{'sectionlist'}}) {
	print "<simplesect>\n <title>$section</title>\n";
	if ($section =~ m/EXAMPLE/i) {
	    print "<example><programlisting>\n";
	} else {
	}
	print "<para>\n";
	output_highlight($args{'sections'}{$section});
	print "</para>\n";
	if ($section =~ m/EXAMPLE/i) {
	    print "</programlisting></example>\n";
	} else {
	}
	print " </simplesect>\n";
    }

    print "</sect2>\n\n";
}

##
# output function in man
sub output_function_man(%) {
    my %args = %{$_[0]};
    my ($parameter, $section);
    my $count;

    print ".TH \"$args{'function'}\" 9 \"$args{'function'}\" \"$man_date\" \"Kernel Hacker's Manual\" LINUX\n";

    print ".SH NAME\n";
    print $args{'function'}." \\- ".$args{'purpose'}."\n";

    print ".SH SYNOPSIS\n";
    if ($args{'functiontype'} ne "") {
	print ".B \"".$args{'functiontype'}."\" ".$args{'function'}."\n";
    } else {
	print ".B \"".$args{'function'}."\n";
    }
    $count = 0;
    my $parenth = "(";
    my $post = ",";
    foreach my $parameter (@{$args{'parameterlist'}}) {
	if ($count == $#{$args{'parameterlist'}}) {
	    $post = ");";
	}
	$type = $args{'parametertypes'}{$parameter};
	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
	    # pointer-to-function
	    print ".BI \"".$parenth.$1."\" ".$parameter." \") (".$2.")".$post."\"\n";
	} else {
	    $type =~ s/([^\*])$/$1 /;
	    print ".BI \"".$parenth.$type."\" ".$parameter." \"".$post."\"\n";
	}
	$count++;
	$parenth = "";
    }

    print ".SH ARGUMENTS\n";
    foreach $parameter (@{$args{'parameterlist'}}) {
	my $parameter_name = $parameter;
	$parameter_name =~ s/\[.*//;

	print ".IP \"".$parameter."\" 12\n";
	output_highlight($args{'parameterdescs'}{$parameter_name});
    }
    foreach $section (@{$args{'sectionlist'}}) {
	print ".SH \"", uc $section, "\"\n";
	output_highlight($args{'sections'}{$section});
    }
}

##
# output enum in man
sub output_enum_man(%) {
    my %args = %{$_[0]};
    my ($parameter, $section);
    my $count;

    print ".TH \"$args{'module'}\" 9 \"enum $args{'enum'}\" \"$man_date\" \"API Manual\" LINUX\n";

    print ".SH NAME\n";
    print "enum ".$args{'enum'}." \\- ".$args{'purpose'}."\n";

    print ".SH SYNOPSIS\n";
    print "enum ".$args{'enum'}." {\n";
    $count = 0;
    foreach my $parameter (@{$args{'parameterlist'}}) {
	print ".br\n.BI \"    $parameter\"\n";
	if ($count == $#{$args{'parameterlist'}}) {
	    print "\n};\n";
	    last;
	}
	else {
	    print ", \n.br\n";
	}
	$count++;
    }

    print ".SH Constants\n";
    foreach $parameter (@{$args{'parameterlist'}}) {
	my $parameter_name = $parameter;
	$parameter_name =~ s/\[.*//;

	print ".IP \"".$parameter."\" 12\n";
	output_highlight($args{'parameterdescs'}{$parameter_name});
    }
    foreach $section (@{$args{'sectionlist'}}) {
	print ".SH \"$section\"\n";
	output_highlight($args{'sections'}{$section});
    }
}

##
# output struct in man
sub output_struct_man(%) {
    my %args = %{$_[0]};
    my ($parameter, $section);

    print ".TH \"$args{'module'}\" 9 \"".$args{'type'}." ".$args{'struct'}."\" \"$man_date\" \"API Manual\" LINUX\n";

    print ".SH NAME\n";
    print $args{'type'}." ".$args{'struct'}." \\- ".$args{'purpose'}."\n";

    print ".SH SYNOPSIS\n";
    print $args{'type'}." ".$args{'struct'}." {\n.br\n";

    foreach my $parameter (@{$args{'parameterlist'}}) {
	if ($parameter =~ /^#/) {
	    print ".BI \"$parameter\"\n.br\n";
	    next;
	}
	my $parameter_name = $parameter;
	$parameter_name =~ s/\[.*//;

	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
	$type = $args{'parametertypes'}{$parameter};
	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
	    # pointer-to-function
	    print ".BI \"    ".$1."\" ".$parameter." \") (".$2.")"."\"\n;\n";
	} elsif ($type =~ m/^(.*?)\s*(:.*)/) {
	    # bitfield
	    print ".BI \"    ".$1."\ \" ".$parameter.$2." \""."\"\n;\n";
	} else {
	    $type =~ s/([^\*])$/$1 /;
	    print ".BI \"    ".$type."\" ".$parameter." \""."\"\n;\n";
	}
	print "\n.br\n";
    }
    print "};\n.br\n";

    print ".SH Members\n";
    foreach $parameter (@{$args{'parameterlist'}}) {
	($parameter =~ /^#/) && next;

	my $parameter_name = $parameter;
	$parameter_name =~ s/\[.*//;

	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
	print ".IP \"".$parameter."\" 12\n";
	output_highlight($args{'parameterdescs'}{$parameter_name});
    }
    foreach $section (@{$args{'sectionlist'}}) {
	print ".SH \"$section\"\n";
	output_highlight($args{'sections'}{$section});
    }
}

##
# output typedef in man
sub output_typedef_man(%) {
    my %args = %{$_[0]};
    my ($parameter, $section);

    print ".TH \"$args{'module'}\" 9 \"$args{'typedef'}\" \"$man_date\" \"API Manual\" LINUX\n";

    print ".SH NAME\n";
    print "typedef ".$args{'typedef'}." \\- ".$args{'purpose'}."\n";

    foreach $section (@{$args{'sectionlist'}}) {
	print ".SH \"$section\"\n";
	output_highlight($args{'sections'}{$section});
    }
}

sub output_blockhead_man(%) {
    my %args = %{$_[0]};
    my ($parameter, $section);
    my $count;

    print ".TH \"$args{'module'}\" 9 \"$args{'module'}\" \"$man_date\" \"API Manual\" LINUX\n";

    foreach $section (@{$args{'sectionlist'}}) {
	print ".SH \"$section\"\n";
	output_highlight($args{'sections'}{$section});
    }
}

##
# output probe in man
sub output_probe_man(%) {
    my %args = %{$_[0]};
    my ($parameter, $section);

}

##
# output sfunction in man
sub output_sfunction_man(%) {
    my %args = %{$_[0]};
    my ($parameter, $section);

}

##
# output in text
sub output_function_text(%) {
    my %args = %{$_[0]};
    my ($parameter, $section);
    my $start;

    print "Name:\n\n";
    print $args{'function'}." - ".$args{'purpose'}."\n";

    print "\nSynopsis:\n\n";
    if ($args{'functiontype'} ne "") {
	$start = $args{'functiontype'}." ".$args{'function'}." (";
    } else {
	$start = $args{'function'}." (";
    }
    print $start;

    my $count = 0;
    foreach my $parameter (@{$args{'parameterlist'}}) {
	$type = $args{'parametertypes'}{$parameter};
	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
	    # pointer-to-function
	    print $1.$parameter.") (".$2;
	} else {
	    print $type." ".$parameter;
	}
	if ($count != $#{$args{'parameterlist'}}) {
	    $count++;
	    print ",\n";
	    print " " x length($start);
	} else {
	    print ");\n\n";
	}
    }

    print "Arguments:\n\n";
    foreach $parameter (@{$args{'parameterlist'}}) {
	my $parameter_name = $parameter;
	$parameter_name =~ s/\[.*//;

	print $parameter."\n\t".$args{'parameterdescs'}{$parameter_name}."\n";
    }
    output_section_text(@_);
}

#output sections in text
sub output_section_text(%) {
    my %args = %{$_[0]};
    my $section;

    print "\n";
    foreach $section (@{$args{'sectionlist'}}) {
	print "$section:\n\n";
	output_highlight($args{'sections'}{$section});
    }
    print "\n\n";
}

# output enum in text
sub output_enum_text(%) {
    my %args = %{$_[0]};
    my ($parameter);
    my $count;
    print "Enum:\n\n";

    print "enum ".$args{'enum'}." - ".$args{'purpose'}."\n\n";
    print "enum ".$args{'enum'}." {\n";
    $count = 0;
    foreach $parameter (@{$args{'parameterlist'}}) {
	print "\t$parameter";
	if ($count != $#{$args{'parameterlist'}}) {
	    $count++;
	    print ",";
	}
	print "\n";
    }
    print "};\n\n";

    print "Constants:\n\n";
    foreach $parameter (@{$args{'parameterlist'}}) {
	print "$parameter\n\t";
	print $args{'parameterdescs'}{$parameter}."\n";
    }

    output_section_text(@_);
}

# output typedef in text
sub output_typedef_text(%) {
    my %args = %{$_[0]};
    my ($parameter);
    my $count;
    print "Typedef:\n\n";

    print "typedef ".$args{'typedef'}." - ".$args{'purpose'}."\n";
    output_section_text(@_);
}

# output struct as text
sub output_struct_text(%) {
    my %args = %{$_[0]};
    my ($parameter);

    print $args{'type'}." ".$args{'struct'}." - ".$args{'purpose'}."\n\n";
    print $args{'type'}." ".$args{'struct'}." {\n";
    foreach $parameter (@{$args{'parameterlist'}}) {
	if ($parameter =~ /^#/) {
	    print "$parameter\n";
	    next;
	}

	my $parameter_name = $parameter;
	$parameter_name =~ s/\[.*//;

	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
	$type = $args{'parametertypes'}{$parameter};
	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
	    # pointer-to-function
	    print "\t$1 $parameter) ($2);\n";
	} elsif ($type =~ m/^(.*?)\s*(:.*)/) {
	    # bitfield
	    print "\t$1 $parameter$2;\n";
	} else {
	    print "\t".$type." ".$parameter.";\n";
	}
    }
    print "};\n\n";

    print "Members:\n\n";
    foreach $parameter (@{$args{'parameterlist'}}) {
	($parameter =~ /^#/) && next;

	my $parameter_name = $parameter;
	$parameter_name =~ s/\[.*//;

	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
	print "$parameter\n\t";
	print $args{'parameterdescs'}{$parameter_name}."\n";
    }
    print "\n";
    output_section_text(@_);
}

sub output_blockhead_text(%) {
    my %args = %{$_[0]};
    my ($parameter, $section);

    foreach $section (@{$args{'sectionlist'}}) {
	print " $section:\n";
	print "    -> ";
	output_highlight($args{'sections'}{$section});
    }
}

# output probe as text
sub output_probe_text(%) {
    my %args = %{$_[0]};
    my ($parameter);

}

# output sfunction as text
sub output_sfunction_text(%) {
    my %args = %{$_[0]};
    my ($parameter);

}

##
# generic output function for all types (function, struct/union, typedef, enum);
# calls the generated, variable output_ function name based on
# functype and output_mode
sub output_declaration {
    no strict 'refs';
    my $name = shift;
    my $functype = shift;
    my $func = "output_${functype}_$output_mode";
    if (($function_only==0) ||
	( $function_only == 1 && defined($function_table{$name})) ||
	( $function_only == 2 && !defined($function_table{$name})))
    {
	&$func(@_);
	$section_counter++;
    }
}

##
# generic output function - calls the right one based on current output mode.
sub output_blockhead {
    no strict 'refs';
    my $func = "output_blockhead_".$output_mode;
    &$func(@_);
    $section_counter++;
}

sub dump_probe($$) {
    my $x = shift;
    my $file = shift;

    @parameterlist = keys %parameterdescs;

    $declaration_name = $x;
    output_declaration($declaration_name,
		       'probe',
		       {'probe' => $declaration_name,
			'parameterlist' => \@parameterlist,
			'module' => $modulename,
			'parameterdescs' => \%parameterdescs,
			'sectionlist' => \@sectionlist,
			'sections' => \%sections,
			'purpose' => $declaration_purpose
		       });
}

##
# takes a declaration (struct, union, enum, typedef) and
# invokes the right handler. NOT called for functions.
sub dump_declaration($$) {
    no strict 'refs';
    my ($prototype, $file) = @_;
    my $func = "dump_".$decl_type;
    &$func(@_);
}

sub dump_union($$) {
    dump_struct(@_);
}

sub dump_struct($$) {
    my $x = shift;
    my $file = shift;

    if ($x =~/(struct|union)\s+(\w+)\s*{(.*)}/) {
	$declaration_name = $2;
	my $members = $3;

	# ignore embedded structs or unions
	$members =~ s/{.*}//g;

	# ignore members marked private:
	$members =~ s/\/\*.*?private:.*?public:.*?\*\///gos;
	$members =~ s/\/\*.*?private:.*//gos;
	# strip comments:
	$members =~ s/\/\*.*?\*\///gos;

	create_parameterlist($members, ';', $file);

	output_declaration($declaration_name,
			   'struct',
			   {'struct' => $declaration_name,
			    'module' => $modulename,
			    'parameterlist' => \@parameterlist,
			    'parameterdescs' => \%parameterdescs,
			    'parametertypes' => \%parametertypes,
			    'sectionlist' => \@sectionlist,
			    'sections' => \%sections,
			    'purpose' => $declaration_purpose,
			    'type' => $decl_type
			   });
    }
    else {
	print STDERR "Error(${file}:$.): Cannot parse struct or union!\n";
	++$errors;
    }
}

sub dump_enum($$) {
    my $x = shift;
    my $file = shift;

    $x =~ s@/\*.*?\*/@@gos;	# strip comments.
    if ($x =~ /enum\s+(\w+)\s*{(.*)}/) {
	$declaration_name = $1;
	my $members = $2;

	foreach my $arg (split ',', $members) {
	    $arg =~ s/^\s*(\w+).*/$1/;
	    push @parameterlist, $arg;
	    if (!$parameterdescs{$arg}) {
		$parameterdescs{$arg} = $undescribed;
		print STDERR "Warning(${file}:$.): Enum value '$arg' ".
		    "not described in enum '$declaration_name'\n";
	    }

	}

	output_declaration($declaration_name,
			   'enum',
			   {'enum' => $declaration_name,
			    'module' => $modulename,
			    'parameterlist' => \@parameterlist,
			    'parameterdescs' => \%parameterdescs,
			    'sectionlist' => \@sectionlist,
			    'sections' => \%sections,
			    'purpose' => $declaration_purpose
			   });
    }
    else {
	print STDERR "Error(${file}:$.): Cannot parse enum!\n";
	++$errors;
    }
}

sub dump_typedef($$) {
    my $x = shift;
    my $file = shift;

    $x =~ s@/\*.*?\*/@@gos;	# strip comments.
    while (($x =~ /\(*.\)\s*;$/) || ($x =~ /\[*.\]\s*;$/)) {
	$x =~ s/\(*.\)\s*;$/;/;
	$x =~ s/\[*.\]\s*;$/;/;
    }

    if ($x =~ /typedef.*\s+(\w+)\s*;/) {
	$declaration_name = $1;

	output_declaration($declaration_name,
			   'typedef',
			   {'typedef' => $declaration_name,
			    'module' => $modulename,
			    'sectionlist' => \@sectionlist,
			    'sections' => \%sections,
			    'purpose' => $declaration_purpose
			   });
    }
    else {
	print STDERR "Error(${file}:$.): Cannot parse typedef!\n";
	++$errors;
    }
}

sub create_parameterlist($$$) {
    my $args = shift;
    my $splitter = shift;
    my $file = shift;
    my $type;
    my $param;

    # temporarily replace commas inside function pointer definition
    while ($args =~ /(\([^\),]+),/) {
	$args =~ s/(\([^\),]+),/$1#/g;
    }

    foreach my $arg (split($splitter, $args)) {
	# strip comments
	$arg =~ s/\/\*.*\*\///;
	# strip leading/trailing spaces
	$arg =~ s/^\s*//;
	$arg =~ s/\s*$//;
	$arg =~ s/\s+/ /;

	if ($arg =~ /^#/) {
	    # Treat preprocessor directive as a typeless variable just to fill
	    # corresponding data structures "correctly". Catch it later in
	    # output_* subs.
	    push_parameter($arg, "", $file);
	} elsif ($arg =~ m/\(.+\)\s*\(/) {
	    # pointer-to-function
	    $arg =~ tr/#/,/;
	    $arg =~ m/[^\(]+\(\*?\s*(\w*)\s*\)/;
	    $param = $1;
	    $type = $arg;
	    $type =~ s/([^\(]+\(\*?)\s*$param/$1/;
	    push_parameter($param, $type, $file);
	} elsif ($arg) {
	    $arg =~ s/\s*:\s*/:/g;
	    $arg =~ s/\s*\[/\[/g;

	    my @args = split('\s*,\s*', $arg);
	    if ($args[0] =~ m/\*/) {
		$args[0] =~ s/(\*+)\s*/ $1/;
	    }

	    my @first_arg;
	    if ($args[0] =~ /^(.*\s+)(.*?\[.*\].*)$/) {
		    shift @args;
		    push(@first_arg, split('\s+', $1));
		    push(@first_arg, $2);
	    } else {
		    @first_arg = split('\s+', shift @args);
	    }

	    unshift(@args, pop @first_arg);
	    $type = join " ", @first_arg;

	    foreach $param (@args) {
		if ($param =~ m/^(\*+)\s*(.*)/) {
		    push_parameter($2, "$type $1", $file);
		}
		elsif ($param =~ m/(.*?):(\d+)/) {
		    if ($type ne "") { # skip unnamed bit-fields
			push_parameter($1, "$type:$2", $file)
		    }
		}
		else {
		    push_parameter($param, $type, $file);
		}
	    }
	}
    }
}

sub create_sparameterlist($$$) {
    my $args = shift;
    my $splitter = shift;
    my $file = shift;
    my $type;
    my $param;

    foreach my $arg (split($splitter, $args)) {
	if ($arg =~ m/s*([\w]+)\s*:?\s*([\w]*)/) {
	    $param = $1;
	    $type = $2;
	    push_parameter($param, $type, $file);
	} else {
	    print STDERR "Error(${file}:$.): problem parsing parameters: '$prototype'\n";
	    ++$errors;
	    return;
	}
    }
}

sub push_parameter($$$) {
	my $param = shift;
	my $type = shift;
	my $file = shift;

	if (($anon_struct_union == 1) && ($type eq "") &&
	    ($param eq "}")) {
		return;		# ignore the ending }; from anon. struct/union
	}

	$anon_struct_union = 0;
	my $param_name = $param;
	$param_name =~ s/\[.*//;

	if ($type eq "" && $param =~ /\.\.\.$/)
	{
	    $type="";
	    $parameterdescs{$param} = "variable arguments";
	}
	elsif ($type eq "" && ($param eq "" or $param eq "void"))
	{
	    $type="";
	    $param="void";
	    $parameterdescs{void} = "no arguments";
	}
	elsif ($type eq "" && ($param eq "struct" or $param eq "union"))
	# handle unnamed (anonymous) union or struct:
	{
		$type = $param;
		$param = "{unnamed_" . $param . "}";
		$parameterdescs{$param} = "anonymous\n";
		$anon_struct_union = 1;
	}

	# warn if parameter has no description
	# (but ignore ones starting with # as these are not parameters
	# but inline preprocessor statements);
	# also ignore unnamed structs/unions;
	if (!$anon_struct_union) {
	if (!defined $parameterdescs{$param_name} && $param_name !~ /^#/) {

	    $parameterdescs{$param_name} = $undescribed;

	    if (($type eq 'function') || ($type eq 'enum')) {
		print STDERR "Warning(${file}:$.): Function parameter ".
		    "or member '$param' not " .
		    "described in '$declaration_name'\n";
	    }
	    print STDERR "Warning(${file}:$.):".
			 " No description found for parameter '$param'\n";
	    ++$warnings;
	}
	}

	push @parameterlist, $param;
	$parametertypes{$param} = $type;
}

##
# takes a function prototype and the name of the current file being
# processed and spits out all the details stored in the global
# arrays/hashes.
sub dump_function($$) {
    my $prototype = shift;
    my $file = shift;

    $prototype =~ s/^static +//;
    $prototype =~ s/^extern +//;
    $prototype =~ s/^asmlinkage +//;
    $prototype =~ s/^inline +//;
    $prototype =~ s/^__inline__ +//;
    $prototype =~ s/^__inline +//;
    $prototype =~ s/^__always_inline +//;
    $prototype =~ s/^noinline +//;
    $prototype =~ s/__devinit +//;
    $prototype =~ s/__init +//;
    $prototype =~ s/^#\s*define\s+//; #ak added
    $prototype =~ s/__attribute__\s*\(\([a-z,]*\)\)//;

    # Yes, this truly is vile.  We are looking for:
    # 1. Return type (may be nothing if we're looking at a macro)
    # 2. Function name
    # 3. Function parameters.
    #
    # All the while we have to watch out for function pointer parameters
    # (which IIRC is what the two sections are for), C types (these
    # regexps don't even start to express all the possibilities), and
    # so on.
    #
    # If you mess with these regexps, it's a good idea to check that
    # the following functions' documentation still comes out right:
    # - parport_register_device (function pointer parameters)
    # - atomic_set (macro)
    # - pci_match_device, __copy_to_user (long return type)

    if ($prototype =~ m/^()([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
	$prototype =~ m/^(\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
	$prototype =~ m/^(\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
	$prototype =~ m/^(\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
	$prototype =~ m/^(\w+\s+\w+\s*\*+)\s*([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
	$prototype =~ m/^(\w+\s+\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
	$prototype =~ m/^(\w+\s+\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
	$prototype =~ m/^()([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
	$prototype =~ m/^(\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
	$prototype =~ m/^(\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
	$prototype =~ m/^(\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
	$prototype =~ m/^(\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
	$prototype =~ m/^(\w+\s+\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
	$prototype =~ m/^(\w+\s+\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
	$prototype =~ m/^(\w+\s+\w+\s+\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
	$prototype =~ m/^(\w+\s+\w+\s+\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
	$prototype =~ m/^(\w+\s+\w+\s*\*\s*\w+\s*\*\s*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/)  {
	$return_type = $1;
	$declaration_name = $2;
	my $args = $3;

	create_parameterlist($args, ',', $file);
    } else {
	print STDERR "Error(${file}:$.): cannot understand prototype: '$prototype'\n";
	++$errors;
	return;
    }

    output_declaration($declaration_name,
		       'function',
		       {'function' => $declaration_name,
			'module' => $modulename,
			'functiontype' => $return_type,
			'parameterlist' => \@parameterlist,
			'parameterdescs' => \%parameterdescs,
			'parametertypes' => \%parametertypes,
			'sectionlist' => \@sectionlist,
			'sections' => \%sections,
			'purpose' => $declaration_purpose
		       });
}

##
# takes a stap function prototype and the name of the current file being
# processed and spits out all the details stored in the global
# arrays/hashes.
sub dump_sfunction($$) {
    my $prototype = shift;
    my $file = shift;

    if ($prototype =~ m/^function\s+([\w]+)\s*:?\s*([\w]*)\s*\(([^\{]*)\)/) {
	$declaration_name = $1;
	$return_type = $2;
	my $args = $3;
	
	create_sparameterlist($args, ',', $file);
    } else {
	print STDERR "Error(${file}:$.): cannot understand prototype: '$prototype'\n";
	++$errors;
	return;
    }

    output_declaration($declaration_name,
		       'sfunction',
		       {'sfunction' => $declaration_name,
			'module' => $modulename,
			'functiontype' => $return_type,
			'parameterlist' => \@parameterlist,
			'parameterdescs' => \%parameterdescs,
			'parametertypes' => \%parametertypes,
			'sectionlist' => \@sectionlist,
			'sections' => \%sections,
			'purpose' => $declaration_purpose
		       });
}

sub process_file($);

# Read the file that maps relative names to absolute names for
# separate source and object directories and for shadow trees.
if (open(SOURCE_MAP, "<.tmp_filelist.txt")) {
	my ($relname, $absname);
	while(<SOURCE_MAP>) {
		chop();
		($relname, $absname) = (split())[0..1];
		$relname =~ s:^/+::;
		$source_map{$relname} = $absname;
	}
	close(SOURCE_MAP);
}

if ($filelist) {
	open(FLIST,"<$filelist") or die "Can't open file list $filelist";
	while(<FLIST>) {
		chop;
		process_file($_);
	}
}

foreach (@ARGV) {
    chomp;
    process_file($_);
}
if ($verbose && $errors) {
  print STDERR "$errors errors\n";
}
if ($verbose && $warnings) {
  print STDERR "$warnings warnings\n";
}

exit($errors);

sub reset_state {
    $function = "";
    %constants = ();
    %parameterdescs = ();
    %parametertypes = ();
    @parameterlist = ();
    %sections = ();
    @sectionlist = ();
    $prototype = "";

    $state = 0;
}

sub process_state3_function($$) {
    my $x = shift;
    my $file = shift;

    $x =~ s@\/\/.*$@@gos; # strip C99-style comments to end of line

    if ($x =~ m#\s*/\*\s+MACDOC\s*#io || ($x =~ /^#/ && $x !~ /^#\s*define/)) {
	# do nothing
    }
    elsif ($x =~ /([^\{]*)/) {
	$prototype .= $1;
    }
    if (($x =~ /\{/) || ($x =~ /\#\s*define/) || ($x =~ /;/)) {
	$prototype =~ s@/\*.*?\*/@@gos;	# strip comments.
	$prototype =~ s@[\r\n]+@ @gos; # strip newlines/cr's.
	$prototype =~ s@^\s+@@gos; # strip leading spaces
	dump_function($prototype,$file);
	reset_state();
    }
}

sub process_state3_type($$) {
    my $x = shift;
    my $file = shift;

    $x =~ s@[\r\n]+@ @gos; # strip newlines/cr's.
    $x =~ s@^\s+@@gos; # strip leading spaces
    $x =~ s@\s+$@@gos; # strip trailing spaces
    $x =~ s@\/\/.*$@@gos; # strip C99-style comments to end of line

    if ($x =~ /^#/) {
	# To distinguish preprocessor directive from regular declaration later.
	$x .= ";";
    }

    while (1) {
	if ( $x =~ /([^{};]*)([{};])(.*)/ ) {
	    $prototype .= $1 . $2;
	    ($2 eq '{') && $brcount++;
	    ($2 eq '}') && $brcount--;
	    if (($2 eq ';') && ($brcount == 0)) {
		dump_declaration($prototype,$file);
		reset_state();
		last;
	    }
	    $x = $3;
	} else {
	    $prototype .= $x;
	    last;
	}
    }
}

sub process_state3_sfunction($$) {
    my $x = shift;
    my $file = shift;

    $x =~ s@\/\/.*$@@gos; # strip C99-style comments to end of line

    if ($x =~ m#\s*/\*\s+MACDOC\s*#io || ($x =~ /^#/ && $x !~ /^#\s*define/)) {
	# do nothing
    }
    elsif ($x =~ /([^\{]*)/) {
	$prototype .= $1;
    }

    $prototype =~ s@/\*.*?\*/@@gos;	# strip comments.
    $prototype =~ s@[\r\n]+@ @gos; # strip newlines/cr's.
    $prototype =~ s@^\s+@@gos; # strip leading spaces
    dump_sfunction($prototype,$file);
    reset_state();
}

sub process_state3_probe($$) {
    my $prototype = shift;
    my $file = shift;

    $prototype =~ s@/probe/@@o;	# strip off leading 'probe'
    $prototype =~ s@^\s+@@gos; # strip leading spaces
    dump_probe($prototype,$file);
    reset_state();
}

# xml_escape: replace <, >, and & in the text stream;
#
# however, formatting controls that are generated internally/locally in the
# kernel-doc script are not escaped here; instead, they begin life like
# $blankline_html (4 of '\' followed by a mnemonic + ':'), then these strings
# are converted to their mnemonic-expected output, without the 4 * '\' & ':',
# just before actual output; (this is done by local_unescape())
sub xml_escape($) {
	my $text = shift;
	if (($output_mode eq "text") || ($output_mode eq "man")) {
		return $text;
	}
	$text =~ s/\&/\\\\\\amp;/g;
	$text =~ s/\</\\\\\\lt;/g;
	$text =~ s/\>/\\\\\\gt;/g;
	return $text;
}

# convert local escape strings to html
# local escape strings look like:  '\\\\menmonic:' (that's 4 backslashes)
sub local_unescape($) {
	my $text = shift;
	if (($output_mode eq "text") || ($output_mode eq "man")) {
		return $text;
	}
	$text =~ s/\\\\\\\\lt:/</g;
	$text =~ s/\\\\\\\\gt:/>/g;
	return $text;
}

sub process_file($) {
    my $file;
    my $identifier;
    my $func;
    my $descr;
    my $initial_section_counter = $section_counter;

    if (defined($ENV{'SRCTREE'})) {
	$file = "$ENV{'SRCTREE'}" . "/" . "@_";
    }
    else {
	$file = "@_";
    }
    if (defined($source_map{$file})) {
	$file = $source_map{$file};
    }

    if (!open(IN,"<$file")) {
	print STDERR "Error: Cannot open file $file\n";
	++$errors;
	return;
    }

    $section_counter = 0;
    while (<IN>) {
	if ($state == 0) {
	    if (/$doc_start/o) {
		$state = 1;		# next line is always the function name
		$in_doc_sect = 0;
	    }
	} elsif ($state == 1) {	# this line is the function name (always)
	    if (/$doc_block/o) {
		$state = 4;
		$contents = "";
		if ( $1 eq "" ) {
			$section = $section_intro;
		} else {
			$section = $1;
		}
	    }
	    elsif (/$doc_decl/o) {
		$identifier = $1;
		if (/\s*([\w\s\.]+?)\s*-/) {
		    $identifier = $1;
		}

		$state = 2;
		if (/-(.*)/) {
		    # strip leading/trailing/multiple spaces
		    $descr= $1;
		    $descr =~ s/^\s*//;
		    $descr =~ s/\s*$//;
		    $descr =~ s/\s+/ /;
		    $declaration_purpose = xml_escape($descr);
		} else {
		    $declaration_purpose = "";
		}

		if (($declaration_purpose eq "") && $verbose) {
			print STDERR "Warning(${file}:$.): missing initial short description on line:\n";
			print STDERR $_;
			++$warnings;
		}

		if ($identifier =~ m/^struct/) {
		    $decl_type = 'struct';
		} elsif ($identifier =~ m/^union/) {
		    $decl_type = 'union';
		} elsif ($identifier =~ m/^enum/) {
		    $decl_type = 'enum';
		} elsif ($identifier =~ m/^typedef/) {
		    $decl_type = 'typedef';
		} elsif ($identifier =~ m/^probe/) {
		    $decl_type = 'probe';
		} elsif ($identifier =~ m/^sfunction/) {
		    $decl_type = 'sfunction';
		} else {
		    $decl_type = 'function';
		}

		if ($verbose) {
		    print STDERR "Info(${file}:$.): Scanning doc for $decl_type $identifier\n";
		}
	    } else {
		print STDERR "Warning(${file}:$.): Cannot understand $_ on line $.",
		" - I thought it was a doc line\n";
		++$warnings;
		$state = 0;
	    }
	} elsif ($state == 2) {	# look for head: lines, and include content
	    if (/$doc_sect/o) {
		$newsection = $1;
		$newcontents = $2;

		if (($contents ne "") && ($contents ne "\n")) {
		    if (!$in_doc_sect && $verbose) {
			print STDERR "Warning(${file}:$.): contents before sections\n";
			++$warnings;
		    }
		    dump_section($file, $section, xml_escape($contents));
		    $section = $section_default;
		}

		$in_doc_sect = 1;
		$contents = $newcontents;
		if ($contents ne "") {
		    while ((substr($contents, 0, 1) eq " ") ||
			substr($contents, 0, 1) eq "\t") {
			    $contents = substr($contents, 1);
		    }
		    $contents .= "\n";
		}
		$section = $newsection;
	    } elsif (/$doc_end/) {

		if ($contents ne "") {
		    dump_section($file, $section, xml_escape($contents));
		    $section = $section_default;
		    $contents = "";
		}
		# look for doc_com + <text> + doc_end:
		if ($_ =~ m'\s*\*\s*[a-zA-Z_0-9:\.]+\*/') {
		    print STDERR "Warning(${file}:$.): suspicious ending line: $_";
		    ++$warnings;
		}

		$prototype = "";
		$state = 3;
		$brcount = 0;
#		print STDERR "end of doc comment, looking for prototype\n";
	    } elsif (/$doc_content/) {
		# miguel-style comment kludge, look for blank lines after
		# @parameter line to signify start of description
		if ($1 eq "" &&
			($section =~ m/^@/ || $section eq $section_context)) {
		    dump_section($file, $section, xml_escape($contents));
		    $section = $section_default;
		    $contents = "";
		} else {
		    $contents .= $1."\n";
		}
	    } else {
		# i dont know - bad line?  ignore.
		print STDERR "Warning(${file}:$.): bad line: $_";
		++$warnings;
	    }
	} elsif ($state == 3) {	# scanning for function '{' (end of prototype)
	    if ($decl_type eq 'function') {
		process_state3_function($_, $file);
	    } elsif ($decl_type eq 'probe') {
		process_state3_probe($identifier, $file);
	    } elsif ($decl_type eq 'sfunction') {
		process_state3_sfunction($_, $file);
	    } else {
		process_state3_type($_, $file);
	    }
	} elsif ($state == 4) {
		# Documentation block
		if (/$doc_block/) {
			dump_doc_section($file, $section, xml_escape($contents));
			$contents = "";
			$function = "";
			%constants = ();
			%parameterdescs = ();
			%parametertypes = ();
			@parameterlist = ();
			%sections = ();
			@sectionlist = ();
			$prototype = "";
			if ( $1 eq "" ) {
				$section = $section_intro;
			} else {
				$section = $1;
			}
		}
		elsif (/$doc_end/)
		{
			dump_doc_section($file, $section, xml_escape($contents));
			$contents = "";
			$function = "";
			%constants = ();
			%parameterdescs = ();
			%parametertypes = ();
			@parameterlist = ();
			%sections = ();
			@sectionlist = ();
			$prototype = "";
			$state = 0;
		}
		elsif (/$doc_content/)
		{
			if ( $1 eq "" )
			{
				$contents .= $blankline;
			}
			else
			{
				$contents .= $1 . "\n";
			}
		}
	}
    }
    if ($initial_section_counter == $section_counter) {
	print STDERR "Warning(${file}): no structured comments found\n";
	if ($output_mode eq "xml") {
	    # The template wants at least one RefEntry here; make one.
	    print "<refentry>\n";
	    print " <refnamediv>\n";
	    print "  <refname>\n";
	    print "   ${file}\n";
	    print "  </refname>\n";
	    print "  <refpurpose>\n";
	    print "   Document generation inconsistency\n";
	    print "  </refpurpose>\n";
	    print " </refnamediv>\n";
	    print " <refsect1>\n";
	    print "  <title>\n";
	    print "   Oops\n";
	    print "  </title>\n";
	    print "  <warning>\n";
	    print "   <para>\n";
	    print "    The template for this document tried to insert\n";
	    print "    the structured comment from the file\n";
	    print "    <filename>${file}</filename> at this point,\n";
	    print "    but none was found.\n";
	    print "    This dummy section is inserted to allow\n";
	    print "    generation to continue.\n";
	    print "   </para>\n";
	    print "  </warning>\n";
	    print " </refsect1>\n";
	    print "</refentry>\n";
	}
    }
}

[-- Attachment #3: memory.stp --]
[-- Type: text/plain, Size: 3882 bytes --]

// memory/vm related tapset
// Copyright (C) 2005, 2006 IBM Corp.
// Copyright (C) 2006 Intel Corporation.
//
// This file is part of systemtap, and is free software.  You can
// redistribute it and/or modify it under the terms of the GNU General
// Public License (GPL); either version 2, or (at your option) any
// later version.

/**
 * probe vm.pagefault - Records that a page fault occurred.
 * @address: The address of the faulting memory access.
 * @write_access: Indicates whether this was a write.
 *
 * Context: The process which triggered the fault
 *
 */
probe vm.pagefault = kernel.function("__handle_mm_fault@mm/memory.c") ?,
                     kernel.function("handle_mm_fault@mm/memory.c") ?
{
	write_access = $write_access
	address =  $address
}

/**
 * probe vm.pagefault.return - Records type of fault that occurred.
 * @fault_type: 0 (VM_FAULT_OOM), 1 (VM_FAULT_SIGBUS),
 * 		2 (VM_FAULT_MINOR), and 3 (VM_FAULT_MAJOR)
 */
probe vm.pagefault.return = kernel.function("__handle_mm_fault@mm/memory.c").return ?,
                            kernel.function("handle_mm_fault@mm/memory.c").return ?
{
	fault_type = $return
}

/**
 * sfunction addr_to_node - Returns which NUMA node has the given address.
 * @addr: The address of the faulting memory access.
 *
 */
function addr_to_node:long(addr:long) %{ /* pure */ 
	int nid;
	int pfn = __pa(THIS->addr) >> PAGE_SHIFT;
	for_each_online_node(nid)
		if ( NODE_DATA(nid)->node_start_pfn <= pfn &&
			pfn < (NODE_DATA(nid)->node_start_pfn +
			NODE_DATA(nid)->node_spanned_pages) )
		{
			THIS->__retvalue = nid;
			break;
		}
%}

/* Return whether a page to be copied is a zero page. */
function _IS_ZERO_PAGE:long(from:long, vaddr:long) %{ /* pure */
    THIS->__retvalue = (THIS->from == (long) ZERO_PAGE(THIS->vaddr));
%}


/**
 * probe vm.write_shared - Write to shared page.
 * @address: The address of the shared write.
 *
 * Context:
 *  The context is the process attempting the write.
 *
 *  Fires when a process attempts to write to a shared page.
 *  If a copy is necessary, this will be followed by a
 *  vm.write_shared_copy.
 */
probe vm.write_shared = kernel.function("do_wp_page") {
    address = $address
}

/**
 * probe vm.write_shared_copy- Page copy for shared page write.
 * @address: the address of the shared write.
 * @zero: boolean indicating whether it is a zero page
 *         (can do a clear instead of a copy).
 *
 * Context:
 *  The process attempting the write.
 *
 *  Fires when a write to a shared page requires a page copy.  This is
 *  always preceded by a vm.shared_write.
 */
probe vm.write_shared_copy = kernel.function("copy_cow_page")? {
    address = $address
    zero = _IS_ZERO_PAGE($from, address);
}


/**
 * probe vm.mmap - Fires when an mmap is requested.
 * @address: the requested address
 * @length: the length of the memory segment 
 *
 * Context:
 *  The process calling mmap.
 */
probe vm.mmap = kernel.function("do_mmap"), kernel.function("do_mmap2")? {
    address = $addr
    length = $len
}


/**
 * probe vm.munmap - Fires when an munmap is requested.
 * @address: the requested address
 * @length: the length of the memory segment 
 *
 * Context:
 *  The process calling munmap.
 */
probe vm.munmap = kernel.function("do_munmap") {
    address = $start
    length = $len
}

/**
 * probe vm.brk -Fires when a brk is requested (resizing a heap).
 * @address - the requested address
 * @length - the length of the memory segment 
 *
 * Context:
 *  The process calling brk.
 */
probe vm.brk = kernel.function("do_brk") {
    address = $addr
    length = $len
}

/**
 * probe vm.oom_kill - Fires when a thread is targetted by the OOM killer.
 * @task: the task being killed
 *
 * Context:
 *  The process that tried to consume more memory, and thus
 *  triggered the OOM. (correct?)
 */
probe vm.oom_kill = kernel.function("__oom_kill_task") {
    task = $p
}

[-- Attachment #4: tapsets2.tmpl --]
[-- Type: text/xml, Size: 1591 bytes --]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
	"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []>

<book id="TapsetRef">
 <bookinfo>
  <title>SystemTap Tapset Reference Manual</title>
  
  <authorgroup>
   <author>
    <firstname>Willliam</firstname>
    <surname>Cohen</surname>
    <affiliation>
     <address>
      <email>wcohen@redhat.com</email>
     </address>
    </affiliation>
   </author>
  </authorgroup>

  <copyright>
   <year>2008</year>
   <holder>Red Hat, Inc.</holder>
  </copyright>

  <legalnotice>
   <para>
     This documentation is free software; you can redistribute
     it and/or modify it under the terms of the GNU General Public
     License version 2 as published by the Free Software Foundation.
   </para>
      
   <para>
     This program is distributed in the hope that it will be
     useful, but WITHOUT ANY WARRANTY; without even the implied
     warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     See the GNU General Public License for more details.
   </para>
      
   <para>
     You should have received a copy of the GNU General Public
     License along with this program; if not, write to the Free
     Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
     MA 02111-1307 USA
   </para>
      
   <para>
     For more details see the file COPYING in the source
     distribution of Linux.
   </para>
  </legalnotice>
 </bookinfo>

<toc></toc>

  <chapter id="memory_stp">
    <title>Memory Tapset</title>
!Itapset/memory.stp
  </chapter>
</book>

[-- Attachment #5: c.pdf --]
[-- Type: pdf, Size: 85920 bytes --]

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Start of Systemtap Tapset Reference manual
  2008-11-20 21:41         ` Randy Dunlap
  2008-11-21 14:54           ` William Cohen
  2008-11-21 23:00           ` Tweaks for kernel-doc to parse systemtap tapsets William Cohen
@ 2008-11-24 16:48           ` William Cohen
  2008-11-24 19:16             ` William Cohen
  2 siblings, 1 reply; 16+ messages in thread
From: William Cohen @ 2008-11-24 16:48 UTC (permalink / raw)
  To: Randy Dunlap; +Cc: Peter Teoh, SystemTAP, Don Domingo, Frank Ch. Eigler

[-- Attachment #1: Type: text/plain, Size: 784 bytes --]

Randy Dunlap wrote:

> Not currently, but I don't see why it couldn't be done.  Then the question
> becomes:  is it the same scripts/kernel-doc file or is it scripts/stap-doc
> (e.g. -- or some other name)?

This weekend I played around this some more and created some patches to use 
kernel-doc as method of encoding the documentation in the tapset files.

kernel-doc1.patch  removes the old documentation method
kernel-doc2.patch  adds the kernel-doc
kernel-doc3.patch  revises the tapsets files to generate instumentation.

To make the instrumentation need to go in the the build directory 
doc/SystemTap_Tapset_Reference and do a "make" in there. It dodn't currently 
install the resulting documtation any where.

Comments on this series of patches would be appreciated.

-Will



[-- Attachment #2: kernel-doc1.patch --]
[-- Type: text/x-patch, Size: 150008 bytes --]

From df812cbc77d205d0f919bbb516f9fc9ddb4deb2a Mon Sep 17 00:00:00 2001
From: William Cohen <wcohen@redhat.com>
Date: Mon, 24 Nov 2008 10:19:07 -0500
Subject: [PATCH] Remove the old SystemTap_Tapset_Reference.

---
 doc/ChangeLog                                      |    4 +
 doc/SystemTap_Tapset_Reference/Makefile            |   19 -
 .../en-US/Author_Group.xml                         |   15 -
 doc/SystemTap_Tapset_Reference/en-US/Book_Info.xml |   33 -
 doc/SystemTap_Tapset_Reference/en-US/Chapter.xml   |   25 -
 .../en-US/Introduction.xml                         |   62 -
 doc/SystemTap_Tapset_Reference/en-US/Preface.xml   |   13 -
 .../en-US/Revision_History.xml                     |   28 -
 .../en-US/Tapset_Reference.ent                     |    5 -
 .../en-US/Tapset_Reference.xml                     |   16 -
 doc/SystemTap_Tapset_Reference/en-US/context.xml   |  226 --
 .../en-US/images/icon.svg                          | 3936 --------------------
 doc/SystemTap_Tapset_Reference/en-US/memory.xml    |  182 -
 .../en-US/networking.xml                           |  100 -
 doc/SystemTap_Tapset_Reference/en-US/timestamp.xml |   50 -
 doc/SystemTap_Tapset_Reference/extractxml.pl       |  137 -
 16 files changed, 4 insertions(+), 4847 deletions(-)
 delete mode 100644 doc/SystemTap_Tapset_Reference/Makefile
 delete mode 100644 doc/SystemTap_Tapset_Reference/en-US/Author_Group.xml
 delete mode 100644 doc/SystemTap_Tapset_Reference/en-US/Book_Info.xml
 delete mode 100644 doc/SystemTap_Tapset_Reference/en-US/Chapter.xml
 delete mode 100644 doc/SystemTap_Tapset_Reference/en-US/Introduction.xml
 delete mode 100644 doc/SystemTap_Tapset_Reference/en-US/Preface.xml
 delete mode 100644 doc/SystemTap_Tapset_Reference/en-US/Revision_History.xml
 delete mode 100644 doc/SystemTap_Tapset_Reference/en-US/Tapset_Reference.ent
 delete mode 100644 doc/SystemTap_Tapset_Reference/en-US/Tapset_Reference.xml
 delete mode 100644 doc/SystemTap_Tapset_Reference/en-US/context.xml
 delete mode 100644 doc/SystemTap_Tapset_Reference/en-US/images/icon.svg
 delete mode 100644 doc/SystemTap_Tapset_Reference/en-US/memory.xml
 delete mode 100644 doc/SystemTap_Tapset_Reference/en-US/networking.xml
 delete mode 100644 doc/SystemTap_Tapset_Reference/en-US/timestamp.xml
 delete mode 100755 doc/SystemTap_Tapset_Reference/extractxml.pl

diff --git a/doc/ChangeLog b/doc/ChangeLog
index d0b02ad..e59e240 100644
--- a/doc/ChangeLog
+++ b/doc/ChangeLog
@@ -1,3 +1,7 @@
+2008-11-24  Will Cohen <wcohen@redhat.com>
+
+	* SystemTap_Tapset_Reference: Remove.
+	
 2008-10-23  Will Cohen <wcohen@redhat.com>
 
 	* SystemTap_Tapset_Reference: New.
diff --git a/doc/SystemTap_Tapset_Reference/Makefile b/doc/SystemTap_Tapset_Reference/Makefile
deleted file mode 100644
index 5212c16..0000000
--- a/doc/SystemTap_Tapset_Reference/Makefile
+++ /dev/null
@@ -1,19 +0,0 @@
-#Makefile for SystemTap_Tapset_Reference
-
-XML_LANG	= en-US
-BRAND		= common
-
-SHOW_REMARKS=1
-
-#OTHER_LANGS	= as-IN bn-IN de-DE es-ES fr-FR gu-IN hi-IN it-IT ja-JP kn-IN ko-KR ml-IN mr-IN or-IN pa-IN pt-BR ru-RU si-LK ta-IN te-IN zh-CN zh-TW
-
-# Extra Parameters start here
-
-# Extra Parameters stop here
-COMMON_CONFIG  = /usr/share/publican
-include $(COMMON_CONFIG)/make/Makefile.common
-
-#Pull the xml out of the tapset
-TAPSETS=../../tapset
-extract-xml:
-	./extractxml.pl $(TAPSETS) ./en-US
diff --git a/doc/SystemTap_Tapset_Reference/en-US/Author_Group.xml b/doc/SystemTap_Tapset_Reference/en-US/Author_Group.xml
deleted file mode 100644
index 1f39c66..0000000
--- a/doc/SystemTap_Tapset_Reference/en-US/Author_Group.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE authorgroup PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-]>
-
-<authorgroup>
-	<author>
-		<firstname>William</firstname>
-		<surname>Cohen</surname>
-		<affiliation>
-			<orgname>Tools</orgname>
-			<orgdiv>Engineering</orgdiv>
-		</affiliation>
-		<email>wcohen@redhat.com</email>
-	</author>
-</authorgroup>
diff --git a/doc/SystemTap_Tapset_Reference/en-US/Book_Info.xml b/doc/SystemTap_Tapset_Reference/en-US/Book_Info.xml
deleted file mode 100644
index c0fc2eb..0000000
--- a/doc/SystemTap_Tapset_Reference/en-US/Book_Info.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE bookinfo PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-]>
-
-<bookinfo id="SystemTap_Tapset_Reference-Documentation">
-	<title>Tapset Reference</title>
-	<productname>Systemtap</productname>
-  <!-- The product number should be filled in by the config -->
-	<productnumber>0.7.1</productnumber>
-	<edition>0</edition>
-	<pubsnumber>0</pubsnumber>
-	<abstract>
-		<para>Describes the various instrumentation points and functions
-		available in SystemTap tapsets.</para>
-	</abstract>
-	<corpauthor>
-		<inlinemediaobject>
-			<imageobject>
-				<imagedata format='SVG' fileref="Common_Content/images/title_logo.svg" />
-			</imageobject>
-			<textobject><phrase>Logo</phrase></textobject>
-		</inlinemediaobject>
-	</corpauthor>
-	<copyright>
-		<year>&YEAR;</year>
-		<holder>&HOLDER;</holder>
-	</copyright>
-	<xi:include href="Common_Content/Legal_Notice.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
-	<xi:include href="Author_Group.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
-</bookinfo>
-
-
-
diff --git a/doc/SystemTap_Tapset_Reference/en-US/Chapter.xml b/doc/SystemTap_Tapset_Reference/en-US/Chapter.xml
deleted file mode 100644
index 64b94c9..0000000
--- a/doc/SystemTap_Tapset_Reference/en-US/Chapter.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-]>
-
-<chapter id="SystemTap_Tapset_Reference-Test">
-	<title>Test</title>
-	<para>
-		This is a test paragraph
-	</para>
-	<section id="SystemTap_Tapset_Reference-Test-Section_1_Test">
-		<title>Section 1 Test</title>
-		<para>
-			Test of a section
-		</para>
-	</section>
-	
-	<section id="SystemTap_Tapset_Reference-Test-Section_2_Test">
-		<title>Section 2 Test</title>
-		<para>
-			Test of a section
-		</para>
-	</section>
-
-</chapter>
-
diff --git a/doc/SystemTap_Tapset_Reference/en-US/Introduction.xml b/doc/SystemTap_Tapset_Reference/en-US/Introduction.xml
deleted file mode 100644
index 31e8a78..0000000
--- a/doc/SystemTap_Tapset_Reference/en-US/Introduction.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-]>
-
-<chapter id="introduction">
-  <title>Introduction</title>
-  <para>
-    SystemTap provides free software (GPL) infrastructure to simplify the
-    gathering of information about the running Linux system. This assists
-    diagnosis of a performance or functional problem. SystemTap eliminates the
-    need for the developer to go through the tedious and disruptive instrument,
-    recompile, install, and reboot sequence that may be otherwise required to
-    collect data.
-  </para>
-
-  <para>
-    SystemTap provides a simple command line interface and scripting language
-    for writing instrumentation for a live running kernel. The instrumentation
-    makes extensive use of the probe points and functions provided in the
-    <firstterm>tapset</firstterm> library. This document describes the various
-    probe points and functions.
-  </para>
-  
-<section id="format">
-	<title>Tapset Name Format</title>
-	
-<para>In this guide, tapset definitions appear in the following format:</para>
-
-<screen>
-name:return (parameters)
-	definition
-</screen>
-	
-<para>
-	The <replaceable>return</replaceable> field specifies what data type the tapset extracts 
-	and returns from the kernel during a probe (and thus, returns).
-	Tapsets use 2 data types for <replaceable>return</replaceable>: 
-	<literal>long</literal> (tapset extracts and returns an integer) and 
-	<literal>string</literal> (tapset extracts and returns a string). 
-</para>
-
-<para>
-	In some cases, tapsets do not have a <replaceable>return</replaceable> value. This
-	simply means that the tapset does not extract anything from the kernel. This is common among 
-	asynchronous events such as timers, exit functions, and print functions.
-</para>
-	
-
-
-<!--
-<varlistentry>
-<term></term>
-<listitem>
-	<para></para>
-</listitem>
-</varlistentry>
--->
-
-</section>
-  
-  
-</chapter>
diff --git a/doc/SystemTap_Tapset_Reference/en-US/Preface.xml b/doc/SystemTap_Tapset_Reference/en-US/Preface.xml
deleted file mode 100644
index 09c00a1..0000000
--- a/doc/SystemTap_Tapset_Reference/en-US/Preface.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-]>
-
-<preface id="SystemTap_Tapset_Reference-Preface">
-	<title>Preface</title>
-	<xi:include href="Common_Content/Conventions.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
-	<xi:include href="Feedback.xml" xmlns:xi="http://www.w3.org/2001/XInclude">
-		<xi:fallback xmlns:xi="http://www.w3.org/2001/XInclude">
-			<xi:include href="Common_Content/Feedback.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
-		</xi:fallback>
-	</xi:include>
-</preface>
diff --git a/doc/SystemTap_Tapset_Reference/en-US/Revision_History.xml b/doc/SystemTap_Tapset_Reference/en-US/Revision_History.xml
deleted file mode 100644
index 2c92d4b..0000000
--- a/doc/SystemTap_Tapset_Reference/en-US/Revision_History.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE appendix PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-]>
-
-<appendix id="appe-Publican-Revision_History">
-	<title>Revision History</title>
-	<simpara>
-		<revhistory>
-			<revision>
-				<revnumber>1.0</revnumber>
-				<date>October 24, 2008</date>
-				<author>
-					<firstname>William</firstname>
-					<surname>Cohen</surname>
-					<email>wcohen@redhat.com</email>
-				</author>
-				<revdescription>
-					<simplelist>
-						<member>Initial creation of
-						SystemTap Reference Manual
-	    					</member>
-					</simplelist>
-				</revdescription>
-			</revision>
-		</revhistory>
-	</simpara>
-</appendix>
-
diff --git a/doc/SystemTap_Tapset_Reference/en-US/Tapset_Reference.ent b/doc/SystemTap_Tapset_Reference/en-US/Tapset_Reference.ent
deleted file mode 100644
index 45fb709..0000000
--- a/doc/SystemTap_Tapset_Reference/en-US/Tapset_Reference.ent
+++ /dev/null
@@ -1,5 +0,0 @@
-<!ENTITY PRODUCT "Documentation">
-<!ENTITY BOOKID "SystemTap_Tapset_Reference">
-<!ENTITY YEAR "2008">
-<!ENTITY HOLDER "Red Hat, Inc. 'SystemTap_Tapset_Reference.ent'">
-
diff --git a/doc/SystemTap_Tapset_Reference/en-US/Tapset_Reference.xml b/doc/SystemTap_Tapset_Reference/en-US/Tapset_Reference.xml
deleted file mode 100644
index 404b654..0000000
--- a/doc/SystemTap_Tapset_Reference/en-US/Tapset_Reference.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-]>
-<!-- This file is machine generated based on tapset files 
-   Do not modify this file -->
-<book>
-<xi:include href="Book_Info.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
-<xi:include href="Preface.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
-<xi:include href="Introduction.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
-<xi:include href="context.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
-<xi:include href="memory.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
-<xi:include href="networking.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
-<xi:include href="timestamp.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
-<xi:include href="Revision_History.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
-<index />
-</book>
diff --git a/doc/SystemTap_Tapset_Reference/en-US/context.xml b/doc/SystemTap_Tapset_Reference/en-US/context.xml
deleted file mode 100644
index 2fa8c63..0000000
--- a/doc/SystemTap_Tapset_Reference/en-US/context.xml
+++ /dev/null
@@ -1,226 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-]>
-<!-- This file is extracted from the tapset files 
-   Do not modify this file -->
-<chapter id="context_stp">
-  <title>Context Functions</title>
-  <para>
-    The context functions provide additional information about the where
-    the event occurred.
-    The contact functions can provide information such as a backtrace
-    where the event occured
-    and the current register values for the processor.
-  </para>
-<formalpara id="print_regs">
-  <title>print_regs()</title>
-  <indexterm><primary>print_regs</primary></indexterm>
-  <para>
-	Print a register dump.
-  </para>
-</formalpara>
-<formalpara id="print_backtrace">
-  <title>print_backtrace()</title>
-  <indexterm><primary>print_backtrace</primary></indexterm>
-  <para>
-     Equivalent to <command>print_stack(backtrace())</command>,
-     except that deeper stack nesting may be supported.  Return nothing.
-  </para>
-</formalpara>
-<formalpara id="backtrace">
-  <title>backtrace:string()</title>
-  <indexterm><primary>backtrace</primary></indexterm>
-  <para>
-	Return a string of hex addresses that are a backtrace of the
-     stack.  It may be truncated due to maximum string length.
-  </para>
-</formalpara>
-<formalpara id="execname">
-  <title>execname:string()</title>
-  <indexterm><primary>execname</primary></indexterm>
-  <para>
-     Return the name of the current process.
-  </para>
-</formalpara>
-<formalpara id="pid">
-  <title>pid:long ()</title>
-  <indexterm><primary>pid</primary></indexterm>
-  <para>
-	Return the id of the current process.
-  </para>
-</formalpara>
-<formalpara id="tid">
-  <title>tid:long()</title>
-  <indexterm><primary>tid</primary></indexterm>
-  <para>
-	Return the id of the current thread.
-  </para>
-</formalpara>
-<formalpara id="ppid">
-  <title>ppid:long()</title>
-  <indexterm><primary>ppid</primary></indexterm>
-  <para>
-	Return the id of the parent process.
-  </para>
-</formalpara>
-<formalpara id="pexecname">
-  <title>pexecname:string()</title>
-  <indexterm><primary>pexecname</primary></indexterm>
-  <para>
-	Return the name of the parent process.
-  </para>
-</formalpara>
-<formalpara id="gid">
-  <title>gid:long()</title>
-  <indexterm><primary>gid</primary></indexterm>
-  <para>
-	Return the gid of the current process.
-  </para>
-</formalpara>
-<formalpara id="egid">
-  <title>egid:long()</title>
-  <indexterm><primary>egid</primary></indexterm>
-  <para>
-    Return the effective gid of the current process.
-  </para>
-</formalpara>
-<formalpara id="uid">
-  <title>uid:long()</title>
-  <indexterm><primary>uid</primary></indexterm>
-  <para>
-	Return the uid of the current process.
-  </para>
-</formalpara>
-<formalpara id="euid">
-  <title>euid:long()</title>
-  <indexterm><primary>euid</primary></indexterm>
-  <para>
-	Return the effective uid of the current process.
-  </para>
-</formalpara>
-<formalpara id="cpu">
-  <title>cpu:long()</title>
-  <indexterm><primary>cpu</primary></indexterm>
-  <para>
-     Return the current cpu number.
-  </para>
-</formalpara>
-<formalpara id="print_stack">
-  <title>print_stack(stk:string)</title>
-  <indexterm><primary>print_stack</primary></indexterm>
-  <para>
-     Perform a symbolic lookup of the addresses in the given  string,
-     which  is  assumed  to  be  the  result of a prior call to 
-	<xref linkend="backtrace"/>.
-     Print one line per address, including the address, the
-     name  of the function containing the address, and an estimate of
-     its position within that function.  Return nothing.
-  </para>
-</formalpara>
-<formalpara id="pp">
-  <title>pp:string()</title>
-  <indexterm><primary>pp</primary></indexterm>
-  <para>
-     Return the probe point associated with the currently running
-     probe handler, including alias and wildcard expansion effects.
-  </para>
-</formalpara>
-<formalpara id="probefunc">
-  <title>probefunc:string()</title>
-  <indexterm><primary>probefunc</primary></indexterm>
-  <para>
-	Return the probe point's function name, if known.
-  </para>
-</formalpara>
-<formalpara id="probemod">
-  <title>probemod:string()</title>
-  <indexterm><primary>probemod</primary></indexterm>
-  <para>
-	Return the probe point's module name, if known.
-  </para>
-</formalpara>
-<formalpara id="registers_valid">
-  <title>registers_valid:long()</title>
-  <indexterm><primary>registers_valid</primary></indexterm>
-  <para>
-	Return 1 if register() and u_register() can be used
-     in the current context, or 0 otherwise.
-     For example, <command>registers_valid()</command> returns 0
-     when called from a begin or end probe.
-  </para>
-</formalpara>
-<formalpara id="user_mode">
-  <title>user_mode:long()</title>
-  <indexterm><primary>user_mode</primary></indexterm>
-  <para>
-	Return 1 if the probe point occurred in user-mode.
-  </para>
-</formalpara>
-<formalpara id="is_return">
-  <title>is_return:long()</title>
-  <indexterm><primary>is_return</primary></indexterm>
-  <para>
-	Return 1 if the probe point is a return probe.
-     <emphasis>Deprecated.</emphasis>
-  </para>
-</formalpara>
-<formalpara id="target">
-  <title>target:long()</title>
-  <indexterm><primary>target</primary></indexterm>
-  <para>
-	Return the pid of the target process.
-  </para>
-</formalpara>
-<formalpara id="module_name">
-  <title>module_name:string()</title>
-  <indexterm><primary>module_name</primary></indexterm>
-  <para>
-	FIXME: need description.
-  </para>
-</formalpara>
-<formalpara id="stp_pid">
-  <title>stp_pid:long()</title>
-  <indexterm><primary>stp_pid</primary></indexterm>
-  <para>
-	FIXME: need description.
-  </para>
-</formalpara>
-<formalpara id="stack_size">
-  <title>stack_size:long()</title>
-  <indexterm><primary>stack_size</primary></indexterm>
-  <para>
-	Return the size of the kernel stack.
-  </para>
-</formalpara>
-<formalpara id="stack_used">
-  <title>stack_used:long ()</title>
-  <indexterm><primary>stack_used</primary></indexterm>
-  <para>
-	Return how many bytes are currently used in the kernel stack.
-  </para>
-</formalpara>
-<formalpara id="stack_unused">
-  <title>stack_unused:long()</title>
-  <indexterm><primary>stack_unused</primary></indexterm>
-  <para>
-	Return how many bytes are currently available in the kernel stack.
-  </para>
-</formalpara>
-<formalpara id="caller_addr">
-  <title>caller_addr:long()</title>
-  <indexterm><primary>caller_addr</primary></indexterm>
-  <para>
-    Return the address of the calling function.
-    <emphasis> Works only for return probes at this time.</emphasis>
-	
-  </para>
-</formalpara>
-<formalpara id="caller">
-  <title>caller:string()</title>
-  <indexterm><primary>caller</primary></indexterm>
-  <para>
-     Return the address and name of the calling function.
-	<emphasis>Works only for return probes at this time.</emphasis>
-  </para>
-</formalpara>
-</chapter>
diff --git a/doc/SystemTap_Tapset_Reference/en-US/images/icon.svg b/doc/SystemTap_Tapset_Reference/en-US/images/icon.svg
deleted file mode 100644
index c471a60..0000000
--- a/doc/SystemTap_Tapset_Reference/en-US/images/icon.svg
+++ /dev/null
@@ -1,3936 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:ns="http://ns.adobe.com/AdobeSVGViewerExtensions/3/"
-   xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   version="1.0"
-   width="32"
-   height="32"
-   id="svg3017"
-   sodipodi:version="0.32"
-   inkscape:version="0.44+devel"
-   sodipodi:docname="book.svg"
-   sodipodi:docbase="/home/andy/Desktop">
-  <metadata
-     id="metadata489">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <sodipodi:namedview
-     inkscape:window-height="480"
-     inkscape:window-width="858"
-     inkscape:pageshadow="0"
-     inkscape:pageopacity="0.0"
-     guidetolerance="10.0"
-     gridtolerance="10.0"
-     objecttolerance="10.0"
-     borderopacity="1.0"
-     bordercolor="#666666"
-     pagecolor="#ffffff"
-     id="base"
-     inkscape:zoom="1"
-     inkscape:cx="16"
-     inkscape:cy="15.944056"
-     inkscape:window-x="0"
-     inkscape:window-y="33"
-     inkscape:current-layer="svg3017" />
-  <defs
-     id="defs3019">
-    <linearGradient
-       id="linearGradient2381">
-      <stop
-         style="stop-color:white;stop-opacity:1"
-         offset="0"
-         id="stop2383" />
-      <stop
-         style="stop-color:white;stop-opacity:0"
-         offset="1"
-         id="stop2385" />
-    </linearGradient>
-    <linearGradient
-       x1="415.73831"
-       y1="11.854"
-       x2="418.13361"
-       y2="18.8104"
-       id="XMLID_1758_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.8362,0.5206,-1.1904,0.992,147.62,-30.9374)">
-      <stop
-         style="stop-color:#ccc;stop-opacity:1"
-         offset="0"
-         id="stop3903" />
-      <stop
-         style="stop-color:#f2f2f2;stop-opacity:1"
-         offset="1"
-         id="stop3905" />
-      <a:midPointStop
-         style="stop-color:#CCCCCC"
-         offset="0" />
-      <a:midPointStop
-         style="stop-color:#CCCCCC"
-         offset="0.5" />
-      <a:midPointStop
-         style="stop-color:#F2F2F2"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="500.70749"
-       y1="-13.2441"
-       x2="513.46442"
-       y2="-2.1547"
-       id="XMLID_1757_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)">
-      <stop
-         style="stop-color:#5387ba;stop-opacity:1"
-         offset="0"
-         id="stop3890" />
-      <stop
-         style="stop-color:#96bad6;stop-opacity:1"
-         offset="1"
-         id="stop3892" />
-      <a:midPointStop
-         style="stop-color:#5387BA"
-         offset="0" />
-      <a:midPointStop
-         style="stop-color:#5387BA"
-         offset="0.5" />
-      <a:midPointStop
-         style="stop-color:#96BAD6"
-         offset="1" />
-    </linearGradient>
-    <clipPath
-       id="XMLID_1755_">
-      <use
-         id="use3874"
-         x="0"
-         y="0"
-         width="744.09448"
-         height="600"
-         xlink:href="#XMLID_343_" />
-    </clipPath>
-    <linearGradient
-       x1="505.62939"
-       y1="-14.9526"
-       x2="527.49402"
-       y2="-0.7536"
-       id="XMLID_1756_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)">
-      <stop
-         style="stop-color:#b4daea;stop-opacity:1"
-         offset="0"
-         id="stop3877" />
-      <stop
-         style="stop-color:#b4daea;stop-opacity:1"
-         offset="0.51120001"
-         id="stop3879" />
-      <stop
-         style="stop-color:#5387ba;stop-opacity:1"
-         offset="0.64609998"
-         id="stop3881" />
-      <stop
-         style="stop-color:#16336e;stop-opacity:1"
-         offset="1"
-         id="stop3883" />
-      <a:midPointStop
-         style="stop-color:#B4DAEA"
-         offset="0" />
-      <a:midPointStop
-         style="stop-color:#B4DAEA"
-         offset="0.5" />
-      <a:midPointStop
-         style="stop-color:#B4DAEA"
-         offset="0.5112" />
-      <a:midPointStop
-         style="stop-color:#B4DAEA"
-         offset="0.5" />
-      <a:midPointStop
-         style="stop-color:#5387BA"
-         offset="0.6461" />
-      <a:midPointStop
-         style="stop-color:#5387BA"
-         offset="0.5" />
-      <a:midPointStop
-         style="stop-color:#16336E"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="471.0806"
-       y1="201.07761"
-       x2="481.91711"
-       y2="210.4977"
-       id="XMLID_1754_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#6498c1;stop-opacity:1"
-         offset="0.005618"
-         id="stop3863" />
-      <stop
-         style="stop-color:#79a9cc;stop-opacity:1"
-         offset="0.2332"
-         id="stop3865" />
-      <stop
-         style="stop-color:#a4cde2;stop-opacity:1"
-         offset="0.74049997"
-         id="stop3867" />
-      <stop
-         style="stop-color:#b4daea;stop-opacity:1"
-         offset="1"
-         id="stop3869" />
-      <a:midPointStop
-         style="stop-color:#6498C1"
-         offset="5.618000e-003" />
-      <a:midPointStop
-         style="stop-color:#6498C1"
-         offset="0.4438" />
-      <a:midPointStop
-         style="stop-color:#B4DAEA"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="516.57672"
-       y1="-15.769"
-       x2="516.57672"
-       y2="0.84280002"
-       id="XMLID_1753_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)">
-      <stop
-         style="stop-color:#b2b2b2;stop-opacity:1"
-         offset="0"
-         id="stop3851" />
-      <stop
-         style="stop-color:#f2f2f2;stop-opacity:1"
-         offset="1"
-         id="stop3853" />
-      <a:midPointStop
-         style="stop-color:#B2B2B2"
-         offset="0" />
-      <a:midPointStop
-         style="stop-color:#B2B2B2"
-         offset="0.5" />
-      <a:midPointStop
-         style="stop-color:#F2F2F2"
-         offset="1" />
-    </linearGradient>
-    <clipPath
-       id="XMLID_1751_">
-      <use
-         id="use3837"
-         x="0"
-         y="0"
-         width="744.09448"
-         height="600"
-         xlink:href="#XMLID_338_" />
-    </clipPath>
-    <linearGradient
-       x1="506.09909"
-       y1="-11.5137"
-       x2="527.99609"
-       y2="2.7063999"
-       id="XMLID_1752_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)">
-      <stop
-         style="stop-color:#b4daea;stop-opacity:1"
-         offset="0"
-         id="stop3840" />
-      <stop
-         style="stop-color:#b4daea;stop-opacity:1"
-         offset="0.51120001"
-         id="stop3842" />
-      <stop
-         style="stop-color:#5387ba;stop-opacity:1"
-         offset="0.64609998"
-         id="stop3844" />
-      <stop
-         style="stop-color:#16336e;stop-opacity:1"
-         offset="1"
-         id="stop3846" />
-      <a:midPointStop
-         style="stop-color:#B4DAEA"
-         offset="0" />
-      <a:midPointStop
-         style="stop-color:#B4DAEA"
-         offset="0.5" />
-      <a:midPointStop
-         style="stop-color:#B4DAEA"
-         offset="0.5112" />
-      <a:midPointStop
-         style="stop-color:#B4DAEA"
-         offset="0.5" />
-      <a:midPointStop
-         style="stop-color:#5387BA"
-         offset="0.6461" />
-      <a:midPointStop
-         style="stop-color:#5387BA"
-         offset="0.5" />
-      <a:midPointStop
-         style="stop-color:#16336E"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="468.2915"
-       y1="204.7612"
-       x2="479.39871"
-       y2="214.4166"
-       id="XMLID_1750_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#5387ba;stop-opacity:1"
-         offset="0"
-         id="stop3830" />
-      <stop
-         style="stop-color:#96bad6;stop-opacity:1"
-         offset="1"
-         id="stop3832" />
-      <a:midPointStop
-         style="stop-color:#5387BA"
-         offset="0" />
-      <a:midPointStop
-         style="stop-color:#5387BA"
-         offset="0.5" />
-      <a:midPointStop
-         style="stop-color:#96BAD6"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="502.70749"
-       y1="115.3013"
-       x2="516.39001"
-       y2="127.1953"
-       id="XMLID_1749_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.9703,0.2419,-0.2419,0.9703,11.0227,-35.6159)">
-      <stop
-         style="stop-color:#5387ba;stop-opacity:1"
-         offset="0"
-         id="stop3818" />
-      <stop
-         style="stop-color:#96bad6;stop-opacity:1"
-         offset="1"
-         id="stop3820" />
-      <a:midPointStop
-         style="stop-color:#5387BA"
-         offset="0" />
-      <a:midPointStop
-         style="stop-color:#5387BA"
-         offset="0.5" />
-      <a:midPointStop
-         style="stop-color:#96BAD6"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="501.0903"
-       y1="-19.2544"
-       x2="531.85413"
-       y2="0.72390002"
-       id="XMLID_1748_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)">
-      <stop
-         style="stop-color:#b4daea;stop-opacity:1"
-         offset="0"
-         id="stop3803" />
-      <stop
-         style="stop-color:#b4daea;stop-opacity:1"
-         offset="0.51120001"
-         id="stop3805" />
-      <stop
-         style="stop-color:#5387ba;stop-opacity:1"
-         offset="0.64609998"
-         id="stop3807" />
-      <stop
-         style="stop-color:#16336e;stop-opacity:1"
-         offset="1"
-         id="stop3809" />
-      <a:midPointStop
-         style="stop-color:#B4DAEA"
-         offset="0" />
-      <a:midPointStop
-         style="stop-color:#B4DAEA"
-         offset="0.5" />
-      <a:midPointStop
-         style="stop-color:#B4DAEA"
-         offset="0.5112" />
-      <a:midPointStop
-         style="stop-color:#B4DAEA"
-         offset="0.5" />
-      <a:midPointStop
-         style="stop-color:#5387BA"
-         offset="0.6461" />
-      <a:midPointStop
-         style="stop-color:#5387BA"
-         offset="0.5" />
-      <a:midPointStop
-         style="stop-color:#16336E"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="481.23969"
-       y1="212.5742"
-       x2="472.92981"
-       y2="207.4967"
-       id="XMLID_2275_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#f3403f;stop-opacity:1"
-         offset="0"
-         id="stop9947" />
-      <stop
-         style="stop-color:#d02a28;stop-opacity:1"
-         offset="0.37889999"
-         id="stop9949" />
-      <stop
-         style="stop-color:#b21714;stop-opacity:1"
-         offset="0.77649999"
-         id="stop9951" />
-      <stop
-         style="stop-color:#a6100c;stop-opacity:1"
-         offset="1"
-         id="stop9953" />
-      <a:midPointStop
-         style="stop-color:#F3403F"
-         offset="0" />
-      <a:midPointStop
-         style="stop-color:#F3403F"
-         offset="0.4213" />
-      <a:midPointStop
-         style="stop-color:#A6100C"
-         offset="1" />
-    </linearGradient>
-    <clipPath
-       id="XMLID_2273_">
-      <use
-         id="use9933"
-         x="0"
-         y="0"
-         width="744.09448"
-         height="600"
-         xlink:href="#XMLID_960_" />
-    </clipPath>
-    <linearGradient
-       x1="473.7681"
-       y1="209.17529"
-       x2="486.98099"
-       y2="213.2001"
-       id="XMLID_2274_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#f3403f;stop-opacity:1"
-         offset="0"
-         id="stop9936" />
-      <stop
-         style="stop-color:#d02a28;stop-opacity:1"
-         offset="0.37889999"
-         id="stop9938" />
-      <stop
-         style="stop-color:#b21714;stop-opacity:1"
-         offset="0.77649999"
-         id="stop9940" />
-      <stop
-         style="stop-color:#a6100c;stop-opacity:1"
-         offset="1"
-         id="stop9942" />
-      <a:midPointStop
-         style="stop-color:#F3403F"
-         offset="0" />
-      <a:midPointStop
-         style="stop-color:#F3403F"
-         offset="0.4213" />
-      <a:midPointStop
-         style="stop-color:#A6100C"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="478.21341"
-       y1="-131.9297"
-       x2="469.85818"
-       y2="-140.28481"
-       id="XMLID_2272_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.5592,0.829,-0.829,0.5592,101.3357,-104.791)">
-      <stop
-         style="stop-color:#f3403f;stop-opacity:1"
-         offset="0"
-         id="stop9917" />
-      <stop
-         style="stop-color:#d02a28;stop-opacity:1"
-         offset="0.37889999"
-         id="stop9919" />
-      <stop
-         style="stop-color:#b21714;stop-opacity:1"
-         offset="0.77649999"
-         id="stop9921" />
-      <stop
-         style="stop-color:#a6100c;stop-opacity:1"
-         offset="1"
-         id="stop9923" />
-      <a:midPointStop
-         style="stop-color:#F3403F"
-         offset="0" />
-      <a:midPointStop
-         style="stop-color:#F3403F"
-         offset="0.4213" />
-      <a:midPointStop
-         style="stop-color:#A6100C"
-         offset="1" />
-    </linearGradient>
-    <marker
-       refX="0"
-       refY="0"
-       orient="auto"
-       style="overflow:visible"
-       id="TriangleInM">
-      <path
-         d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z "
-         transform="scale(-0.4,-0.4)"
-         style="fill:#5c5c4f"
-         id="path3197" />
-    </marker>
-    <linearGradient
-       x1="200.7363"
-       y1="100.4028"
-       x2="211.99519"
-       y2="89.143997"
-       id="XMLID_3298_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#bfbfbf;stop-opacity:1"
-         offset="0"
-         id="stop20103" />
-      <stop
-         style="stop-color:#f2f2f2;stop-opacity:1"
-         offset="1"
-         id="stop20105" />
-      <a:midPointStop
-         offset="0"
-         style="stop-color:#BFBFBF" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#BFBFBF" />
-      <a:midPointStop
-         offset="1"
-         style="stop-color:#F2F2F2" />
-    </linearGradient>
-    <linearGradient
-       x1="200.7363"
-       y1="100.4028"
-       x2="211.99519"
-       y2="89.143997"
-       id="linearGradient36592"
-       xlink:href="#XMLID_3298_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.029078,0,0,1,-183.2624,-79.44655)" />
-    <linearGradient
-       x1="181.2925"
-       y1="110.8481"
-       x2="192.6369"
-       y2="99.5037"
-       id="XMLID_3297_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#e5e5e5;stop-opacity:1"
-         offset="0"
-         id="stop20096" />
-      <stop
-         style="stop-color:#ccc;stop-opacity:1"
-         offset="1"
-         id="stop20098" />
-      <a:midPointStop
-         offset="0"
-         style="stop-color:#E5E5E5" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#E5E5E5" />
-      <a:midPointStop
-         offset="1"
-         style="stop-color:#CCCCCC" />
-    </linearGradient>
-    <linearGradient
-       x1="181.2925"
-       y1="110.8481"
-       x2="192.6369"
-       y2="99.5037"
-       id="linearGradient36595"
-       xlink:href="#XMLID_3297_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.029078,0,0,1,-183.2624,-79.44655)" />
-    <linearGradient
-       x1="211.77589"
-       y1="105.7749"
-       x2="212.6619"
-       y2="108.2092"
-       id="XMLID_3296_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#0f6124;stop-opacity:1"
-         offset="0"
-         id="stop20087" />
-      <stop
-         style="stop-color:#219630;stop-opacity:1"
-         offset="1"
-         id="stop20089" />
-      <a:midPointStop
-         offset="0"
-         style="stop-color:#0F6124" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#0F6124" />
-      <a:midPointStop
-         offset="1"
-         style="stop-color:#219630" />
-    </linearGradient>
-    <linearGradient
-       x1="211.77589"
-       y1="105.7749"
-       x2="212.6619"
-       y2="108.2092"
-       id="linearGradient36677"
-       xlink:href="#XMLID_3296_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.029078,0,0,1,-183.2624,-79.44655)" />
-    <linearGradient
-       x1="208.9834"
-       y1="116.8296"
-       x2="200.0811"
-       y2="96.834602"
-       id="XMLID_3295_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#b2b2b2;stop-opacity:1"
-         offset="0"
-         id="stop20076" />
-      <stop
-         style="stop-color:#e5e5e5;stop-opacity:1"
-         offset="0.5"
-         id="stop20078" />
-      <stop
-         style="stop-color:white;stop-opacity:1"
-         offset="1"
-         id="stop20080" />
-      <a:midPointStop
-         offset="0"
-         style="stop-color:#B2B2B2" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#B2B2B2" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#E5E5E5" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#E5E5E5" />
-      <a:midPointStop
-         offset="1"
-         style="stop-color:#FFFFFF" />
-    </linearGradient>
-    <linearGradient
-       x1="208.9834"
-       y1="116.8296"
-       x2="200.0811"
-       y2="96.834602"
-       id="linearGradient36604"
-       xlink:href="#XMLID_3295_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.029078,0,0,1,-183.2624,-79.44655)" />
-    <linearGradient
-       x1="195.5264"
-       y1="97.911102"
-       x2="213.5213"
-       y2="115.9061"
-       id="XMLID_3294_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#ccc;stop-opacity:1"
-         offset="0"
-         id="stop20069" />
-      <stop
-         style="stop-color:white;stop-opacity:1"
-         offset="1"
-         id="stop20071" />
-      <a:midPointStop
-         offset="0"
-         style="stop-color:#CCCCCC" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#CCCCCC" />
-      <a:midPointStop
-         offset="1"
-         style="stop-color:#FFFFFF" />
-    </linearGradient>
-    <linearGradient
-       x1="195.5264"
-       y1="97.911102"
-       x2="213.5213"
-       y2="115.9061"
-       id="linearGradient36607"
-       xlink:href="#XMLID_3294_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.029078,0,0,1,-183.2624,-79.44655)" />
-    <linearGradient
-       x1="186.1938"
-       y1="109.1343"
-       x2="206.6881"
-       y2="88.639999"
-       id="XMLID_3293_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#b2b2b2;stop-opacity:1"
-         offset="0"
-         id="stop20056" />
-      <stop
-         style="stop-color:#e5e5e5;stop-opacity:1"
-         offset="0.16850001"
-         id="stop20058" />
-      <stop
-         style="stop-color:white;stop-opacity:1"
-         offset="0.23029999"
-         id="stop20060" />
-      <stop
-         style="stop-color:#e5e5e5;stop-opacity:1"
-         offset="0.2809"
-         id="stop20062" />
-      <stop
-         style="stop-color:#c2c2c2;stop-opacity:1"
-         offset="0.5"
-         id="stop20064" />
-      <a:midPointStop
-         offset="0"
-         style="stop-color:#B2B2B2" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#B2B2B2" />
-      <a:midPointStop
-         offset="0.1685"
-         style="stop-color:#E5E5E5" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#E5E5E5" />
-      <a:midPointStop
-         offset="0.2303"
-         style="stop-color:#FFFFFF" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#FFFFFF" />
-      <a:midPointStop
-         offset="0.2809"
-         style="stop-color:#E5E5E5" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#E5E5E5" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#C2C2C2" />
-    </linearGradient>
-    <linearGradient
-       x1="186.1938"
-       y1="109.1343"
-       x2="206.6881"
-       y2="88.639999"
-       id="linearGradient36610"
-       xlink:href="#XMLID_3293_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.029078,0,0,1,-183.2624,-79.44655)" />
-    <linearGradient
-       x1="184.8569"
-       y1="112.2676"
-       x2="211.94099"
-       y2="89.541397"
-       id="XMLID_3292_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#b2b2b2;stop-opacity:1"
-         offset="0"
-         id="stop20043" />
-      <stop
-         style="stop-color:#e5e5e5;stop-opacity:1"
-         offset="0.16850001"
-         id="stop20045" />
-      <stop
-         style="stop-color:white;stop-opacity:1"
-         offset="0.23029999"
-         id="stop20047" />
-      <stop
-         style="stop-color:#e5e5e5;stop-opacity:1"
-         offset="0.2809"
-         id="stop20049" />
-      <stop
-         style="stop-color:#ccc;stop-opacity:1"
-         offset="1"
-         id="stop20051" />
-      <a:midPointStop
-         offset="0"
-         style="stop-color:#B2B2B2" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#B2B2B2" />
-      <a:midPointStop
-         offset="0.1685"
-         style="stop-color:#E5E5E5" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#E5E5E5" />
-      <a:midPointStop
-         offset="0.2303"
-         style="stop-color:#FFFFFF" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#FFFFFF" />
-      <a:midPointStop
-         offset="0.2809"
-         style="stop-color:#E5E5E5" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#E5E5E5" />
-      <a:midPointStop
-         offset="1"
-         style="stop-color:#CCCCCC" />
-    </linearGradient>
-    <linearGradient
-       x1="184.8569"
-       y1="112.2676"
-       x2="211.94099"
-       y2="89.541397"
-       id="linearGradient36613"
-       xlink:href="#XMLID_3292_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.029078,0,0,1,-183.2624,-79.44655)" />
-    <marker
-       refX="0"
-       refY="0"
-       orient="auto"
-       style="overflow:visible"
-       id="TriangleOutM">
-      <path
-         d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z "
-         transform="scale(0.4,0.4)"
-         style="fill:#5c5c4f;fill-rule:evenodd;stroke-width:1pt;marker-start:none"
-         id="path3238" />
-    </marker>
-    <linearGradient
-       x1="165.3"
-       y1="99.5"
-       x2="165.3"
-       y2="115.9"
-       id="XMLID_3457_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#999;stop-opacity:1"
-         offset="0"
-         id="stop8309" />
-      <stop
-         style="stop-color:#b2b2b2;stop-opacity:1"
-         offset="0.30000001"
-         id="stop8311" />
-      <stop
-         style="stop-color:#b2b2b2;stop-opacity:1"
-         offset="1"
-         id="stop8313" />
-      <a:midPointstop
-         offset="0"
-         style="stop-color:#999999" />
-      <a:midPointstop
-         offset="0.5"
-         style="stop-color:#999999" />
-      <a:midPointstop
-         offset="0.3"
-         style="stop-color:#B2B2B2" />
-      <a:midPointstop
-         offset="0.5"
-         style="stop-color:#B2B2B2" />
-      <a:midPointstop
-         offset="1"
-         style="stop-color:#B2B2B2" />
-    </linearGradient>
-    <linearGradient
-       x1="165.3"
-       y1="99.5"
-       x2="165.3"
-       y2="115.9"
-       id="lg1997"
-       xlink:href="#XMLID_3457_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.2,0,0,1.2,-175.9,-114.6)" />
-    <linearGradient
-       x1="175"
-       y1="99.800003"
-       x2="175"
-       y2="112.5"
-       id="XMLID_3456_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#737373;stop-opacity:1"
-         offset="0"
-         id="stop8300" />
-      <stop
-         style="stop-color:#191919;stop-opacity:1"
-         offset="0.60000002"
-         id="stop8302" />
-      <stop
-         style="stop-color:#191919;stop-opacity:1"
-         offset="1"
-         id="stop8304" />
-      <a:midPointstop
-         offset="0"
-         style="stop-color:#737373" />
-      <a:midPointstop
-         offset="0.5"
-         style="stop-color:#737373" />
-      <a:midPointstop
-         offset="0.6"
-         style="stop-color:#191919" />
-      <a:midPointstop
-         offset="0.5"
-         style="stop-color:#191919" />
-      <a:midPointstop
-         offset="1"
-         style="stop-color:#191919" />
-    </linearGradient>
-    <linearGradient
-       x1="175"
-       y1="99.800003"
-       x2="175"
-       y2="112.5"
-       id="lg2000"
-       xlink:href="#XMLID_3456_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.2,0,0,1.2,-175.9,-114.6)" />
-    <linearGradient
-       x1="168.8"
-       y1="107.1"
-       x2="164.5"
-       y2="110"
-       id="XMLID_3455_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#666;stop-opacity:1"
-         offset="0"
-         id="stop8291" />
-      <stop
-         style="stop-color:#191919;stop-opacity:1"
-         offset="0.69999999"
-         id="stop8293" />
-      <stop
-         style="stop-color:#191919;stop-opacity:1"
-         offset="1"
-         id="stop8295" />
-      <a:midPointstop
-         offset="0"
-         style="stop-color:#666666" />
-      <a:midPointstop
-         offset="0.5"
-         style="stop-color:#666666" />
-      <a:midPointstop
-         offset="0.7"
-         style="stop-color:#191919" />
-      <a:midPointstop
-         offset="0.5"
-         style="stop-color:#191919" />
-      <a:midPointstop
-         offset="1"
-         style="stop-color:#191919" />
-    </linearGradient>
-    <linearGradient
-       x1="168.8"
-       y1="107.1"
-       x2="164.5"
-       y2="110"
-       id="lg2003"
-       xlink:href="#XMLID_3455_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.2,0,0,1.2,-175.9,-114.6)" />
-    <linearGradient
-       id="lg63694">
-      <stop
-         style="stop-color:white;stop-opacity:1"
-         offset="0"
-         id="stop63696" />
-      <stop
-         style="stop-color:white;stop-opacity:0"
-         offset="1"
-         id="stop63698" />
-    </linearGradient>
-    <linearGradient
-       x1="458"
-       y1="483"
-       x2="465.20001"
-       y2="271.39999"
-       id="lg2006"
-       xlink:href="#lg63694"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(6.3e-2,0,0,6.3e-2,-1.3,-9.8)" />
-    <linearGradient
-       x1="176.3"
-       y1="110.1"
-       x2="158.7"
-       y2="105"
-       id="XMLID_3453_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#666;stop-opacity:1"
-         offset="0"
-         id="stop8271" />
-      <stop
-         style="stop-color:#737373;stop-opacity:1"
-         offset="0.2"
-         id="stop8273" />
-      <stop
-         style="stop-color:white;stop-opacity:1"
-         offset="1"
-         id="stop8275" />
-      <a:midPointstop
-         offset="0"
-         style="stop-color:#666666" />
-      <a:midPointstop
-         offset="0.5"
-         style="stop-color:#666666" />
-      <a:midPointstop
-         offset="0.2"
-         style="stop-color:#737373" />
-      <a:midPointstop
-         offset="0.5"
-         style="stop-color:#737373" />
-      <a:midPointstop
-         offset="1"
-         style="stop-color:#FFFFFF" />
-    </linearGradient>
-    <linearGradient
-       x1="176.3"
-       y1="110.1"
-       x2="158.7"
-       y2="105"
-       id="lg2009"
-       xlink:href="#XMLID_3453_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.2,0,0,1.2,-175.9,-114.6)" />
-    <linearGradient
-       x1="173.60001"
-       y1="118.9"
-       x2="172.8"
-       y2="128.2"
-       id="XMLID_3449_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#ecb300;stop-opacity:1"
-         offset="0"
-         id="stop8232" />
-      <stop
-         style="stop-color:#fff95e;stop-opacity:1"
-         offset="0.60000002"
-         id="stop8234" />
-      <stop
-         style="stop-color:#ecd600;stop-opacity:1"
-         offset="1"
-         id="stop8236" />
-      <a:midPointstop
-         offset="0"
-         style="stop-color:#ECB300" />
-      <a:midPointstop
-         offset="0.5"
-         style="stop-color:#ECB300" />
-      <a:midPointstop
-         offset="0.6"
-         style="stop-color:#FFF95E" />
-      <a:midPointstop
-         offset="0.5"
-         style="stop-color:#FFF95E" />
-      <a:midPointstop
-         offset="1"
-         style="stop-color:#ECD600" />
-    </linearGradient>
-    <linearGradient
-       x1="173.60001"
-       y1="118.9"
-       x2="172.8"
-       y2="128.2"
-       id="lg2016"
-       xlink:href="#XMLID_3449_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.2,0,0,1.2,-175.9,-114.6)" />
-    <radialGradient
-       cx="284.60001"
-       cy="172.60001"
-       r="6.5"
-       fx="284.60001"
-       fy="172.60001"
-       id="XMLID_3448_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.4,0,0,1.4,-237.3,-126.8)">
-      <stop
-         style="stop-color:#ecb300;stop-opacity:1"
-         offset="0"
-         id="stop8219" />
-      <stop
-         style="stop-color:#ecb300;stop-opacity:1"
-         offset="0.30000001"
-         id="stop8221" />
-      <stop
-         style="stop-color:#c96b00;stop-opacity:1"
-         offset="0.89999998"
-         id="stop8223" />
-      <stop
-         style="stop-color:#9a5500;stop-opacity:1"
-         offset="1"
-         id="stop8225" />
-      <a:midPointstop
-         offset="0"
-         style="stop-color:#ECB300" />
-      <a:midPointstop
-         offset="0.5"
-         style="stop-color:#ECB300" />
-      <a:midPointstop
-         offset="0.3"
-         style="stop-color:#ECB300" />
-      <a:midPointstop
-         offset="0.5"
-         style="stop-color:#ECB300" />
-      <a:midPointstop
-         offset="0.9"
-         style="stop-color:#C96B00" />
-      <a:midPointstop
-         offset="0.5"
-         style="stop-color:#C96B00" />
-      <a:midPointstop
-         offset="1"
-         style="stop-color:#9A5500" />
-    </radialGradient>
-    <radialGradient
-       cx="284.60001"
-       cy="172.60001"
-       r="6.5"
-       fx="284.60001"
-       fy="172.60001"
-       id="rg2020"
-       xlink:href="#XMLID_3448_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.513992,0,0,2.347576,-689.1621,-378.5717)" />
-    <linearGradient
-       x1="158.10001"
-       y1="123"
-       x2="164.2"
-       y2="126.6"
-       id="XMLID_3447_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#ecd600;stop-opacity:1"
-         offset="0"
-         id="stop8204" />
-      <stop
-         style="stop-color:#ffffb3;stop-opacity:1"
-         offset="0.30000001"
-         id="stop8206" />
-      <stop
-         style="stop-color:white;stop-opacity:1"
-         offset="1"
-         id="stop8208" />
-      <a:midPointstop
-         offset="0"
-         style="stop-color:#ECD600" />
-      <a:midPointstop
-         offset="0.5"
-         style="stop-color:#ECD600" />
-      <a:midPointstop
-         offset="0.3"
-         style="stop-color:#FFFFB3" />
-      <a:midPointstop
-         offset="0.5"
-         style="stop-color:#FFFFB3" />
-      <a:midPointstop
-         offset="1"
-         style="stop-color:#FFFFFF" />
-    </linearGradient>
-    <linearGradient
-       x1="158.10001"
-       y1="123"
-       x2="164.2"
-       y2="126.6"
-       id="lg2026"
-       xlink:href="#XMLID_3447_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.2,0,0,1.2,-175.9,-114.6)" />
-    <radialGradient
-       cx="280.89999"
-       cy="163.7"
-       r="10.1"
-       fx="280.89999"
-       fy="163.7"
-       id="XMLID_3446_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.4,0,0,1.4,-237.3,-126.8)">
-      <stop
-         style="stop-color:white;stop-opacity:1"
-         offset="0"
-         id="stop8197" />
-      <stop
-         style="stop-color:#fff95e;stop-opacity:1"
-         offset="1"
-         id="stop8199" />
-      <a:midPointstop
-         offset="0"
-         style="stop-color:#FFFFFF" />
-      <a:midPointstop
-         offset="0.5"
-         style="stop-color:#FFFFFF" />
-      <a:midPointstop
-         offset="1"
-         style="stop-color:#FFF95E" />
-    </radialGradient>
-    <radialGradient
-       cx="280.89999"
-       cy="163.7"
-       r="10.1"
-       fx="280.89999"
-       fy="163.7"
-       id="rg2029"
-       xlink:href="#XMLID_3446_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.7,0,0,1.7,-457.5,-266.8)" />
-    <linearGradient
-       x1="156.5"
-       y1="122.7"
-       x2="180.10001"
-       y2="122.7"
-       id="XMLID_3445_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#ecb300;stop-opacity:1"
-         offset="0"
-         id="stop8184" />
-      <stop
-         style="stop-color:#ffe900;stop-opacity:1"
-         offset="0.2"
-         id="stop8186" />
-      <stop
-         style="stop-color:#ffffb3;stop-opacity:1"
-         offset="0.30000001"
-         id="stop8188" />
-      <stop
-         style="stop-color:#ffe900;stop-opacity:1"
-         offset="0.40000001"
-         id="stop8190" />
-      <stop
-         style="stop-color:#d68100;stop-opacity:1"
-         offset="1"
-         id="stop8192" />
-      <a:midPointstop
-         offset="0"
-         style="stop-color:#ECB300" />
-      <a:midPointstop
-         offset="0.5"
-         style="stop-color:#ECB300" />
-      <a:midPointstop
-         offset="0.2"
-         style="stop-color:#FFE900" />
-      <a:midPointstop
-         offset="0.5"
-         style="stop-color:#FFE900" />
-      <a:midPointstop
-         offset="0.3"
-         style="stop-color:#FFFFB3" />
-      <a:midPointstop
-         offset="0.5"
-         style="stop-color:#FFFFB3" />
-      <a:midPointstop
-         offset="0.4"
-         style="stop-color:#FFE900" />
-      <a:midPointstop
-         offset="0.5"
-         style="stop-color:#FFE900" />
-      <a:midPointstop
-         offset="1"
-         style="stop-color:#D68100" />
-    </linearGradient>
-    <linearGradient
-       x1="156.5"
-       y1="122.7"
-       x2="180.10001"
-       y2="122.7"
-       id="lg2032"
-       xlink:href="#XMLID_3445_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.2,0,0,1.2,-175.9,-114.6)" />
-    <linearGradient
-       x1="156.39999"
-       y1="115.4"
-       x2="180.10001"
-       y2="115.4"
-       id="XMLID_3444_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#ecb300;stop-opacity:1"
-         offset="0"
-         id="stop8171" />
-      <stop
-         style="stop-color:#ffe900;stop-opacity:1"
-         offset="0.2"
-         id="stop8173" />
-      <stop
-         style="stop-color:#ffffb3;stop-opacity:1"
-         offset="0.30000001"
-         id="stop8175" />
-      <stop
-         style="stop-color:#ffe900;stop-opacity:1"
-         offset="0.40000001"
-         id="stop8177" />
-      <stop
-         style="stop-color:#d68100;stop-opacity:1"
-         offset="1"
-         id="stop8179" />
-      <a:midPointstop
-         offset="0"
-         style="stop-color:#ECB300" />
-      <a:midPointstop
-         offset="0.5"
-         style="stop-color:#ECB300" />
-      <a:midPointstop
-         offset="0.2"
-         style="stop-color:#FFE900" />
-      <a:midPointstop
-         offset="0.5"
-         style="stop-color:#FFE900" />
-      <a:midPointstop
-         offset="0.3"
-         style="stop-color:#FFFFB3" />
-      <a:midPointstop
-         offset="0.5"
-         style="stop-color:#FFFFB3" />
-      <a:midPointstop
-         offset="0.4"
-         style="stop-color:#FFE900" />
-      <a:midPointstop
-         offset="0.5"
-         style="stop-color:#FFE900" />
-      <a:midPointstop
-         offset="1"
-         style="stop-color:#D68100" />
-    </linearGradient>
-    <linearGradient
-       x1="156.39999"
-       y1="115.4"
-       x2="180.10001"
-       y2="115.4"
-       id="lg2035"
-       xlink:href="#XMLID_3444_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.2,0,0,1.2,-175.9,-114.6)" />
-    <linearGradient
-       x1="379.70001"
-       y1="167.89999"
-       x2="383.89999"
-       y2="172.89999"
-       id="lg4286_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.8,0.2,-0.2,0.8,78.8,38.1)">
-      <stop
-         style="stop-color:white;stop-opacity:1"
-         offset="0"
-         id="s16159" />
-      <stop
-         style="stop-color:white;stop-opacity:1"
-         offset="0.1"
-         id="s16161" />
-      <stop
-         style="stop-color:#737373;stop-opacity:1"
-         offset="1"
-         id="s16163" />
-      <ns:midPointStop
-         style="stop-color:#FFFFFF"
-         offset="0" />
-      <ns:midPointStop
-         style="stop-color:#FFFFFF"
-         offset="0.5" />
-      <ns:midPointStop
-         style="stop-color:#FFFFFF"
-         offset="0.1" />
-      <ns:midPointStop
-         style="stop-color:#FFFFFF"
-         offset="0.5" />
-      <ns:midPointStop
-         style="stop-color:#737373"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="379.60001"
-       y1="167.8"
-       x2="383.79999"
-       y2="172"
-       id="lg6416"
-       xlink:href="#lg4286_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.622156,0.623859,-0.623859,2.62182,-882.9706,-673.7921)" />
-    <linearGradient
-       x1="384.20001"
-       y1="169.8"
-       x2="384.79999"
-       y2="170.39999"
-       id="lg4285_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.8,0.2,-0.2,0.8,78.8,38.1)">
-      <stop
-         style="stop-color:#737373;stop-opacity:1"
-         offset="0"
-         id="s16152" />
-      <stop
-         style="stop-color:#d9d9d9;stop-opacity:1"
-         offset="1"
-         id="s16154" />
-      <ns:midPointStop
-         style="stop-color:#737373"
-         offset="0" />
-      <ns:midPointStop
-         style="stop-color:#737373"
-         offset="0.5" />
-      <ns:midPointStop
-         style="stop-color:#D9D9D9"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="384.20001"
-       y1="169.8"
-       x2="384.79999"
-       y2="170.39999"
-       id="lg6453"
-       xlink:href="#lg4285_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.6,0.6,-0.6,2.6,-883,-673.8)" />
-    <linearGradient
-       x1="380.5"
-       y1="172.60001"
-       x2="382.79999"
-       y2="173.7"
-       id="lg4284_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.8,0.2,-0.2,0.8,78.8,38.1)">
-      <stop
-         style="stop-color:gray;stop-opacity:1"
-         offset="0"
-         id="s16145" />
-      <stop
-         style="stop-color:#e5e5e5;stop-opacity:1"
-         offset="1"
-         id="s16147" />
-      <ns:midPointStop
-         style="stop-color:#808080"
-         offset="0" />
-      <ns:midPointStop
-         style="stop-color:#808080"
-         offset="0.5" />
-      <ns:midPointStop
-         style="stop-color:#E5E5E5"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="380.5"
-       y1="172.60001"
-       x2="382.79999"
-       y2="173.7"
-       id="lg6456"
-       xlink:href="#lg4284_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.6,0.6,-0.6,2.6,-883,-673.8)" />
-    <radialGradient
-       cx="347.29999"
-       cy="244.5"
-       r="5.1999998"
-       fx="347.29999"
-       fy="244.5"
-       id="lg4282_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(3.4,0,0,3.4,-1148,-802)">
-      <stop
-         style="stop-color:#333;stop-opacity:1"
-         offset="0"
-         id="s16135" />
-      <stop
-         style="stop-color:#999;stop-opacity:1"
-         offset="1"
-         id="s16137" />
-      <ns:midPointStop
-         style="stop-color:#333333"
-         offset="0" />
-      <ns:midPointStop
-         style="stop-color:#333333"
-         offset="0.5" />
-      <ns:midPointStop
-         style="stop-color:#999999"
-         offset="1" />
-    </radialGradient>
-    <linearGradient
-       x1="310.39999"
-       y1="397.70001"
-       x2="310.89999"
-       y2="399.5"
-       id="lg4280_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.7,-0.7,0.7,0.7,-153.4,180.6)">
-      <stop
-         style="stop-color:#ffcd00;stop-opacity:1"
-         offset="0"
-         id="s16111" />
-      <stop
-         style="stop-color:#ffffb3;stop-opacity:1"
-         offset="0.60000002"
-         id="s16113" />
-      <stop
-         style="stop-color:#ffffb3;stop-opacity:1"
-         offset="1"
-         id="s16115" />
-      <ns:midPointStop
-         style="stop-color:#FFCD00"
-         offset="0" />
-      <ns:midPointStop
-         style="stop-color:#FFCD00"
-         offset="0.5" />
-      <ns:midPointStop
-         style="stop-color:#FFFFB3"
-         offset="0.6" />
-      <ns:midPointStop
-         style="stop-color:#FFFFB3"
-         offset="0.5" />
-      <ns:midPointStop
-         style="stop-color:#FFFFB3"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="310.39999"
-       y1="397.70001"
-       x2="310.89999"
-       y2="399.5"
-       id="lg6467"
-       xlink:href="#lg4280_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.4,-2.4,2.4,2.4,-1663.6,-195)" />
-    <linearGradient
-       x1="310.89999"
-       y1="395.79999"
-       x2="313.29999"
-       y2="403.10001"
-       id="lg4279_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.7,-0.7,0.7,0.7,-153.4,180.6)">
-      <stop
-         style="stop-color:#ffffb3;stop-opacity:1"
-         offset="0"
-         id="s16100" />
-      <stop
-         style="stop-color:#ffffb3;stop-opacity:1"
-         offset="0.40000001"
-         id="s16102" />
-      <stop
-         style="stop-color:#ffcd00;stop-opacity:1"
-         offset="0.89999998"
-         id="s16104" />
-      <stop
-         style="stop-color:#ffcd00;stop-opacity:1"
-         offset="1"
-         id="s16106" />
-      <ns:midPointStop
-         style="stop-color:#FFFFB3"
-         offset="0" />
-      <ns:midPointStop
-         style="stop-color:#FFFFB3"
-         offset="0.5" />
-      <ns:midPointStop
-         style="stop-color:#FFFFB3"
-         offset="0.4" />
-      <ns:midPointStop
-         style="stop-color:#FFFFB3"
-         offset="0.5" />
-      <ns:midPointStop
-         style="stop-color:#FFCD00"
-         offset="0.9" />
-      <ns:midPointStop
-         style="stop-color:#FFCD00"
-         offset="0.5" />
-      <ns:midPointStop
-         style="stop-color:#FFCD00"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="310.89999"
-       y1="395.79999"
-       x2="313.29999"
-       y2="403.10001"
-       id="lg6465"
-       xlink:href="#lg4279_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.4,-2.4,2.4,2.4,-1663.6,-195)" />
-    <linearGradient
-       x1="307.79999"
-       y1="395.20001"
-       x2="313.79999"
-       y2="413.60001"
-       id="lg4278_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.7,-0.7,0.7,0.7,-153.4,180.6)">
-      <stop
-         style="stop-color:#ffffb3;stop-opacity:1"
-         offset="0"
-         id="s16091" />
-      <stop
-         style="stop-color:#fcd72f;stop-opacity:1"
-         offset="0.40000001"
-         id="s16093" />
-      <stop
-         style="stop-color:#ffcd00;stop-opacity:1"
-         offset="1"
-         id="s16095" />
-      <ns:midPointStop
-         style="stop-color:#FFFFB3"
-         offset="0" />
-      <ns:midPointStop
-         style="stop-color:#FFFFB3"
-         offset="0.5" />
-      <ns:midPointStop
-         style="stop-color:#FCD72F"
-         offset="0.4" />
-      <ns:midPointStop
-         style="stop-color:#FCD72F"
-         offset="0.5" />
-      <ns:midPointStop
-         style="stop-color:#FFCD00"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="306.5"
-       y1="393"
-       x2="309"
-       y2="404"
-       id="lg6400"
-       xlink:href="#lg4278_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.4,-2.4,2.4,2.4,-1663.6,-195)" />
-    <linearGradient
-       x1="352.10001"
-       y1="253.60001"
-       x2="348.5"
-       y2="237.8"
-       id="lg4276_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(3.4,0,0,3.4,-1148,-802)">
-      <stop
-         style="stop-color:#ffff87;stop-opacity:1"
-         offset="0"
-         id="s16077" />
-      <stop
-         style="stop-color:#ffad00;stop-opacity:1"
-         offset="1"
-         id="s16079" />
-      <ns:midPointStop
-         style="stop-color:#FFFF87"
-         offset="0" />
-      <ns:midPointStop
-         style="stop-color:#FFFF87"
-         offset="0.5" />
-      <ns:midPointStop
-         style="stop-color:#FFAD00"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="335.60001"
-       y1="354.79999"
-       x2="337.89999"
-       y2="354.79999"
-       id="lg4275_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.9,-0.5,0.5,0.9,-121.7,105.1)">
-      <stop
-         style="stop-color:#d9d9d9;stop-opacity:1"
-         offset="0"
-         id="s16057" />
-      <stop
-         style="stop-color:white;stop-opacity:1"
-         offset="0.80000001"
-         id="s16059" />
-      <stop
-         style="stop-color:white;stop-opacity:1"
-         offset="1"
-         id="s16061" />
-      <ns:midPointStop
-         style="stop-color:#D9D9D9"
-         offset="0" />
-      <ns:midPointStop
-         style="stop-color:#D9D9D9"
-         offset="0.5" />
-      <ns:midPointStop
-         style="stop-color:#FFFFFF"
-         offset="0.8" />
-      <ns:midPointStop
-         style="stop-color:#FFFFFF"
-         offset="0.5" />
-      <ns:midPointStop
-         style="stop-color:#FFFFFF"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="335.60001"
-       y1="354.79999"
-       x2="337.89999"
-       y2="354.79999"
-       id="lg6463"
-       xlink:href="#lg4275_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.9,-1.7,1.7,2.9,-1557,-448.7)" />
-    <linearGradient
-       x1="337.39999"
-       y1="353.10001"
-       x2="339.39999"
-       y2="357.10001"
-       id="lg4274_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.9,-0.5,0.5,0.9,-121.7,105.1)">
-      <stop
-         style="stop-color:white;stop-opacity:1"
-         offset="0"
-         id="s16048" />
-      <stop
-         style="stop-color:white;stop-opacity:1"
-         offset="0.1"
-         id="s16050" />
-      <stop
-         style="stop-color:#ccc;stop-opacity:1"
-         offset="1"
-         id="s16052" />
-      <ns:midPointStop
-         style="stop-color:#FFFFFF"
-         offset="0" />
-      <ns:midPointStop
-         style="stop-color:#FFFFFF"
-         offset="0.5" />
-      <ns:midPointStop
-         style="stop-color:#FFFFFF"
-         offset="0.1" />
-      <ns:midPointStop
-         style="stop-color:#FFFFFF"
-         offset="0.5" />
-      <ns:midPointStop
-         style="stop-color:#CCCCCC"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="337.39999"
-       y1="353.10001"
-       x2="339.39999"
-       y2="357.10001"
-       id="lg6461"
-       xlink:href="#lg4274_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.9,-1.7,1.7,2.9,-1557,-448.7)" />
-    <linearGradient
-       x1="334.39999"
-       y1="355.5"
-       x2="335.5"
-       y2="356.79999"
-       id="lg4273_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.9,-0.5,0.5,0.9,-121.7,105.1)">
-      <stop
-         style="stop-color:white;stop-opacity:1"
-         offset="0"
-         id="s16041" />
-      <stop
-         style="stop-color:#ccc;stop-opacity:1"
-         offset="1"
-         id="s16043" />
-      <ns:midPointStop
-         style="stop-color:#FFFFFF"
-         offset="5.6e-003" />
-      <ns:midPointStop
-         style="stop-color:#FFFFFF"
-         offset="0.5" />
-      <ns:midPointStop
-         style="stop-color:#CCCCCC"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="334.39999"
-       y1="355.5"
-       x2="335.5"
-       y2="356.79999"
-       id="lg6381"
-       xlink:href="#lg4273_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.9,-1.7,1.7,2.9,-1557,-448.7)" />
-    <linearGradient
-       x1="348.39999"
-       y1="247.39999"
-       x2="354.10001"
-       y2="242"
-       id="lg4271_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(3.4,0,0,3.4,-1148,-802)">
-      <stop
-         style="stop-color:#f2f2f2;stop-opacity:1"
-         offset="0"
-         id="s16025" />
-      <stop
-         style="stop-color:#9e9e9e;stop-opacity:1"
-         offset="0.40000001"
-         id="s16027" />
-      <stop
-         style="stop-color:black;stop-opacity:1"
-         offset="1"
-         id="s16029" />
-      <ns:midPointStop
-         style="stop-color:#F2F2F2"
-         offset="0" />
-      <ns:midPointStop
-         style="stop-color:#F2F2F2"
-         offset="0.5" />
-      <ns:midPointStop
-         style="stop-color:#000000"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="351.29999"
-       y1="257.29999"
-       x2="346.29999"
-       y2="235.5"
-       id="lg4270_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#ffff87;stop-opacity:1"
-         offset="0"
-         id="s16007" />
-      <stop
-         style="stop-color:#ffad00;stop-opacity:1"
-         offset="1"
-         id="s16009" />
-      <ns:midPointStop
-         style="stop-color:#FFFF87"
-         offset="0" />
-      <ns:midPointStop
-         style="stop-color:#FFFF87"
-         offset="0.5" />
-      <ns:midPointStop
-         style="stop-color:#FFAD00"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="351.29999"
-       y1="257.29999"
-       x2="346.29999"
-       y2="235.5"
-       id="lg6459"
-       xlink:href="#lg4270_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(3.4,0,0,3.4,-1148,-802)" />
-    <linearGradient
-       x1="43.799999"
-       y1="32.5"
-       x2="63.299999"
-       y2="66.400002"
-       id="XMLID_2708_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:white;stop-opacity:1"
-         offset="0"
-         id="stop75318" />
-      <stop
-         style="stop-color:#fffcea;stop-opacity:1"
-         offset="1"
-         id="stop75320" />
-      <a:midPointStop
-         style="stop-color:#FFFFFF"
-         offset="0" />
-      <a:midPointStop
-         style="stop-color:#FFFFFF"
-         offset="0.5" />
-      <a:midPointStop
-         style="stop-color:#FFFCEA"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="43.799999"
-       y1="32.5"
-       x2="63.299999"
-       y2="66.400002"
-       id="lg1907"
-       xlink:href="#XMLID_2708_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(-29,-22.6)" />
-    <linearGradient
-       x1="52.5"
-       y1="40.400002"
-       x2="58.200001"
-       y2="64"
-       id="XMLID_2707_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#ffdea0;stop-opacity:1"
-         offset="0"
-         id="stop75305" />
-      <stop
-         style="stop-color:#ffd89e;stop-opacity:1"
-         offset="0.30000001"
-         id="stop75307" />
-      <stop
-         style="stop-color:#ffd79e;stop-opacity:1"
-         offset="0.30000001"
-         id="stop75309" />
-      <stop
-         style="stop-color:#dbaf6d;stop-opacity:1"
-         offset="0.69999999"
-         id="stop75311" />
-      <stop
-         style="stop-color:#6f4c24;stop-opacity:1"
-         offset="1"
-         id="stop75313" />
-      <a:midPointStop
-         style="stop-color:#FFDEA0"
-         offset="0" />
-      <a:midPointStop
-         style="stop-color:#FFDEA0"
-         offset="0.6" />
-      <a:midPointStop
-         style="stop-color:#FFD79E"
-         offset="0.3" />
-      <a:midPointStop
-         style="stop-color:#FFD79E"
-         offset="0.5" />
-      <a:midPointStop
-         style="stop-color:#DBAF6D"
-         offset="0.7" />
-      <a:midPointStop
-         style="stop-color:#DBAF6D"
-         offset="0.5" />
-      <a:midPointStop
-         style="stop-color:#6F4C24"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="52.5"
-       y1="40.400002"
-       x2="58.200001"
-       y2="64"
-       id="lg1910"
-       xlink:href="#XMLID_2707_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(-29,-22.6)" />
-    <linearGradient
-       x1="58"
-       y1="73.199997"
-       x2="44.5"
-       y2="19"
-       id="XMLID_2704_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(-29,-22.6)">
-      <stop
-         style="stop-color:#d4a96c;stop-opacity:1"
-         offset="0.5"
-         id="stop75284" />
-      <stop
-         style="stop-color:#dcb273;stop-opacity:1"
-         offset="0.60000002"
-         id="stop75286" />
-      <stop
-         style="stop-color:#f0ca87;stop-opacity:1"
-         offset="0.80000001"
-         id="stop75288" />
-      <stop
-         style="stop-color:#ffdc96;stop-opacity:1"
-         offset="0.69999999"
-         id="stop75290" />
-      <stop
-         style="stop-color:#c18a42;stop-opacity:1"
-         offset="1"
-         id="stop75292" />
-      <a:midPointStop
-         style="stop-color:#D4A96C"
-         offset="0.5" />
-      <a:midPointStop
-         style="stop-color:#D4A96C"
-         offset="0.6" />
-      <a:midPointStop
-         style="stop-color:#FFDC96"
-         offset="0.7" />
-      <a:midPointStop
-         style="stop-color:#FFDC96"
-         offset="0.5" />
-      <a:midPointStop
-         style="stop-color:#C18A42"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="53.700001"
-       y1="32"
-       x2="53.700001"
-       y2="64.599998"
-       id="XMLID_2703_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#e5c9b0;stop-opacity:1"
-         offset="0"
-         id="stop75268" />
-      <stop
-         style="stop-color:#e5c9b0;stop-opacity:1"
-         offset="0.40000001"
-         id="stop75270" />
-      <stop
-         style="stop-color:#c0aa94;stop-opacity:1"
-         offset="1"
-         id="stop75272" />
-      <a:midPointStop
-         style="stop-color:#E5C9B0"
-         offset="0" />
-      <a:midPointStop
-         style="stop-color:#E5C9B0"
-         offset="0.5" />
-      <a:midPointStop
-         style="stop-color:#E5C9B0"
-         offset="0.4" />
-      <a:midPointStop
-         style="stop-color:#E5C9B0"
-         offset="0.5" />
-      <a:midPointStop
-         style="stop-color:#C0AA94"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="53.700001"
-       y1="32"
-       x2="53.700001"
-       y2="64.599998"
-       id="lg1916"
-       xlink:href="#XMLID_2703_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(-29,-22.6)" />
-    <linearGradient
-       x1="224.31"
-       y1="19.450001"
-       x2="214.33"
-       y2="11.46"
-       id="XMLID_419_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#404040;stop-opacity:1"
-         offset="0"
-         id="s1903" />
-      <stop
-         style="stop-color:#6d6d6d;stop-opacity:1"
-         offset="0.33000001"
-         id="s1905" />
-      <stop
-         style="stop-color:#e9e9e9;stop-opacity:1"
-         offset="1"
-         id="s1907" />
-      <a:midPointStop
-         offset="0"
-         style="stop-color:#404040" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#404040" />
-      <a:midPointStop
-         offset="0.33"
-         style="stop-color:#6D6D6D" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#6D6D6D" />
-      <a:midPointStop
-         offset="1"
-         style="stop-color:#E9E9E9" />
-    </linearGradient>
-    <linearGradient
-       x1="221.84"
-       y1="32.779999"
-       x2="212.2"
-       y2="20.27"
-       id="lg1988"
-       xlink:href="#XMLID_419_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.33,0,0,1.31,-274.2,-5.2)" />
-    <linearGradient
-       x1="228.35001"
-       y1="33.279999"
-       x2="215.42999"
-       y2="33.279999"
-       id="lg1900"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:white;stop-opacity:1"
-         offset="0"
-         id="s1902" />
-      <stop
-         style="stop-color:white;stop-opacity:0"
-         offset="1"
-         id="s1906" />
-      <a:midPointStop
-         style="stop-color:#575757"
-         offset="0" />
-      <a:midPointStop
-         style="stop-color:#575757"
-         offset="0.5" />
-      <a:midPointStop
-         style="stop-color:#6D6D6D"
-         offset="0.33" />
-      <a:midPointStop
-         style="stop-color:#6D6D6D"
-         offset="0.5" />
-      <a:midPointStop
-         style="stop-color:#D3D3D3"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="234.81"
-       y1="33.279999"
-       x2="228.27"
-       y2="33.279999"
-       id="lg1908"
-       xlink:href="#lg1900"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.33,0,0,1.31,-274.2,-5.2)" />
-    <linearGradient
-       x1="228.35001"
-       y1="33.279999"
-       x2="215.42999"
-       y2="33.279999"
-       id="XMLID_416_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#575757;stop-opacity:1"
-         offset="0"
-         id="s1874" />
-      <stop
-         style="stop-color:#6d6d6d;stop-opacity:1"
-         offset="0.33000001"
-         id="s1876" />
-      <stop
-         style="stop-color:#d3d3d3;stop-opacity:1"
-         offset="1"
-         id="s1878" />
-      <a:midPointStop
-         offset="0"
-         style="stop-color:#575757" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#575757" />
-      <a:midPointStop
-         offset="0.33"
-         style="stop-color:#6D6D6D" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#6D6D6D" />
-      <a:midPointStop
-         offset="1"
-         style="stop-color:#D3D3D3" />
-    </linearGradient>
-    <linearGradient
-       x1="228.35001"
-       y1="33.279999"
-       x2="215.42999"
-       y2="33.279999"
-       id="lg1991"
-       xlink:href="#XMLID_416_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.33,0,0,1.31,-274.2,-5.2)" />
-    <radialGradient
-       cx="603.19"
-       cy="230.77"
-       r="1.67"
-       fx="603.19"
-       fy="230.77"
-       id="x5010_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.1,0,0,1.1,-54.33,-75.4)">
-      <stop
-         style="stop-color:#c9ffc9;stop-opacity:1"
-         offset="0"
-         id="stop29201" />
-      <stop
-         style="stop-color:#23a11f;stop-opacity:1"
-         offset="1"
-         id="stop29203" />
-      <a:midPointStop
-         offset="0"
-         style="stop-color:#C9FFC9" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#C9FFC9" />
-      <a:midPointStop
-         offset="1"
-         style="stop-color:#23A11F" />
-    </radialGradient>
-    <radialGradient
-       cx="603.19"
-       cy="230.77"
-       r="1.67"
-       fx="603.19"
-       fy="230.77"
-       id="radialGradient5711"
-       xlink:href="#x5010_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.23,0,0,1.23,-709.93,-245.02)" />
-    <linearGradient
-       x1="592.31"
-       y1="162.60001"
-       x2="609.32001"
-       y2="145.59"
-       id="lg5722"
-       xlink:href="#x5003_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.12,0,0,1.12,-649.08,-160.62)" />
-    <linearGradient
-       x1="601.48999"
-       y1="170.16"
-       x2="613.84003"
-       y2="170.16"
-       id="x5002_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#d9d9d9;stop-opacity:1"
-         offset="0"
-         id="stop29134" />
-      <stop
-         style="stop-color:white;stop-opacity:1"
-         offset="0.2"
-         id="stop29136" />
-      <stop
-         style="stop-color:#999;stop-opacity:1"
-         offset="1"
-         id="stop29138" />
-      <a:midPointStop
-         offset="0"
-         style="stop-color:#D9D9D9" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#D9D9D9" />
-      <a:midPointStop
-         offset="0.20"
-         style="stop-color:#FFFFFF" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#FFFFFF" />
-      <a:midPointStop
-         offset="1"
-         style="stop-color:#999999" />
-    </linearGradient>
-    <linearGradient
-       x1="601.48999"
-       y1="170.16"
-       x2="613.84003"
-       y2="170.16"
-       id="lg5725"
-       xlink:href="#x5002_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.12,0,0,1.12,-649.08,-160.62)" />
-    <linearGradient
-       x1="592.20001"
-       y1="156.45"
-       x2="609.98999"
-       y2="174.23"
-       id="x5004_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.12,0,0,1.12,-649.08,-160.62)">
-      <stop
-         style="stop-color:#d9d9d9;stop-opacity:1"
-         offset="0"
-         id="stop29157" />
-      <stop
-         style="stop-color:white;stop-opacity:1"
-         offset="1"
-         id="stop29159" />
-      <a:midPointStop
-         offset="0"
-         style="stop-color:#D9D9D9" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#D9D9D9" />
-      <a:midPointStop
-         offset="1"
-         style="stop-color:#FFFFFF" />
-    </linearGradient>
-    <linearGradient
-       x1="592.20001"
-       y1="156.45"
-       x2="609.98999"
-       y2="174.23"
-       id="lg5728"
-       xlink:href="#x5004_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.12,0,0,1.12,-649.08,-160.62)" />
-    <linearGradient
-       x1="592.31"
-       y1="162.60001"
-       x2="609.32001"
-       y2="145.59"
-       id="x5003_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#f2f2f2;stop-opacity:1"
-         offset="0"
-         id="stop29143" />
-      <stop
-         style="stop-color:#e5e5e5;stop-opacity:1"
-         offset="1"
-         id="stop29145" />
-      <a:midPointStop
-         offset="0"
-         style="stop-color:#F2F2F2" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#F2F2F2" />
-      <a:midPointStop
-         offset="1"
-         style="stop-color:#E5E5E5" />
-    </linearGradient>
-    <linearGradient
-       x1="592.31"
-       y1="162.60001"
-       x2="609.32001"
-       y2="145.59"
-       id="lg5732"
-       xlink:href="#x5003_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.12,0,0,1.12,-649.08,-160.62)" />
-    <linearGradient
-       x1="592.20001"
-       y1="156.45"
-       x2="609.98999"
-       y2="174.24001"
-       id="x5000_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.12,0,0,1.12,-649.08,-160.62)">
-      <stop
-         style="stop-color:#d9d9d9;stop-opacity:1"
-         offset="0"
-         id="stop29124" />
-      <stop
-         style="stop-color:white;stop-opacity:1"
-         offset="1"
-         id="stop29126" />
-      <a:midPointStop
-         offset="0"
-         style="stop-color:#D9D9D9" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#D9D9D9" />
-      <a:midPointStop
-         offset="1"
-         style="stop-color:#FFFFFF" />
-    </linearGradient>
-    <linearGradient
-       x1="592.20001"
-       y1="156.45"
-       x2="609.98999"
-       y2="174.24001"
-       id="lg5735"
-       xlink:href="#x5000_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.12,0,0,1.12,-649.08,-160.62)" />
-    <linearGradient
-       x1="308.54999"
-       y1="149.89999"
-       x2="299.72"
-       y2="148.83"
-       id="XMLID_2433_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#d6d6d6;stop-opacity:1"
-         offset="0"
-         id="71615" />
-      <stop
-         style="stop-color:#a5a5a5;stop-opacity:1"
-         offset="1"
-         id="71617" />
-      <a:midPointStop
-         offset="0"
-         style="stop-color:#D6D6D6" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#D6D6D6" />
-      <a:midPointStop
-         offset="1"
-         style="stop-color:#A5A5A5" />
-    </linearGradient>
-    <linearGradient
-       x1="308.54999"
-       y1="149.89999"
-       x2="299.72"
-       y2="148.83"
-       id="lg1952"
-       xlink:href="#XMLID_2433_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.03,0,0,1.03,-279.57,-124.36)" />
-    <radialGradient
-       cx="307.39999"
-       cy="121"
-       r="23.35"
-       fx="307.39999"
-       fy="121"
-       id="XMLID_2432_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.98,0,0,0.98,2.88,2.75)">
-      <stop
-         style="stop-color:#d2d2d2;stop-opacity:1"
-         offset="0.19"
-         id="71592" />
-      <stop
-         style="stop-color:#cfcfcf;stop-opacity:1"
-         offset="0.44999999"
-         id="71594" />
-      <stop
-         style="stop-color:#c7c7c7;stop-opacity:1"
-         offset="0.60000002"
-         id="71596" />
-      <stop
-         style="stop-color:#b9b9b9;stop-opacity:1"
-         offset="0.74000001"
-         id="71598" />
-      <stop
-         style="stop-color:#a4a4a4;stop-opacity:1"
-         offset="0.86000001"
-         id="71600" />
-      <stop
-         style="stop-color:#8a8a8a;stop-opacity:1"
-         offset="0.95999998"
-         id="71602" />
-      <stop
-         style="stop-color:gray;stop-opacity:1"
-         offset="1"
-         id="71604" />
-      <a:midPointStop
-         offset="0.19"
-         style="stop-color:#D2D2D2" />
-      <a:midPointStop
-         offset="0.8"
-         style="stop-color:#D2D2D2" />
-      <a:midPointStop
-         offset="1"
-         style="stop-color:#808080" />
-    </radialGradient>
-    <radialGradient
-       cx="307.39999"
-       cy="121"
-       r="23.35"
-       fx="307.39999"
-       fy="121"
-       id="radialGradient2331"
-       xlink:href="#XMLID_2432_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(-276.62,-121.54)" />
-    <linearGradient
-       x1="294.13"
-       y1="127.07"
-       x2="294.13"
-       y2="142.2"
-       id="XMLID_2430_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#b5d8ff;stop-opacity:1"
-         offset="0"
-         id="71582" />
-      <stop
-         style="stop-color:black;stop-opacity:1"
-         offset="1"
-         id="71584" />
-      <a:midPointStop
-         offset="0"
-         style="stop-color:#B5D8FF" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#B5D8FF" />
-      <a:midPointStop
-         offset="1"
-         style="stop-color:#000000" />
-    </linearGradient>
-    <linearGradient
-       x1="294.13"
-       y1="127.07"
-       x2="294.13"
-       y2="142.2"
-       id="lg2820"
-       xlink:href="#XMLID_2430_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.03,0,0,1.03,-279.57,-124.36)" />
-    <linearGradient
-       x1="279.10999"
-       y1="148.03"
-       x2="309.16"
-       y2="148.03"
-       id="XMLID_2429_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#e1e1e1;stop-opacity:1"
-         offset="0"
-         id="71564" />
-      <stop
-         style="stop-color:#e1e1e1;stop-opacity:1"
-         offset="0.25"
-         id="71566" />
-      <stop
-         style="stop-color:#a5a5a5;stop-opacity:1"
-         offset="0.44"
-         id="71568" />
-      <stop
-         style="stop-color:#a5a5a5;stop-opacity:1"
-         offset="1"
-         id="71570" />
-      <a:midPointStop
-         offset="0"
-         style="stop-color:#E1E1E1" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#E1E1E1" />
-      <a:midPointStop
-         offset="0.25"
-         style="stop-color:#E1E1E1" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#E1E1E1" />
-      <a:midPointStop
-         offset="0.44"
-         style="stop-color:#A5A5A5" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#A5A5A5" />
-      <a:midPointStop
-         offset="1"
-         style="stop-color:#A5A5A5" />
-    </linearGradient>
-    <linearGradient
-       x1="279.10999"
-       y1="148.03"
-       x2="309.16"
-       y2="148.03"
-       id="lg2818"
-       xlink:href="#XMLID_2429_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.03,0,0,1.03,-279.57,-124.36)" />
-    <radialGradient
-       cx="622.34302"
-       cy="14.449"
-       r="26.496"
-       fx="622.34302"
-       fy="14.449"
-       id="lg3499_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.851,0,0,0.849,69.297,51.658)">
-      <stop
-         style="stop-color:#23468e;stop-opacity:1"
-         offset="0"
-         id="stop10972" />
-      <stop
-         style="stop-color:#012859;stop-opacity:1"
-         offset="1"
-         id="stop10974" />
-      <a:midPointStop
-         offset="0"
-         style="stop-color:#23468E" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#23468E" />
-      <a:midPointStop
-         offset="1"
-         style="stop-color:#012859" />
-    </radialGradient>
-    <radialGradient
-       cx="622.34302"
-       cy="14.449"
-       r="26.496"
-       fx="622.34302"
-       fy="14.449"
-       id="rg5791"
-       xlink:href="#lg3499_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.858,0,0,0.857,-511.7,9.02)" />
-    <linearGradient
-       x1="616.112"
-       y1="76.247002"
-       x2="588.14099"
-       y2="60.742001"
-       id="lg3497_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#01326e;stop-opacity:1"
-         offset="0"
-         id="stop10962" />
-      <stop
-         style="stop-color:#012859;stop-opacity:1"
-         offset="1"
-         id="stop10964" />
-      <a:midPointStop
-         offset="0"
-         style="stop-color:#01326E" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#01326E" />
-      <a:midPointStop
-         offset="1"
-         style="stop-color:#012859" />
-    </linearGradient>
-    <linearGradient
-       x1="617.698"
-       y1="82.445999"
-       x2="585.95203"
-       y2="54.848999"
-       id="lg3496_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#e5e5e5;stop-opacity:1"
-         offset="0"
-         id="stop10950" />
-      <stop
-         style="stop-color:#ccc;stop-opacity:1"
-         offset="1"
-         id="stop10952" />
-      <a:midPointStop
-         offset="0"
-         style="stop-color:#E5E5E5" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#E5E5E5" />
-      <a:midPointStop
-         offset="1"
-         style="stop-color:#CCCCCC" />
-    </linearGradient>
-    <linearGradient
-       x1="617.698"
-       y1="82.445999"
-       x2="585.95203"
-       y2="54.848999"
-       id="lg5794"
-       xlink:href="#lg3496_"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       x1="601.39001"
-       y1="55.341"
-       x2="588.29199"
-       y2="71.515999"
-       id="lg3495_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#d9d9d9;stop-opacity:1"
-         offset="0"
-         id="stop10941" />
-      <stop
-         style="stop-color:#f2f2f2;stop-opacity:1"
-         offset="0.52200001"
-         id="stop10943" />
-      <stop
-         style="stop-color:#ccc;stop-opacity:1"
-         offset="1"
-         id="stop10945" />
-      <a:midPointStop
-         offset="0"
-         style="stop-color:#D9D9D9" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#D9D9D9" />
-      <a:midPointStop
-         offset="0.522"
-         style="stop-color:#F2F2F2" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#F2F2F2" />
-      <a:midPointStop
-         offset="1"
-         style="stop-color:#CCCCCC" />
-    </linearGradient>
-    <linearGradient
-       x1="601.39001"
-       y1="55.341"
-       x2="588.29199"
-       y2="71.515999"
-       id="lg5771"
-       xlink:href="#lg3495_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.009,0,0,1.009,-581.615,-43.098)" />
-    <linearGradient
-       x1="611.34601"
-       y1="55.279999"
-       x2="590.39001"
-       y2="81.157997"
-       id="lg3494_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#d9d9d9;stop-opacity:1"
-         offset="0"
-         id="stop10932" />
-      <stop
-         style="stop-color:#f2f2f2;stop-opacity:1"
-         offset="0.52200001"
-         id="stop10934" />
-      <stop
-         style="stop-color:#ccc;stop-opacity:1"
-         offset="1"
-         id="stop10936" />
-      <a:midPointStop
-         offset="0"
-         style="stop-color:#D9D9D9" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#D9D9D9" />
-      <a:midPointStop
-         offset="0.522"
-         style="stop-color:#F2F2F2" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#F2F2F2" />
-      <a:midPointStop
-         offset="1"
-         style="stop-color:#CCCCCC" />
-    </linearGradient>
-    <linearGradient
-       x1="611.34601"
-       y1="55.279999"
-       x2="590.39001"
-       y2="81.157997"
-       id="lg5774"
-       xlink:href="#lg3494_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.009,0,0,1.009,-581.616,-43.098)" />
-    <linearGradient
-       x1="798.72998"
-       y1="69.839996"
-       x2="799.04999"
-       y2="70.709999"
-       id="g3302_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#005e00;stop-opacity:1"
-         offset="0"
-         id="s6504" />
-      <stop
-         style="stop-color:#23a11f;stop-opacity:1"
-         offset="1"
-         id="s6506" />
-      <a:midPointstop
-         style="stop-color:#005E00"
-         offset="0" />
-      <a:midPointstop
-         style="stop-color:#005E00"
-         offset="0.5" />
-      <a:midPointstop
-         style="stop-color:#23A11F"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="798.72998"
-       y1="69.839996"
-       x2="799.04999"
-       y2="70.709999"
-       id="lg5851"
-       xlink:href="#g3302_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.204,0,0,1.263,-926.036,-60.001)" />
-    <linearGradient
-       x1="779.19"
-       y1="122.73"
-       x2="811.69"
-       y2="149.74001"
-       id="g3301_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,-0.25,0,1,0,129.19)">
-      <stop
-         style="stop-color:#f2f2f2;stop-opacity:1"
-         offset="0"
-         id="s6483" />
-      <stop
-         style="stop-color:#eee;stop-opacity:1"
-         offset="0.17"
-         id="s6485" />
-      <stop
-         style="stop-color:#e3e3e3;stop-opacity:1"
-         offset="0.34"
-         id="s6487" />
-      <stop
-         style="stop-color:#cfcfcf;stop-opacity:1"
-         offset="0.50999999"
-         id="s6489" />
-      <stop
-         style="stop-color:#b4b4b4;stop-opacity:1"
-         offset="0.67000002"
-         id="s6491" />
-      <stop
-         style="stop-color:#919191;stop-opacity:1"
-         offset="0.83999997"
-         id="s6493" />
-      <stop
-         style="stop-color:#666;stop-opacity:1"
-         offset="1"
-         id="s6495" />
-      <a:midPointstop
-         style="stop-color:#F2F2F2"
-         offset="0" />
-      <a:midPointstop
-         style="stop-color:#F2F2F2"
-         offset="0.71" />
-      <a:midPointstop
-         style="stop-color:#666666"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="779.19"
-       y1="122.73"
-       x2="811.69"
-       y2="149.74001"
-       id="lg5855"
-       xlink:href="#g3301_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.204,-0.316,0,1.263,-926.036,103.123)" />
-    <clipPath
-       id="g3299_">
-      <use
-         id="use6469"
-         x="0"
-         y="0"
-         width="1005.92"
-         height="376.97"
-         xlink:href="#g101_" />
-    </clipPath>
-    <radialGradient
-       cx="1189.9301"
-       cy="100.05"
-       r="40.400002"
-       fx="1189.9301"
-       fy="100.05"
-       id="g3300_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.34,-8.46e-2,0,0.34,394.16,137.13)">
-      <stop
-         style="stop-color:white;stop-opacity:1"
-         offset="0"
-         id="s6472" />
-      <stop
-         style="stop-color:white;stop-opacity:0"
-         offset="1"
-         id="s6474" />
-      <a:midPointstop
-         style="stop-color:#FFFFFF"
-         offset="0" />
-      <a:midPointstop
-         style="stop-color:#FFFFFF"
-         offset="0.5" />
-      <a:midPointstop
-         style="stop-color:#000000"
-         offset="1" />
-    </radialGradient>
-    <radialGradient
-       cx="1199.74"
-       cy="97.150002"
-       r="40.400002"
-       fx="1199.74"
-       fy="97.150002"
-       id="rg5860"
-       xlink:href="#g3300_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.409,-0.107,0,0.429,-451.489,113.149)" />
-    <linearGradient
-       x1="796.38"
-       y1="67.580002"
-       x2="781.28003"
-       y2="58.549999"
-       id="g3298_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#4c8bca;stop-opacity:1"
-         offset="0"
-         id="s6462" />
-      <stop
-         style="stop-color:#b7e9ff;stop-opacity:1"
-         offset="1"
-         id="s6464" />
-      <a:midPointstop
-         style="stop-color:#4C8BCA"
-         offset="0" />
-      <a:midPointstop
-         style="stop-color:#4C8BCA"
-         offset="0.5" />
-      <a:midPointstop
-         style="stop-color:#B7E9FF"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="800.97998"
-       y1="140.72"
-       x2="777.71997"
-       y2="121.76"
-       id="g3297_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,-0.25,0,1,0,129.19)">
-      <stop
-         style="stop-color:#e5e5e5;stop-opacity:1"
-         offset="0"
-         id="s6448" />
-      <stop
-         style="stop-color:#ccc;stop-opacity:1"
-         offset="1"
-         id="s6450" />
-      <a:midPointstop
-         style="stop-color:#E5E5E5"
-         offset="0" />
-      <a:midPointstop
-         style="stop-color:#E5E5E5"
-         offset="0.5" />
-      <a:midPointstop
-         style="stop-color:#CCCCCC"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="800.97998"
-       y1="140.72"
-       x2="777.71997"
-       y2="121.76"
-       id="lg5890"
-       xlink:href="#g3297_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,-0.25,0,1,0,129.19)" />
-    <linearGradient
-       x1="790.03998"
-       y1="-16.33"
-       x2="779.84003"
-       y2="-3.73"
-       id="g3296_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(0,70.17)">
-      <stop
-         style="stop-color:#d9d9d9;stop-opacity:1"
-         offset="0"
-         id="s6439" />
-      <stop
-         style="stop-color:#f2f2f2;stop-opacity:1"
-         offset="0.51999998"
-         id="s6441" />
-      <stop
-         style="stop-color:#ccc;stop-opacity:1"
-         offset="1"
-         id="s6443" />
-      <a:midPointstop
-         style="stop-color:#D9D9D9"
-         offset="0" />
-      <a:midPointstop
-         style="stop-color:#D9D9D9"
-         offset="0.5" />
-      <a:midPointstop
-         style="stop-color:#F2F2F2"
-         offset="0.52" />
-      <a:midPointstop
-         style="stop-color:#F2F2F2"
-         offset="0.5" />
-      <a:midPointstop
-         style="stop-color:#CCCCCC"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="790.03998"
-       y1="-16.33"
-       x2="779.84003"
-       y2="-3.73"
-       id="lg5866"
-       xlink:href="#g3296_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.204,0,0,1.263,-926.036,28.6)" />
-    <linearGradient
-       x1="785.84003"
-       y1="72.989998"
-       x2="785.26001"
-       y2="76.279999"
-       id="g3293_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:white;stop-opacity:1"
-         offset="0"
-         id="s6412" />
-      <stop
-         style="stop-color:#737373;stop-opacity:1"
-         offset="1"
-         id="s6414" />
-      <a:midPointstop
-         style="stop-color:#FFFFFF"
-         offset="0" />
-      <a:midPointstop
-         style="stop-color:#FFFFFF"
-         offset="0.5" />
-      <a:midPointstop
-         style="stop-color:#737373"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="785.84003"
-       y1="72.989998"
-       x2="785.26001"
-       y2="76.279999"
-       id="lg5871"
-       xlink:href="#g3293_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.204,0,0,1.263,-926.036,-60.001)" />
-    <linearGradient
-       x1="789.37"
-       y1="69.879997"
-       x2="791.03998"
-       y2="77.120003"
-       id="g3292_"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#999;stop-opacity:1"
-         offset="0"
-         id="s6403" />
-      <stop
-         style="stop-color:#f2f2f2;stop-opacity:1"
-         offset="0.28"
-         id="s6405" />
-      <stop
-         style="stop-color:#666;stop-opacity:1"
-         offset="1"
-         id="s6407" />
-      <a:midPointstop
-         style="stop-color:#999999"
-         offset="0" />
-      <a:midPointstop
-         style="stop-color:#999999"
-         offset="0.5" />
-      <a:midPointstop
-         style="stop-color:#F2F2F2"
-         offset="0.28" />
-      <a:midPointstop
-         style="stop-color:#F2F2F2"
-         offset="0.5" />
-      <a:midPointstop
-         style="stop-color:#666666"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="789.37"
-       y1="69.879997"
-       x2="791.03998"
-       y2="77.120003"
-       id="lg5874"
-       xlink:href="#g3292_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.204,0,0,1.263,-926.036,-60.001)" />
-    <linearGradient
-       x1="786.65997"
-       y1="136.12"
-       x2="786.71002"
-       y2="134.33"
-       id="g3290_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,-0.25,0,1,0,137.29)">
-      <stop
-         style="stop-color:#d9d9d9;stop-opacity:1"
-         offset="0"
-         id="s6380" />
-      <stop
-         style="stop-color:#b2b2b2;stop-opacity:1"
-         offset="1"
-         id="s6382" />
-      <a:midPointstop
-         style="stop-color:#D9D9D9"
-         offset="0" />
-      <a:midPointstop
-         style="stop-color:#D9D9D9"
-         offset="0.5" />
-      <a:midPointstop
-         style="stop-color:#B2B2B2"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="786.65997"
-       y1="136.12"
-       x2="786.71002"
-       y2="134.33"
-       id="lg5878"
-       xlink:href="#g3290_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.204,-0.316,0,1.263,-926.036,113.351)" />
-    <radialGradient
-       cx="1458.77"
-       cy="-5.0999999"
-       r="35.130001"
-       fx="1458.77"
-       fy="-5.0999999"
-       id="g3289_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.42,0,0,0.42,167.09,79.84)">
-      <stop
-         style="stop-color:white;stop-opacity:1"
-         offset="0"
-         id="s6371" />
-      <stop
-         style="stop-color:#999;stop-opacity:1"
-         offset="1"
-         id="s6373" />
-      <a:midPointstop
-         style="stop-color:#FFFFFF"
-         offset="0" />
-      <a:midPointstop
-         style="stop-color:#FFFFFF"
-         offset="0.5" />
-      <a:midPointstop
-         style="stop-color:#999999"
-         offset="1" />
-    </radialGradient>
-    <radialGradient
-       cx="1458.77"
-       cy="-5.0999999"
-       r="35.130001"
-       fx="1458.77"
-       fy="-5.0999999"
-       id="rg5881"
-       xlink:href="#g3289_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.505,0,0,0.53,-724.957,40.636)" />
-    <radialGradient
-       cx="1612.98"
-       cy="-4.4699998"
-       r="36.580002"
-       fx="1612.98"
-       fy="-4.4699998"
-       id="g3288_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.34,0,0,0.36,238.56,86.87)">
-      <stop
-         style="stop-color:#e5e5e5;stop-opacity:1"
-         offset="0"
-         id="s6362" />
-      <stop
-         style="stop-color:#b2b2b2;stop-opacity:1"
-         offset="0.63999999"
-         id="s6364" />
-      <stop
-         style="stop-color:#737373;stop-opacity:1"
-         offset="1"
-         id="s6366" />
-      <a:midPointstop
-         style="stop-color:#E5E5E5"
-         offset="0" />
-      <a:midPointstop
-         style="stop-color:#E5E5E5"
-         offset="0.5" />
-      <a:midPointstop
-         style="stop-color:#B2B2B2"
-         offset="0.64" />
-      <a:midPointstop
-         style="stop-color:#B2B2B2"
-         offset="0.5" />
-      <a:midPointstop
-         style="stop-color:#737373"
-         offset="1" />
-    </radialGradient>
-    <radialGradient
-       cx="1612.98"
-       cy="-4.4699998"
-       r="36.580002"
-       fx="1612.98"
-       fy="-4.4699998"
-       id="rg5884"
-       xlink:href="#g3288_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.408,0,0,0.448,-638.943,49.495)" />
-    <radialGradient
-       cx="1470.5"
-       cy="-10.21"
-       r="33.290001"
-       fx="1470.5"
-       fy="-10.21"
-       id="g3287_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.42,0,0,0.42,167.09,79.84)">
-      <stop
-         style="stop-color:#e5e5e5;stop-opacity:1"
-         offset="0"
-         id="s6347" />
-      <stop
-         style="stop-color:#b2b2b2;stop-opacity:1"
-         offset="0.38999999"
-         id="s6349" />
-      <stop
-         style="stop-color:#b1b1b1;stop-opacity:1"
-         offset="0.75"
-         id="s6351" />
-      <stop
-         style="stop-color:#aaa;stop-opacity:1"
-         offset="0.88"
-         id="s6353" />
-      <stop
-         style="stop-color:#9e9e9e;stop-opacity:1"
-         offset="0.97000003"
-         id="s6355" />
-      <stop
-         style="stop-color:#999;stop-opacity:1"
-         offset="1"
-         id="s6357" />
-      <a:midPointstop
-         style="stop-color:#E5E5E5"
-         offset="0" />
-      <a:midPointstop
-         style="stop-color:#E5E5E5"
-         offset="0.5" />
-      <a:midPointstop
-         style="stop-color:#B2B2B2"
-         offset="0.39" />
-      <a:midPointstop
-         style="stop-color:#B2B2B2"
-         offset="0.87" />
-      <a:midPointstop
-         style="stop-color:#999999"
-         offset="1" />
-    </radialGradient>
-    <radialGradient
-       cx="1470.5"
-       cy="-10.21"
-       r="33.290001"
-       fx="1470.5"
-       fy="-10.21"
-       id="rg5887"
-       xlink:href="#g3287_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.505,0,0,0.53,-724.957,40.636)" />
-    <pattern
-       patternTransform="matrix(0.592927,0,0,0.592927,78,462)"
-       id="cream-spots"
-       height="32"
-       width="32"
-       patternUnits="userSpaceOnUse">
-      <g
-         transform="translate(-365.3146,-513.505)"
-         id="g3047">
-           id=&quot;path2858&quot; /&gt;
-        <path
-   inkscape:label="#path2854"
-   sodipodi:nodetypes="czzzz"
-   style="fill:#e3dcc0"
-   id="path3060"
-   d="M 390.31462,529.50504 C 390.31462,534.47304 386.28262,538.50504 381.31462,538.50504 C 376.34662,538.50504 372.31462,534.47304 372.31462,529.50504 C 372.31462,524.53704 376.34662,520.50504 381.31462,520.50504 C 386.28262,520.50504 390.31462,524.53704 390.31462,529.50504 z " />
-</g>
-    </pattern>
-    <pattern
-       patternTransform="matrix(0.733751,0,0,0.733751,67,367)"
-       id="dark-cream-spots"
-       height="32"
-       width="32"
-       patternUnits="userSpaceOnUse">
-      <g
-         transform="translate(-408.0946,-513.505)"
-         id="dark-cream-spot"
-         inkscape:label="#g3043">
-        <path
-           sodipodi:nodetypes="czzzz"
-           style="fill:#c8c5ac"
-           d="M 433.09458,529.50504 C 433.09458,534.47304 429.06258,538.50504 424.09458,538.50504 C 419.12658,538.50504 415.09458,534.47304 415.09458,529.50504 C 415.09458,524.53704 419.12658,520.50504 424.09458,520.50504 C 429.06258,520.50504 433.09458,524.53704 433.09458,529.50504 z "
-           id="path2953" />
-      </g>
-    </pattern>
-    <pattern
-       patternTransform="matrix(0.375,0,0,0.375,379,400)"
-       id="white-spots"
-       height="32"
-       width="32"
-       patternUnits="userSpaceOnUse">
-      <g
-         transform="translate(-484.3997,-513.505)"
-         id="white-spot"
-         inkscape:label="#g3035">
-        <path
-           style="opacity:0.25;fill:white"
-           id="path3033"
-           d="M 509.39967,529.50504 C 509.39967,534.47304 505.36767,538.50504 500.39967,538.50504 C 495.43167,538.50504 491.39967,534.47304 491.39967,529.50504 C 491.39967,524.53704 495.43167,520.50504 500.39967,520.50504 C 505.36767,520.50504 509.39967,524.53704 509.39967,529.50504 z "
-           sodipodi:nodetypes="czzzz" />
-      </g>
-    </pattern>
-    <pattern
-       patternTransform="matrix(0.455007,0,0,0.455007,-5e-5,1.9e-5)"
-       id="black-spots"
-       height="32"
-       width="32"
-       patternUnits="userSpaceOnUse">
-      <g
-         transform="translate(-448.3997,-513.505)"
-         id="black-spot"
-         inkscape:label="#g3039">
-        <path
-           sodipodi:nodetypes="czzzz"
-           d="M 473.39967,529.50504 C 473.39967,534.47304 469.36767,538.50504 464.39967,538.50504 C 459.43167,538.50504 455.39967,534.47304 455.39967,529.50504 C 455.39967,524.53704 459.43167,520.50504 464.39967,520.50504 C 469.36767,520.50504 473.39967,524.53704 473.39967,529.50504 z "
-           id="path2961"
-           style="opacity:0.25;fill:black" />
-      </g>
-    </pattern>
-    <linearGradient
-       x1="501.0903"
-       y1="-19.2544"
-       x2="531.85413"
-       y2="0.72390002"
-       id="linearGradient17334"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)">
-      <stop
-         style="stop-color:#b4daea;stop-opacity:1"
-         offset="0"
-         id="stop17336" />
-      <stop
-         style="stop-color:#b4daea;stop-opacity:1"
-         offset="0.51120001"
-         id="stop17338" />
-      <stop
-         style="stop-color:#5387ba;stop-opacity:1"
-         offset="0.64609998"
-         id="stop17340" />
-      <stop
-         style="stop-color:#16336e;stop-opacity:1"
-         offset="1"
-         id="stop17342" />
-      <a:midPointStop
-         offset="0"
-         style="stop-color:#B4DAEA" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#B4DAEA" />
-      <a:midPointStop
-         offset="0.5112"
-         style="stop-color:#B4DAEA" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#B4DAEA" />
-      <a:midPointStop
-         offset="0.6461"
-         style="stop-color:#5387BA" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#5387BA" />
-      <a:midPointStop
-         offset="1"
-         style="stop-color:#16336E" />
-    </linearGradient>
-    <linearGradient
-       x1="415.73831"
-       y1="11.854"
-       x2="418.13361"
-       y2="18.8104"
-       id="linearGradient17426"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.8362,0.5206,-1.1904,0.992,147.62,-30.9374)">
-      <stop
-         style="stop-color:#ccc;stop-opacity:1"
-         offset="0"
-         id="stop17428" />
-      <stop
-         style="stop-color:#f2f2f2;stop-opacity:1"
-         offset="1"
-         id="stop17430" />
-      <a:midPointStop
-         offset="0"
-         style="stop-color:#CCCCCC" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#CCCCCC" />
-      <a:midPointStop
-         offset="1"
-         style="stop-color:#F2F2F2" />
-    </linearGradient>
-    <linearGradient
-       x1="478.21341"
-       y1="-131.9297"
-       x2="469.85818"
-       y2="-140.28481"
-       id="linearGradient17434"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.5592,0.829,-0.829,0.5592,101.3357,-104.791)">
-      <stop
-         style="stop-color:#f3403f;stop-opacity:1"
-         offset="0"
-         id="stop17436" />
-      <stop
-         style="stop-color:#d02a28;stop-opacity:1"
-         offset="0.37889999"
-         id="stop17438" />
-      <stop
-         style="stop-color:#b21714;stop-opacity:1"
-         offset="0.77649999"
-         id="stop17440" />
-      <stop
-         style="stop-color:#a6100c;stop-opacity:1"
-         offset="1"
-         id="stop17442" />
-      <a:midPointStop
-         offset="0"
-         style="stop-color:#F3403F" />
-      <a:midPointStop
-         offset="0.4213"
-         style="stop-color:#F3403F" />
-      <a:midPointStop
-         offset="1"
-         style="stop-color:#A6100C" />
-    </linearGradient>
-    <linearGradient
-       x1="502.70749"
-       y1="115.3013"
-       x2="516.39001"
-       y2="127.1953"
-       id="linearGradient17709"
-       xlink:href="#XMLID_1749_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.9703,0.2419,-0.2419,0.9703,11.0227,-35.6159)" />
-    <linearGradient
-       x1="506.09909"
-       y1="-11.5137"
-       x2="527.99609"
-       y2="2.7063999"
-       id="linearGradient17711"
-       xlink:href="#XMLID_1752_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)" />
-    <linearGradient
-       x1="516.57672"
-       y1="-15.769"
-       x2="516.57672"
-       y2="0.84280002"
-       id="linearGradient17713"
-       xlink:href="#XMLID_1753_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)" />
-    <linearGradient
-       x1="505.62939"
-       y1="-14.9526"
-       x2="527.49402"
-       y2="-0.7536"
-       id="linearGradient17715"
-       xlink:href="#XMLID_1756_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)" />
-    <linearGradient
-       x1="500.70749"
-       y1="-13.2441"
-       x2="513.46442"
-       y2="-2.1547"
-       id="linearGradient17717"
-       xlink:href="#XMLID_1757_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)" />
-    <linearGradient
-       x1="473.7681"
-       y1="209.17529"
-       x2="486.98099"
-       y2="213.2001"
-       id="linearGradient17721"
-       xlink:href="#XMLID_2274_"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       x1="481.23969"
-       y1="212.5742"
-       x2="472.92981"
-       y2="207.4967"
-       id="linearGradient17723"
-       xlink:href="#XMLID_2275_"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       x1="500.70749"
-       y1="-13.2441"
-       x2="513.46442"
-       y2="-2.1547"
-       id="linearGradient17416"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)">
-      <stop
-         style="stop-color:#5387ba;stop-opacity:1"
-         offset="0"
-         id="stop17418" />
-      <stop
-         style="stop-color:#96bad6;stop-opacity:1"
-         offset="1"
-         id="stop17420" />
-      <a:midPointStop
-         style="stop-color:#5387BA"
-         offset="0" />
-      <a:midPointStop
-         style="stop-color:#5387BA"
-         offset="0.5" />
-      <a:midPointStop
-         style="stop-color:#96BAD6"
-         offset="1" />
-    </linearGradient>
-    <defs
-       id="defs9929">
-      <path
-         d="M 489.21,209.35 L 485.35,203.63 C 483.63,204.25 473.47,208.93 471.5,210.18 C 470.57,210.77 470.17,211.16 469.72,212.48 C 470.93,212.31 471.72,212.49 473.42,213.04 C 473.26,214.77 473.24,215.74 473.57,218.2 C 474.01,216.88 474.41,216.49 475.34,215.9 C 477.33,214.65 487.49,209.97 489.21,209.35 z "
-         id="XMLID_960_" />
-    </defs>
-    <clipPath
-       id="clipPath17448">
-      <use
-         id="use17450"
-         x="0"
-         y="0"
-         width="744.09448"
-         height="600"
-         xlink:href="#XMLID_960_" />
-    </clipPath>
-    <linearGradient
-       x1="473.7681"
-       y1="209.17529"
-       x2="486.98099"
-       y2="213.2001"
-       id="linearGradient17452"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#f3403f;stop-opacity:1"
-         offset="0"
-         id="stop17454" />
-      <stop
-         style="stop-color:#d02a28;stop-opacity:1"
-         offset="0.37889999"
-         id="stop17456" />
-      <stop
-         style="stop-color:#b21714;stop-opacity:1"
-         offset="0.77649999"
-         id="stop17458" />
-      <stop
-         style="stop-color:#a6100c;stop-opacity:1"
-         offset="1"
-         id="stop17460" />
-      <a:midPointStop
-         style="stop-color:#F3403F"
-         offset="0" />
-      <a:midPointStop
-         style="stop-color:#F3403F"
-         offset="0.4213" />
-      <a:midPointStop
-         style="stop-color:#A6100C"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="481.23969"
-       y1="212.5742"
-       x2="472.92981"
-       y2="207.4967"
-       id="linearGradient17463"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#f3403f;stop-opacity:1"
-         offset="0"
-         id="stop17465" />
-      <stop
-         style="stop-color:#d02a28;stop-opacity:1"
-         offset="0.37889999"
-         id="stop17467" />
-      <stop
-         style="stop-color:#b21714;stop-opacity:1"
-         offset="0.77649999"
-         id="stop17469" />
-      <stop
-         style="stop-color:#a6100c;stop-opacity:1"
-         offset="1"
-         id="stop17471" />
-      <a:midPointStop
-         style="stop-color:#F3403F"
-         offset="0" />
-      <a:midPointStop
-         style="stop-color:#F3403F"
-         offset="0.4213" />
-      <a:midPointStop
-         style="stop-color:#A6100C"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="481.23969"
-       y1="212.5742"
-       x2="472.92981"
-       y2="207.4967"
-       id="linearGradient17807"
-       xlink:href="#XMLID_2275_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(-177.1654,35.43307)" />
-    <linearGradient
-       x1="473.7681"
-       y1="209.17529"
-       x2="486.98099"
-       y2="213.2001"
-       id="linearGradient17810"
-       xlink:href="#XMLID_2274_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(-177.1654,35.43307)" />
-    <linearGradient
-       x1="502.70749"
-       y1="115.3013"
-       x2="516.39001"
-       y2="127.1953"
-       id="linearGradient17812"
-       xlink:href="#XMLID_1749_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.9703,0.2419,-0.2419,0.9703,11.0227,-35.6159)" />
-    <linearGradient
-       x1="506.09909"
-       y1="-11.5137"
-       x2="527.99609"
-       y2="2.7063999"
-       id="linearGradient17814"
-       xlink:href="#XMLID_1752_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)" />
-    <linearGradient
-       x1="516.57672"
-       y1="-15.769"
-       x2="516.57672"
-       y2="0.84280002"
-       id="linearGradient17816"
-       xlink:href="#XMLID_1753_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)" />
-    <linearGradient
-       x1="505.62939"
-       y1="-14.9526"
-       x2="527.49402"
-       y2="-0.7536"
-       id="linearGradient17818"
-       xlink:href="#XMLID_1756_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)" />
-    <linearGradient
-       x1="502.70749"
-       y1="115.3013"
-       x2="516.39001"
-       y2="127.1953"
-       id="linearGradient17347"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.9703,0.2419,-0.2419,0.9703,11.0227,-35.6159)">
-      <stop
-         style="stop-color:#5387ba;stop-opacity:1"
-         offset="0"
-         id="stop17349" />
-      <stop
-         style="stop-color:#96bad6;stop-opacity:1"
-         offset="1"
-         id="stop17351" />
-      <a:midPointStop
-         offset="0"
-         style="stop-color:#5387BA" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#5387BA" />
-      <a:midPointStop
-         offset="1"
-         style="stop-color:#96BAD6" />
-    </linearGradient>
-    <linearGradient
-       x1="516.57672"
-       y1="-15.769"
-       x2="516.57672"
-       y2="0.84280002"
-       id="linearGradient17379"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)">
-      <stop
-         style="stop-color:#b2b2b2;stop-opacity:1"
-         offset="0"
-         id="stop17381" />
-      <stop
-         style="stop-color:#f2f2f2;stop-opacity:1"
-         offset="1"
-         id="stop17383" />
-      <a:midPointStop
-         offset="0"
-         style="stop-color:#B2B2B2" />
-      <a:midPointStop
-         offset="0.5"
-         style="stop-color:#B2B2B2" />
-      <a:midPointStop
-         offset="1"
-         style="stop-color:#F2F2F2" />
-    </linearGradient>
-    <linearGradient
-       x1="502.70749"
-       y1="115.3013"
-       x2="516.39001"
-       y2="127.1953"
-       id="linearGradient17862"
-       xlink:href="#XMLID_1749_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.9703,0.2419,-0.2419,0.9703,-166.1427,-0.18283)" />
-    <linearGradient
-       x1="505.62939"
-       y1="-14.9526"
-       x2="527.49402"
-       y2="-0.7536"
-       id="linearGradient17864"
-       xlink:href="#XMLID_1756_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)" />
-    <defs
-       id="defs3859">
-      <polygon
-         points="465.54,213.52 481.94,217.46 482.74,216.71 487.46,198.05 471.08,194.07 470.26,194.83 465.54,213.52 "
-         id="XMLID_343_" />
-    </defs>
-    <linearGradient
-       x1="471.0806"
-       y1="201.07761"
-       x2="481.91711"
-       y2="210.4977"
-       id="linearGradient17389"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#6498c1;stop-opacity:1"
-         offset="0.005618"
-         id="stop17391" />
-      <stop
-         style="stop-color:#79a9cc;stop-opacity:1"
-         offset="0.2332"
-         id="stop17393" />
-      <stop
-         style="stop-color:#a4cde2;stop-opacity:1"
-         offset="0.74049997"
-         id="stop17395" />
-      <stop
-         style="stop-color:#b4daea;stop-opacity:1"
-         offset="1"
-         id="stop17397" />
-      <a:midPointStop
-         style="stop-color:#6498C1"
-         offset="5.618000e-003" />
-      <a:midPointStop
-         style="stop-color:#6498C1"
-         offset="0.4438" />
-      <a:midPointStop
-         style="stop-color:#B4DAEA"
-         offset="1" />
-    </linearGradient>
-    <clipPath
-       id="clipPath17400">
-      <use
-         id="use17402"
-         x="0"
-         y="0"
-         width="744.09448"
-         height="600"
-         xlink:href="#XMLID_343_" />
-    </clipPath>
-    <linearGradient
-       x1="505.62939"
-       y1="-14.9526"
-       x2="527.49402"
-       y2="-0.7536"
-       id="linearGradient17404"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)">
-      <stop
-         style="stop-color:#b4daea;stop-opacity:1"
-         offset="0"
-         id="stop17406" />
-      <stop
-         style="stop-color:#b4daea;stop-opacity:1"
-         offset="0.51120001"
-         id="stop17408" />
-      <stop
-         style="stop-color:#5387ba;stop-opacity:1"
-         offset="0.64609998"
-         id="stop17410" />
-      <stop
-         style="stop-color:#16336e;stop-opacity:1"
-         offset="1"
-         id="stop17412" />
-      <a:midPointStop
-         style="stop-color:#B4DAEA"
-         offset="0" />
-      <a:midPointStop
-         style="stop-color:#B4DAEA"
-         offset="0.5" />
-      <a:midPointStop
-         style="stop-color:#B4DAEA"
-         offset="0.5112" />
-      <a:midPointStop
-         style="stop-color:#B4DAEA"
-         offset="0.5" />
-      <a:midPointStop
-         style="stop-color:#5387BA"
-         offset="0.6461" />
-      <a:midPointStop
-         style="stop-color:#5387BA"
-         offset="0.5" />
-      <a:midPointStop
-         style="stop-color:#16336E"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="506.09909"
-       y1="-11.5137"
-       x2="527.99609"
-       y2="2.7063999"
-       id="linearGradient17882"
-       xlink:href="#XMLID_1752_"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)" />
-    <defs
-       id="defs3826">
-      <polygon
-         points="463.52,216.14 480.56,220.24 481.36,219.5 483.03,202.04 469.05,196.69 468.24,197.45 463.52,216.14 "
-         id="XMLID_338_" />
-    </defs>
-    <linearGradient
-       x1="468.2915"
-       y1="204.7612"
-       x2="479.39871"
-       y2="214.4166"
-       id="linearGradient17357"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         style="stop-color:#5387ba;stop-opacity:1"
-         offset="0"
-         id="stop17359" />
-      <stop
-         style="stop-color:#96bad6;stop-opacity:1"
-         offset="1"
-         id="stop17361" />
-      <a:midPointStop
-         style="stop-color:#5387BA"
-         offset="0" />
-      <a:midPointStop
-         style="stop-color:#5387BA"
-         offset="0.5" />
-      <a:midPointStop
-         style="stop-color:#96BAD6"
-         offset="1" />
-    </linearGradient>
-    <clipPath
-       id="clipPath17364">
-      <use
-         id="use17366"
-         x="0"
-         y="0"
-         width="744.09448"
-         height="600"
-         xlink:href="#XMLID_338_" />
-    </clipPath>
-    <linearGradient
-       x1="506.09909"
-       y1="-11.5137"
-       x2="527.99609"
-       y2="2.7063999"
-       id="linearGradient17368"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.6868,0.4269,-0.9821,0.821,111.6149,-5.7901)">
-      <stop
-         style="stop-color:#b4daea;stop-opacity:1"
-         offset="0"
-         id="stop17370" />
-      <stop
-         style="stop-color:#b4daea;stop-opacity:1"
-         offset="0.51120001"
-         id="stop17372" />
-      <stop
-         style="stop-color:#5387ba;stop-opacity:1"
-         offset="0.64609998"
-         id="stop17374" />
-      <stop
-         style="stop-color:#16336e;stop-opacity:1"
-         offset="1"
-         id="stop17376" />
-      <a:midPointStop
-         style="stop-color:#B4DAEA"
-         offset="0" />
-      <a:midPointStop
-         style="stop-color:#B4DAEA"
-         offset="0.5" />
-      <a:midPointStop
-         style="stop-color:#B4DAEA"
-         offset="0.5112" />
-      <a:midPointStop
-         style="stop-color:#B4DAEA"
-         offset="0.5" />
-      <a:midPointStop
-         style="stop-color:#5387BA"
-         offset="0.6461" />
-      <a:midPointStop
-         style="stop-color:#5387BA"
-         offset="0.5" />
-      <a:midPointStop
-         style="stop-color:#16336E"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       x1="296.4996"
-       y1="188.81061"
-       x2="317.32471"
-       y2="209.69398"
-       id="linearGradient2387"
-       xlink:href="#linearGradient2381"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.90776,0,0,0.90776,24.35648,49.24131)" />
-    <linearGradient
-       x1="296.4996"
-       y1="188.81061"
-       x2="317.32471"
-       y2="209.69398"
-       id="linearGradient5105"
-       xlink:href="#linearGradient2381"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.90776,0,0,0.90776,24.35648,49.24131)" />
-    <linearGradient
-       x1="296.4996"
-       y1="188.81061"
-       x2="317.32471"
-       y2="209.69398"
-       id="linearGradient5145"
-       xlink:href="#linearGradient2381"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.90776,0,0,0.90776,24.35648,49.24131)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2381"
-       id="linearGradient2371"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.90776,0,0,0.90776,24.35648,49.24131)"
-       x1="296.4996"
-       y1="188.81061"
-       x2="317.32471"
-       y2="209.69398" />
-  </defs>
-  <g
-     transform="matrix(0.437808,-0.437808,0.437808,0.437808,-220.8237,43.55311)"
-     id="g5089">
-    <path
-       d="M 8.4382985,-6.28125 C 7.8309069,-6.28125 4.125,-0.33238729 4.125,1.96875 L 4.125,28.6875 C 4.125,29.533884 4.7068159,29.8125 5.28125,29.8125 L 30.84375,29.8125 C 31.476092,29.8125 31.968751,29.319842 31.96875,28.6875 L 31.96875,23.46875 L 32.25,23.46875 C 32.74684,23.46875 33.156249,23.059339 33.15625,22.5625 L 33.15625,-5.375 C 33.15625,-5.8718398 32.74684,-6.28125 32.25,-6.28125 L 8.4382985,-6.28125 z "
-       transform="translate(282.8327,227.1903)"
-       style="fill:#5c5c4f;stroke:black;stroke-width:3.23021388;stroke-miterlimit:4;stroke-dasharray:none"
-       id="path5091" />
-    <rect
-       width="27.85074"
-       height="29.369793"
-       rx="1.1414107"
-       ry="1.1414107"
-       x="286.96509"
-       y="227.63805"
-       style="fill:#032c87"
-       id="rect5093" />
-    <path
-       d="M 288.43262,225.43675 L 313.67442,225.43675 L 313.67442,254.80655 L 287.29827,254.83069 L 288.43262,225.43675 z "
-       style="fill:white"
-       id="rect5095" />
-    <path
-       d="M 302.44536,251.73726 C 303.83227,259.59643 301.75225,263.02091 301.75225,263.02091 C 303.99609,261.41329 305.71651,259.54397 306.65747,257.28491 C 307.62455,259.47755 308.49041,261.71357 310.9319,263.27432 C 310.9319,263.27432 309.33686,256.07392 309.22047,251.73726 L 302.44536,251.73726 z "
-       style="fill:#a70000;fill-opacity:1;stroke-width:2"
-       id="path5097" />
-    <rect
-       width="25.241802"
-       height="29.736675"
-       rx="0.89682275"
-       ry="0.89682275"
-       x="290.73544"
-       y="220.92249"
-       style="fill:#809cc9"
-       id="rect5099" />
-    <path
-       d="M 576.47347,725.93939 L 582.84431,726.35441 L 583.25121,755.8725 C 581.35919,754.55465 576.39694,752.1117 574.98889,754.19149 L 574.98889,727.42397 C 574.98889,726.60151 575.65101,725.93939 576.47347,725.93939 z "
-       transform="matrix(0.499065,-0.866565,0,1,0,0)"
-       style="fill:#4573b3;fill-opacity:1"
-       id="rect5101" />
-    <path
-       d="M 293.2599,221.89363 L 313.99908,221.89363 C 314.45009,221.89363 314.81318,222.25673 314.81318,222.70774 C 315.02865,229.0361 295.44494,244.47124 292.44579,240.30491 L 292.44579,222.70774 C 292.44579,222.25673 292.80889,221.89363 293.2599,221.89363 z "
-       style="opacity:0.65536726;fill:url(#linearGradient2371);fill-opacity:1"
-       id="path5103" />
-  </g>
-</svg>
diff --git a/doc/SystemTap_Tapset_Reference/en-US/memory.xml b/doc/SystemTap_Tapset_Reference/en-US/memory.xml
deleted file mode 100644
index 7bceaa1..0000000
--- a/doc/SystemTap_Tapset_Reference/en-US/memory.xml
+++ /dev/null
@@ -1,182 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-]>
-<!-- This file is extracted from the tapset files 
-   Do not modify this file -->
-<chapter id="memory_stp">
-  <title>Memory Tapset</title>
-  <para>
-	This family of probe  points is used to probe page fault events.
-     It contains the following probe points:
-  </para>
-<formalpara id="vm.pagefault">
-  <title>vm.pagefault</title>
-  <indexterm><primary>vm.pagefault</primary></indexterm>
-  <para>
-    Records that a page fault occurred.
-    The context is the process which triggered the fault.</para>
-</formalpara>
-<para>
-  <variablelist><title>Arguments:</title>
-    <varlistentry><term>address</term>
-       <listitem><para>
-         The address of the faulting memory access.
-       </para></listitem>
-    </varlistentry>
-    <varlistentry><term>write_access</term>
-       <listitem><para>
-          Indicates whether this was a write.
-       </para></listitem>
-    </varlistentry>
-  </variablelist>
-</para>
-<formalpara id="vm.pagefault.return">
-  <title>vm.pagefault.return</title>
-  <indexterm><primary>vm.pagefault.return</primary></indexterm>
-  <para>
-    Records type of fault that occurred.
-    The context is the process which triggered the fault.
-  </para>
-</formalpara>
-<para>
-  <variablelist><title>Arguments:</title>
-    <varlistentry><term>fault_type</term>
-      <listitem><para>The possible values of fault_type are:
-        <table frame='all'><title>Fault values</title>
-        <tgroup cols='3' align='left' colsep='1' rowsep='1'>
-        <colspec colname='Define'/>
-        <colspec colname='Value'/>
-        <colspec colname='Reason'/>
-	   <thead>
-   	   <row><entry>Define</entry><entry>Value</entry><entry>Reason</entry></row>
-	   </thead>
-	   <tbody>
-	   <row>
-	     <entry>VM_FAULT_OOM</entry>
-	     <entry>0</entry>
-	     <entry>out of memory</entry>
-	   </row>
-	   <row>
-		<entry>VM_FAULT_SIGBUS</entry>
-		<entry>1</entry>
-		<entry>if not oom, minor, or major fault, this val</entry>
-	   </row>
-	   <row>
-		<entry>VM_FAULT_MINOR</entry>
-		<entry>2</entry>
-		<entry>no blocking operation to handle fault</entry>
-	   </row>
-	   <row>
-		<entry>VM_FAULT_MAJOR</entry>
-		<entry>3</entry>
-		<entry>required blocking operation to handle fault</entry>
-	   </row>
-	 </tbody>
-	 </tgroup>
-	 </table>
-      </para></listitem>
-    </varlistentry>
-  </variablelist>
-</para>
-<formalpara id="vm.write_shared">
-  <title>vm.write_shared</title>
-  <indexterm><primary>vm.write_shared</primary></indexterm>
-  <para>
-    Fires when a process attempts to write to a shared page.
-    If a copy is necessary, this will be followed by a
-    <xref linkend="vm.write_shared_copy"/>.
-    The context is the process attempting the write.
-  </para>
-</formalpara>
-<para>
-  <variablelist><title>Arguments:</title>
-    <varlistentry><term>address</term>
-       <listitem><para>The address of the shared write.</para></listitem>
-    </varlistentry>
-  </variablelist>
-</para>
-<formalpara id="vm.write_shared_copy">
-  <title>vm.write_shared_copy</title>
-  <indexterm><primary>vm.write_shared_copy</primary></indexterm>
-  <para>
-    Fires when a write to a shared page requires a page copy.
-    This is always preceded by a <xref linkend="vm.write_shared"/>.
-    The context is the process attempting the write.
-</para>
-</formalpara>
-<para>
-  <variablelist><title>Arguments:</title>
-    <varlistentry><term>address</term>
-       <listitem><para>
-	    The address of the shared write.
-       </para></listitem>
-    </varlistentry>
-    <varlistentry><term>zero</term>
-       <listitem><para>
-	  Boolean indicating whether it is a zero page
-       (can do a clear instead of a copy).
-       </para></listitem>
-    </varlistentry>
-  </variablelist>
-</para>
-<formalpara id="vm.mmap">
-  <title>vm.mmap</title>
-  <indexterm><primary>vm.mmap</primary></indexterm>
-  <para>
-    Fires when an mmap is requested. 
-    The context is the process calling mmap.
-  </para>
-</formalpara>
-<para>
-  <variablelist><title>Arguments:</title>
-    <varlistentry><term>address</term>
-      <listitem><para>The requested address.</para></listitem>
-    </varlistentry>
-    <varlistentry><term>length</term>
-      <listitem><para>The length of the memory segment.</para></listitem>
-    </varlistentry>
-  </variablelist>
-</para>
-<formalpara id="vm.munmap">
-  <title>vm.munmap</title>
-  <indexterm><primary>vm.munmap</primary></indexterm>
-  <para>Fires when an munmap is requested.</para>
-</formalpara>
-<para>
-  <variablelist><title>Arguments:</title>
-    <varlistentry><term>address</term>
-       <listitem><para>The requested address.</para></listitem>
-    </varlistentry>
-    <varlistentry><term>length</term>
-       <listitem><para>The length of the memory segment.</para></listitem>
-    </varlistentry>
-  </variablelist>
-</para>
-<formalpara id="vm.brk">
-  <title>vm.brk</title>
-  <indexterm><primary>vm.brk</primary></indexterm>
-  <para>Fires when a brk is requested (resizing a heap).</para>
-</formalpara>
-<para>
-  <variablelist><title>Arguments:</title>
-    <varlistentry><term>address</term>
-       <listitem><para>The requested address.</para></listitem>
-    </varlistentry>
-    <varlistentry><term>length</term>
-       <listitem><para>The length of the memory segment.</para></listitem>
-    </varlistentry>
-  </variablelist>
-</para>
-<formalpara id="vm.oom_kill">
-  <title>vm.oom_kill</title>
-  <indexterm><primary>vm.oom_kill</primary></indexterm>
-  <para>Fires when a thread is targetted by the OOM killer.</para>
-</formalpara>
-<para>
-  <variablelist><title>Arguments:</title>
-    <varlistentry><term>task</term>
-       <listitem><para>The task being killed.</para></listitem>
-    </varlistentry>
-  </variablelist>
-</para>
-</chapter>
diff --git a/doc/SystemTap_Tapset_Reference/en-US/networking.xml b/doc/SystemTap_Tapset_Reference/en-US/networking.xml
deleted file mode 100644
index bb5cfea..0000000
--- a/doc/SystemTap_Tapset_Reference/en-US/networking.xml
+++ /dev/null
@@ -1,100 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-]>
-<!-- This file is extracted from the tapset files 
-   Do not modify this file -->
-<chapter id="networking.stp">
-  <title>Networking Tapset</title>
-  <para>
-	This family of probe points is used to probe the activities of
-     network device. 
-  </para>
-<formalpara id="netdev.receive">
-  <title>netdev.receive</title>
-  <indexterm><primary>netdev.receive</primary></indexterm>
-  <para>Fires when data arrives on network device.</para>
-</formalpara>
-<para>
-  <variablelist><title>Arguments:</title>
-    <varlistentry><term>dev_name</term>
-       <listitem><para>
-          The name of the device. e.g: eth0, ath1
-       </para></listitem>
-    </varlistentry>
-
-    <varlistentry><term>length</term>
-       <listitem><para>
-           The length of the receiving buffer
-       </para></listitem>
-    </varlistentry>
-
-    <varlistentry><term>protocol</term>
-       <listitem><para>The possible values of protocol could be:
-         <table frame='all'><title>Protocol Values</title>
-         <tgroup cols='2' align='left' colsep='1' rowsep='1'>
-         <colspec colname='Value'/>
-         <colspec colname='Protocol'/>
-	    <thead>
-   	    <row><entry>Value(Hex)</entry><entry>Protocol</entry></row>
-	    </thead>
-	    <tbody>
-   	    <row><entry>0001</entry><entry>802.3</entry></row>
-   	    <row><entry>0002</entry><entry>AX.25</entry></row>
-   	    <row><entry>0004</entry><entry>802.2</entry></row>
-   	    <row><entry>0005</entry><entry>SNAP</entry></row>
-   	    <row><entry>0009</entry><entry>Localtalk</entry></row>
-   	    <row><entry>0800</entry><entry>IP</entry></row>
-   	    <row><entry>0805</entry><entry>X.25</entry></row>
-   	    <row><entry>0806</entry><entry>ARP</entry></row>
-   	    <row><entry>8035</entry><entry>RARP</entry></row>
-   	    <row><entry>8100</entry><entry>802.1Q VLAN</entry></row>
-   	    <row><entry>8137</entry><entry>IPX</entry></row>
-   	    <row><entry>86DD</entry><entry>IPv6</entry></row>
-	    </tbody>
-	    </tgroup>
-	    </table>
-       </para></listitem>
-    </varlistentry>
-
-    <varlistentry><term>truesize</term>
-       <listitem><para>
-           The size of the received data.
-       </para></listitem>
-    </varlistentry>
-
-  </variablelist>
-</para>
-<formalpara id="netdev.transmit">
-  <title>netdev.transmit</title>
-  <indexterm><primary>netdev.transmit</primary></indexterm>
-  <para> Fires when the network device wants to transmit a buffer.</para>
-</formalpara>
-<para>
-  <variablelist><title>Arguments:</title>
-    <varlistentry><term>dev_name</term>
-       <listitem><para>
-          The name of the device. e.g: eth0, ath1
-       </para></listitem>
-    </varlistentry>
-
-    <varlistentry><term>length</term>
-       <listitem><para>
-         The length of the transmit buffer
-       </para></listitem>
-    </varlistentry>
-
-    <varlistentry><term>protocol</term>
-       <listitem><para>
-         The protocol of this packet.
-       </para></listitem>
-    </varlistentry>
-
-    <varlistentry><term>truesize</term>
-       <listitem><para>
-         The size of the the data to be transmitted.
-       </para></listitem>
-    </varlistentry>
-
-  </variablelist>
-</para>
-</chapter>
diff --git a/doc/SystemTap_Tapset_Reference/en-US/timestamp.xml b/doc/SystemTap_Tapset_Reference/en-US/timestamp.xml
deleted file mode 100644
index 714f16b..0000000
--- a/doc/SystemTap_Tapset_Reference/en-US/timestamp.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version='1.0'?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-]>
-<!-- This file is extracted from the tapset files 
-   Do not modify this file -->
-<chapter id="timestamp_stp">
-  <title>Timestamp Functions</title>
-  <para>
-	Each timestamp function returns a value to indicate when
-     the function is executed.
-     Thus, these returned values can be used to indicate
-     when an event occurs, provide an ordering for events, or compute
-	the amount of time elapsed between to time stamps.
-  </para>
-<formalpara id="get_cycles">
-  <title>get_cycles:long()</title>
-  <indexterm><primary>get_cycles</primary></indexterm>
-  <para>
-	Return the processor cycle counter value, or 0 if unavailable.
-  </para>
-</formalpara>
-<formalpara id="gettimeofday_ns">
-  <title>gettimeofday_ns:long ()</title>
-  <indexterm><primary>gettimeofday_ns</primary></indexterm>
-  <para>
-	Return the number of nanoseconds since the UNIX epoch.
-  </para>
-</formalpara>
-<formalpara id="gettimeofday_us">
-  <title>gettimeofday_us:long ()</title>
-  <indexterm><primary>gettimeofday_us</primary></indexterm>
-  <para>
-	Return the number of microseconds since the UNIX epoch.
-  </para>
-</formalpara>
-<formalpara id="gettimeofday_ms">
-  <title>gettimeofday_ms:long ()</title>
-  <indexterm><primary>gettimeofday_ms</primary></indexterm>
-  <para>
-	Return the number of milliseconds since the UNIX epoch.
-  </para>
-</formalpara>
-<formalpara id="gettimeofday_s">
-  <title>gettimeofday_s:long ()</title>
-  <indexterm><primary>gettimeofday_s</primary></indexterm>
-  <para>
-	Return the number of seconds since the UNIX epoch.
-  </para>
-</formalpara>
-</chapter>
diff --git a/doc/SystemTap_Tapset_Reference/extractxml.pl b/doc/SystemTap_Tapset_Reference/extractxml.pl
deleted file mode 100755
index 492a29c..0000000
--- a/doc/SystemTap_Tapset_Reference/extractxml.pl
+++ /dev/null
@@ -1,137 +0,0 @@
-#! /usr/bin/perl
-# Generates xml files from tapset .stp files.
-# Copyright (C) 2008 Red Hat Inc.
-#
-# This file is part of systemtap, and is free software.  You can
-# redistribute it and/or modify it under the terms of the GNU General
-# Public License (GPL); either version 2, or (at your option) any
-# later version.
-
-use strict;
-use warnings;
-
-use Cwd 'abs_path';
-use File::Copy;
-use File::Find;
-use File::Path;
-use Text::Wrap;
-use IO::File;
-use POSIX qw(tmpnam);
-
-my $XMLHEADER = 
-    "<?xml version='1.0'?>\n"
-    . "<!DOCTYPE chapter PUBLIC \"-//OASIS//DTD DocBook XML V4.5//EN\" \"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd\" [\n"
-    . "]>\n"
-    ."<!-- This file is machine generated based on tapset files \n"
-    . "   Do not modify this file -->\n"
-    . "<book>\n"
-    . "<xi:include href=\"Book_Info.xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\" />\n"
-    . "<xi:include href=\"Preface.xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\" />\n"
-    . "<xi:include href=\"Introduction.xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\" />\n"
-;
-my $XMLFOOTER =
-    "<xi:include href=\"Revision_History.xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\" />\n"
-    . "<index />\n"
-    ."</book>\n";
-
-my $XML_CHAPTER_HEADER = 
-    "<?xml version='1.0'?>\n"
-    . "<!DOCTYPE chapter PUBLIC \"-//OASIS//DTD DocBook XML V4.5//EN\" \"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd\" [\n"
-    . "]>\n"
-    . "<!-- This file is extracted from the tapset files \n"
-    . "   Do not modify this file -->\n";
-
-my $XML_CHAPTER_FOOTER = "";
-
-my $inputdir;
-if ($#ARGV >= 0) {
-    $inputdir = $ARGV[0];
-} else {
-    $inputdir = ".";
-}
-$inputdir = abs_path($inputdir);
-
-my $outputdir;
-if ($#ARGV >= 1) {
-    $outputdir = $ARGV[1];
-} else {
-    $outputdir = $inputdir;
-}
-$outputdir = abs_path($outputdir);
-
-#attempt to create the output directory
-if ($inputdir ne $outputdir) {
-    if (! -d "$outputdir") {
-	mkpath("$outputdir", 1, 0711);
-    }
-}
-
-my %scripts = ();
-
-print "Extracting xml from .stp files in $inputdir...\n";
-find(\&extract_xml, $inputdir);
-
-
-# Output list of extracted xml files
-my $tapsetxml = "$outputdir/Tapset_Reference.xml";
-open (TAPSETXML, ">$tapsetxml")
-    || die "couldn't open $tapsetxml: $!";
-print "Creating $tapsetxml...\n";
-print TAPSETXML $XMLHEADER;
-
-my $tapset;
-foreach $tapset (sort keys %scripts) {
-    print TAPSETXML 	"<xi:include href=\"$tapset\" xmlns:xi=\"http://www.w3.org/2001/XInclude\" />\n"
-
-}
-print TAPSETXML $XMLFOOTER;
-close (TAPSETXML);
-
-
-sub extract_xml {
-    my $file = $_;
-    my $filename = $File::Find::name;
-    my $ofile;
-    my $ofilefullt;
-    my $ofilefull;
-
-    if (-f $file && $file =~ /\.stp$/) {
-	open FILE, $file or die "couldn't open '$file': $!\n";
-
-	$ofilefullt = tmpnam();
-	open OFILET, ">$ofilefullt" or die "couldn't open '$ofilefullt': $!\n";
-
-	print "Extracting xml from $filename...\n";
-	
-	while (<FILE>) {
-	    print OFILET if s/\s*\/\/\///;
-	}
-	close OFILET;
-	close FILE;
-
-	#If xml was extracted make a .xml file
-	if (-s $ofilefullt) {
-	    #get rid of the inputdir part and .stp, add .xml
-	    # chop off the search dir prefix.
-	    $inputdir =~ s/\/$//;
-	    $ofile = substr $filename, (length $inputdir) + 1;
-	    $ofile =~ s/.stp/.xml/;
-	    $ofile =~ s/\//_/g;
-	    $scripts{$ofile} = $ofile;
-	    print "$ofile\n";
-	    $ofilefull = "$outputdir/$ofile";
-	    open OFILE, ">$ofilefull"
-		or die "couldn't open '$ofilefull': $!\n";
-	    open OFILET, "$ofilefullt"
-		or die "couldn't open '$ofilefullt': $!\n";
-	    print OFILE "$XML_CHAPTER_HEADER";
-	    while (<OFILET>) {
-		print OFILE ;
-	    }
-	    print OFILE "$XML_CHAPTER_FOOTER";
-	    close OFILET;
-	    close OFILE;
-	}
-	unlink($ofilefullt);
-    }
-}
-- 
1.5.6.5


[-- Attachment #3: kernel-doc2.patch --]
[-- Type: text/x-patch, Size: 103985 bytes --]

From 45451e50f27e29fece12a3ee9747514806a65795 Mon Sep 17 00:00:00 2001
From: William Cohen <wcohen@redhat.com>
Date: Mon, 24 Nov 2008 10:34:29 -0500
Subject: [PATCH] Add kernel-doc based version of SystemTap_Tapset_Reference.

---
 ChangeLog                                   |    6 +
 configure                                   |    3 +-
 configure.ac                                |    2 +-
 doc/ChangeLog                               |    4 +
 doc/SystemTap_Tapset_Reference/Makefile.am  |   37 +
 doc/SystemTap_Tapset_Reference/Makefile.in  |  458 ++++++
 doc/SystemTap_Tapset_Reference/docproc.c    |  448 +++++
 doc/SystemTap_Tapset_Reference/tapsets.tmpl |  115 ++
 scripts/kernel-doc                          | 2356 +++++++++++++++++++++++++++
 9 files changed, 3427 insertions(+), 2 deletions(-)
 create mode 100644 doc/SystemTap_Tapset_Reference/Makefile.am
 create mode 100644 doc/SystemTap_Tapset_Reference/Makefile.in
 create mode 100644 doc/SystemTap_Tapset_Reference/docproc.c
 create mode 100644 doc/SystemTap_Tapset_Reference/tapsets.tmpl
 create mode 100755 scripts/kernel-doc

diff --git a/ChangeLog b/ChangeLog
index cd0cd73..4742a41 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2008-11-24  Will Cohen <wcohen@redhat.com>
+
+	* scripts/kernel-doc: New.
+	* configure.ac: Add doc/SystemTap_Tapset_Reference/Makefile.
+	* configure, doc/SystemTap_Tapset_Reference/Makefile.in: Regenerate.
+	
 2008-11-22  Frank Ch. Eigler  <fche@elastic.org>
 
 	* tapsets.cxx (MAXUPROBES): Tweak its definition.  Use it
diff --git a/configure b/configure
index c5bccb2..dc40c1e 100755
--- a/configure
+++ b/configure
@@ -6995,7 +6995,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 ac_config_headers="$ac_config_headers config.h:config.in"
 
-ac_config_files="$ac_config_files Makefile doc/Makefile stap.1 stapprobes.5 stapfuncs.5 stapvars.5 stapex.5 staprun.8 stap-server.8 man/stapprobes.iosched.5 man/stapprobes.netdev.5 man/stapprobes.nfs.5 man/stapprobes.nfsd.5 man/stapprobes.pagefault.5 man/stapprobes.process.5 man/stapprobes.rpc.5 man/stapprobes.scsi.5 man/stapprobes.signal.5 man/stapprobes.socket.5 man/stapprobes.tcp.5 man/stapprobes.udp.5"
+ac_config_files="$ac_config_files Makefile doc/Makefile doc/SystemTap_Tapset_Reference/Makefile stap.1 stapprobes.5 stapfuncs.5 stapvars.5 stapex.5 staprun.8 stap-server.8 man/stapprobes.iosched.5 man/stapprobes.netdev.5 man/stapprobes.nfs.5 man/stapprobes.nfsd.5 man/stapprobes.pagefault.5 man/stapprobes.process.5 man/stapprobes.rpc.5 man/stapprobes.scsi.5 man/stapprobes.signal.5 man/stapprobes.socket.5 man/stapprobes.tcp.5 man/stapprobes.udp.5"
 
 subdirs="$subdirs testsuite"
 
@@ -7623,6 +7623,7 @@ do
     "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h:config.in" ;;
     "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
     "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
+    "doc/SystemTap_Tapset_Reference/Makefile") CONFIG_FILES="$CONFIG_FILES doc/SystemTap_Tapset_Reference/Makefile" ;;
     "stap.1") CONFIG_FILES="$CONFIG_FILES stap.1" ;;
     "stapprobes.5") CONFIG_FILES="$CONFIG_FILES stapprobes.5" ;;
     "stapfuncs.5") CONFIG_FILES="$CONFIG_FILES stapfuncs.5" ;;
diff --git a/configure.ac b/configure.ac
index aec2a55..108a519 100644
--- a/configure.ac
+++ b/configure.ac
@@ -221,7 +221,7 @@ AC_CHECK_HEADERS([tr1/unordered_map])
 AC_LANG_POP(C++)
 
 AC_CONFIG_HEADERS([config.h:config.in])
-AC_CONFIG_FILES(Makefile doc/Makefile stap.1 stapprobes.5 stapfuncs.5 stapvars.5 stapex.5 staprun.8 stap-server.8 man/stapprobes.iosched.5 man/stapprobes.netdev.5 man/stapprobes.nfs.5 man/stapprobes.nfsd.5 man/stapprobes.pagefault.5 man/stapprobes.process.5 man/stapprobes.rpc.5 man/stapprobes.scsi.5 man/stapprobes.signal.5 man/stapprobes.socket.5 man/stapprobes.tcp.5 man/stapprobes.udp.5)
+AC_CONFIG_FILES(Makefile doc/Makefile doc/SystemTap_Tapset_Reference/Makefile stap.1 stapprobes.5 stapfuncs.5 stapvars.5 stapex.5 staprun.8 stap-server.8 man/stapprobes.iosched.5 man/stapprobes.netdev.5 man/stapprobes.nfs.5 man/stapprobes.nfsd.5 man/stapprobes.pagefault.5 man/stapprobes.process.5 man/stapprobes.rpc.5 man/stapprobes.scsi.5 man/stapprobes.signal.5 man/stapprobes.socket.5 man/stapprobes.tcp.5 man/stapprobes.udp.5)
 AC_CONFIG_SUBDIRS(testsuite)
 
 AC_OUTPUT
diff --git a/doc/ChangeLog b/doc/ChangeLog
index e59e240..ac2d01a 100644
--- a/doc/ChangeLog
+++ b/doc/ChangeLog
@@ -1,5 +1,9 @@
 2008-11-24  Will Cohen <wcohen@redhat.com>
 
+	* SystemTap_Tapset_Reference: Add kernel-doc based version.
+	
+2008-11-24  Will Cohen <wcohen@redhat.com>
+
 	* SystemTap_Tapset_Reference: Remove.
 	
 2008-10-23  Will Cohen <wcohen@redhat.com>
diff --git a/doc/SystemTap_Tapset_Reference/Makefile.am b/doc/SystemTap_Tapset_Reference/Makefile.am
new file mode 100644
index 0000000..8327e90
--- /dev/null
+++ b/doc/SystemTap_Tapset_Reference/Makefile.am
@@ -0,0 +1,37 @@
+# Makefile.am --- automake input file for systemtap tapset reference manual
+## process this file with automake to produce Makefile.in
+
+###
+# The build process is as follows (targets):
+#              (xmldocs) [by docproc]
+# file.tmpl --> file.xml +--> file.ps   (psdocs)   [by xmlto]
+#                        +--> file.pdf  (pdfdocs)  [by xmlto]
+#                        +--> DIR=file  (htmldocs) [by xmlto]
+#                        +--> man/      (mandocs)  [by xmlto]
+
+bin_PROGRAMS = docproc
+docproc_SOURCES = docproc.c
+
+all: pdfdocs htmldocs mandocs
+
+
+SRCTREE=$(abs_top_srcdir)/
+DOCPROC=$(abs_builddir)/docproc
+
+xmldocs: docproc
+	SRCTREE=$(SRCTREE) $(DOCPROC) doc $(abs_srcdir)/tapsets.tmpl > tapsets.xml
+
+htmldocs: xmldocs
+	xmlto html -o tapset tapsets.xml
+
+pdfdocs: xmldocs
+	xmlto pdf tapsets.xml
+
+mandocs: xmldocs
+	xmlto man tapsets.xml
+
+#FIXME need to figure out where to install things appropriately
+#installmandocs: mandocs
+#	$(MKDIR_P) /usr/local/man/man5/
+#	install Documentation/DocBook/man/*.5.gz /usr/local/man/man5/
+
diff --git a/doc/SystemTap_Tapset_Reference/Makefile.in b/doc/SystemTap_Tapset_Reference/Makefile.in
new file mode 100644
index 0000000..5dff66f
--- /dev/null
+++ b/doc/SystemTap_Tapset_Reference/Makefile.in
@@ -0,0 +1,458 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Makefile.am --- automake input file for systemtap tapset reference manual
+
+###
+# The build process is as follows (targets):
+#              (xmldocs) [by docproc]
+# file.tmpl --> file.xml +--> file.ps   (psdocs)   [by xmlto]
+#                        +--> file.pdf  (pdfdocs)  [by xmlto]
+#                        +--> DIR=file  (htmldocs) [by xmlto]
+#                        +--> man/      (mandocs)  [by xmlto]
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+bin_PROGRAMS = docproc$(EXEEXT)
+subdir = doc/SystemTap_Tapset_Reference
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_docproc_OBJECTS = docproc.$(OBJEXT)
+docproc_OBJECTS = $(am_docproc_OBJECTS)
+docproc_LDADD = $(LDADD)
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(docproc_SOURCES)
+DIST_SOURCES = $(docproc_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATE = @DATE@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PIELDFLAGS = @PIELDFLAGS@
+PROCFLAGS = @PROCFLAGS@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+U = @U@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+elfutils_abs_srcdir = @elfutils_abs_srcdir@
+exec_prefix = @exec_prefix@
+have_dvips = @have_dvips@
+have_latex = @have_latex@
+have_latex2html = @have_latex2html@
+have_ps2pdf = @have_ps2pdf@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sqlite3_LIBS = @sqlite3_LIBS@
+srcdir = @srcdir@
+stap_LIBS = @stap_LIBS@
+staplog_CPPFLAGS = @staplog_CPPFLAGS@
+subdirs = @subdirs@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+docproc_SOURCES = docproc.c
+SRCTREE = $(abs_top_srcdir)/
+DOCPROC = $(abs_builddir)/docproc
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  doc/SystemTap_Tapset_Reference/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  doc/SystemTap_Tapset_Reference/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  if test -f $$p \
+	  ; then \
+	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+	   echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+	   $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+	  else :; fi; \
+	done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+	  echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(bindir)/$$f"; \
+	done
+
+clean-binPROGRAMS:
+	-test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+docproc$(EXEEXT): $(docproc_OBJECTS) $(docproc_DEPENDENCIES) 
+	@rm -f docproc$(EXEEXT)
+	$(LINK) $(docproc_OBJECTS) $(docproc_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/docproc.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+	for dir in "$(DESTDIR)$(bindir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+	clean-generic ctags distclean distclean-compile \
+	distclean-generic distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-binPROGRAMS \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+	uninstall-am uninstall-binPROGRAMS
+
+
+all: pdfdocs htmldocs mandocs
+
+xmldocs: docproc
+	SRCTREE=$(SRCTREE) $(DOCPROC) doc $(abs_srcdir)/tapsets.tmpl > tapsets.xml
+
+htmldocs: xmldocs
+	xmlto html -o tapset tapsets.xml
+
+pdfdocs: xmldocs
+	xmlto pdf tapsets.xml
+
+mandocs: xmldocs
+	xmlto man tapsets.xml
+
+#FIXME need to figure out where to install things appropriately
+#installmandocs: mandocs
+#	$(MKDIR_P) /usr/local/man/man5/
+#	install Documentation/DocBook/man/*.5.gz /usr/local/man/man5/
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/doc/SystemTap_Tapset_Reference/docproc.c b/doc/SystemTap_Tapset_Reference/docproc.c
new file mode 100644
index 0000000..35bdc68
--- /dev/null
+++ b/doc/SystemTap_Tapset_Reference/docproc.c
@@ -0,0 +1,448 @@
+/*
+ *	docproc is a simple preprocessor for the template files
+ *      used as placeholders for the kernel internal documentation.
+ *	docproc is used for documentation-frontend and
+ *      dependency-generator.
+ *	The two usages have in common that they require
+ *	some knowledge of the .tmpl syntax, therefore they
+ *	are kept together.
+ *
+ *	documentation-frontend
+ *		Scans the template file and call kernel-doc for
+ *		all occurrences of ![EIF]file
+ *		Beforehand each referenced file is scanned for
+ *		any symbols that are exported via these macros:
+ *			EXPORT_SYMBOL(), EXPORT_SYMBOL_GPL(), &
+ *			EXPORT_SYMBOL_GPL_FUTURE()
+ *		This is used to create proper -function and
+ *		-nofunction arguments in calls to kernel-doc.
+ *		Usage: docproc doc file.tmpl
+ *
+ *	dependency-generator:
+ *		Scans the template file and list all files
+ *		referenced in a format recognized by make.
+ *		Usage:	docproc depend file.tmpl
+ *		Writes dependency information to stdout
+ *		in the following format:
+ *		file.tmpl src.c	src2.c
+ *		The filenames are obtained from the following constructs:
+ *		!Efilename
+ *		!Ifilename
+ *		!Dfilename
+ *		!Ffilename
+ *		!Pfilename
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <unistd.h>
+#include <limits.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+/* exitstatus is used to keep track of any failing calls to kernel-doc,
+ * but execution continues. */
+int exitstatus = 0;
+
+typedef void DFL(char *);
+DFL *defaultline;
+
+typedef void FILEONLY(char * file);
+FILEONLY *internalfunctions;
+FILEONLY *externalfunctions;
+FILEONLY *symbolsonly;
+
+typedef void FILELINE(char * file, char * line);
+FILELINE * singlefunctions;
+FILELINE * entity_system;
+FILELINE * docsection;
+
+#define MAXLINESZ     2048
+#define MAXFILES      250
+#define KERNELDOCPATH "scripts/"
+#define KERNELDOC     "kernel-doc"
+#define DOCBOOK       "-docbook"
+#define FUNCTION      "-function"
+#define NOFUNCTION    "-nofunction"
+#define NODOCSECTIONS "-no-doc-sections"
+
+char *srctree;
+
+void usage (void)
+{
+	fprintf(stderr, "Usage: docproc {doc|depend} file\n");
+	fprintf(stderr, "Input is read from file.tmpl. Output is sent to stdout\n");
+	fprintf(stderr, "doc: frontend when generating kernel documentation\n");
+	fprintf(stderr, "depend: generate list of files referenced within file\n");
+	fprintf(stderr, "Environment variable SRCTREE: absolute path to kernel source tree.\n");
+}
+
+/*
+ * Execute kernel-doc with parameters given in svec
+ */
+void exec_kernel_doc(char **svec)
+{
+	pid_t pid;
+	int ret;
+	char real_filename[PATH_MAX + 1];
+	/* Make sure output generated so far are flushed */
+	fflush(stdout);
+	switch (pid=fork()) {
+		case -1:
+			perror("fork");
+			exit(1);
+		case  0:
+			memset(real_filename, 0, sizeof(real_filename));
+			strncat(real_filename, srctree, PATH_MAX);
+			strncat(real_filename, KERNELDOCPATH KERNELDOC,
+					PATH_MAX - strlen(real_filename));
+			execvp(real_filename, svec);
+			fprintf(stderr, "exec ");
+			perror(real_filename);
+			exit(1);
+		default:
+			waitpid(pid, &ret ,0);
+	}
+	if (WIFEXITED(ret))
+		exitstatus |= WEXITSTATUS(ret);
+	else
+		exitstatus = 0xff;
+}
+
+/* Types used to create list of all exported symbols in a number of files */
+struct symbols
+{
+	char *name;
+};
+
+struct symfile
+{
+	char *filename;
+	struct symbols *symbollist;
+	int symbolcnt;
+};
+
+struct symfile symfilelist[MAXFILES];
+int symfilecnt = 0;
+
+void add_new_symbol(struct symfile *sym, char * symname)
+{
+	sym->symbollist =
+          realloc(sym->symbollist, (sym->symbolcnt + 1) * sizeof(char *));
+	sym->symbollist[sym->symbolcnt++].name = strdup(symname);
+}
+
+/* Add a filename to the list */
+struct symfile * add_new_file(char * filename)
+{
+	symfilelist[symfilecnt++].filename = strdup(filename);
+	return &symfilelist[symfilecnt - 1];
+}
+
+/* Check if file already are present in the list */
+struct symfile * filename_exist(char * filename)
+{
+	int i;
+	for (i=0; i < symfilecnt; i++)
+		if (strcmp(symfilelist[i].filename, filename) == 0)
+			return &symfilelist[i];
+	return NULL;
+}
+
+/*
+ * List all files referenced within the template file.
+ * Files are separated by tabs.
+ */
+void adddep(char * file)		   { printf("\t%s", file); }
+void adddep2(char * file, char * line)     { line = line; adddep(file); }
+void noaction(char * line)		   { line = line; }
+void noaction2(char * file, char * line)   { file = file; line = line; }
+
+/* Echo the line without further action */
+void printline(char * line)               { printf("%s", line); }
+
+/*
+ * Find all symbols in filename that are exported with EXPORT_SYMBOL &
+ * EXPORT_SYMBOL_GPL (& EXPORT_SYMBOL_GPL_FUTURE implicitly).
+ * All symbols located are stored in symfilelist.
+ */
+void find_export_symbols(char * filename)
+{
+	FILE * fp;
+	struct symfile *sym;
+	char line[MAXLINESZ];
+	if (filename_exist(filename) == NULL) {
+		char real_filename[PATH_MAX + 1];
+		memset(real_filename, 0, sizeof(real_filename));
+		strncat(real_filename, srctree, PATH_MAX);
+		strncat(real_filename, filename,
+				PATH_MAX - strlen(real_filename));
+		sym = add_new_file(filename);
+		fp = fopen(real_filename, "r");
+		if (fp == NULL)
+		{
+			fprintf(stderr, "docproc: ");
+			perror(real_filename);
+			exit(1);
+		}
+		while (fgets(line, MAXLINESZ, fp)) {
+			char *p;
+			char *e;
+			if (((p = strstr(line, "EXPORT_SYMBOL_GPL")) != NULL) ||
+                            ((p = strstr(line, "EXPORT_SYMBOL")) != NULL)) {
+				/* Skip EXPORT_SYMBOL{_GPL} */
+				while (isalnum(*p) || *p == '_')
+					p++;
+				/* Remove parentheses & additional whitespace */
+				while (isspace(*p))
+					p++;
+				if (*p != '(')
+					continue; /* Syntax error? */
+				else
+					p++;
+				while (isspace(*p))
+					p++;
+				e = p;
+				while (isalnum(*e) || *e == '_')
+					e++;
+				*e = '\0';
+				add_new_symbol(sym, p);
+			}
+		}
+		fclose(fp);
+	}
+}
+
+/*
+ * Document all external or internal functions in a file.
+ * Call kernel-doc with following parameters:
+ * kernel-doc -docbook -nofunction function_name1 filename
+ * Function names are obtained from all the src files
+ * by find_export_symbols.
+ * intfunc uses -nofunction
+ * extfunc uses -function
+ */
+void docfunctions(char * filename, char * type)
+{
+	int i,j;
+	int symcnt = 0;
+	int idx = 0;
+	char **vec;
+
+	for (i=0; i <= symfilecnt; i++)
+		symcnt += symfilelist[i].symbolcnt;
+	vec = malloc((2 + 2 * symcnt + 3) * sizeof(char *));
+	if (vec == NULL) {
+		perror("docproc: ");
+		exit(1);
+	}
+	vec[idx++] = KERNELDOC;
+	vec[idx++] = DOCBOOK;
+	vec[idx++] = NODOCSECTIONS;
+	for (i=0; i < symfilecnt; i++) {
+		struct symfile * sym = &symfilelist[i];
+		for (j=0; j < sym->symbolcnt; j++) {
+			vec[idx++]     = type;
+			vec[idx++] = sym->symbollist[j].name;
+		}
+	}
+	vec[idx++]     = filename;
+	vec[idx] = NULL;
+	printf("<!-- %s -->\n", filename);
+	exec_kernel_doc(vec);
+	fflush(stdout);
+	free(vec);
+}
+void intfunc(char * filename) {	docfunctions(filename, NOFUNCTION); }
+void extfunc(char * filename) { docfunctions(filename, FUNCTION);   }
+
+/*
+ * Document specific function(s) in a file.
+ * Call kernel-doc with the following parameters:
+ * kernel-doc -docbook -function function1 [-function function2]
+ */
+void singfunc(char * filename, char * line)
+{
+	char *vec[200]; /* Enough for specific functions */
+        int i, idx = 0;
+        int startofsym = 1;
+	vec[idx++] = KERNELDOC;
+	vec[idx++] = DOCBOOK;
+
+        /* Split line up in individual parameters preceded by FUNCTION */
+        for (i=0; line[i]; i++) {
+                if (isspace(line[i])) {
+                        line[i] = '\0';
+                        startofsym = 1;
+                        continue;
+                }
+                if (startofsym) {
+                        startofsym = 0;
+                        vec[idx++] = FUNCTION;
+                        vec[idx++] = &line[i];
+                }
+        }
+	vec[idx++] = filename;
+	vec[idx] = NULL;
+	exec_kernel_doc(vec);
+}
+
+/*
+ * Insert specific documentation section from a file.
+ * Call kernel-doc with the following parameters:
+ * kernel-doc -docbook -function "doc section" filename
+ */
+void docsect(char *filename, char *line)
+{
+	char *vec[6]; /* kerneldoc -docbook -function "section" file NULL */
+	char *s;
+
+	for (s = line; *s; s++)
+		if (*s == '\n')
+			*s = '\0';
+
+	vec[0] = KERNELDOC;
+	vec[1] = DOCBOOK;
+	vec[2] = FUNCTION;
+	vec[3] = line;
+	vec[4] = filename;
+	vec[5] = NULL;
+	exec_kernel_doc(vec);
+}
+
+/*
+ * Parse file, calling action specific functions for:
+ * 1) Lines containing !E
+ * 2) Lines containing !I
+ * 3) Lines containing !D
+ * 4) Lines containing !F
+ * 5) Lines containing !P
+ * 6) Default lines - lines not matching the above
+ */
+void parse_file(FILE *infile)
+{
+	char line[MAXLINESZ];
+	char * s;
+	while (fgets(line, MAXLINESZ, infile)) {
+		if (line[0] == '!') {
+			s = line + 2;
+			switch (line[1]) {
+				case 'E':
+					while (*s && !isspace(*s)) s++;
+					*s = '\0';
+					externalfunctions(line+2);
+					break;
+				case 'I':
+					while (*s && !isspace(*s)) s++;
+					*s = '\0';
+					internalfunctions(line+2);
+					break;
+				case 'D':
+					while (*s && !isspace(*s)) s++;
+                                        *s = '\0';
+                                        symbolsonly(line+2);
+                                        break;
+				case 'F':
+					/* filename */
+					while (*s && !isspace(*s)) s++;
+					*s++ = '\0';
+                                        /* function names */
+					while (isspace(*s))
+						s++;
+					singlefunctions(line +2, s);
+					break;
+				case 'P':
+					/* filename */
+					while (*s && !isspace(*s)) s++;
+					*s++ = '\0';
+					/* DOC: section name */
+					while (isspace(*s))
+						s++;
+					docsection(line + 2, s);
+					break;
+				default:
+					defaultline(line);
+			}
+		}
+		else {
+			defaultline(line);
+		}
+	}
+	fflush(stdout);
+}
+
+
+int main(int argc, char *argv[])
+{
+	FILE * infile;
+
+	srctree = getenv("SRCTREE");
+	if (!srctree)
+		srctree = getcwd(NULL, 0);
+	if (argc != 3) {
+		usage();
+		exit(1);
+	}
+	/* Open file, exit on error */
+	infile = fopen(argv[2], "r");
+        if (infile == NULL) {
+                fprintf(stderr, "docproc: ");
+                perror(argv[2]);
+                exit(2);
+        }
+
+	if (strcmp("doc", argv[1]) == 0)
+	{
+		/* Need to do this in two passes.
+		 * First pass is used to collect all symbols exported
+		 * in the various files;
+		 * Second pass generate the documentation.
+		 * This is required because some functions are declared
+		 * and exported in different files :-((
+		 */
+		/* Collect symbols */
+		defaultline       = noaction;
+		internalfunctions = find_export_symbols;
+		externalfunctions = find_export_symbols;
+		symbolsonly       = find_export_symbols;
+		singlefunctions   = noaction2;
+		docsection        = noaction2;
+		parse_file(infile);
+
+		/* Rewind to start from beginning of file again */
+		fseek(infile, 0, SEEK_SET);
+		defaultline       = printline;
+		internalfunctions = intfunc;
+		externalfunctions = extfunc;
+		symbolsonly       = printline;
+		singlefunctions   = singfunc;
+		docsection        = docsect;
+
+		parse_file(infile);
+	}
+	else if (strcmp("depend", argv[1]) == 0)
+	{
+		/* Create first part of dependency chain
+		 * file.tmpl */
+		printf("%s\t", argv[2]);
+		defaultline       = noaction;
+		internalfunctions = adddep;
+		externalfunctions = adddep;
+		symbolsonly       = adddep;
+		singlefunctions   = adddep2;
+		docsection        = adddep2;
+		parse_file(infile);
+		printf("\n");
+	}
+	else
+	{
+		fprintf(stderr, "Unknown option: %s\n", argv[1]);
+		exit(1);
+	}
+	fclose(infile);
+	fflush(stdout);
+	return exitstatus;
+}
diff --git a/doc/SystemTap_Tapset_Reference/tapsets.tmpl b/doc/SystemTap_Tapset_Reference/tapsets.tmpl
new file mode 100644
index 0000000..8ae22ed
--- /dev/null
+++ b/doc/SystemTap_Tapset_Reference/tapsets.tmpl
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
+	"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []>
+
+<book id="TapsetRef">
+ <bookinfo>
+  <title>SystemTap Tapset Reference Manual</title>
+  
+  <authorgroup>
+   <author>
+    <firstname>Willliam</firstname>
+    <surname>Cohen</surname>
+    <affiliation>
+     <address>
+      <email>wcohen@redhat.com</email>
+     </address>
+    </affiliation>
+   </author>
+  </authorgroup>
+
+  <copyright>
+   <year>2008</year>
+   <holder>Red Hat, Inc.</holder>
+  </copyright>
+
+  <legalnotice>
+   <para>
+     This documentation is free software; you can redistribute
+     it and/or modify it under the terms of the GNU General Public
+     License version 2 as published by the Free Software Foundation.
+   </para>
+      
+   <para>
+     This program is distributed in the hope that it will be
+     useful, but WITHOUT ANY WARRANTY; without even the implied
+     warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+     See the GNU General Public License for more details.
+   </para>
+      
+   <para>
+     You should have received a copy of the GNU General Public
+     License along with this program; if not, write to the Free
+     Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+     MA 02111-1307 USA
+   </para>
+      
+   <para>
+     For more details see the file COPYING in the source
+     distribution of Linux.
+   </para>
+  </legalnotice>
+ </bookinfo>
+
+<toc></toc>
+
+<chapter id="introduction">
+  <title>Introduction</title>
+  <para>
+    SystemTap provides free software (GPL) infrastructure to simplify the
+    gathering of information about the running Linux system. This assists
+    diagnosis of a performance or functional problem. SystemTap eliminates the
+    need for the developer to go through the tedious and disruptive instrument,
+    recompile, install, and reboot sequence that may be otherwise required to
+    collect data.
+  </para>
+
+  <para>
+    SystemTap provides a simple command line interface and scripting language
+    for writing instrumentation for a live running kernel. The instrumentation
+    makes extensive use of the probe points and functions provided in the
+    <firstterm>tapset</firstterm> library. This document describes the various
+    probe points and functions.
+  </para>
+  
+    <section id="format">
+      <title>Tapset Name Format</title>
+	
+      <para>In this guide, tapset definitions appear in the following format:</para>
+
+      <screen>
+	name:return (parameters)
+	definition
+      </screen>
+	
+      <para>
+	The <replaceable>return</replaceable> field specifies what data type the
+	tapset extracts and returns from the kernel during a probe (and thus,
+	returns).  Tapsets use 2 data types for
+	<replaceable>return</replaceable>: <literal>long</literal> (tapset
+	extracts and returns an integer) and <literal>string</literal> (tapset
+	extracts and returns a string).
+      </para>
+
+      <para>
+	In some cases, tapsets do not have a <replaceable>return</replaceable> v
+alue. This
+	simply means that the tapset does not extract anything from the kernel. 
+This is common among 
+	asynchronous events such as timers, exit functions, and print functions.
+      </para>
+
+<!--
+<varlistentry>
+<term></term>
+<listitem>
+	<para></para>
+</listitem>
+</varlistentry>
+-->
+
+    </section>
+  
+  </chapter>
+
+</book>
diff --git a/scripts/kernel-doc b/scripts/kernel-doc
new file mode 100755
index 0000000..1ed3432
--- /dev/null
+++ b/scripts/kernel-doc
@@ -0,0 +1,2356 @@
+#!/usr/bin/perl -w
+
+use strict;
+
+## Copyright (c) 1998 Michael Zucchi, All Rights Reserved        ##
+## Copyright (C) 2000, 1  Tim Waugh <twaugh@redhat.com>          ##
+## Copyright (C) 2001  Simon Huggins                             ##
+## Copyright (C) 2005-2008  Randy Dunlap                         ##
+## 								 ##
+## #define enhancements by Armin Kuster <akuster@mvista.com>	 ##
+## Copyright (c) 2000 MontaVista Software, Inc.			 ##
+## 								 ##
+## This software falls under the GNU General Public License.     ##
+## Please read the COPYING file for more information             ##
+
+# w.o. 03-11-2000: added the '-filelist' option.
+
+# 18/01/2001 - 	Cleanups
+# 		Functions prototyped as foo(void) same as foo()
+# 		Stop eval'ing where we don't need to.
+# -- huggie@earth.li
+
+# 27/06/2001 -  Allowed whitespace after initial "/**" and
+#               allowed comments before function declarations.
+# -- Christian Kreibich <ck@whoop.org>
+
+# Still to do:
+# 	- add perldoc documentation
+# 	- Look more closely at some of the scarier bits :)
+
+# 26/05/2001 - 	Support for separate source and object trees.
+#		Return error code.
+# 		Keith Owens <kaos@ocs.com.au>
+
+# 23/09/2001 - Added support for typedefs, structs, enums and unions
+#              Support for Context section; can be terminated using empty line
+#              Small fixes (like spaces vs. \s in regex)
+# -- Tim Jansen <tim@tjansen.de>
+
+
+#
+# This will read a 'c' file and scan for embedded comments in the
+# style of gnome comments (+minor extensions - see below).
+#
+
+# Note: This only supports 'c'.
+
+# usage:
+# kernel-doc [ -docbook | -html | -text | -man ] [ -no-doc-sections ]
+#           [ -function funcname [ -function funcname ...] ] c file(s)s > outputfile
+# or
+#           [ -nofunction funcname [ -function funcname ...] ] c file(s)s > outputfile
+#
+#  Set output format using one of -docbook -html -text or -man.  Default is man.
+#
+#  -no-doc-sections
+#	Do not output DOC: sections
+#
+#  -function funcname
+#	If set, then only generate documentation for the given function(s) or
+#	DOC: section titles.  All other functions and DOC: sections are ignored.
+#
+#  -nofunction funcname
+#	If set, then only generate documentation for the other function(s)/DOC:
+#	sections. Cannot be used together with -function (yes, that's a bug --
+#	perl hackers can fix it 8))
+#
+#  c files - list of 'c' files to process
+#
+#  All output goes to stdout, with errors to stderr.
+
+#
+# format of comments.
+# In the following table, (...)? signifies optional structure.
+#                         (...)* signifies 0 or more structure elements
+# /**
+#  * function_name(:)? (- short description)?
+# (* @parameterx: (description of parameter x)?)*
+# (* a blank line)?
+#  * (Description:)? (Description of function)?
+#  * (section header: (section description)? )*
+#  (*)?*/
+#
+# So .. the trivial example would be:
+#
+# /**
+#  * my_function
+#  **/
+#
+# If the Description: header tag is omitted, then there must be a blank line
+# after the last parameter specification.
+# e.g.
+# /**
+#  * my_function - does my stuff
+#  * @my_arg: its mine damnit
+#  *
+#  * Does my stuff explained.
+#  */
+#
+#  or, could also use:
+# /**
+#  * my_function - does my stuff
+#  * @my_arg: its mine damnit
+#  * Description: Does my stuff explained.
+#  */
+# etc.
+#
+# Beside functions you can also write documentation for structs, unions,
+# enums and typedefs. Instead of the function name you must write the name
+# of the declaration;  the struct/union/enum/typedef must always precede
+# the name. Nesting of declarations is not supported.
+# Use the argument mechanism to document members or constants.
+# e.g.
+# /**
+#  * struct my_struct - short description
+#  * @a: first member
+#  * @b: second member
+#  *
+#  * Longer description
+#  */
+# struct my_struct {
+#     int a;
+#     int b;
+# /* private: */
+#     int c;
+# };
+#
+# All descriptions can be multiline, except the short function description.
+#
+# You can also add additional sections. When documenting kernel functions you
+# should document the "Context:" of the function, e.g. whether the functions
+# can be called form interrupts. Unlike other sections you can end it with an
+# empty line.
+# Example-sections should contain the string EXAMPLE so that they are marked
+# appropriately in DocBook.
+#
+# Example:
+# /**
+#  * user_function - function that can only be called in user context
+#  * @a: some argument
+#  * Context: !in_interrupt()
+#  *
+#  * Some description
+#  * Example:
+#  *    user_function(22);
+#  */
+# ...
+#
+#
+# All descriptive text is further processed, scanning for the following special
+# patterns, which are highlighted appropriately.
+#
+# 'funcname()' - function
+# '$ENVVAR' - environmental variable
+# '&struct_name' - name of a structure (up to two words including 'struct')
+# '@parameter' - name of a parameter
+# '%CONST' - name of a constant.
+
+my $errors = 0;
+my $warnings = 0;
+my $anon_struct_union = 0;
+
+# match expressions used to find embedded type information
+my $type_constant = '\%([-_\w]+)';
+my $type_func = '(\w+)\(\)';
+my $type_param = '\@(\w+)';
+my $type_struct = '\&((struct\s*)*[_\w]+)';
+my $type_struct_xml = '\\&amp;((struct\s*)*[_\w]+)';
+my $type_env = '(\$\w+)';
+
+# Output conversion substitutions.
+#  One for each output format
+
+# these work fairly well
+my %highlights_html = ( $type_constant, "<i>\$1</i>",
+			$type_func, "<b>\$1</b>",
+			$type_struct_xml, "<i>\$1</i>",
+			$type_env, "<b><i>\$1</i></b>",
+			$type_param, "<tt><b>\$1</b></tt>" );
+my $local_lt = "\\\\\\\\lt:";
+my $local_gt = "\\\\\\\\gt:";
+my $blankline_html = $local_lt . "p" . $local_gt;	# was "<p>"
+
+# XML, docbook format
+my %highlights_xml = ( "([^=])\\\"([^\\\"<]+)\\\"", "\$1<quote>\$2</quote>",
+			$type_constant, "<constant>\$1</constant>",
+			$type_func, "<function>\$1</function>",
+			$type_struct_xml, "<structname>\$1</structname>",
+			$type_env, "<envar>\$1</envar>",
+			$type_param, "<parameter>\$1</parameter>" );
+my $blankline_xml = $local_lt . "/para" . $local_gt . $local_lt . "para" . $local_gt . "\n";
+
+# gnome, docbook format
+my %highlights_gnome = ( $type_constant, "<replaceable class=\"option\">\$1</replaceable>",
+			 $type_func, "<function>\$1</function>",
+			 $type_struct, "<structname>\$1</structname>",
+			 $type_env, "<envar>\$1</envar>",
+			 $type_param, "<parameter>\$1</parameter>" );
+my $blankline_gnome = "</para><para>\n";
+
+# these are pretty rough
+my %highlights_man = ( $type_constant, "\$1",
+		       $type_func, "\\\\fB\$1\\\\fP",
+		       $type_struct, "\\\\fI\$1\\\\fP",
+		       $type_param, "\\\\fI\$1\\\\fP" );
+my $blankline_man = "";
+
+# text-mode
+my %highlights_text = ( $type_constant, "\$1",
+			$type_func, "\$1",
+			$type_struct, "\$1",
+			$type_param, "\$1" );
+my $blankline_text = "";
+
+
+sub usage {
+    print "Usage: $0 [ -v ] [ -docbook | -html | -text | -man ] [ -no-doc-sections ]\n";
+    print "         [ -function funcname [ -function funcname ...] ]\n";
+    print "         [ -nofunction funcname [ -nofunction funcname ...] ]\n";
+    print "         c source file(s) > outputfile\n";
+    print "         -v : verbose output, more warnings & other info listed\n";
+    exit 1;
+}
+
+# read arguments
+if ($#ARGV==-1) {
+    usage();
+}
+
+my $verbose = 0;
+my $output_mode = "man";
+my $no_doc_sections = 0;
+my %highlights = %highlights_man;
+my $blankline = $blankline_man;
+my $modulename = "Kernel API";
+my $function_only = 0;
+my $man_date = ('January', 'February', 'March', 'April', 'May', 'June',
+		'July', 'August', 'September', 'October',
+		'November', 'December')[(localtime)[4]] .
+  " " . ((localtime)[5]+1900);
+
+# Essentially these are globals
+# They probably want to be tidied up made more localised or summat.
+# CAVEAT EMPTOR!  Some of the others I localised may not want to be which
+# could cause "use of undefined value" or other bugs.
+my ($function, %function_table,%parametertypes,$declaration_purpose);
+my ($type,$declaration_name,$return_type);
+my ($newsection,$newcontents,$prototype,$filelist, $brcount, %source_map);
+
+if (defined($ENV{'KBUILD_VERBOSE'})) {
+	$verbose = "$ENV{'KBUILD_VERBOSE'}";
+}
+
+# Generated docbook code is inserted in a template at a point where
+# docbook v3.1 requires a non-zero sequence of RefEntry's; see:
+# http://www.oasis-open.org/docbook/documentation/reference/html/refentry.html
+# We keep track of number of generated entries and generate a dummy
+# if needs be to ensure the expanded template can be postprocessed
+# into html.
+my $section_counter = 0;
+
+my $lineprefix="";
+
+# states
+# 0 - normal code
+# 1 - looking for function name
+# 2 - scanning field start.
+# 3 - scanning prototype.
+# 4 - documentation block
+my $state;
+my $in_doc_sect;
+
+#declaration types: can be
+# 'function', 'struct', 'union', 'enum', 'typedef', 'probe', 'sfunction'
+my $decl_type;
+
+my $doc_special = "\@\%\$\&";
+
+my $doc_start = '^/\*\*\s*$'; # Allow whitespace at end of comment start.
+my $doc_end = '\*/';
+my $doc_com = '\s*\*\s*';
+my $doc_decl = $doc_com.'(\w+)';
+my $doc_sect = $doc_com.'(['.$doc_special.']?[\w\s]+):(.*)';
+my $doc_content = $doc_com.'(.*)';
+my $doc_block = $doc_com.'DOC:\s*(.*)?';
+
+my %constants;
+my %parameterdescs;
+my @parameterlist;
+my %sections;
+my @sectionlist;
+
+my $contents = "";
+my $section_default = "Description";	# default section
+my $section_intro = "Introduction";
+my $section = $section_default;
+my $section_context = "Context";
+
+my $undescribed = "-- undescribed --";
+
+reset_state();
+
+while ($ARGV[0] =~ m/^-(.*)/) {
+    my $cmd = shift @ARGV;
+    if ($cmd eq "-html") {
+	$output_mode = "html";
+	%highlights = %highlights_html;
+	$blankline = $blankline_html;
+    } elsif ($cmd eq "-man") {
+	$output_mode = "man";
+	%highlights = %highlights_man;
+	$blankline = $blankline_man;
+    } elsif ($cmd eq "-text") {
+	$output_mode = "text";
+	%highlights = %highlights_text;
+	$blankline = $blankline_text;
+    } elsif ($cmd eq "-docbook") {
+	$output_mode = "xml";
+	%highlights = %highlights_xml;
+	$blankline = $blankline_xml;
+    } elsif ($cmd eq "-gnome") {
+	$output_mode = "gnome";
+	%highlights = %highlights_gnome;
+	$blankline = $blankline_gnome;
+    } elsif ($cmd eq "-module") { # not needed for XML, inherits from calling document
+	$modulename = shift @ARGV;
+    } elsif ($cmd eq "-function") { # to only output specific functions
+	$function_only = 1;
+	$function = shift @ARGV;
+	$function_table{$function} = 1;
+    } elsif ($cmd eq "-nofunction") { # to only output specific functions
+	$function_only = 2;
+	$function = shift @ARGV;
+	$function_table{$function} = 1;
+    } elsif ($cmd eq "-v") {
+	$verbose = 1;
+    } elsif (($cmd eq "-h") || ($cmd eq "--help")) {
+	usage();
+    } elsif ($cmd eq '-filelist') {
+	    $filelist = shift @ARGV;
+    } elsif ($cmd eq '-no-doc-sections') {
+	    $no_doc_sections = 1;
+    }
+}
+
+# get kernel version from env
+sub get_kernel_version() {
+    my $version = 'unknown kernel version';
+
+    if (defined($ENV{'KERNELVERSION'})) {
+	$version = $ENV{'KERNELVERSION'};
+    }
+    return $version;
+}
+my $kernelversion = get_kernel_version();
+
+# generate a sequence of code that will splice in highlighting information
+# using the s// operator.
+my $dohighlight = "";
+foreach my $pattern (keys %highlights) {
+#   print STDERR "scanning pattern:$pattern, highlight:($highlights{$pattern})\n";
+    $dohighlight .=  "\$contents =~ s:$pattern:$highlights{$pattern}:gs;\n";
+}
+
+##
+# dumps section contents to arrays/hashes intended for that purpose.
+#
+sub dump_section {
+    my $file = shift;
+    my $name = shift;
+    my $contents = join "\n", @_;
+
+    if ($name =~ m/$type_constant/) {
+	$name = $1;
+#	print STDERR "constant section '$1' = '$contents'\n";
+	$constants{$name} = $contents;
+    } elsif ($name =~ m/$type_param/) {
+#	print STDERR "parameter def '$1' = '$contents'\n";
+	$name = $1;
+	$parameterdescs{$name} = $contents;
+    } else {
+#	print STDERR "other section '$name' = '$contents'\n";
+	if (defined($sections{$name}) && ($sections{$name} ne "")) {
+		print STDERR "Error(${file}:$.): duplicate section name '$name'\n";
+		++$errors;
+	}
+	$sections{$name} = $contents;
+	push @sectionlist, $name;
+    }
+}
+
+##
+# dump DOC: section after checking that it should go out
+#
+sub dump_doc_section {
+    my $file = shift;
+    my $name = shift;
+    my $contents = join "\n", @_;
+
+    if ($no_doc_sections) {
+        return;
+    }
+
+    if (($function_only == 0) ||
+	( $function_only == 1 && defined($function_table{$name})) ||
+	( $function_only == 2 && !defined($function_table{$name})))
+    {
+	dump_section($file, $name, $contents);
+	output_blockhead({'sectionlist' => \@sectionlist,
+			  'sections' => \%sections,
+			  'module' => $modulename,
+			  'content-only' => ($function_only != 0), });
+    }
+}
+
+##
+# output function
+#
+# parameterdescs, a hash.
+#  function => "function name"
+#  parameterlist => @list of parameters
+#  parameterdescs => %parameter descriptions
+#  sectionlist => @list of sections
+#  sections => %section descriptions
+#
+
+sub output_highlight {
+    my $contents = join "\n",@_;
+    my $line;
+
+#   DEBUG
+#   if (!defined $contents) {
+#	use Carp;
+#	confess "output_highlight got called with no args?\n";
+#   }
+
+    if ($output_mode eq "html" || $output_mode eq "xml") {
+	$contents = local_unescape($contents);
+	# convert data read & converted thru xml_escape() into &xyz; format:
+	$contents =~ s/\\\\\\/&/g;
+    }
+#   print STDERR "contents b4:$contents\n";
+    eval $dohighlight;
+    die $@ if $@;
+#   print STDERR "contents af:$contents\n";
+
+    foreach $line (split "\n", $contents) {
+	if ($line eq ""){
+	    print $lineprefix, local_unescape($blankline);
+	} else {
+	    $line =~ s/\\\\\\/\&/g;
+	    if ($output_mode eq "man" && substr($line, 0, 1) eq ".") {
+		print "\\&$line";
+	    } else {
+		print $lineprefix, $line;
+	    }
+	}
+	print "\n";
+    }
+}
+
+#output sections in html
+sub output_section_html(%) {
+    my %args = %{$_[0]};
+    my $section;
+
+    foreach $section (@{$args{'sectionlist'}}) {
+	print "<h3>$section</h3>\n";
+	print "<blockquote>\n";
+	output_highlight($args{'sections'}{$section});
+	print "</blockquote>\n";
+    }
+}
+
+# output enum in html
+sub output_enum_html(%) {
+    my %args = %{$_[0]};
+    my ($parameter);
+    my $count;
+    print "<h2>enum ".$args{'enum'}."</h2>\n";
+
+    print "<b>enum ".$args{'enum'}."</b> {<br>\n";
+    $count = 0;
+    foreach $parameter (@{$args{'parameterlist'}}) {
+	print " <b>".$parameter."</b>";
+	if ($count != $#{$args{'parameterlist'}}) {
+	    $count++;
+	    print ",\n";
+	}
+	print "<br>";
+    }
+    print "};<br>\n";
+
+    print "<h3>Constants</h3>\n";
+    print "<dl>\n";
+    foreach $parameter (@{$args{'parameterlist'}}) {
+	print "<dt><b>".$parameter."</b>\n";
+	print "<dd>";
+	output_highlight($args{'parameterdescs'}{$parameter});
+    }
+    print "</dl>\n";
+    output_section_html(@_);
+    print "<hr>\n";
+}
+
+# output typedef in html
+sub output_typedef_html(%) {
+    my %args = %{$_[0]};
+    my ($parameter);
+    my $count;
+    print "<h2>typedef ".$args{'typedef'}."</h2>\n";
+
+    print "<b>typedef ".$args{'typedef'}."</b>\n";
+    output_section_html(@_);
+    print "<hr>\n";
+}
+
+# output struct in html
+sub output_struct_html(%) {
+    my %args = %{$_[0]};
+    my ($parameter);
+
+    print "<h2>".$args{'type'}." ".$args{'struct'}. " - " .$args{'purpose'}."</h2>\n";
+    print "<b>".$args{'type'}." ".$args{'struct'}."</b> {<br>\n";
+    foreach $parameter (@{$args{'parameterlist'}}) {
+	if ($parameter =~ /^#/) {
+		print "$parameter<br>\n";
+		next;
+	}
+	my $parameter_name = $parameter;
+	$parameter_name =~ s/\[.*//;
+
+	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
+	$type = $args{'parametertypes'}{$parameter};
+	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
+	    # pointer-to-function
+	    print "&nbsp; &nbsp; <i>$1</i><b>$parameter</b>) <i>($2)</i>;<br>\n";
+	} elsif ($type =~ m/^(.*?)\s*(:.*)/) {
+	    # bitfield
+	    print "&nbsp; &nbsp; <i>$1</i> <b>$parameter</b>$2;<br>\n";
+	} else {
+	    print "&nbsp; &nbsp; <i>$type</i> <b>$parameter</b>;<br>\n";
+	}
+    }
+    print "};<br>\n";
+
+    print "<h3>Members</h3>\n";
+    print "<dl>\n";
+    foreach $parameter (@{$args{'parameterlist'}}) {
+	($parameter =~ /^#/) && next;
+
+	my $parameter_name = $parameter;
+	$parameter_name =~ s/\[.*//;
+
+	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
+	print "<dt><b>".$parameter."</b>\n";
+	print "<dd>";
+	output_highlight($args{'parameterdescs'}{$parameter_name});
+    }
+    print "</dl>\n";
+    output_section_html(@_);
+    print "<hr>\n";
+}
+
+# output function in html
+sub output_function_html(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+    my $count;
+
+    print "<h2>" .$args{'function'}." - ".$args{'purpose'}."</h2>\n";
+    print "<i>".$args{'functiontype'}."</i>\n";
+    print "<b>".$args{'function'}."</b>\n";
+    print "(";
+    $count = 0;
+    foreach $parameter (@{$args{'parameterlist'}}) {
+	$type = $args{'parametertypes'}{$parameter};
+	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
+	    # pointer-to-function
+	    print "<i>$1</i><b>$parameter</b>) <i>($2)</i>";
+	} else {
+	    print "<i>".$type."</i> <b>".$parameter."</b>";
+	}
+	if ($count != $#{$args{'parameterlist'}}) {
+	    $count++;
+	    print ",\n";
+	}
+    }
+    print ")\n";
+
+    print "<h3>Arguments</h3>\n";
+    print "<dl>\n";
+    foreach $parameter (@{$args{'parameterlist'}}) {
+	my $parameter_name = $parameter;
+	$parameter_name =~ s/\[.*//;
+
+	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
+	print "<dt><b>".$parameter."</b>\n";
+	print "<dd>";
+	output_highlight($args{'parameterdescs'}{$parameter_name});
+    }
+    print "</dl>\n";
+    output_section_html(@_);
+    print "<hr>\n";
+}
+
+# output probe in html
+sub output_probe_html(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+    my $count;
+
+}
+
+# output sfunction in html
+sub output_sfunction_html(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+    my $count;
+
+}
+
+# output DOC: block header in html
+sub output_blockhead_html(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+    my $count;
+
+    foreach $section (@{$args{'sectionlist'}}) {
+	print "<h3>$section</h3>\n";
+	print "<ul>\n";
+	output_highlight($args{'sections'}{$section});
+	print "</ul>\n";
+    }
+    print "<hr>\n";
+}
+
+sub output_section_xml(%) {
+    my %args = %{$_[0]};
+    my $section;
+    # print out each section
+    $lineprefix="   ";
+    foreach $section (@{$args{'sectionlist'}}) {
+	print "<refsect1>\n";
+	print "<title>$section</title>\n";
+	if ($section =~ m/EXAMPLE/i) {
+	    print "<informalexample><programlisting>\n";
+	} else {
+	    print "<para>\n";
+	}
+	output_highlight($args{'sections'}{$section});
+	if ($section =~ m/EXAMPLE/i) {
+	    print "</programlisting></informalexample>\n";
+	} else {
+	    print "</para>\n";
+	}
+	print "</refsect1>\n";
+    }
+}
+
+# output function in XML DocBook
+sub output_function_xml(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+    my $count;
+    my $id;
+
+    $id = "API-".$args{'function'};
+    $id =~ s/[^A-Za-z0-9]/-/g;
+
+    print "<refentry id=\"$id\">\n";
+    print "<refentryinfo>\n";
+    print " <title>LINUX</title>\n";
+    print " <productname>Kernel Hackers Manual</productname>\n";
+    print " <date>$man_date</date>\n";
+    print "</refentryinfo>\n";
+    print "<refmeta>\n";
+    print " <refentrytitle><phrase>".$args{'function'}."</phrase></refentrytitle>\n";
+    print " <manvolnum>9</manvolnum>\n";
+    print " <refmiscinfo class=\"version\">" . $kernelversion . "</refmiscinfo>\n";
+    print "</refmeta>\n";
+    print "<refnamediv>\n";
+    print " <refname>".$args{'function'}."</refname>\n";
+    print " <refpurpose>\n";
+    print "  ";
+    output_highlight ($args{'purpose'});
+    print " </refpurpose>\n";
+    print "</refnamediv>\n";
+
+    print "<refsynopsisdiv>\n";
+    print " <title>Synopsis</title>\n";
+    print "  <funcsynopsis><funcprototype>\n";
+    print "   <funcdef>".$args{'functiontype'}." ";
+    print "<function>".$args{'function'}." </function></funcdef>\n";
+
+    $count = 0;
+    if ($#{$args{'parameterlist'}} >= 0) {
+	foreach $parameter (@{$args{'parameterlist'}}) {
+	    $type = $args{'parametertypes'}{$parameter};
+	    if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
+		# pointer-to-function
+		print "   <paramdef>$1<parameter>$parameter</parameter>)\n";
+		print "     <funcparams>$2</funcparams></paramdef>\n";
+	    } else {
+		print "   <paramdef>".$type;
+		print " <parameter>$parameter</parameter></paramdef>\n";
+	    }
+	}
+    } else {
+	print "  <void/>\n";
+    }
+    print "  </funcprototype></funcsynopsis>\n";
+    print "</refsynopsisdiv>\n";
+
+    # print parameters
+    print "<refsect1>\n <title>Arguments</title>\n";
+    if ($#{$args{'parameterlist'}} >= 0) {
+	print " <variablelist>\n";
+	foreach $parameter (@{$args{'parameterlist'}}) {
+	    my $parameter_name = $parameter;
+	    $parameter_name =~ s/\[.*//;
+
+	    print "  <varlistentry>\n   <term><parameter>$parameter</parameter></term>\n";
+	    print "   <listitem>\n    <para>\n";
+	    $lineprefix="     ";
+	    output_highlight($args{'parameterdescs'}{$parameter_name});
+	    print "    </para>\n   </listitem>\n  </varlistentry>\n";
+	}
+	print " </variablelist>\n";
+    } else {
+	print " <para>\n  None\n </para>\n";
+    }
+    print "</refsect1>\n";
+
+    output_section_xml(@_);
+    print "</refentry>\n\n";
+}
+
+# output struct in XML DocBook
+sub output_struct_xml(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+    my $id;
+
+    $id = "API-struct-".$args{'struct'};
+    $id =~ s/[^A-Za-z0-9]/-/g;
+
+    print "<refentry id=\"$id\">\n";
+    print "<refentryinfo>\n";
+    print " <title>LINUX</title>\n";
+    print " <productname>Kernel Hackers Manual</productname>\n";
+    print " <date>$man_date</date>\n";
+    print "</refentryinfo>\n";
+    print "<refmeta>\n";
+    print " <refentrytitle><phrase>".$args{'type'}." ".$args{'struct'}."</phrase></refentrytitle>\n";
+    print " <manvolnum>9</manvolnum>\n";
+    print " <refmiscinfo class=\"version\">" . $kernelversion . "</refmiscinfo>\n";
+    print "</refmeta>\n";
+    print "<refnamediv>\n";
+    print " <refname>".$args{'type'}." ".$args{'struct'}."</refname>\n";
+    print " <refpurpose>\n";
+    print "  ";
+    output_highlight ($args{'purpose'});
+    print " </refpurpose>\n";
+    print "</refnamediv>\n";
+
+    print "<refsynopsisdiv>\n";
+    print " <title>Synopsis</title>\n";
+    print "  <programlisting>\n";
+    print $args{'type'}." ".$args{'struct'}." {\n";
+    foreach $parameter (@{$args{'parameterlist'}}) {
+	if ($parameter =~ /^#/) {
+	    print "$parameter\n";
+	    next;
+	}
+
+	my $parameter_name = $parameter;
+	$parameter_name =~ s/\[.*//;
+
+	defined($args{'parameterdescs'}{$parameter_name}) || next;
+	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
+	$type = $args{'parametertypes'}{$parameter};
+	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
+	    # pointer-to-function
+	    print "  $1 $parameter) ($2);\n";
+	} elsif ($type =~ m/^(.*?)\s*(:.*)/) {
+	    # bitfield
+	    print "  $1 $parameter$2;\n";
+	} else {
+	    print "  ".$type." ".$parameter.";\n";
+	}
+    }
+    print "};";
+    print "  </programlisting>\n";
+    print "</refsynopsisdiv>\n";
+
+    print " <refsect1>\n";
+    print "  <title>Members</title>\n";
+
+    if ($#{$args{'parameterlist'}} >= 0) {
+    print "  <variablelist>\n";
+    foreach $parameter (@{$args{'parameterlist'}}) {
+      ($parameter =~ /^#/) && next;
+
+      my $parameter_name = $parameter;
+      $parameter_name =~ s/\[.*//;
+
+      defined($args{'parameterdescs'}{$parameter_name}) || next;
+      ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
+      print "    <varlistentry>";
+      print "      <term>$parameter</term>\n";
+      print "      <listitem><para>\n";
+      output_highlight($args{'parameterdescs'}{$parameter_name});
+      print "      </para></listitem>\n";
+      print "    </varlistentry>\n";
+    }
+    print "  </variablelist>\n";
+    } else {
+	print " <para>\n  None\n </para>\n";
+    }
+    print " </refsect1>\n";
+
+    output_section_xml(@_);
+
+    print "</refentry>\n\n";
+}
+
+# output enum in XML DocBook
+sub output_enum_xml(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+    my $count;
+    my $id;
+
+    $id = "API-enum-".$args{'enum'};
+    $id =~ s/[^A-Za-z0-9]/-/g;
+
+    print "<refentry id=\"$id\">\n";
+    print "<refentryinfo>\n";
+    print " <title>LINUX</title>\n";
+    print " <productname>Kernel Hackers Manual</productname>\n";
+    print " <date>$man_date</date>\n";
+    print "</refentryinfo>\n";
+    print "<refmeta>\n";
+    print " <refentrytitle><phrase>enum ".$args{'enum'}."</phrase></refentrytitle>\n";
+    print " <manvolnum>9</manvolnum>\n";
+    print " <refmiscinfo class=\"version\">" . $kernelversion . "</refmiscinfo>\n";
+    print "</refmeta>\n";
+    print "<refnamediv>\n";
+    print " <refname>enum ".$args{'enum'}."</refname>\n";
+    print " <refpurpose>\n";
+    print "  ";
+    output_highlight ($args{'purpose'});
+    print " </refpurpose>\n";
+    print "</refnamediv>\n";
+
+    print "<refsynopsisdiv>\n";
+    print " <title>Synopsis</title>\n";
+    print "  <programlisting>\n";
+    print "enum ".$args{'enum'}." {\n";
+    $count = 0;
+    foreach $parameter (@{$args{'parameterlist'}}) {
+	print "  $parameter";
+	if ($count != $#{$args{'parameterlist'}}) {
+	    $count++;
+	    print ",";
+	}
+	print "\n";
+    }
+    print "};";
+    print "  </programlisting>\n";
+    print "</refsynopsisdiv>\n";
+
+    print "<refsect1>\n";
+    print " <title>Constants</title>\n";
+    print "  <variablelist>\n";
+    foreach $parameter (@{$args{'parameterlist'}}) {
+      my $parameter_name = $parameter;
+      $parameter_name =~ s/\[.*//;
+
+      print "    <varlistentry>";
+      print "      <term>$parameter</term>\n";
+      print "      <listitem><para>\n";
+      output_highlight($args{'parameterdescs'}{$parameter_name});
+      print "      </para></listitem>\n";
+      print "    </varlistentry>\n";
+    }
+    print "  </variablelist>\n";
+    print "</refsect1>\n";
+
+    output_section_xml(@_);
+
+    print "</refentry>\n\n";
+}
+
+# output typedef in XML DocBook
+sub output_typedef_xml(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+    my $id;
+
+    $id = "API-typedef-".$args{'typedef'};
+    $id =~ s/[^A-Za-z0-9]/-/g;
+
+    print "<refentry id=\"$id\">\n";
+    print "<refentryinfo>\n";
+    print " <title>LINUX</title>\n";
+    print " <productname>Kernel Hackers Manual</productname>\n";
+    print " <date>$man_date</date>\n";
+    print "</refentryinfo>\n";
+    print "<refmeta>\n";
+    print " <refentrytitle><phrase>typedef ".$args{'typedef'}."</phrase></refentrytitle>\n";
+    print " <manvolnum>9</manvolnum>\n";
+    print "</refmeta>\n";
+    print "<refnamediv>\n";
+    print " <refname>typedef ".$args{'typedef'}."</refname>\n";
+    print " <refpurpose>\n";
+    print "  ";
+    output_highlight ($args{'purpose'});
+    print " </refpurpose>\n";
+    print "</refnamediv>\n";
+
+    print "<refsynopsisdiv>\n";
+    print " <title>Synopsis</title>\n";
+    print "  <synopsis>typedef ".$args{'typedef'}.";</synopsis>\n";
+    print "</refsynopsisdiv>\n";
+
+    output_section_xml(@_);
+
+    print "</refentry>\n\n";
+}
+
+# output in XML DocBook
+sub output_blockhead_xml(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+    my $count;
+
+    my $id = $args{'module'};
+    $id =~ s/[^A-Za-z0-9]/-/g;
+
+    # print out each section
+    $lineprefix="   ";
+    foreach $section (@{$args{'sectionlist'}}) {
+	if (!$args{'content-only'}) {
+		print "<refsect1>\n <title>$section</title>\n";
+	}
+	if ($section =~ m/EXAMPLE/i) {
+	    print "<example><para>\n";
+	} else {
+	    print "<para>\n";
+	}
+	output_highlight($args{'sections'}{$section});
+	if ($section =~ m/EXAMPLE/i) {
+	    print "</para></example>\n";
+	} else {
+	    print "</para>";
+	}
+	if (!$args{'content-only'}) {
+		print "\n</refsect1>\n";
+	}
+    }
+
+    print "\n\n";
+}
+
+# output in XML DocBook
+sub output_probe_xml(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+    my $count;
+    my $id;
+
+    $id = "API-".$args{'probe'};
+    $id =~ s/[^A-Za-z0-9]/-/g;
+    print "<refentry id=\"$id\">\n";
+    print "<refentryinfo>\n";
+    print " <title>LINUX</title>\n";
+    print " <productname>Kernel Hackers Manual</productname>\n";
+    print " <date>$man_date</date>\n";
+    print "</refentryinfo>\n";
+    print "<refmeta>\n";
+    print " <refentrytitle><phrase>".$args{'probe'}."</phrase></refentrytitle>\n";
+    print " <manvolnum>5</manvolnum>\n";
+    print " <refmiscinfo class=\"version\">" . $kernelversion . "</refmiscinfo>\n";
+    print "</refmeta>\n";
+    print "<refnamediv>\n";
+    print " <refname>".$args{'probe'}."</refname>\n";
+    print " <refpurpose>\n";
+    print "  ";
+    output_highlight ($args{'purpose'});
+    print " </refpurpose>\n";
+    print "</refnamediv>\n";
+
+    print "<refsynopsisdiv>\n";
+    print " <title>Synopsis</title>\n";
+    print "<synopsis>".$args{'probe'}." </synopsis>\n";
+    print "</refsynopsisdiv>\n";
+
+    # print parameters
+    print "<refsect1>\n <title>Values</title>\n";
+    if ($#{$args{'parameterlist'}} >= 0) {
+	print " <variablelist>\n";
+	foreach $parameter (@{$args{'parameterlist'}}) {
+	    my $parameter_name = $parameter;
+	    $parameter_name =~ s/\[.*//;
+
+	    print "  <varlistentry>\n   <term><parameter>$parameter</parameter></term>\n";
+	    print "   <listitem>\n    <para>\n";
+	    $lineprefix="     ";
+	    output_highlight($args{'parameterdescs'}{$parameter_name});
+	    print "    </para>\n   </listitem>\n  </varlistentry>\n";
+	}
+	print " </variablelist>\n";
+    } else {
+	print " <para>\n  None\n </para>\n";
+    }
+    print "</refsect1>\n";
+
+    output_section_xml(@_);
+    print "</refentry>\n\n";
+}
+
+# output in XML DocBook
+sub output_sfunction_xml(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+    my $count;
+    my $id;
+
+    $id = "API-".$args{'sfunction'};
+    $id =~ s/[^A-Za-z0-9]/-/g;
+
+    print "<refentry id=\"$id\">\n";
+    print "<refentryinfo>\n";
+    print " <title>LINUX</title>\n";
+    print " <productname>Kernel Hackers Manual</productname>\n";
+    print " <date>$man_date</date>\n";
+    print "</refentryinfo>\n";
+    print "<refmeta>\n";
+    print " <refentrytitle><phrase>".$args{'sfunction'}."</phrase></refentrytitle>\n";
+    print " <manvolnum>5</manvolnum>\n";
+    print " <refmiscinfo class=\"version\">" . $kernelversion . "</refmiscinfo>\n";
+    print "</refmeta>\n";
+    print "<refnamediv>\n";
+    print " <refname>".$args{'sfunction'}."</refname>\n";
+    print " <refpurpose>\n";
+    print "  ";
+    output_highlight ($args{'purpose'});
+    print " </refpurpose>\n";
+    print "</refnamediv>\n";
+
+    print "<refsynopsisdiv>\n";
+    print " <title>Synopsis</title>\n";
+    print "  <programlisting>\n";
+    print "    ".$args{'sfunction'}.":";
+    print $args{'functiontype'}."(\n";
+
+    $count = $#{$args{'parameterlist'}};
+    if ($count >= 0) {
+	foreach $parameter (@{$args{'parameterlist'}}) {
+	    $type = $args{'parametertypes'}{$parameter};
+	    print "        ".$parameter.":".$type;
+	    $count -= 1;
+	    if ($count >= 0) { print ",\n"; }
+	}
+    } else {
+	print "  ";
+    }
+    print "\n    );\n</programlisting>\n";
+    print "</refsynopsisdiv>\n";
+
+    # print parameters
+    print "<refsect1>\n <title>Arguments</title>\n";
+    if ($#{$args{'parameterlist'}} >= 0) {
+	print " <variablelist>\n";
+	foreach $parameter (@{$args{'parameterlist'}}) {
+	    my $parameter_name = $parameter;
+	    $parameter_name =~ s/\[.*//;
+
+	    print "  <varlistentry>\n   <term><parameter>$parameter</parameter></term>\n";
+	    print "   <listitem>\n    <para>\n";
+	    $lineprefix="     ";
+	    output_highlight($args{'parameterdescs'}{$parameter_name});
+	    print "    </para>\n   </listitem>\n  </varlistentry>\n";
+	}
+	print " </variablelist>\n";
+    } else {
+	print " <para>\n  None\n </para>\n";
+    }
+    print "</refsect1>\n";
+
+    output_section_xml(@_);
+    print "</refentry>\n\n";
+}
+
+# output in XML DocBook
+sub output_function_gnome {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+    my $count;
+    my $id;
+
+    $id = $args{'module'}."-".$args{'function'};
+    $id =~ s/[^A-Za-z0-9]/-/g;
+
+    print "<sect2>\n";
+    print " <title id=\"$id\">".$args{'function'}."</title>\n";
+
+    print "  <funcsynopsis>\n";
+    print "   <funcdef>".$args{'functiontype'}." ";
+    print "<function>".$args{'function'}." ";
+    print "</function></funcdef>\n";
+
+    $count = 0;
+    if ($#{$args{'parameterlist'}} >= 0) {
+	foreach $parameter (@{$args{'parameterlist'}}) {
+	    $type = $args{'parametertypes'}{$parameter};
+	    if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
+		# pointer-to-function
+		print "   <paramdef>$1 <parameter>$parameter</parameter>)\n";
+		print "     <funcparams>$2</funcparams></paramdef>\n";
+	    } else {
+		print "   <paramdef>".$type;
+		print " <parameter>$parameter</parameter></paramdef>\n";
+	    }
+	}
+    } else {
+	print "  <void>\n";
+    }
+    print "  </funcsynopsis>\n";
+    if ($#{$args{'parameterlist'}} >= 0) {
+	print " <informaltable pgwide=\"1\" frame=\"none\" role=\"params\">\n";
+	print "<tgroup cols=\"2\">\n";
+	print "<colspec colwidth=\"2*\">\n";
+	print "<colspec colwidth=\"8*\">\n";
+	print "<tbody>\n";
+	foreach $parameter (@{$args{'parameterlist'}}) {
+	    my $parameter_name = $parameter;
+	    $parameter_name =~ s/\[.*//;
+
+	    print "  <row><entry align=\"right\"><parameter>$parameter</parameter></entry>\n";
+	    print "   <entry>\n";
+	    $lineprefix="     ";
+	    output_highlight($args{'parameterdescs'}{$parameter_name});
+	    print "    </entry></row>\n";
+	}
+	print " </tbody></tgroup></informaltable>\n";
+    } else {
+	print " <para>\n  None\n </para>\n";
+    }
+
+    # print out each section
+    $lineprefix="   ";
+    foreach $section (@{$args{'sectionlist'}}) {
+	print "<simplesect>\n <title>$section</title>\n";
+	if ($section =~ m/EXAMPLE/i) {
+	    print "<example><programlisting>\n";
+	} else {
+	}
+	print "<para>\n";
+	output_highlight($args{'sections'}{$section});
+	print "</para>\n";
+	if ($section =~ m/EXAMPLE/i) {
+	    print "</programlisting></example>\n";
+	} else {
+	}
+	print " </simplesect>\n";
+    }
+
+    print "</sect2>\n\n";
+}
+
+##
+# output function in man
+sub output_function_man(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+    my $count;
+
+    print ".TH \"$args{'function'}\" 9 \"$args{'function'}\" \"$man_date\" \"Kernel Hacker's Manual\" LINUX\n";
+
+    print ".SH NAME\n";
+    print $args{'function'}." \\- ".$args{'purpose'}."\n";
+
+    print ".SH SYNOPSIS\n";
+    if ($args{'functiontype'} ne "") {
+	print ".B \"".$args{'functiontype'}."\" ".$args{'function'}."\n";
+    } else {
+	print ".B \"".$args{'function'}."\n";
+    }
+    $count = 0;
+    my $parenth = "(";
+    my $post = ",";
+    foreach my $parameter (@{$args{'parameterlist'}}) {
+	if ($count == $#{$args{'parameterlist'}}) {
+	    $post = ");";
+	}
+	$type = $args{'parametertypes'}{$parameter};
+	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
+	    # pointer-to-function
+	    print ".BI \"".$parenth.$1."\" ".$parameter." \") (".$2.")".$post."\"\n";
+	} else {
+	    $type =~ s/([^\*])$/$1 /;
+	    print ".BI \"".$parenth.$type."\" ".$parameter." \"".$post."\"\n";
+	}
+	$count++;
+	$parenth = "";
+    }
+
+    print ".SH ARGUMENTS\n";
+    foreach $parameter (@{$args{'parameterlist'}}) {
+	my $parameter_name = $parameter;
+	$parameter_name =~ s/\[.*//;
+
+	print ".IP \"".$parameter."\" 12\n";
+	output_highlight($args{'parameterdescs'}{$parameter_name});
+    }
+    foreach $section (@{$args{'sectionlist'}}) {
+	print ".SH \"", uc $section, "\"\n";
+	output_highlight($args{'sections'}{$section});
+    }
+}
+
+##
+# output enum in man
+sub output_enum_man(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+    my $count;
+
+    print ".TH \"$args{'module'}\" 9 \"enum $args{'enum'}\" \"$man_date\" \"API Manual\" LINUX\n";
+
+    print ".SH NAME\n";
+    print "enum ".$args{'enum'}." \\- ".$args{'purpose'}."\n";
+
+    print ".SH SYNOPSIS\n";
+    print "enum ".$args{'enum'}." {\n";
+    $count = 0;
+    foreach my $parameter (@{$args{'parameterlist'}}) {
+	print ".br\n.BI \"    $parameter\"\n";
+	if ($count == $#{$args{'parameterlist'}}) {
+	    print "\n};\n";
+	    last;
+	}
+	else {
+	    print ", \n.br\n";
+	}
+	$count++;
+    }
+
+    print ".SH Constants\n";
+    foreach $parameter (@{$args{'parameterlist'}}) {
+	my $parameter_name = $parameter;
+	$parameter_name =~ s/\[.*//;
+
+	print ".IP \"".$parameter."\" 12\n";
+	output_highlight($args{'parameterdescs'}{$parameter_name});
+    }
+    foreach $section (@{$args{'sectionlist'}}) {
+	print ".SH \"$section\"\n";
+	output_highlight($args{'sections'}{$section});
+    }
+}
+
+##
+# output struct in man
+sub output_struct_man(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+
+    print ".TH \"$args{'module'}\" 9 \"".$args{'type'}." ".$args{'struct'}."\" \"$man_date\" \"API Manual\" LINUX\n";
+
+    print ".SH NAME\n";
+    print $args{'type'}." ".$args{'struct'}." \\- ".$args{'purpose'}."\n";
+
+    print ".SH SYNOPSIS\n";
+    print $args{'type'}." ".$args{'struct'}." {\n.br\n";
+
+    foreach my $parameter (@{$args{'parameterlist'}}) {
+	if ($parameter =~ /^#/) {
+	    print ".BI \"$parameter\"\n.br\n";
+	    next;
+	}
+	my $parameter_name = $parameter;
+	$parameter_name =~ s/\[.*//;
+
+	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
+	$type = $args{'parametertypes'}{$parameter};
+	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
+	    # pointer-to-function
+	    print ".BI \"    ".$1."\" ".$parameter." \") (".$2.")"."\"\n;\n";
+	} elsif ($type =~ m/^(.*?)\s*(:.*)/) {
+	    # bitfield
+	    print ".BI \"    ".$1."\ \" ".$parameter.$2." \""."\"\n;\n";
+	} else {
+	    $type =~ s/([^\*])$/$1 /;
+	    print ".BI \"    ".$type."\" ".$parameter." \""."\"\n;\n";
+	}
+	print "\n.br\n";
+    }
+    print "};\n.br\n";
+
+    print ".SH Members\n";
+    foreach $parameter (@{$args{'parameterlist'}}) {
+	($parameter =~ /^#/) && next;
+
+	my $parameter_name = $parameter;
+	$parameter_name =~ s/\[.*//;
+
+	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
+	print ".IP \"".$parameter."\" 12\n";
+	output_highlight($args{'parameterdescs'}{$parameter_name});
+    }
+    foreach $section (@{$args{'sectionlist'}}) {
+	print ".SH \"$section\"\n";
+	output_highlight($args{'sections'}{$section});
+    }
+}
+
+##
+# output typedef in man
+sub output_typedef_man(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+
+    print ".TH \"$args{'module'}\" 9 \"$args{'typedef'}\" \"$man_date\" \"API Manual\" LINUX\n";
+
+    print ".SH NAME\n";
+    print "typedef ".$args{'typedef'}." \\- ".$args{'purpose'}."\n";
+
+    foreach $section (@{$args{'sectionlist'}}) {
+	print ".SH \"$section\"\n";
+	output_highlight($args{'sections'}{$section});
+    }
+}
+
+sub output_blockhead_man(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+    my $count;
+
+    print ".TH \"$args{'module'}\" 9 \"$args{'module'}\" \"$man_date\" \"API Manual\" LINUX\n";
+
+    foreach $section (@{$args{'sectionlist'}}) {
+	print ".SH \"$section\"\n";
+	output_highlight($args{'sections'}{$section});
+    }
+}
+
+##
+# output probe in man
+sub output_probe_man(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+
+}
+
+##
+# output sfunction in man
+sub output_sfunction_man(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+
+}
+
+##
+# output in text
+sub output_function_text(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+    my $start;
+
+    print "Name:\n\n";
+    print $args{'function'}." - ".$args{'purpose'}."\n";
+
+    print "\nSynopsis:\n\n";
+    if ($args{'functiontype'} ne "") {
+	$start = $args{'functiontype'}." ".$args{'function'}." (";
+    } else {
+	$start = $args{'function'}." (";
+    }
+    print $start;
+
+    my $count = 0;
+    foreach my $parameter (@{$args{'parameterlist'}}) {
+	$type = $args{'parametertypes'}{$parameter};
+	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
+	    # pointer-to-function
+	    print $1.$parameter.") (".$2;
+	} else {
+	    print $type." ".$parameter;
+	}
+	if ($count != $#{$args{'parameterlist'}}) {
+	    $count++;
+	    print ",\n";
+	    print " " x length($start);
+	} else {
+	    print ");\n\n";
+	}
+    }
+
+    print "Arguments:\n\n";
+    foreach $parameter (@{$args{'parameterlist'}}) {
+	my $parameter_name = $parameter;
+	$parameter_name =~ s/\[.*//;
+
+	print $parameter."\n\t".$args{'parameterdescs'}{$parameter_name}."\n";
+    }
+    output_section_text(@_);
+}
+
+#output sections in text
+sub output_section_text(%) {
+    my %args = %{$_[0]};
+    my $section;
+
+    print "\n";
+    foreach $section (@{$args{'sectionlist'}}) {
+	print "$section:\n\n";
+	output_highlight($args{'sections'}{$section});
+    }
+    print "\n\n";
+}
+
+# output enum in text
+sub output_enum_text(%) {
+    my %args = %{$_[0]};
+    my ($parameter);
+    my $count;
+    print "Enum:\n\n";
+
+    print "enum ".$args{'enum'}." - ".$args{'purpose'}."\n\n";
+    print "enum ".$args{'enum'}." {\n";
+    $count = 0;
+    foreach $parameter (@{$args{'parameterlist'}}) {
+	print "\t$parameter";
+	if ($count != $#{$args{'parameterlist'}}) {
+	    $count++;
+	    print ",";
+	}
+	print "\n";
+    }
+    print "};\n\n";
+
+    print "Constants:\n\n";
+    foreach $parameter (@{$args{'parameterlist'}}) {
+	print "$parameter\n\t";
+	print $args{'parameterdescs'}{$parameter}."\n";
+    }
+
+    output_section_text(@_);
+}
+
+# output typedef in text
+sub output_typedef_text(%) {
+    my %args = %{$_[0]};
+    my ($parameter);
+    my $count;
+    print "Typedef:\n\n";
+
+    print "typedef ".$args{'typedef'}." - ".$args{'purpose'}."\n";
+    output_section_text(@_);
+}
+
+# output struct as text
+sub output_struct_text(%) {
+    my %args = %{$_[0]};
+    my ($parameter);
+
+    print $args{'type'}." ".$args{'struct'}." - ".$args{'purpose'}."\n\n";
+    print $args{'type'}." ".$args{'struct'}." {\n";
+    foreach $parameter (@{$args{'parameterlist'}}) {
+	if ($parameter =~ /^#/) {
+	    print "$parameter\n";
+	    next;
+	}
+
+	my $parameter_name = $parameter;
+	$parameter_name =~ s/\[.*//;
+
+	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
+	$type = $args{'parametertypes'}{$parameter};
+	if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
+	    # pointer-to-function
+	    print "\t$1 $parameter) ($2);\n";
+	} elsif ($type =~ m/^(.*?)\s*(:.*)/) {
+	    # bitfield
+	    print "\t$1 $parameter$2;\n";
+	} else {
+	    print "\t".$type." ".$parameter.";\n";
+	}
+    }
+    print "};\n\n";
+
+    print "Members:\n\n";
+    foreach $parameter (@{$args{'parameterlist'}}) {
+	($parameter =~ /^#/) && next;
+
+	my $parameter_name = $parameter;
+	$parameter_name =~ s/\[.*//;
+
+	($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
+	print "$parameter\n\t";
+	print $args{'parameterdescs'}{$parameter_name}."\n";
+    }
+    print "\n";
+    output_section_text(@_);
+}
+
+sub output_blockhead_text(%) {
+    my %args = %{$_[0]};
+    my ($parameter, $section);
+
+    foreach $section (@{$args{'sectionlist'}}) {
+	print " $section:\n";
+	print "    -> ";
+	output_highlight($args{'sections'}{$section});
+    }
+}
+
+# output probe as text
+sub output_probe_text(%) {
+    my %args = %{$_[0]};
+    my ($parameter);
+
+}
+
+# output sfunction as text
+sub output_sfunction_text(%) {
+    my %args = %{$_[0]};
+    my ($parameter);
+
+}
+
+##
+# generic output function for all types (function, struct/union, typedef, enum);
+# calls the generated, variable output_ function name based on
+# functype and output_mode
+sub output_declaration {
+    no strict 'refs';
+    my $name = shift;
+    my $functype = shift;
+    my $func = "output_${functype}_$output_mode";
+    if (($function_only==0) ||
+	( $function_only == 1 && defined($function_table{$name})) ||
+	( $function_only == 2 && !defined($function_table{$name})))
+    {
+	&$func(@_);
+	$section_counter++;
+    }
+}
+
+##
+# generic output function - calls the right one based on current output mode.
+sub output_blockhead {
+    no strict 'refs';
+    my $func = "output_blockhead_".$output_mode;
+    &$func(@_);
+    $section_counter++;
+}
+
+sub dump_probe($$) {
+    my $x = shift;
+    my $file = shift;
+
+    @parameterlist = keys %parameterdescs;
+
+    $declaration_name = $x;
+    output_declaration($declaration_name,
+		       'probe',
+		       {'probe' => $declaration_name,
+			'parameterlist' => \@parameterlist,
+			'module' => $modulename,
+			'parameterdescs' => \%parameterdescs,
+			'sectionlist' => \@sectionlist,
+			'sections' => \%sections,
+			'purpose' => $declaration_purpose
+		       });
+}
+
+##
+# takes a declaration (struct, union, enum, typedef) and
+# invokes the right handler. NOT called for functions.
+sub dump_declaration($$) {
+    no strict 'refs';
+    my ($prototype, $file) = @_;
+    my $func = "dump_".$decl_type;
+    &$func(@_);
+}
+
+sub dump_union($$) {
+    dump_struct(@_);
+}
+
+sub dump_struct($$) {
+    my $x = shift;
+    my $file = shift;
+
+    if ($x =~/(struct|union)\s+(\w+)\s*{(.*)}/) {
+	$declaration_name = $2;
+	my $members = $3;
+
+	# ignore embedded structs or unions
+	$members =~ s/{.*}//g;
+
+	# ignore members marked private:
+	$members =~ s/\/\*.*?private:.*?public:.*?\*\///gos;
+	$members =~ s/\/\*.*?private:.*//gos;
+	# strip comments:
+	$members =~ s/\/\*.*?\*\///gos;
+
+	create_parameterlist($members, ';', $file);
+
+	output_declaration($declaration_name,
+			   'struct',
+			   {'struct' => $declaration_name,
+			    'module' => $modulename,
+			    'parameterlist' => \@parameterlist,
+			    'parameterdescs' => \%parameterdescs,
+			    'parametertypes' => \%parametertypes,
+			    'sectionlist' => \@sectionlist,
+			    'sections' => \%sections,
+			    'purpose' => $declaration_purpose,
+			    'type' => $decl_type
+			   });
+    }
+    else {
+	print STDERR "Error(${file}:$.): Cannot parse struct or union!\n";
+	++$errors;
+    }
+}
+
+sub dump_enum($$) {
+    my $x = shift;
+    my $file = shift;
+
+    $x =~ s@/\*.*?\*/@@gos;	# strip comments.
+    if ($x =~ /enum\s+(\w+)\s*{(.*)}/) {
+	$declaration_name = $1;
+	my $members = $2;
+
+	foreach my $arg (split ',', $members) {
+	    $arg =~ s/^\s*(\w+).*/$1/;
+	    push @parameterlist, $arg;
+	    if (!$parameterdescs{$arg}) {
+		$parameterdescs{$arg} = $undescribed;
+		print STDERR "Warning(${file}:$.): Enum value '$arg' ".
+		    "not described in enum '$declaration_name'\n";
+	    }
+
+	}
+
+	output_declaration($declaration_name,
+			   'enum',
+			   {'enum' => $declaration_name,
+			    'module' => $modulename,
+			    'parameterlist' => \@parameterlist,
+			    'parameterdescs' => \%parameterdescs,
+			    'sectionlist' => \@sectionlist,
+			    'sections' => \%sections,
+			    'purpose' => $declaration_purpose
+			   });
+    }
+    else {
+	print STDERR "Error(${file}:$.): Cannot parse enum!\n";
+	++$errors;
+    }
+}
+
+sub dump_typedef($$) {
+    my $x = shift;
+    my $file = shift;
+
+    $x =~ s@/\*.*?\*/@@gos;	# strip comments.
+    while (($x =~ /\(*.\)\s*;$/) || ($x =~ /\[*.\]\s*;$/)) {
+	$x =~ s/\(*.\)\s*;$/;/;
+	$x =~ s/\[*.\]\s*;$/;/;
+    }
+
+    if ($x =~ /typedef.*\s+(\w+)\s*;/) {
+	$declaration_name = $1;
+
+	output_declaration($declaration_name,
+			   'typedef',
+			   {'typedef' => $declaration_name,
+			    'module' => $modulename,
+			    'sectionlist' => \@sectionlist,
+			    'sections' => \%sections,
+			    'purpose' => $declaration_purpose
+			   });
+    }
+    else {
+	print STDERR "Error(${file}:$.): Cannot parse typedef!\n";
+	++$errors;
+    }
+}
+
+sub create_parameterlist($$$) {
+    my $args = shift;
+    my $splitter = shift;
+    my $file = shift;
+    my $type;
+    my $param;
+
+    # temporarily replace commas inside function pointer definition
+    while ($args =~ /(\([^\),]+),/) {
+	$args =~ s/(\([^\),]+),/$1#/g;
+    }
+
+    foreach my $arg (split($splitter, $args)) {
+	# strip comments
+	$arg =~ s/\/\*.*\*\///;
+	# strip leading/trailing spaces
+	$arg =~ s/^\s*//;
+	$arg =~ s/\s*$//;
+	$arg =~ s/\s+/ /;
+
+	if ($arg =~ /^#/) {
+	    # Treat preprocessor directive as a typeless variable just to fill
+	    # corresponding data structures "correctly". Catch it later in
+	    # output_* subs.
+	    push_parameter($arg, "", $file);
+	} elsif ($arg =~ m/\(.+\)\s*\(/) {
+	    # pointer-to-function
+	    $arg =~ tr/#/,/;
+	    $arg =~ m/[^\(]+\(\*?\s*(\w*)\s*\)/;
+	    $param = $1;
+	    $type = $arg;
+	    $type =~ s/([^\(]+\(\*?)\s*$param/$1/;
+	    push_parameter($param, $type, $file);
+	} elsif ($arg) {
+	    $arg =~ s/\s*:\s*/:/g;
+	    $arg =~ s/\s*\[/\[/g;
+
+	    my @args = split('\s*,\s*', $arg);
+	    if ($args[0] =~ m/\*/) {
+		$args[0] =~ s/(\*+)\s*/ $1/;
+	    }
+
+	    my @first_arg;
+	    if ($args[0] =~ /^(.*\s+)(.*?\[.*\].*)$/) {
+		    shift @args;
+		    push(@first_arg, split('\s+', $1));
+		    push(@first_arg, $2);
+	    } else {
+		    @first_arg = split('\s+', shift @args);
+	    }
+
+	    unshift(@args, pop @first_arg);
+	    $type = join " ", @first_arg;
+
+	    foreach $param (@args) {
+		if ($param =~ m/^(\*+)\s*(.*)/) {
+		    push_parameter($2, "$type $1", $file);
+		}
+		elsif ($param =~ m/(.*?):(\d+)/) {
+		    if ($type ne "") { # skip unnamed bit-fields
+			push_parameter($1, "$type:$2", $file)
+		    }
+		}
+		else {
+		    push_parameter($param, $type, $file);
+		}
+	    }
+	}
+    }
+}
+
+sub create_sparameterlist($$$) {
+    my $args = shift;
+    my $splitter = shift;
+    my $file = shift;
+    my $type;
+    my $param;
+
+    foreach my $arg (split($splitter, $args)) {
+	if ($arg =~ m/s*([\w]+)\s*:?\s*([\w]*)/) {
+	    $param = $1;
+	    $type = $2;
+	    push_parameter($param, $type, $file);
+	} else {
+	    print STDERR "Error(${file}:$.): problem parsing parameters: '$prototype'\n";
+	    ++$errors;
+	    return;
+	}
+    }
+}
+
+sub push_parameter($$$) {
+	my $param = shift;
+	my $type = shift;
+	my $file = shift;
+
+	if (($anon_struct_union == 1) && ($type eq "") &&
+	    ($param eq "}")) {
+		return;		# ignore the ending }; from anon. struct/union
+	}
+
+	$anon_struct_union = 0;
+	my $param_name = $param;
+	$param_name =~ s/\[.*//;
+
+	if ($type eq "" && $param =~ /\.\.\.$/)
+	{
+	    $type="";
+	    $parameterdescs{$param} = "variable arguments";
+	}
+	elsif ($type eq "" && ($param eq "" or $param eq "void"))
+	{
+	    $type="";
+	    $param="void";
+	    $parameterdescs{void} = "no arguments";
+	}
+	elsif ($type eq "" && ($param eq "struct" or $param eq "union"))
+	# handle unnamed (anonymous) union or struct:
+	{
+		$type = $param;
+		$param = "{unnamed_" . $param . "}";
+		$parameterdescs{$param} = "anonymous\n";
+		$anon_struct_union = 1;
+	}
+
+	# warn if parameter has no description
+	# (but ignore ones starting with # as these are not parameters
+	# but inline preprocessor statements);
+	# also ignore unnamed structs/unions;
+	if (!$anon_struct_union) {
+	if (!defined $parameterdescs{$param_name} && $param_name !~ /^#/) {
+
+	    $parameterdescs{$param_name} = $undescribed;
+
+	    if (($type eq 'function') || ($type eq 'enum')) {
+		print STDERR "Warning(${file}:$.): Function parameter ".
+		    "or member '$param' not " .
+		    "described in '$declaration_name'\n";
+	    }
+	    print STDERR "Warning(${file}:$.):".
+			 " No description found for parameter '$param'\n";
+	    ++$warnings;
+	}
+	}
+
+	push @parameterlist, $param;
+	$parametertypes{$param} = $type;
+}
+
+##
+# takes a function prototype and the name of the current file being
+# processed and spits out all the details stored in the global
+# arrays/hashes.
+sub dump_function($$) {
+    my $prototype = shift;
+    my $file = shift;
+
+    $prototype =~ s/^static +//;
+    $prototype =~ s/^extern +//;
+    $prototype =~ s/^asmlinkage +//;
+    $prototype =~ s/^inline +//;
+    $prototype =~ s/^__inline__ +//;
+    $prototype =~ s/^__inline +//;
+    $prototype =~ s/^__always_inline +//;
+    $prototype =~ s/^noinline +//;
+    $prototype =~ s/__devinit +//;
+    $prototype =~ s/__init +//;
+    $prototype =~ s/^#\s*define\s+//; #ak added
+    $prototype =~ s/__attribute__\s*\(\([a-z,]*\)\)//;
+
+    # Yes, this truly is vile.  We are looking for:
+    # 1. Return type (may be nothing if we're looking at a macro)
+    # 2. Function name
+    # 3. Function parameters.
+    #
+    # All the while we have to watch out for function pointer parameters
+    # (which IIRC is what the two sections are for), C types (these
+    # regexps don't even start to express all the possibilities), and
+    # so on.
+    #
+    # If you mess with these regexps, it's a good idea to check that
+    # the following functions' documentation still comes out right:
+    # - parport_register_device (function pointer parameters)
+    # - atomic_set (macro)
+    # - pci_match_device, __copy_to_user (long return type)
+
+    if ($prototype =~ m/^()([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
+	$prototype =~ m/^(\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
+	$prototype =~ m/^(\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
+	$prototype =~ m/^(\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
+	$prototype =~ m/^(\w+\s+\w+\s*\*+)\s*([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
+	$prototype =~ m/^(\w+\s+\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
+	$prototype =~ m/^(\w+\s+\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ ||
+	$prototype =~ m/^()([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
+	$prototype =~ m/^(\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
+	$prototype =~ m/^(\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
+	$prototype =~ m/^(\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
+	$prototype =~ m/^(\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
+	$prototype =~ m/^(\w+\s+\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
+	$prototype =~ m/^(\w+\s+\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
+	$prototype =~ m/^(\w+\s+\w+\s+\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
+	$prototype =~ m/^(\w+\s+\w+\s+\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
+	$prototype =~ m/^(\w+\s+\w+\s*\*\s*\w+\s*\*\s*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/)  {
+	$return_type = $1;
+	$declaration_name = $2;
+	my $args = $3;
+
+	create_parameterlist($args, ',', $file);
+    } else {
+	print STDERR "Error(${file}:$.): cannot understand prototype: '$prototype'\n";
+	++$errors;
+	return;
+    }
+
+    output_declaration($declaration_name,
+		       'function',
+		       {'function' => $declaration_name,
+			'module' => $modulename,
+			'functiontype' => $return_type,
+			'parameterlist' => \@parameterlist,
+			'parameterdescs' => \%parameterdescs,
+			'parametertypes' => \%parametertypes,
+			'sectionlist' => \@sectionlist,
+			'sections' => \%sections,
+			'purpose' => $declaration_purpose
+		       });
+}
+
+##
+# takes a stap function prototype and the name of the current file being
+# processed and spits out all the details stored in the global
+# arrays/hashes.
+sub dump_sfunction($$) {
+    my $prototype = shift;
+    my $file = shift;
+
+    if ($prototype =~ m/^function\s+([\w]+)\s*:?\s*([\w]*)\s*\(([^\{]*)\)/) {
+	$declaration_name = $1;
+	$return_type = $2;
+	my $args = $3;
+	
+	create_sparameterlist($args, ',', $file);
+    } else {
+	print STDERR "Error(${file}:$.): cannot understand prototype: '$prototype'\n";
+	++$errors;
+	return;
+    }
+
+    output_declaration($declaration_name,
+		       'sfunction',
+		       {'sfunction' => $declaration_name,
+			'module' => $modulename,
+			'functiontype' => $return_type,
+			'parameterlist' => \@parameterlist,
+			'parameterdescs' => \%parameterdescs,
+			'parametertypes' => \%parametertypes,
+			'sectionlist' => \@sectionlist,
+			'sections' => \%sections,
+			'purpose' => $declaration_purpose
+		       });
+}
+
+sub process_file($);
+
+# Read the file that maps relative names to absolute names for
+# separate source and object directories and for shadow trees.
+if (open(SOURCE_MAP, "<.tmp_filelist.txt")) {
+	my ($relname, $absname);
+	while(<SOURCE_MAP>) {
+		chop();
+		($relname, $absname) = (split())[0..1];
+		$relname =~ s:^/+::;
+		$source_map{$relname} = $absname;
+	}
+	close(SOURCE_MAP);
+}
+
+if ($filelist) {
+	open(FLIST,"<$filelist") or die "Can't open file list $filelist";
+	while(<FLIST>) {
+		chop;
+		process_file($_);
+	}
+}
+
+foreach (@ARGV) {
+    chomp;
+    process_file($_);
+}
+if ($verbose && $errors) {
+  print STDERR "$errors errors\n";
+}
+if ($verbose && $warnings) {
+  print STDERR "$warnings warnings\n";
+}
+
+exit($errors);
+
+sub reset_state {
+    $function = "";
+    %constants = ();
+    %parameterdescs = ();
+    %parametertypes = ();
+    @parameterlist = ();
+    %sections = ();
+    @sectionlist = ();
+    $prototype = "";
+
+    $state = 0;
+}
+
+sub process_state3_function($$) {
+    my $x = shift;
+    my $file = shift;
+
+    $x =~ s@\/\/.*$@@gos; # strip C99-style comments to end of line
+
+    if ($x =~ m#\s*/\*\s+MACDOC\s*#io || ($x =~ /^#/ && $x !~ /^#\s*define/)) {
+	# do nothing
+    }
+    elsif ($x =~ /([^\{]*)/) {
+	$prototype .= $1;
+    }
+    if (($x =~ /\{/) || ($x =~ /\#\s*define/) || ($x =~ /;/)) {
+	$prototype =~ s@/\*.*?\*/@@gos;	# strip comments.
+	$prototype =~ s@[\r\n]+@ @gos; # strip newlines/cr's.
+	$prototype =~ s@^\s+@@gos; # strip leading spaces
+	dump_function($prototype,$file);
+	reset_state();
+    }
+}
+
+sub process_state3_type($$) {
+    my $x = shift;
+    my $file = shift;
+
+    $x =~ s@[\r\n]+@ @gos; # strip newlines/cr's.
+    $x =~ s@^\s+@@gos; # strip leading spaces
+    $x =~ s@\s+$@@gos; # strip trailing spaces
+    $x =~ s@\/\/.*$@@gos; # strip C99-style comments to end of line
+
+    if ($x =~ /^#/) {
+	# To distinguish preprocessor directive from regular declaration later.
+	$x .= ";";
+    }
+
+    while (1) {
+	if ( $x =~ /([^{};]*)([{};])(.*)/ ) {
+	    $prototype .= $1 . $2;
+	    ($2 eq '{') && $brcount++;
+	    ($2 eq '}') && $brcount--;
+	    if (($2 eq ';') && ($brcount == 0)) {
+		dump_declaration($prototype,$file);
+		reset_state();
+		last;
+	    }
+	    $x = $3;
+	} else {
+	    $prototype .= $x;
+	    last;
+	}
+    }
+}
+
+sub process_state3_sfunction($$) {
+    my $x = shift;
+    my $file = shift;
+
+    $x =~ s@\/\/.*$@@gos; # strip C99-style comments to end of line
+
+    if ($x =~ m#\s*/\*\s+MACDOC\s*#io || ($x =~ /^#/ && $x !~ /^#\s*define/)) {
+	# do nothing
+    }
+    elsif ($x =~ /([^\{]*)/) {
+	$prototype .= $1;
+    }
+
+    $prototype =~ s@/\*.*?\*/@@gos;	# strip comments.
+    $prototype =~ s@[\r\n]+@ @gos; # strip newlines/cr's.
+    $prototype =~ s@^\s+@@gos; # strip leading spaces
+    dump_sfunction($prototype,$file);
+    reset_state();
+}
+
+sub process_state3_probe($$) {
+    my $prototype = shift;
+    my $file = shift;
+
+    $prototype =~ s@/probe/@@o;	# strip off leading 'probe'
+    $prototype =~ s@^\s+@@gos; # strip leading spaces
+    dump_probe($prototype,$file);
+    reset_state();
+}
+
+# xml_escape: replace <, >, and & in the text stream;
+#
+# however, formatting controls that are generated internally/locally in the
+# kernel-doc script are not escaped here; instead, they begin life like
+# $blankline_html (4 of '\' followed by a mnemonic + ':'), then these strings
+# are converted to their mnemonic-expected output, without the 4 * '\' & ':',
+# just before actual output; (this is done by local_unescape())
+sub xml_escape($) {
+	my $text = shift;
+	if (($output_mode eq "text") || ($output_mode eq "man")) {
+		return $text;
+	}
+	$text =~ s/\&/\\\\\\amp;/g;
+	$text =~ s/\</\\\\\\lt;/g;
+	$text =~ s/\>/\\\\\\gt;/g;
+	return $text;
+}
+
+# convert local escape strings to html
+# local escape strings look like:  '\\\\menmonic:' (that's 4 backslashes)
+sub local_unescape($) {
+	my $text = shift;
+	if (($output_mode eq "text") || ($output_mode eq "man")) {
+		return $text;
+	}
+	$text =~ s/\\\\\\\\lt:/</g;
+	$text =~ s/\\\\\\\\gt:/>/g;
+	return $text;
+}
+
+sub process_file($) {
+    my $file;
+    my $identifier;
+    my $func;
+    my $descr;
+    my $initial_section_counter = $section_counter;
+
+    if (defined($ENV{'SRCTREE'})) {
+	$file = "$ENV{'SRCTREE'}" . "/" . "@_";
+    }
+    else {
+	$file = "@_";
+    }
+    if (defined($source_map{$file})) {
+	$file = $source_map{$file};
+    }
+
+    if (!open(IN,"<$file")) {
+	print STDERR "Error: Cannot open file $file\n";
+	++$errors;
+	return;
+    }
+
+    $section_counter = 0;
+    while (<IN>) {
+	if ($state == 0) {
+	    if (/$doc_start/o) {
+		$state = 1;		# next line is always the function name
+		$in_doc_sect = 0;
+	    }
+	} elsif ($state == 1) {	# this line is the function name (always)
+	    if (/$doc_block/o) {
+		$state = 4;
+		$contents = "";
+		if ( $1 eq "" ) {
+			$section = $section_intro;
+		} else {
+			$section = $1;
+		}
+	    }
+	    elsif (/$doc_decl/o) {
+		$identifier = $1;
+		if (/\s*([\w\s\.]+?)\s*-/) {
+		    $identifier = $1;
+		}
+
+		$state = 2;
+		if (/-(.*)/) {
+		    # strip leading/trailing/multiple spaces
+		    $descr= $1;
+		    $descr =~ s/^\s*//;
+		    $descr =~ s/\s*$//;
+		    $descr =~ s/\s+/ /;
+		    $declaration_purpose = xml_escape($descr);
+		} else {
+		    $declaration_purpose = "";
+		}
+
+		if (($declaration_purpose eq "") && $verbose) {
+			print STDERR "Warning(${file}:$.): missing initial short description on line:\n";
+			print STDERR $_;
+			++$warnings;
+		}
+
+		if ($identifier =~ m/^struct/) {
+		    $decl_type = 'struct';
+		} elsif ($identifier =~ m/^union/) {
+		    $decl_type = 'union';
+		} elsif ($identifier =~ m/^enum/) {
+		    $decl_type = 'enum';
+		} elsif ($identifier =~ m/^typedef/) {
+		    $decl_type = 'typedef';
+		} elsif ($identifier =~ m/^probe/) {
+		    $decl_type = 'probe';
+		} elsif ($identifier =~ m/^sfunction/) {
+		    $decl_type = 'sfunction';
+		} else {
+		    $decl_type = 'function';
+		}
+
+		if ($verbose) {
+		    print STDERR "Info(${file}:$.): Scanning doc for $decl_type $identifier\n";
+		}
+	    } else {
+		print STDERR "Warning(${file}:$.): Cannot understand $_ on line $.",
+		" - I thought it was a doc line\n";
+		++$warnings;
+		$state = 0;
+	    }
+	} elsif ($state == 2) {	# look for head: lines, and include content
+	    if (/$doc_sect/o) {
+		$newsection = $1;
+		$newcontents = $2;
+
+		if (($contents ne "") && ($contents ne "\n")) {
+		    if (!$in_doc_sect && $verbose) {
+			print STDERR "Warning(${file}:$.): contents before sections\n";
+			++$warnings;
+		    }
+		    dump_section($file, $section, xml_escape($contents));
+		    $section = $section_default;
+		}
+
+		$in_doc_sect = 1;
+		$contents = $newcontents;
+		if ($contents ne "") {
+		    while ((substr($contents, 0, 1) eq " ") ||
+			substr($contents, 0, 1) eq "\t") {
+			    $contents = substr($contents, 1);
+		    }
+		    $contents .= "\n";
+		}
+		$section = $newsection;
+	    } elsif (/$doc_end/) {
+
+		if ($contents ne "") {
+		    dump_section($file, $section, xml_escape($contents));
+		    $section = $section_default;
+		    $contents = "";
+		}
+		# look for doc_com + <text> + doc_end:
+		if ($_ =~ m'\s*\*\s*[a-zA-Z_0-9:\.]+\*/') {
+		    print STDERR "Warning(${file}:$.): suspicious ending line: $_";
+		    ++$warnings;
+		}
+
+		$prototype = "";
+		$state = 3;
+		$brcount = 0;
+#		print STDERR "end of doc comment, looking for prototype\n";
+	    } elsif (/$doc_content/) {
+		# miguel-style comment kludge, look for blank lines after
+		# @parameter line to signify start of description
+		if ($1 eq "" &&
+			($section =~ m/^@/ || $section eq $section_context)) {
+		    dump_section($file, $section, xml_escape($contents));
+		    $section = $section_default;
+		    $contents = "";
+		} else {
+		    $contents .= $1."\n";
+		}
+	    } else {
+		# i dont know - bad line?  ignore.
+		print STDERR "Warning(${file}:$.): bad line: $_";
+		++$warnings;
+	    }
+	} elsif ($state == 3) {	# scanning for function '{' (end of prototype)
+	    if ($decl_type eq 'function') {
+		process_state3_function($_, $file);
+	    } elsif ($decl_type eq 'probe') {
+		process_state3_probe($identifier, $file);
+	    } elsif ($decl_type eq 'sfunction') {
+		process_state3_sfunction($_, $file);
+	    } else {
+		process_state3_type($_, $file);
+	    }
+	} elsif ($state == 4) {
+		# Documentation block
+		if (/$doc_block/) {
+			dump_doc_section($file, $section, xml_escape($contents));
+			$contents = "";
+			$function = "";
+			%constants = ();
+			%parameterdescs = ();
+			%parametertypes = ();
+			@parameterlist = ();
+			%sections = ();
+			@sectionlist = ();
+			$prototype = "";
+			if ( $1 eq "" ) {
+				$section = $section_intro;
+			} else {
+				$section = $1;
+			}
+		}
+		elsif (/$doc_end/)
+		{
+			dump_doc_section($file, $section, xml_escape($contents));
+			$contents = "";
+			$function = "";
+			%constants = ();
+			%parameterdescs = ();
+			%parametertypes = ();
+			@parameterlist = ();
+			%sections = ();
+			@sectionlist = ();
+			$prototype = "";
+			$state = 0;
+		}
+		elsif (/$doc_content/)
+		{
+			if ( $1 eq "" )
+			{
+				$contents .= $blankline;
+			}
+			else
+			{
+				$contents .= $1 . "\n";
+			}
+		}
+	}
+    }
+    if ($initial_section_counter == $section_counter) {
+	print STDERR "Warning(${file}): no structured comments found\n";
+	if ($output_mode eq "xml") {
+	    # The template wants at least one RefEntry here; make one.
+	    print "<refentry>\n";
+	    print " <refnamediv>\n";
+	    print "  <refname>\n";
+	    print "   ${file}\n";
+	    print "  </refname>\n";
+	    print "  <refpurpose>\n";
+	    print "   Document generation inconsistency\n";
+	    print "  </refpurpose>\n";
+	    print " </refnamediv>\n";
+	    print " <refsect1>\n";
+	    print "  <title>\n";
+	    print "   Oops\n";
+	    print "  </title>\n";
+	    print "  <warning>\n";
+	    print "   <para>\n";
+	    print "    The template for this document tried to insert\n";
+	    print "    the structured comment from the file\n";
+	    print "    <filename>${file}</filename> at this point,\n";
+	    print "    but none was found.\n";
+	    print "    This dummy section is inserted to allow\n";
+	    print "    generation to continue.\n";
+	    print "   </para>\n";
+	    print "  </warning>\n";
+	    print " </refsect1>\n";
+	    print "</refentry>\n";
+	}
+    }
+}
-- 
1.5.6.5


[-- Attachment #4: kernel-doc3.patch --]
[-- Type: text/x-patch, Size: 35504 bytes --]

From 9cd61407c728ffe78793f2265fd3d250660ec984 Mon Sep 17 00:00:00 2001
From: William Cohen <wcohen@redhat.com>
Date: Mon, 24 Nov 2008 10:51:46 -0500
Subject: [PATCH] Add context, timestamp, memory, and networking tapsets.

---
 doc/ChangeLog                               |    5 +
 doc/SystemTap_Tapset_Reference/tapsets.tmpl |   38 +++
 tapset/ChangeLog                            |    7 +
 tapset/context.stp                          |  351 +++++++++++----------------
 tapset/memory.stp                           |  267 ++++----------------
 tapset/networking.stp                       |   76 ++-----
 tapset/timestamp.stp                        |   72 ++----
 7 files changed, 285 insertions(+), 531 deletions(-)

diff --git a/doc/ChangeLog b/doc/ChangeLog
index ac2d01a..4106091 100644
--- a/doc/ChangeLog
+++ b/doc/ChangeLog
@@ -1,5 +1,10 @@
 2008-11-24  Will Cohen <wcohen@redhat.com>
 
+	* SystemTap_Tapset_Reference/tapsets.tmpl: Add context, timestamp,
+	memory, and networking tapsets.
+	
+2008-11-24  Will Cohen <wcohen@redhat.com>
+
 	* SystemTap_Tapset_Reference: Add kernel-doc based version.
 	
 2008-11-24  Will Cohen <wcohen@redhat.com>
diff --git a/doc/SystemTap_Tapset_Reference/tapsets.tmpl b/doc/SystemTap_Tapset_Reference/tapsets.tmpl
index 8ae22ed..ccdba8c 100644
--- a/doc/SystemTap_Tapset_Reference/tapsets.tmpl
+++ b/doc/SystemTap_Tapset_Reference/tapsets.tmpl
@@ -112,4 +112,42 @@ This is common among
   
   </chapter>
 
+  <chapter id="context_stp">
+    <title>Context Functions</title>
+    <para>
+      The context functions provide additional information about the where
+      the event occurred.
+      These functions can provide information such as a backtrace
+      where the event occured
+      and the current register values for the processor.
+    </para>
+!Itapset/context.stp
+  </chapter>
+
+  <chapter id="timestamp_stp">
+    <title>Timestamp Functions</title>
+    <para>
+      Each timestamp function returns a value to indicate when
+      the function is executed.
+      Thus, these returned values can be used to indicate
+      when an event occurs, provide an ordering for events, or compute
+      the amount of time elapsed between to time stamps.
+    </para>
+!Itapset/timestamp.stp
+  </chapter>
+
+  <chapter id="memory_stp">
+    <title>Memory Tapset</title>
+!Itapset/memory.stp
+  </chapter>
+
+  <chapter id="networking.stp">
+    <title>Networking Tapset</title>
+    <para>
+      This family of probe points is used to probe the activities of
+      network device. 
+    </para>
+!Itapset/networking.stp
+  </chapter>
+
 </book>
diff --git a/tapset/ChangeLog b/tapset/ChangeLog
index b63b1ac..20b564c 100644
--- a/tapset/ChangeLog
+++ b/tapset/ChangeLog
@@ -1,3 +1,10 @@
+2008-11-24  Will Cohen <wcohen@redhat.com>
+
+	* context.stp:
+	* memory.stp:
+	* networking.stp:
+	* timestamp.stp: Change to use kernel-doc notation.
+	
 2008-11-19  Jim Keniston <jkenisto@us.ibm.com>
 
 	* s390x/registers.stp: Fixed typo.
diff --git a/tapset/context.stp b/tapset/context.stp
index 3c87d1b..7505c60 100644
--- a/tapset/context.stp
+++ b/tapset/context.stp
@@ -7,37 +7,22 @@
 // Public License (GPL); either version 2, or (at your option) any
 // later version.
 
-///<chapter id="context_stp">
-///  <title>Context Functions</title>
-///  <para>
-///    The context functions provide additional information about the where
-///    the event occurred.
-///    These functions can provide information such as a backtrace
-///    where the event occured
-///    and the current register values for the processor.
-///  </para>
 
-///<formalpara id="print_regs">
-///  <title>print_regs()</title>
-///  <indexterm><primary>print_regs</primary></indexterm>
-///  <para>
-///	Print a register dump.
-///  </para>
-///</formalpara>
+/**
+ * sfunction print_regs - Print a register dump.
+ */
 function print_regs () %{
 	if (CONTEXT->regs) {
 		_stp_print_regs (CONTEXT->regs);
 	}
 %}
 
-///<formalpara id="print_backtrace">
-///  <title>print_backtrace()</title>
-///  <indexterm><primary>print_backtrace</primary></indexterm>
-///  <para>
-///     Equivalent to <command>print_stack(backtrace())</command>,
-///     except that deeper stack nesting may be supported.  Return nothing.
-///  </para>
-///</formalpara>
+/**
+ * sfunction print_backtrace - Print stack back trace
+ *
+ *  Equivalent to <command>print_stack(backtrace())</command>,
+ *  except that deeper stack nesting may be supported.  Return nothing.
+ */
 function print_backtrace () %{
 	if (CONTEXT->regs) {
 		_stp_stack_print(CONTEXT->regs, 1, CONTEXT->pi, MAXTRACE);
@@ -46,14 +31,12 @@ function print_backtrace () %{
 	}
 %}
 
-///<formalpara id="backtrace">
-///  <title>backtrace:string()</title>
-///  <indexterm><primary>backtrace</primary></indexterm>
-///  <para>
-///	Return a string of hex addresses that are a backtrace of the
-///     stack.  It may be truncated due to maximum string length.
-///  </para>
-///</formalpara>
+/**
+ * sfunction backtrace - Hex backtrace of current stack
+ *
+ *  Return a string of hex addresses that are a backtrace of the
+ *  stack.  It may be truncated due to maximum string length.
+ */
 function backtrace:string () %{ /* pure */
 	if (CONTEXT->regs)
 		_stp_stack_snprint (THIS->__retvalue, MAXSTRINGLEN, CONTEXT->regs, 0, CONTEXT->pi, MAXTRACE);
@@ -61,46 +44,39 @@ function backtrace:string () %{ /* pure */
 		strlcpy (THIS->__retvalue, "", MAXSTRINGLEN);
 %}
 
-///<formalpara id="execname">
-///  <title>execname:string()</title>
-///  <indexterm><primary>execname</primary></indexterm>
-///  <para>
-///     Return the name of the current process.
-///  </para>
-///</formalpara>
+/**
+ * sfunction execname - Execname of current processes
+ *
+ *  Return the name of the current process.
+ */
 function execname:string () %{ /* pure */
 	strlcpy (THIS->__retvalue, current->comm, MAXSTRINGLEN);
 %}
 
-///<formalpara id="pid">
-///  <title>pid:long ()</title>
-///  <indexterm><primary>pid</primary></indexterm>
-///  <para>
-///	Return the id of the current process.
-///  </para>
-///</formalpara>
+/**
+ * sfunction pid - Process ID of current process
+ *
+ *
+ *  Return the id of the current process.
+ */
 function pid:long () %{ /* pure */
 	THIS->__retvalue = current->tgid;
 %}
 
-///<formalpara id="tid">
-///  <title>tid:long()</title>
-///  <indexterm><primary>tid</primary></indexterm>
-///  <para>
-///	Return the id of the current thread.
-///  </para>
-///</formalpara>
+/**
+ * sfunction tid - Thread ID of current process
+ *
+ *  Return the id of the current thread.
+ */
 function tid:long () %{ /* pure */
 	THIS->__retvalue = current->pid;
 %}
 
-///<formalpara id="ppid">
-///  <title>ppid:long()</title>
-///  <indexterm><primary>ppid</primary></indexterm>
-///  <para>
-///	Return the id of the parent process.
-///  </para>
-///</formalpara>
+/**
+ * sfunction ppid - Parent Process ID of current process
+ *
+ *  Return the id of the parent process.
+ */
 function ppid:long () %{ /* pure */
 #if defined(STAPCONF_REAL_PARENT)
 	THIS->__retvalue = current->real_parent->tgid;
@@ -109,13 +85,11 @@ function ppid:long () %{ /* pure */
 #endif
 %}
 
-///<formalpara id="pexecname">
-///  <title>pexecname:string()</title>
-///  <indexterm><primary>pexecname</primary></indexterm>
-///  <para>
-///	Return the name of the parent process.
-///  </para>
-///</formalpara>
+/**
+ * sfunction pexecname - Execname of the parent process.
+ *
+ *  Return the name of the parent process.
+ */
 function pexecname:string () %{ /* pure */
 #if defined(STAPCONF_REAL_PARENT)
 	strlcpy (THIS->__retvalue, current->real_parent->comm, MAXSTRINGLEN);
@@ -124,46 +98,38 @@ function pexecname:string () %{ /* pure */
 #endif
 %}
 
-///<formalpara id="gid">
-///  <title>gid:long()</title>
-///  <indexterm><primary>gid</primary></indexterm>
-///  <para>
-///	Return the gid of the current process.
-///  </para>
-///</formalpara>
+/**
+ * sfunction gid - Group ID of current process
+ *
+ *  Return the gid of the current process.
+ */
 function gid:long () %{ /* pure */
 	THIS->__retvalue = current->gid;		
 %}
 
-///<formalpara id="egid">
-///  <title>egid:long()</title>
-///  <indexterm><primary>egid</primary></indexterm>
-///  <para>
-///    Return the effective gid of the current process.
-///  </para>
-///</formalpara>
+/**
+ * sfunction egid - Effective gid of the current process.
+ *
+ *  Return the effective gid of the current process.
+ */
 function egid:long () %{ /* pure */
 	THIS->__retvalue = current->egid;		
 %}
 
-///<formalpara id="uid">
-///  <title>uid:long()</title>
-///  <indexterm><primary>uid</primary></indexterm>
-///  <para>
-///	Return the uid of the current process.
-///  </para>
-///</formalpara>
+/**
+ * sfunction uid -User ID of the current process.
+ *
+ *  Return the uid of the current process.
+ */
 function uid:long () %{ /* pure */
 	THIS->__retvalue = current->uid;		
 %}
 
-///<formalpara id="euid">
-///  <title>euid:long()</title>
-///  <indexterm><primary>euid</primary></indexterm>
-///  <para>
-///	Return the effective uid of the current process.
-///  </para>
-///</formalpara>
+/**
+ * sfunction euid - Effective User ID of the current process.
+ *
+ *  Return the effective uid of the current process.
+ */
 function euid:long () %{ /* pure */
 	THIS->__retvalue = current->euid;		
 %}
@@ -173,29 +139,26 @@ function cpuid:long () %{ /* pure */
 	THIS->__retvalue = smp_processor_id();
 %}
 
-///<formalpara id="cpu">
-///  <title>cpu:long()</title>
-///  <indexterm><primary>cpu</primary></indexterm>
-///  <para>
-///     Return the current cpu number.
-///  </para>
-///</formalpara>
+/**
+ * sfunction cpu - The current cpu number.
+ * 
+ *  Return the current cpu number.
+ */
 function cpu:long () %{ /* pure */
 	THIS->__retvalue = smp_processor_id();
 %}
 
-///<formalpara id="print_stack">
-///  <title>print_stack(stk:string)</title>
-///  <indexterm><primary>print_stack</primary></indexterm>
-///  <para>
-///     Perform a symbolic lookup of the addresses in the given  string,
-///     which  is  assumed  to  be  the  result of a prior call to 
-///	<xref linkend="backtrace"/>.
-///     Print one line per address, including the address, the
-///     name  of the function containing the address, and an estimate of
-///     its position within that function.  Return nothing.
-///  </para>
-///</formalpara>
+/**
+ * sfunction print_stack - Print out stack from string
+ * @stk: String with list of hexidecimal addresses. (FIXME)
+ *
+ *  Perform a symbolic lookup of the addresses in the given  string,
+ *  which  is  assumed  to  be  the  result of a prior call to 
+ *  backtrace().
+ *  Print one line per address, including the address, the
+ *  name  of the function containing the address, and an estimate of
+ *  its position within that function.  Return nothing.
+ */
 function print_stack(stk:string) %{
 	char *ptr = THIS->stk;
 	char *tok = strsep(&ptr, " ");
@@ -207,25 +170,21 @@ function print_stack(stk:string) %{
 	}
 %}
 
-///<formalpara id="pp">
-///  <title>pp:string()</title>
-///  <indexterm><primary>pp</primary></indexterm>
-///  <para>
-///     Return the probe point associated with the currently running
-///     probe handler, including alias and wildcard expansion effects.
-///  </para>
-///</formalpara>
+/**
+ * sfunction pp - Current probe point
+ *
+ *  Return the probe point associated with the currently running
+ *  probe handler, including alias and wildcard expansion effects.
+ */
 function pp:string () %{ /* pure */
 	strlcpy (THIS->__retvalue, CONTEXT->probe_point, MAXSTRINGLEN);
 %}
 
-///<formalpara id="probefunc">
-///  <title>probefunc:string()</title>
-///  <indexterm><primary>probefunc</primary></indexterm>
-///  <para>
-///	Return the probe point's function name, if known.
-///  </para>
-///</formalpara>
+/**
+ * sfunction probefunc - Function probed
+ *
+ * Return the probe point's function name, if known.
+ */
 function probefunc:string () %{ /* pure */
 	char *ptr, *start;
 
@@ -257,13 +216,11 @@ function probefunc:string () %{ /* pure */
 	}
 %}
 
-///<formalpara id="probemod">
-///  <title>probemod:string()</title>
-///  <indexterm><primary>probemod</primary></indexterm>
-///  <para>
-///	Return the probe point's module name, if known.
-///  </para>
-///</formalpara>
+/**
+ * sfunction probemod - Module probed
+ *
+ *  Return the probe point's module name, if known.
+ */
 function probemod:string () %{ /* pure */
 	char *ptr, *start;
 
@@ -282,27 +239,23 @@ function probemod:string () %{ /* pure */
 	}
 %}
 
-///<formalpara id="registers_valid">
-///  <title>registers_valid:long()</title>
-///  <indexterm><primary>registers_valid</primary></indexterm>
-///  <para>
-///	Return 1 if register() and u_register() can be used
-///     in the current context, or 0 otherwise.
-///     For example, <command>registers_valid()</command> returns 0
-///     when called from a begin or end probe.
-///  </para>
-///</formalpara>
+/**
+ * sfunction registers_valid - Register information valid
+ *
+ *  Return 1 if register() and u_register() can be used
+ *  in the current context, or 0 otherwise.
+ *  For example, <command>registers_valid()</command> returns 0
+ *  when called from a begin or end probe.
+ */
 function registers_valid:long () %{ /* pure */
 	THIS->__retvalue = (CONTEXT->regs != NULL);
 %}
 
-///<formalpara id="user_mode">
-///  <title>user_mode:long()</title>
-///  <indexterm><primary>user_mode</primary></indexterm>
-///  <para>
-///	Return 1 if the probe point occurred in user-mode.
-///  </para>
-///</formalpara>
+/**
+ * sfunction user_mode - User Mode
+ *
+ * Return 1 if the probe point occurred in user-mode.
+ */
 function user_mode:long () %{ /* pure */ /* currently a user-mode address? */
   if (CONTEXT->regs) {
 #if defined(__i386__) || defined(__x86_64__)
@@ -315,14 +268,12 @@ function user_mode:long () %{ /* pure */ /* currently a user-mode address? */
   }
 %}
 
-///<formalpara id="is_return">
-///  <title>is_return:long()</title>
-///  <indexterm><primary>is_return</primary></indexterm>
-///  <para>
-///	Return 1 if the probe point is a return probe.
-///     <emphasis>Deprecated.</emphasis>
-///  </para>
-///</formalpara>
+/**
+ * sfunction is_return - Is return probe
+ *
+ *  Return 1 if the probe point is a return probe.
+ *  <emphasis>Deprecated.</emphasis>
+ */
 function is_return:long () %{ /* pure */
 	if (CONTEXT->pi)
 		THIS->__retvalue = 1;
@@ -330,13 +281,11 @@ function is_return:long () %{ /* pure */
 		THIS->__retvalue = 0;	
 %}
 
-///<formalpara id="target">
-///  <title>target:long()</title>
-///  <indexterm><primary>target</primary></indexterm>
-///  <para>
-///	Return the pid of the target process.
-///  </para>
-///</formalpara>
+/**
+ * sfunction target - Target pid
+ *
+ *  Return the pid of the target process.
+ */
 function target:long () %{ /* pure */
         THIS->__retvalue = _stp_target;
 %}
@@ -363,50 +312,41 @@ function stp_pid:long () %{ /* pure */
         THIS->__retvalue = _stp_pid;
 %}
 
-///<formalpara id="stack_size">
-///  <title>stack_size:long()</title>
-///  <indexterm><primary>stack_size</primary></indexterm>
-///  <para>
-///	Return the size of the kernel stack.
-///  </para>
-///</formalpara>
+/**
+ * sfunction stack_size - Size of kernel stack
+ *
+ *  Return the size of the kernel stack.
+ */
 function stack_size:long () %{ /* pure */
         THIS->__retvalue = THREAD_SIZE;
 %}
 
-///<formalpara id="stack_used">
-///  <title>stack_used:long ()</title>
-///  <indexterm><primary>stack_used</primary></indexterm>
-///  <para>
-///	Return how many bytes are currently used in the kernel stack.
-///  </para>
-///</formalpara>
+/**
+ * sfunction stack_used - Current amount of kernel stack used
+ *
+ *  Return how many bytes are currently used in the kernel stack.
+ */
 function stack_used:long () %{ /* pure */
 	char a;
         THIS->__retvalue = THREAD_SIZE - ((long)&a & (THREAD_SIZE-1));
 %}
 
-///<formalpara id="stack_unused">
-///  <title>stack_unused:long()</title>
-///  <indexterm><primary>stack_unused</primary></indexterm>
-///  <para>
-///	Return how many bytes are currently available in the kernel stack.
-///  </para>
-///</formalpara>
+/**
+ * sfunction stack_unused - Amount of kernel stack currently available
+ *
+ *  Return how many bytes are currently available in the kernel stack.
+ */
 function stack_unused:long () %{ /* pure */
 	char a;
         THIS->__retvalue = (long)&a & (THREAD_SIZE-1);
 %}
 
-///<formalpara id="caller_addr">
-///  <title>caller_addr:long()</title>
-///  <indexterm><primary>caller_addr</primary></indexterm>
-///  <para>
-///    Return the address of the calling function.
-///    <emphasis> Works only for return probes at this time.</emphasis>
-///	
-///  </para>
-///</formalpara>
+/**
+ * sfunction caller_addr -  Return caller address
+ *
+ *  Return the address of the calling function.
+ *  <emphasis> Works only for return probes at this time.</emphasis>
+ */
 function caller_addr:long () %{ /* pure */
         if (CONTEXT->pi)
 		THIS->__retvalue = (int64_t)(long)_stp_ret_addr_r(CONTEXT->pi);
@@ -414,14 +354,12 @@ function caller_addr:long () %{ /* pure */
 		THIS->__retvalue = 0;
 %}
 
-///<formalpara id="caller">
-///  <title>caller:string()</title>
-///  <indexterm><primary>caller</primary></indexterm>
-///  <para>
-///     Return the address and name of the calling function.
-///	<emphasis>Works only for return probes at this time.</emphasis>
-///  </para>
-///</formalpara>
+/**
+ * sfunction caller - Return name and address of calling function
+ *
+ *  Return the address and name of the calling function.
+ *  <emphasis>Works only for return probes at this time.</emphasis>
+ */
 function caller:string() %{ /* pure */
         if (CONTEXT->pi) 
 		_stp_symbol_snprint( THIS->__retvalue, MAXSTRINGLEN, 
@@ -430,4 +368,3 @@ function caller:string() %{ /* pure */
 		strlcpy(THIS->__retvalue,"unknown",MAXSTRINGLEN);
 %}
 
-///</chapter>
diff --git a/tapset/memory.stp b/tapset/memory.stp
index 03568ad..9370073 100644
--- a/tapset/memory.stp
+++ b/tapset/memory.stp
@@ -7,34 +7,14 @@
 // Public License (GPL); either version 2, or (at your option) any
 // later version.
 
-///<chapter id="memory_stp">
-///  <title>Memory Tapset</title>
-///  <para>
-///	This family of probe  points is used to probe page fault events.
-///     It contains the following probe points:
-///  </para>
-
-///<formalpara id="vm.pagefault">
-///  <title>vm.pagefault</title>
-///  <indexterm><primary>vm.pagefault</primary></indexterm>
-///  <para>
-///    Records that a page fault occurred.
-///    The context is the process which triggered the fault.</para>
-///</formalpara>
-///<para>
-///  <variablelist><title>Arguments:</title>
-///    <varlistentry><term>address</term>
-///       <listitem><para>
-///         The address of the faulting memory access.
-///       </para></listitem>
-///    </varlistentry>
-///    <varlistentry><term>write_access</term>
-///       <listitem><para>
-///          Indicates whether this was a write.
-///       </para></listitem>
-///    </varlistentry>
-///  </variablelist>
-///</para>
+/**
+ * probe vm.pagefault - Records that a page fault occurred.
+ * @address: The address of the faulting memory access.
+ * @write_access: Indicates whether this was a write.
+ *
+ * Context: The process which triggered the fault
+ *
+ */
 probe vm.pagefault = kernel.function("__handle_mm_fault@mm/memory.c") ?,
                      kernel.function("handle_mm_fault@mm/memory.c") ?
 {
@@ -42,61 +22,22 @@ probe vm.pagefault = kernel.function("__handle_mm_fault@mm/memory.c") ?,
 	address =  $address
 }
 
-///<formalpara id="vm.pagefault.return">
-///  <title>vm.pagefault.return</title>
-///  <indexterm><primary>vm.pagefault.return</primary></indexterm>
-///  <para>
-///    Records type of fault that occurred.
-///    The context is the process which triggered the fault.
-///  </para>
-///</formalpara>
-///<para>
-///  <variablelist><title>Arguments:</title>
-///    <varlistentry><term>fault_type</term>
-///      <listitem><para>The possible values of fault_type are:
-///        <table frame='all'><title>Fault values</title>
-///        <tgroup cols='3' align='left' colsep='1' rowsep='1'>
-///        <colspec colname='Define'/>
-///        <colspec colname='Value'/>
-///        <colspec colname='Reason'/>
-///	   <thead>
-///   	   <row><entry>Define</entry><entry>Value</entry><entry>Reason</entry></row>
-///	   </thead>
-///	   <tbody>
-///	   <row>
-///	     <entry>VM_FAULT_OOM</entry>
-///	     <entry>0</entry>
-///	     <entry>out of memory</entry>
-///	   </row>
-///	   <row>
-///		<entry>VM_FAULT_SIGBUS</entry>
-///		<entry>1</entry>
-///		<entry>if not oom, minor, or major fault, this val</entry>
-///	   </row>
-///	   <row>
-///		<entry>VM_FAULT_MINOR</entry>
-///		<entry>2</entry>
-///		<entry>no blocking operation to handle fault</entry>
-///	   </row>
-///	   <row>
-///		<entry>VM_FAULT_MAJOR</entry>
-///		<entry>3</entry>
-///		<entry>required blocking operation to handle fault</entry>
-///	   </row>
-///	 </tbody>
-///	 </tgroup>
-///	 </table>
-///      </para></listitem>
-///    </varlistentry>
-///  </variablelist>
-///</para>
+/**
+ * probe vm.pagefault.return - Records type of fault that occurred.
+ * @fault_type: 0 (VM_FAULT_OOM), 1 (VM_FAULT_SIGBUS),
+ * 		2 (VM_FAULT_MINOR), and 3 (VM_FAULT_MAJOR)
+ */
 probe vm.pagefault.return = kernel.function("__handle_mm_fault@mm/memory.c").return ?,
                             kernel.function("handle_mm_fault@mm/memory.c").return ?
 {
 	fault_type = $return
 }
 
-/* Return which node the given address belongs to in a NUMA system */
+/**
+ * sfunction addr_to_node - Returns which NUMA node has the given address.
+ * @addr: The address of the faulting memory access.
+ *
+ */
 function addr_to_node:long(addr:long) %{ /* pure */ 
 	int nid;
 	int pfn = __pa(THIS->addr) >> PAGE_SHIFT;
@@ -116,64 +57,32 @@ function _IS_ZERO_PAGE:long(from:long, vaddr:long) %{ /* pure */
 %}
 
 
-///<formalpara id="vm.write_shared">
-///  <title>vm.write_shared</title>
-///  <indexterm><primary>vm.write_shared</primary></indexterm>
-///  <para>
-///    Fires when a process attempts to write to a shared page.
-///    If a copy is necessary, this will be followed by a
-///    <xref linkend="vm.write_shared_copy"/>.
-///    The context is the process attempting the write.
-///  </para>
-///</formalpara>
-///<para>
-///  <variablelist><title>Arguments:</title>
-///    <varlistentry><term>address</term>
-///       <listitem><para>The address of the shared write.</para></listitem>
-///    </varlistentry>
-///  </variablelist>
-///</para>
+/**
+ * probe vm.write_shared - Write to shared page.
+ * @address: The address of the shared write.
+ *
+ * Context:
+ *  The context is the process attempting the write.
+ *
+ *  Fires when a process attempts to write to a shared page.
+ *  If a copy is necessary, this will be followed by a
+ *  vm.write_shared_copy.
+ */
 probe vm.write_shared = kernel.function("do_wp_page") {
     address = $address
 }
 
-
-///<formalpara id="vm.write_shared_copy">
-///  <title>vm.write_shared_copy</title>
-///  <indexterm><primary>vm.write_shared_copy</primary></indexterm>
-///  <para>
-///    Fires when a write to a shared page requires a page copy.
-///    This is always preceded by a <xref linkend="vm.write_shared"/>.
-///    The context is the process attempting the write.
-///</para>
-///</formalpara>
-///<para>
-///  <variablelist><title>Arguments:</title>
-///    <varlistentry><term>address</term>
-///       <listitem><para>
-///	    The address of the shared write.
-///       </para></listitem>
-///    </varlistentry>
-///    <varlistentry><term>zero</term>
-///       <listitem><para>
-///	  Boolean indicating whether it is a zero page
-///       (can do a clear instead of a copy).
-///       </para></listitem>
-///    </varlistentry>
-///  </variablelist>
-///</para>
-/* probe vm.write_shared_copy
- *
- *  Fires when a write to a shared page requires a page copy.  This is
- *  always preceded by a vm.shared_write.
+/**
+ * probe vm.write_shared_copy- Page copy for shared page write.
+ * @address: the address of the shared write.
+ * @zero: boolean indicating whether it is a zero page
+ *         (can do a clear instead of a copy).
  *
  * Context:
  *  The process attempting the write.
  *
- * Arguments:
- *  address - the address of the shared write.
- *  zero - boolean indicating whether it is a zero page
- *         (can do a clear instead of a copy).
+ *  Fires when a write to a shared page requires a page copy.  This is
+ *  always preceded by a vm.shared_write.
  */
 probe vm.write_shared_copy = kernel.function("copy_cow_page")? {
     address = $address
@@ -181,34 +90,13 @@ probe vm.write_shared_copy = kernel.function("copy_cow_page")? {
 }
 
 
-///<formalpara id="vm.mmap">
-///  <title>vm.mmap</title>
-///  <indexterm><primary>vm.mmap</primary></indexterm>
-///  <para>
-///    Fires when an mmap is requested. 
-///    The context is the process calling mmap.
-///  </para>
-///</formalpara>
-///<para>
-///  <variablelist><title>Arguments:</title>
-///    <varlistentry><term>address</term>
-///      <listitem><para>The requested address.</para></listitem>
-///    </varlistentry>
-///    <varlistentry><term>length</term>
-///      <listitem><para>The length of the memory segment.</para></listitem>
-///    </varlistentry>
-///  </variablelist>
-///</para>
-/* probe vm.mmap
- *
- *  Fires when an mmap is requested.
+/**
+ * probe vm.mmap - Fires when an mmap is requested.
+ * @address: the requested address
+ * @length: the length of the memory segment 
  *
  * Context:
  *  The process calling mmap.
- *
- * Arguments:
- *  address - the requested address
- *  length - the length of the memory segment 
  */
 probe vm.mmap = kernel.function("do_mmap"), kernel.function("do_mmap2")? {
     address = $addr
@@ -216,93 +104,40 @@ probe vm.mmap = kernel.function("do_mmap"), kernel.function("do_mmap2")? {
 }
 
 
-///<formalpara id="vm.munmap">
-///  <title>vm.munmap</title>
-///  <indexterm><primary>vm.munmap</primary></indexterm>
-///  <para>Fires when an munmap is requested.</para>
-///</formalpara>
-///<para>
-///  <variablelist><title>Arguments:</title>
-///    <varlistentry><term>address</term>
-///       <listitem><para>The requested address.</para></listitem>
-///    </varlistentry>
-///    <varlistentry><term>length</term>
-///       <listitem><para>The length of the memory segment.</para></listitem>
-///    </varlistentry>
-///  </variablelist>
-///</para>
-/* probe vm.munmap
- *
- *  Fires when an munmap is requested.
+/**
+ * probe vm.munmap - Fires when an munmap is requested.
+ * @address: the requested address
+ * @length: the length of the memory segment 
  *
  * Context:
  *  The process calling munmap.
- *
- * Arguments:
- *  address - the requested address
- *  length - the length of the memory segment 
  */
 probe vm.munmap = kernel.function("do_munmap") {
     address = $start
     length = $len
 }
 
-///<formalpara id="vm.brk">
-///  <title>vm.brk</title>
-///  <indexterm><primary>vm.brk</primary></indexterm>
-///  <para>Fires when a brk is requested (resizing a heap).</para>
-///</formalpara>
-///<para>
-///  <variablelist><title>Arguments:</title>
-///    <varlistentry><term>address</term>
-///       <listitem><para>The requested address.</para></listitem>
-///    </varlistentry>
-///    <varlistentry><term>length</term>
-///       <listitem><para>The length of the memory segment.</para></listitem>
-///    </varlistentry>
-///  </variablelist>
-///</para>
-/* probe vm.brk
- *
- *  Fires when a brk is requested (resizing a heap).
+/**
+ * probe vm.brk -Fires when a brk is requested (resizing a heap).
+ * @address - the requested address
+ * @length - the length of the memory segment 
  *
  * Context:
  *  The process calling brk.
- *
- * Arguments:
- *  address - the requested address
- *  length - the length of the memory segment 
  */
 probe vm.brk = kernel.function("do_brk") {
     address = $addr
     length = $len
 }
 
-///<formalpara id="vm.oom_kill">
-///  <title>vm.oom_kill</title>
-///  <indexterm><primary>vm.oom_kill</primary></indexterm>
-///  <para>Fires when a thread is targetted by the OOM killer.</para>
-///</formalpara>
-///<para>
-///  <variablelist><title>Arguments:</title>
-///    <varlistentry><term>task</term>
-///       <listitem><para>The task being killed.</para></listitem>
-///    </varlistentry>
-///  </variablelist>
-///</para>
-/* probe vm.oom_kill
- *
- *  Fires when a thread is targetted by the OOM killer.
+/**
+ * probe vm.oom_kill - Fires when a thread is targetted by the OOM killer.
+ * @task: the task being killed
  *
  * Context:
  *  The process that tried to consume more memory, and thus
  *  triggered the OOM. (correct?)
- *
- * Arguments:
- *  task - the task being killed
  */
 probe vm.oom_kill = kernel.function("__oom_kill_task") {
     task = $p
 }
-
-///</chapter>
diff --git a/tapset/networking.stp b/tapset/networking.stp
index decd62a..d6e9025 100644
--- a/tapset/networking.stp
+++ b/tapset/networking.stp
@@ -6,36 +6,17 @@
 // Public License (GPL); either version 2, or (at your option) any
 // later version.
 
-///<chapter id="networking.stp">
-///  <title>Networking Tapset</title>
-///  <para>
-///	This family of probe points is used to probe the activities of
-///     network device. 
-///  </para>
-
 %{
 #include <linux/netdevice.h>
 %}
 
-///<formalpara id="netdev.receive">
-///  <title>netdev.receive</title>
-///  <indexterm><primary>netdev.receive</primary></indexterm>
-///  <para>Fires when data arrives on network device.</para>
-///</formalpara>
-///<para>
-///  <variablelist><title>Arguments:</title>
-///    <varlistentry><term>dev_name</term>
-///       <listitem><para>
-///          The name of the device. e.g: eth0, ath1
-///       </para></listitem>
-///    </varlistentry>
-///
-///    <varlistentry><term>length</term>
-///       <listitem><para>
-///           The length of the receiving buffer
-///       </para></listitem>
-///    </varlistentry>
-///
+/**
+ * probe netdev.receive - Data recieved from network device.
+ * @dev_name: The name of the device. e.g: eth0, ath1.
+ * @length: The length of the receiving buffer.
+ * @protocol: Protocol of recieved packet.
+ *
+ */
 ///    <varlistentry><term>protocol</term>
 ///       <listitem><para>The possible values of protocol could be:
 ///         <table frame='all'><title>Protocol Values</title>
@@ -82,39 +63,14 @@ probe netdev.receive
 	truesize = $skb->truesize
 }
 
-///<formalpara id="netdev.transmit">
-///  <title>netdev.transmit</title>
-///  <indexterm><primary>netdev.transmit</primary></indexterm>
-///  <para> Fires when the network device wants to transmit a buffer.</para>
-///</formalpara>
-///<para>
-///  <variablelist><title>Arguments:</title>
-///    <varlistentry><term>dev_name</term>
-///       <listitem><para>
-///          The name of the device. e.g: eth0, ath1
-///       </para></listitem>
-///    </varlistentry>
-///
-///    <varlistentry><term>length</term>
-///       <listitem><para>
-///         The length of the transmit buffer
-///       </para></listitem>
-///    </varlistentry>
-///
-///    <varlistentry><term>protocol</term>
-///       <listitem><para>
-///         The protocol of this packet.
-///       </para></listitem>
-///    </varlistentry>
-///
-///    <varlistentry><term>truesize</term>
-///       <listitem><para>
-///         The size of the the data to be transmitted.
-///       </para></listitem>
-///    </varlistentry>
-///
-///  </variablelist>
-///</para>
+/**
+ * probe netdev.transmit - Network device transmitting buffer
+ * @dev_name: The name of the device. e.g: eth0, ath1.
+ * @length: The length of the transmit buffer.
+ * @protocol: The protocol of this packet.
+ * @truesize: The size of the the data to be transmitted.
+ *
+ */
 /* Queue a buffer for transmission to a network device */
 probe netdev.transmit
 	=  kernel.function("dev_queue_xmit")
@@ -124,5 +80,3 @@ probe netdev.transmit
 	protocol = $skb->protocol
 	truesize = $skb->truesize
 }
-
-///</chapter>
diff --git a/tapset/timestamp.stp b/tapset/timestamp.stp
index 4c8592a..29763cb 100644
--- a/tapset/timestamp.stp
+++ b/tapset/timestamp.stp
@@ -7,79 +7,57 @@
 // Public License (GPL); either version 2, or (at your option) any
 // later version.
 
-///<chapter id="timestamp_stp">
-///  <title>Timestamp Functions</title>
-///  <para>
-///	Each timestamp function returns a value to indicate when
-///     the function is executed.
-///     Thus, these returned values can be used to indicate
-///     when an event occurs, provide an ordering for events, or compute
-///	the amount of time elapsed between to time stamps.
-///  </para>
-
 %{
 #include <linux/time.h>
 %}
 
-///<formalpara id="get_cycles">
-///  <title>get_cycles:long()</title>
-///  <indexterm><primary>get_cycles</primary></indexterm>
-///  <para>
-///	Return the processor cycle counter value, or 0 if unavailable.
-///  </para>
-///</formalpara>
+/**
+ * sfunction get_cycles - Processor cycle count.
+ *
+ *  Return the processor cycle counter value, or 0 if unavailable.
+ */
 function get_cycles:long () %{ /* pure */
   cycles_t c = get_cycles();
   THIS->__retvalue = (int64_t) c;
 %}
 
 
-///<formalpara id="gettimeofday_ns">
-///  <title>gettimeofday_ns:long ()</title>
-///  <indexterm><primary>gettimeofday_ns</primary></indexterm>
-///  <para>
-///	Return the number of nanoseconds since the UNIX epoch.
-///  </para>
-///</formalpara>
+/**
+ * sfunction gettimeofday_ns - Number of nanoseconds since UNIX epoch.
+ *
+ *  Return the number of nanoseconds since the UNIX epoch.
+ */
 function gettimeofday_ns:long () %{ /* pure */
   /* NOTE: we can't use do_gettimeofday because we could be called from a
    * context where xtime_lock is already held.  See bug #2525. */
   THIS->__retvalue = _stp_gettimeofday_ns();
 %}
 
-///<formalpara id="gettimeofday_us">
-///  <title>gettimeofday_us:long ()</title>
-///  <indexterm><primary>gettimeofday_us</primary></indexterm>
-///  <para>
-///	Return the number of microseconds since the UNIX epoch.
-///  </para>
-///</formalpara>
+/**
+ * sfunction gettimeofday_us - Number of microseconds since UNIX epoch.
+ *
+ *  Return the number of microseconds since the UNIX epoch.
+ */
 function gettimeofday_us:long () {
   return gettimeofday_ns() / 1000;
 }
 
-///<formalpara id="gettimeofday_ms">
-///  <title>gettimeofday_ms:long ()</title>
-///  <indexterm><primary>gettimeofday_ms</primary></indexterm>
-///  <para>
-///	Return the number of milliseconds since the UNIX epoch.
-///  </para>
-///</formalpara>
+/**
+ * sfunction gettimeofday_ms - Number of milliseconds since UNIX epoch.
+ *
+ *  Return the number of milliseconds since the UNIX epoch.
+ */
 function gettimeofday_ms:long () {
   return gettimeofday_ns() / 1000000;
 }
 
-///<formalpara id="gettimeofday_s">
-///  <title>gettimeofday_s:long ()</title>
-///  <indexterm><primary>gettimeofday_s</primary></indexterm>
-///  <para>
-///	Return the number of seconds since the UNIX epoch.
-///  </para>
-///</formalpara>
+/**
+ * sfunction gettimeofday_s - Number of seconds since UNIX epoch.
+ *
+ * Return the number of seconds since the UNIX epoch.
+ */
 function gettimeofday_s:long () {
   return gettimeofday_ns() / 1000000000;
 }
 
 // likewise jiffies, monotonic_clock ...
-
-///</chapter>
-- 
1.5.6.5


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Start of Systemtap Tapset Reference manual
  2008-11-24 16:48           ` Start of Systemtap Tapset Reference manual William Cohen
@ 2008-11-24 19:16             ` William Cohen
  2008-11-25 11:27               ` Mark Wielaard
  0 siblings, 1 reply; 16+ messages in thread
From: William Cohen @ 2008-11-24 19:16 UTC (permalink / raw)
  To: SystemTAP

William Cohen wrote:
> Randy Dunlap wrote:
> 
>> Not currently, but I don't see why it couldn't be done.  Then the 
>> question
>> becomes:  is it the same scripts/kernel-doc file or is it 
>> scripts/stap-doc
>> (e.g. -- or some other name)?
> 
> This weekend I played around this some more and created some patches to 
> use kernel-doc as method of encoding the documentation in the tapset files.
> 
> kernel-doc1.patch  removes the old documentation method
> kernel-doc2.patch  adds the kernel-doc
> kernel-doc3.patch  revises the tapsets files to generate instumentation.
> 
> To make the instrumentation need to go in the the build directory 
> doc/SystemTap_Tapset_Reference and do a "make" in there. It dodn't 
> currently install the resulting documtation any where.
> 
> Comments on this series of patches would be appreciated.
> 
> -Will

Hi,

I have also placed the patches kernel-doc[123].patch at:

http://people.redhat.com/wcohen/systemtap-doc/

If you are interested in see what the output looks like, I made the current 
types of output available. The pdf is:
 
http://people.redhat.com/wcohen/systemtap-doc/SystemTap_Tapset_Reference/tapsets.pdf

The html:

http://people.redhat.com/wcohen/systemtap-doc/SystemTap_Tapset_Reference/tapset/

The man pages are at:

http://people.redhat.com/wcohen/systemtap-doc/SystemTap_Tapset_Reference/

-Will

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Start of Systemtap Tapset Reference manual
  2008-11-24 19:16             ` William Cohen
@ 2008-11-25 11:27               ` Mark Wielaard
  2008-11-25 15:04                 ` William Cohen
  0 siblings, 1 reply; 16+ messages in thread
From: Mark Wielaard @ 2008-11-25 11:27 UTC (permalink / raw)
  To: William Cohen; +Cc: SystemTAP

Hi Will,

On Mon, 2008-11-24 at 14:15 -0500, William Cohen wrote:
> > This weekend I played around this some more and created some patches to 
> > use kernel-doc as method of encoding the documentation in the tapset files.
> > 
> > kernel-doc1.patch  removes the old documentation method
> > kernel-doc2.patch  adds the kernel-doc
> > kernel-doc3.patch  revises the tapsets files to generate instumentation.
> > 
> > To make the instrumentation need to go in the the build directory 
> > doc/SystemTap_Tapset_Reference and do a "make" in there. It dodn't 
> > currently install the resulting documtation any where.
> > 
> > Comments on this series of patches would be appreciated.
>
> I have also placed the patches kernel-doc[123].patch at:
> 
> http://people.redhat.com/wcohen/systemtap-doc/
> 
> If you are interested in see what the output looks like, I made the current 
> types of output available. The pdf is:
>  
> http://people.redhat.com/wcohen/systemtap-doc/SystemTap_Tapset_Reference/tapsets.pdf
> 
> The html:
> 
> http://people.redhat.com/wcohen/systemtap-doc/SystemTap_Tapset_Reference/tapset/

Just a quick note on how it looks. I like the output. It is imho nicer
(less verbose) than the previous versions based on publican. The only
thing that would need some tweaking is the synopsis in the pdf version
it comes after the name with a lot of extra whitespace (but not the word
synopsis). In both the pdf and the html version functions are formatted
somewhat oddly with the closing bracket on their own line.

> The man pages are at:
> 
> http://people.redhat.com/wcohen/systemtap-doc/SystemTap_Tapset_Reference/

It might be a bit much to have a man page for each probe and function.
Is there a way to group them in sets based on tapset filename or the
chapter names for example?

Cheers,

Mark

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Start of Systemtap Tapset Reference manual
  2008-11-25 11:27               ` Mark Wielaard
@ 2008-11-25 15:04                 ` William Cohen
  2008-11-27  1:47                   ` Peter Teoh
  0 siblings, 1 reply; 16+ messages in thread
From: William Cohen @ 2008-11-25 15:04 UTC (permalink / raw)
  To: Mark Wielaard; +Cc: SystemTAP

Mark Wielaard wrote:

> Just a quick note on how it looks. I like the output. It is imho nicer
> (less verbose) than the previous versions based on publican. The only
> thing that would need some tweaking is the synopsis in the pdf version
> it comes after the name with a lot of extra whitespace (but not the word
> synopsis). In both the pdf and the html version functions are formatted
> somewhat oddly with the closing bracket on their own line.
> 
>> The man pages are at:
>>
>> http://people.redhat.com/wcohen/systemtap-doc/SystemTap_Tapset_Reference/
> 
> It might be a bit much to have a man page for each probe and function.
> Is there a way to group them in sets based on tapset filename or the
> chapter names for example?
> 
> Cheers,
> 
> Mark
> 


Hi Mark,

Thanks for the feedback. I noticed the closing parenthesis oddity also and I 
have modified the output of SystemTap function synopis to be a bit more compact.

I found man pages for each function and probe a bit much. I am not sure if there 
is a way to get xmlto to group them together.

-Will

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: Start of Systemtap Tapset Reference manual
  2008-11-25 15:04                 ` William Cohen
@ 2008-11-27  1:47                   ` Peter Teoh
  0 siblings, 0 replies; 16+ messages in thread
From: Peter Teoh @ 2008-11-27  1:47 UTC (permalink / raw)
  To: William Cohen; +Cc: Mark Wielaard, SystemTAP

Not sure if it has been mentioned before:

a.   In the section on netdev.receive, are three global parameter.
But I read the source (tapset/networking.stp), inside this function
are declared 4 variables instead.   "truesize" is missed out?

b.   Wouldn't it be good to have an example (perhaps not for all
function, but at least one example to summarize a few functions etc)
after each function description?   Or another way - an
"example/sample" section entirely dedicated to describing the
testsuite/systemtap.examples or testsuite/systemtap.samples and
showing some of the codes and its expected output?

Expected output speaks a thousand words, so not much explanation is
really needed.

Similarly, a real, short script showing how the function/stapprobe
are used, speaks a hundred words, if not a thousand.

c.   I also saw quite a many others similar references - it will be
good to reference these existing documentation if possible:

http://sourceware.org/systemtap/langref.pdf
http://fedoraproject.org/w/uploads/3/3c/LCA_Melbourne2008_systemtap-scripts.pdf
etc etc.


On Tue, Nov 25, 2008 at 11:03 PM, William Cohen <wcohen@redhat.com> wrote:
> Mark Wielaard wrote:
>
>> Just a quick note on how it looks. I like the output. It is imho nicer
>> (less verbose) than the previous versions based on publican. The only
>> thing that would need some tweaking is the synopsis in the pdf version
>> it comes after the name with a lot of extra whitespace (but not the word
>> synopsis). In both the pdf and the html version functions are formatted
>> somewhat oddly with the closing bracket on their own line.
>>
>>> The man pages are at:
>>>
>>> http://people.redhat.com/wcohen/systemtap-doc/SystemTap_Tapset_Reference/
>>
>> It might be a bit much to have a man page for each probe and function.
>> Is there a way to group them in sets based on tapset filename or the
>> chapter names for example?
>>
>> Cheers,
>>
>> Mark
>>
>
>
> Hi Mark,
>
> Thanks for the feedback. I noticed the closing parenthesis oddity also and I
> have modified the output of SystemTap function synopis to be a bit more
> compact.
>
> I found man pages for each function and probe a bit much. I am not sure if
> there is a way to get xmlto to group them together.
>
> -Will
>



-- 
Regards,
Peter Teoh

Ernest Hemingway - "Never mistake motion for action."

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2008-11-27  1:47 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-11-11 16:45 Start of Systemtap Tapset Reference manual William Cohen
     [not found] ` <491CBA1C.4080108@redhat.com>
2008-11-14 14:08   ` William Cohen
2008-11-17  6:00 ` Peter Teoh
     [not found] ` <804dabb00811162156s7cc931deja89861e47571331f@mail.gmail.com>
2008-11-18 16:55   ` William Cohen
2008-11-18 20:44     ` Randy Dunlap
2008-11-19  1:01       ` Peter Teoh
2008-11-19 16:33       ` William Cohen
2008-11-20 21:31       ` William Cohen
2008-11-20 21:41         ` Randy Dunlap
2008-11-21 14:54           ` William Cohen
2008-11-21 23:00           ` Tweaks for kernel-doc to parse systemtap tapsets William Cohen
2008-11-24 16:48           ` Start of Systemtap Tapset Reference manual William Cohen
2008-11-24 19:16             ` William Cohen
2008-11-25 11:27               ` Mark Wielaard
2008-11-25 15:04                 ` William Cohen
2008-11-27  1:47                   ` Peter Teoh

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).