1*53ee8cc1Swenshuai.xi#!/usr/bin/perl -w 2*53ee8cc1Swenshuai.xi 3*53ee8cc1Swenshuai.xiuse strict; 4*53ee8cc1Swenshuai.xi 5*53ee8cc1Swenshuai.xi## Copyright (c) 1998 Michael Zucchi, All Rights Reserved ## 6*53ee8cc1Swenshuai.xi## Copyright (C) 2000, 1 Tim Waugh <twaugh@redhat.com> ## 7*53ee8cc1Swenshuai.xi## Copyright (C) 2001 Simon Huggins ## 8*53ee8cc1Swenshuai.xi## Copyright (C) 2005-2010 Randy Dunlap ## 9*53ee8cc1Swenshuai.xi## ## 10*53ee8cc1Swenshuai.xi## #define enhancements by Armin Kuster <akuster@mvista.com> ## 11*53ee8cc1Swenshuai.xi## Copyright (c) 2000 MontaVista Software, Inc. ## 12*53ee8cc1Swenshuai.xi## ## 13*53ee8cc1Swenshuai.xi## This software falls under the GNU General Public License. ## 14*53ee8cc1Swenshuai.xi## Please read the COPYING file for more information ## 15*53ee8cc1Swenshuai.xi 16*53ee8cc1Swenshuai.xi# 18/01/2001 - Cleanups 17*53ee8cc1Swenshuai.xi# Functions prototyped as foo(void) same as foo() 18*53ee8cc1Swenshuai.xi# Stop eval'ing where we don't need to. 19*53ee8cc1Swenshuai.xi# -- huggie@earth.li 20*53ee8cc1Swenshuai.xi 21*53ee8cc1Swenshuai.xi# 27/06/2001 - Allowed whitespace after initial "/**" and 22*53ee8cc1Swenshuai.xi# allowed comments before function declarations. 23*53ee8cc1Swenshuai.xi# -- Christian Kreibich <ck@whoop.org> 24*53ee8cc1Swenshuai.xi 25*53ee8cc1Swenshuai.xi# Still to do: 26*53ee8cc1Swenshuai.xi# - add perldoc documentation 27*53ee8cc1Swenshuai.xi# - Look more closely at some of the scarier bits :) 28*53ee8cc1Swenshuai.xi 29*53ee8cc1Swenshuai.xi# 26/05/2001 - Support for separate source and object trees. 30*53ee8cc1Swenshuai.xi# Return error code. 31*53ee8cc1Swenshuai.xi# Keith Owens <kaos@ocs.com.au> 32*53ee8cc1Swenshuai.xi 33*53ee8cc1Swenshuai.xi# 23/09/2001 - Added support for typedefs, structs, enums and unions 34*53ee8cc1Swenshuai.xi# Support for Context section; can be terminated using empty line 35*53ee8cc1Swenshuai.xi# Small fixes (like spaces vs. \s in regex) 36*53ee8cc1Swenshuai.xi# -- Tim Jansen <tim@tjansen.de> 37*53ee8cc1Swenshuai.xi 38*53ee8cc1Swenshuai.xi 39*53ee8cc1Swenshuai.xi# 40*53ee8cc1Swenshuai.xi# This will read a 'c' file and scan for embedded comments in the 41*53ee8cc1Swenshuai.xi# style of gnome comments (+minor extensions - see below). 42*53ee8cc1Swenshuai.xi# 43*53ee8cc1Swenshuai.xi 44*53ee8cc1Swenshuai.xi# Note: This only supports 'c'. 45*53ee8cc1Swenshuai.xi 46*53ee8cc1Swenshuai.xi# usage: 47*53ee8cc1Swenshuai.xi# kernel-doc [ -docbook | -html | -text | -man | -list ] [ -no-doc-sections ] 48*53ee8cc1Swenshuai.xi# [ -function funcname [ -function funcname ...] ] c file(s)s > outputfile 49*53ee8cc1Swenshuai.xi# or 50*53ee8cc1Swenshuai.xi# [ -nofunction funcname [ -function funcname ...] ] c file(s)s > outputfile 51*53ee8cc1Swenshuai.xi# 52*53ee8cc1Swenshuai.xi# Set output format using one of -docbook -html -text or -man. Default is man. 53*53ee8cc1Swenshuai.xi# The -list format is for internal use by docproc. 54*53ee8cc1Swenshuai.xi# 55*53ee8cc1Swenshuai.xi# -no-doc-sections 56*53ee8cc1Swenshuai.xi# Do not output DOC: sections 57*53ee8cc1Swenshuai.xi# 58*53ee8cc1Swenshuai.xi# -function funcname 59*53ee8cc1Swenshuai.xi# If set, then only generate documentation for the given function(s) or 60*53ee8cc1Swenshuai.xi# DOC: section titles. All other functions and DOC: sections are ignored. 61*53ee8cc1Swenshuai.xi# 62*53ee8cc1Swenshuai.xi# -nofunction funcname 63*53ee8cc1Swenshuai.xi# If set, then only generate documentation for the other function(s)/DOC: 64*53ee8cc1Swenshuai.xi# sections. Cannot be used together with -function (yes, that's a bug -- 65*53ee8cc1Swenshuai.xi# perl hackers can fix it 8)) 66*53ee8cc1Swenshuai.xi# 67*53ee8cc1Swenshuai.xi# c files - list of 'c' files to process 68*53ee8cc1Swenshuai.xi# 69*53ee8cc1Swenshuai.xi# All output goes to stdout, with errors to stderr. 70*53ee8cc1Swenshuai.xi 71*53ee8cc1Swenshuai.xi# 72*53ee8cc1Swenshuai.xi# format of comments. 73*53ee8cc1Swenshuai.xi# In the following table, (...)? signifies optional structure. 74*53ee8cc1Swenshuai.xi# (...)* signifies 0 or more structure elements 75*53ee8cc1Swenshuai.xi# /** 76*53ee8cc1Swenshuai.xi# * function_name(:)? (- short description)? 77*53ee8cc1Swenshuai.xi# (* @parameterx: (description of parameter x)?)* 78*53ee8cc1Swenshuai.xi# (* a blank line)? 79*53ee8cc1Swenshuai.xi# * (Description:)? (Description of function)? 80*53ee8cc1Swenshuai.xi# * (section header: (section description)? )* 81*53ee8cc1Swenshuai.xi# (*)?*/ 82*53ee8cc1Swenshuai.xi# 83*53ee8cc1Swenshuai.xi# So .. the trivial example would be: 84*53ee8cc1Swenshuai.xi# 85*53ee8cc1Swenshuai.xi# /** 86*53ee8cc1Swenshuai.xi# * my_function 87*53ee8cc1Swenshuai.xi# */ 88*53ee8cc1Swenshuai.xi# 89*53ee8cc1Swenshuai.xi# If the Description: header tag is omitted, then there must be a blank line 90*53ee8cc1Swenshuai.xi# after the last parameter specification. 91*53ee8cc1Swenshuai.xi# e.g. 92*53ee8cc1Swenshuai.xi# /** 93*53ee8cc1Swenshuai.xi# * my_function - does my stuff 94*53ee8cc1Swenshuai.xi# * @my_arg: its mine damnit 95*53ee8cc1Swenshuai.xi# * 96*53ee8cc1Swenshuai.xi# * Does my stuff explained. 97*53ee8cc1Swenshuai.xi# */ 98*53ee8cc1Swenshuai.xi# 99*53ee8cc1Swenshuai.xi# or, could also use: 100*53ee8cc1Swenshuai.xi# /** 101*53ee8cc1Swenshuai.xi# * my_function - does my stuff 102*53ee8cc1Swenshuai.xi# * @my_arg: its mine damnit 103*53ee8cc1Swenshuai.xi# * Description: Does my stuff explained. 104*53ee8cc1Swenshuai.xi# */ 105*53ee8cc1Swenshuai.xi# etc. 106*53ee8cc1Swenshuai.xi# 107*53ee8cc1Swenshuai.xi# Besides functions you can also write documentation for structs, unions, 108*53ee8cc1Swenshuai.xi# enums and typedefs. Instead of the function name you must write the name 109*53ee8cc1Swenshuai.xi# of the declaration; the struct/union/enum/typedef must always precede 110*53ee8cc1Swenshuai.xi# the name. Nesting of declarations is not supported. 111*53ee8cc1Swenshuai.xi# Use the argument mechanism to document members or constants. 112*53ee8cc1Swenshuai.xi# e.g. 113*53ee8cc1Swenshuai.xi# /** 114*53ee8cc1Swenshuai.xi# * struct my_struct - short description 115*53ee8cc1Swenshuai.xi# * @a: first member 116*53ee8cc1Swenshuai.xi# * @b: second member 117*53ee8cc1Swenshuai.xi# * 118*53ee8cc1Swenshuai.xi# * Longer description 119*53ee8cc1Swenshuai.xi# */ 120*53ee8cc1Swenshuai.xi# struct my_struct { 121*53ee8cc1Swenshuai.xi# int a; 122*53ee8cc1Swenshuai.xi# int b; 123*53ee8cc1Swenshuai.xi# /* private: */ 124*53ee8cc1Swenshuai.xi# int c; 125*53ee8cc1Swenshuai.xi# }; 126*53ee8cc1Swenshuai.xi# 127*53ee8cc1Swenshuai.xi# All descriptions can be multiline, except the short function description. 128*53ee8cc1Swenshuai.xi# 129*53ee8cc1Swenshuai.xi# You can also add additional sections. When documenting kernel functions you 130*53ee8cc1Swenshuai.xi# should document the "Context:" of the function, e.g. whether the functions 131*53ee8cc1Swenshuai.xi# can be called form interrupts. Unlike other sections you can end it with an 132*53ee8cc1Swenshuai.xi# empty line. 133*53ee8cc1Swenshuai.xi# Example-sections should contain the string EXAMPLE so that they are marked 134*53ee8cc1Swenshuai.xi# appropriately in DocBook. 135*53ee8cc1Swenshuai.xi# 136*53ee8cc1Swenshuai.xi# Example: 137*53ee8cc1Swenshuai.xi# /** 138*53ee8cc1Swenshuai.xi# * user_function - function that can only be called in user context 139*53ee8cc1Swenshuai.xi# * @a: some argument 140*53ee8cc1Swenshuai.xi# * Context: !in_interrupt() 141*53ee8cc1Swenshuai.xi# * 142*53ee8cc1Swenshuai.xi# * Some description 143*53ee8cc1Swenshuai.xi# * Example: 144*53ee8cc1Swenshuai.xi# * user_function(22); 145*53ee8cc1Swenshuai.xi# */ 146*53ee8cc1Swenshuai.xi# ... 147*53ee8cc1Swenshuai.xi# 148*53ee8cc1Swenshuai.xi# 149*53ee8cc1Swenshuai.xi# All descriptive text is further processed, scanning for the following special 150*53ee8cc1Swenshuai.xi# patterns, which are highlighted appropriately. 151*53ee8cc1Swenshuai.xi# 152*53ee8cc1Swenshuai.xi# 'funcname()' - function 153*53ee8cc1Swenshuai.xi# '$ENVVAR' - environmental variable 154*53ee8cc1Swenshuai.xi# '&struct_name' - name of a structure (up to two words including 'struct') 155*53ee8cc1Swenshuai.xi# '@parameter' - name of a parameter 156*53ee8cc1Swenshuai.xi# '%CONST' - name of a constant. 157*53ee8cc1Swenshuai.xi 158*53ee8cc1Swenshuai.xi## init lots of data 159*53ee8cc1Swenshuai.xi 160*53ee8cc1Swenshuai.ximy $errors = 0; 161*53ee8cc1Swenshuai.ximy $warnings = 0; 162*53ee8cc1Swenshuai.ximy $anon_struct_union = 0; 163*53ee8cc1Swenshuai.xi 164*53ee8cc1Swenshuai.xi# match expressions used to find embedded type information 165*53ee8cc1Swenshuai.ximy $type_constant = '\%([-_\w]+)'; 166*53ee8cc1Swenshuai.ximy $type_func = '(\w+)\(\)'; 167*53ee8cc1Swenshuai.ximy $type_param = '\@(\w+)'; 168*53ee8cc1Swenshuai.ximy $type_struct = '\&((struct\s*)*[_\w]+)'; 169*53ee8cc1Swenshuai.ximy $type_struct_xml = '\\&((struct\s*)*[_\w]+)'; 170*53ee8cc1Swenshuai.ximy $type_env = '(\$\w+)'; 171*53ee8cc1Swenshuai.xi 172*53ee8cc1Swenshuai.xi# Output conversion substitutions. 173*53ee8cc1Swenshuai.xi# One for each output format 174*53ee8cc1Swenshuai.xi 175*53ee8cc1Swenshuai.xi# these work fairly well 176*53ee8cc1Swenshuai.ximy %highlights_html = ( $type_constant, "<i>\$1</i>", 177*53ee8cc1Swenshuai.xi $type_func, "<b>\$1</b>", 178*53ee8cc1Swenshuai.xi $type_struct_xml, "<i>\$1</i>", 179*53ee8cc1Swenshuai.xi $type_env, "<b><i>\$1</i></b>", 180*53ee8cc1Swenshuai.xi $type_param, "<tt><b>\$1</b></tt>" ); 181*53ee8cc1Swenshuai.ximy $local_lt = "\\\\\\\\lt:"; 182*53ee8cc1Swenshuai.ximy $local_gt = "\\\\\\\\gt:"; 183*53ee8cc1Swenshuai.ximy $blankline_html = $local_lt . "p" . $local_gt; # was "<p>" 184*53ee8cc1Swenshuai.xi 185*53ee8cc1Swenshuai.xi# XML, docbook format 186*53ee8cc1Swenshuai.ximy %highlights_xml = ( "([^=])\\\"([^\\\"<]+)\\\"", "\$1<quote>\$2</quote>", 187*53ee8cc1Swenshuai.xi $type_constant, "<constant>\$1</constant>", 188*53ee8cc1Swenshuai.xi $type_func, "<function>\$1</function>", 189*53ee8cc1Swenshuai.xi $type_struct_xml, "<structname>\$1</structname>", 190*53ee8cc1Swenshuai.xi $type_env, "<envar>\$1</envar>", 191*53ee8cc1Swenshuai.xi $type_param, "<parameter>\$1</parameter>" ); 192*53ee8cc1Swenshuai.ximy $blankline_xml = $local_lt . "/para" . $local_gt . $local_lt . "para" . $local_gt . "\n"; 193*53ee8cc1Swenshuai.xi 194*53ee8cc1Swenshuai.xi# gnome, docbook format 195*53ee8cc1Swenshuai.ximy %highlights_gnome = ( $type_constant, "<replaceable class=\"option\">\$1</replaceable>", 196*53ee8cc1Swenshuai.xi $type_func, "<function>\$1</function>", 197*53ee8cc1Swenshuai.xi $type_struct, "<structname>\$1</structname>", 198*53ee8cc1Swenshuai.xi $type_env, "<envar>\$1</envar>", 199*53ee8cc1Swenshuai.xi $type_param, "<parameter>\$1</parameter>" ); 200*53ee8cc1Swenshuai.ximy $blankline_gnome = "</para><para>\n"; 201*53ee8cc1Swenshuai.xi 202*53ee8cc1Swenshuai.xi# these are pretty rough 203*53ee8cc1Swenshuai.ximy %highlights_man = ( $type_constant, "\$1", 204*53ee8cc1Swenshuai.xi $type_func, "\\\\fB\$1\\\\fP", 205*53ee8cc1Swenshuai.xi $type_struct, "\\\\fI\$1\\\\fP", 206*53ee8cc1Swenshuai.xi $type_param, "\\\\fI\$1\\\\fP" ); 207*53ee8cc1Swenshuai.ximy $blankline_man = ""; 208*53ee8cc1Swenshuai.xi 209*53ee8cc1Swenshuai.xi# text-mode 210*53ee8cc1Swenshuai.ximy %highlights_text = ( $type_constant, "\$1", 211*53ee8cc1Swenshuai.xi $type_func, "\$1", 212*53ee8cc1Swenshuai.xi $type_struct, "\$1", 213*53ee8cc1Swenshuai.xi $type_param, "\$1" ); 214*53ee8cc1Swenshuai.ximy $blankline_text = ""; 215*53ee8cc1Swenshuai.xi 216*53ee8cc1Swenshuai.xi# list mode 217*53ee8cc1Swenshuai.ximy %highlights_list = ( $type_constant, "\$1", 218*53ee8cc1Swenshuai.xi $type_func, "\$1", 219*53ee8cc1Swenshuai.xi $type_struct, "\$1", 220*53ee8cc1Swenshuai.xi $type_param, "\$1" ); 221*53ee8cc1Swenshuai.ximy $blankline_list = ""; 222*53ee8cc1Swenshuai.xi 223*53ee8cc1Swenshuai.xi# read arguments 224*53ee8cc1Swenshuai.xiif ($#ARGV == -1) { 225*53ee8cc1Swenshuai.xi usage(); 226*53ee8cc1Swenshuai.xi} 227*53ee8cc1Swenshuai.xi 228*53ee8cc1Swenshuai.ximy $kernelversion; 229*53ee8cc1Swenshuai.ximy $dohighlight = ""; 230*53ee8cc1Swenshuai.xi 231*53ee8cc1Swenshuai.ximy $verbose = 0; 232*53ee8cc1Swenshuai.ximy $output_mode = "man"; 233*53ee8cc1Swenshuai.ximy $no_doc_sections = 0; 234*53ee8cc1Swenshuai.ximy %highlights = %highlights_man; 235*53ee8cc1Swenshuai.ximy $blankline = $blankline_man; 236*53ee8cc1Swenshuai.ximy $modulename = "Kernel API"; 237*53ee8cc1Swenshuai.ximy $function_only = 0; 238*53ee8cc1Swenshuai.ximy $man_date = ('January', 'February', 'March', 'April', 'May', 'June', 239*53ee8cc1Swenshuai.xi 'July', 'August', 'September', 'October', 240*53ee8cc1Swenshuai.xi 'November', 'December')[(localtime)[4]] . 241*53ee8cc1Swenshuai.xi " " . ((localtime)[5]+1900); 242*53ee8cc1Swenshuai.xi 243*53ee8cc1Swenshuai.xi# Essentially these are globals. 244*53ee8cc1Swenshuai.xi# They probably want to be tidied up, made more localised or something. 245*53ee8cc1Swenshuai.xi# CAVEAT EMPTOR! Some of the others I localised may not want to be, which 246*53ee8cc1Swenshuai.xi# could cause "use of undefined value" or other bugs. 247*53ee8cc1Swenshuai.ximy ($function, %function_table, %parametertypes, $declaration_purpose); 248*53ee8cc1Swenshuai.ximy ($type, $declaration_name, $return_type); 249*53ee8cc1Swenshuai.ximy ($newsection, $newcontents, $prototype, $brcount, %source_map); 250*53ee8cc1Swenshuai.xi 251*53ee8cc1Swenshuai.xiif (defined($ENV{'KBUILD_VERBOSE'})) { 252*53ee8cc1Swenshuai.xi $verbose = "$ENV{'KBUILD_VERBOSE'}"; 253*53ee8cc1Swenshuai.xi} 254*53ee8cc1Swenshuai.xi 255*53ee8cc1Swenshuai.xi# Generated docbook code is inserted in a template at a point where 256*53ee8cc1Swenshuai.xi# docbook v3.1 requires a non-zero sequence of RefEntry's; see: 257*53ee8cc1Swenshuai.xi# http://www.oasis-open.org/docbook/documentation/reference/html/refentry.html 258*53ee8cc1Swenshuai.xi# We keep track of number of generated entries and generate a dummy 259*53ee8cc1Swenshuai.xi# if needs be to ensure the expanded template can be postprocessed 260*53ee8cc1Swenshuai.xi# into html. 261*53ee8cc1Swenshuai.ximy $section_counter = 0; 262*53ee8cc1Swenshuai.xi 263*53ee8cc1Swenshuai.ximy $lineprefix=""; 264*53ee8cc1Swenshuai.xi 265*53ee8cc1Swenshuai.xi# states 266*53ee8cc1Swenshuai.xi# 0 - normal code 267*53ee8cc1Swenshuai.xi# 1 - looking for function name 268*53ee8cc1Swenshuai.xi# 2 - scanning field start. 269*53ee8cc1Swenshuai.xi# 3 - scanning prototype. 270*53ee8cc1Swenshuai.xi# 4 - documentation block 271*53ee8cc1Swenshuai.ximy $state; 272*53ee8cc1Swenshuai.ximy $in_doc_sect; 273*53ee8cc1Swenshuai.xi 274*53ee8cc1Swenshuai.xi#declaration types: can be 275*53ee8cc1Swenshuai.xi# 'function', 'struct', 'union', 'enum', 'typedef' 276*53ee8cc1Swenshuai.ximy $decl_type; 277*53ee8cc1Swenshuai.xi 278*53ee8cc1Swenshuai.ximy $doc_special = "\@\%\$\&"; 279*53ee8cc1Swenshuai.xi 280*53ee8cc1Swenshuai.ximy $doc_start = '^/\*\*\s*$'; # Allow whitespace at end of comment start. 281*53ee8cc1Swenshuai.ximy $doc_end = '\*/'; 282*53ee8cc1Swenshuai.ximy $doc_com = '\s*\*\s*'; 283*53ee8cc1Swenshuai.ximy $doc_decl = $doc_com . '(\w+)'; 284*53ee8cc1Swenshuai.ximy $doc_sect = $doc_com . '([' . $doc_special . ']?[\w\s]+):(.*)'; 285*53ee8cc1Swenshuai.ximy $doc_content = $doc_com . '(.*)'; 286*53ee8cc1Swenshuai.ximy $doc_block = $doc_com . 'DOC:\s*(.*)?'; 287*53ee8cc1Swenshuai.xi 288*53ee8cc1Swenshuai.ximy %constants; 289*53ee8cc1Swenshuai.ximy %parameterdescs; 290*53ee8cc1Swenshuai.ximy @parameterlist; 291*53ee8cc1Swenshuai.ximy %sections; 292*53ee8cc1Swenshuai.ximy @sectionlist; 293*53ee8cc1Swenshuai.ximy $sectcheck; 294*53ee8cc1Swenshuai.ximy $struct_actual; 295*53ee8cc1Swenshuai.xi 296*53ee8cc1Swenshuai.ximy $contents = ""; 297*53ee8cc1Swenshuai.ximy $section_default = "Description"; # default section 298*53ee8cc1Swenshuai.ximy $section_intro = "Introduction"; 299*53ee8cc1Swenshuai.ximy $section = $section_default; 300*53ee8cc1Swenshuai.ximy $section_context = "Context"; 301*53ee8cc1Swenshuai.xi 302*53ee8cc1Swenshuai.ximy $undescribed = "-- undescribed --"; 303*53ee8cc1Swenshuai.xi 304*53ee8cc1Swenshuai.xireset_state(); 305*53ee8cc1Swenshuai.xi 306*53ee8cc1Swenshuai.xiwhile ($ARGV[0] =~ m/^-(.*)/) { 307*53ee8cc1Swenshuai.xi my $cmd = shift @ARGV; 308*53ee8cc1Swenshuai.xi if ($cmd eq "-html") { 309*53ee8cc1Swenshuai.xi $output_mode = "html"; 310*53ee8cc1Swenshuai.xi %highlights = %highlights_html; 311*53ee8cc1Swenshuai.xi $blankline = $blankline_html; 312*53ee8cc1Swenshuai.xi } elsif ($cmd eq "-man") { 313*53ee8cc1Swenshuai.xi $output_mode = "man"; 314*53ee8cc1Swenshuai.xi %highlights = %highlights_man; 315*53ee8cc1Swenshuai.xi $blankline = $blankline_man; 316*53ee8cc1Swenshuai.xi } elsif ($cmd eq "-text") { 317*53ee8cc1Swenshuai.xi $output_mode = "text"; 318*53ee8cc1Swenshuai.xi %highlights = %highlights_text; 319*53ee8cc1Swenshuai.xi $blankline = $blankline_text; 320*53ee8cc1Swenshuai.xi } elsif ($cmd eq "-docbook") { 321*53ee8cc1Swenshuai.xi $output_mode = "xml"; 322*53ee8cc1Swenshuai.xi %highlights = %highlights_xml; 323*53ee8cc1Swenshuai.xi $blankline = $blankline_xml; 324*53ee8cc1Swenshuai.xi } elsif ($cmd eq "-list") { 325*53ee8cc1Swenshuai.xi $output_mode = "list"; 326*53ee8cc1Swenshuai.xi %highlights = %highlights_list; 327*53ee8cc1Swenshuai.xi $blankline = $blankline_list; 328*53ee8cc1Swenshuai.xi } elsif ($cmd eq "-gnome") { 329*53ee8cc1Swenshuai.xi $output_mode = "gnome"; 330*53ee8cc1Swenshuai.xi %highlights = %highlights_gnome; 331*53ee8cc1Swenshuai.xi $blankline = $blankline_gnome; 332*53ee8cc1Swenshuai.xi } elsif ($cmd eq "-module") { # not needed for XML, inherits from calling document 333*53ee8cc1Swenshuai.xi $modulename = shift @ARGV; 334*53ee8cc1Swenshuai.xi } elsif ($cmd eq "-function") { # to only output specific functions 335*53ee8cc1Swenshuai.xi $function_only = 1; 336*53ee8cc1Swenshuai.xi $function = shift @ARGV; 337*53ee8cc1Swenshuai.xi $function_table{$function} = 1; 338*53ee8cc1Swenshuai.xi } elsif ($cmd eq "-nofunction") { # to only output specific functions 339*53ee8cc1Swenshuai.xi $function_only = 2; 340*53ee8cc1Swenshuai.xi $function = shift @ARGV; 341*53ee8cc1Swenshuai.xi $function_table{$function} = 1; 342*53ee8cc1Swenshuai.xi } elsif ($cmd eq "-v") { 343*53ee8cc1Swenshuai.xi $verbose = 1; 344*53ee8cc1Swenshuai.xi } elsif (($cmd eq "-h") || ($cmd eq "--help")) { 345*53ee8cc1Swenshuai.xi usage(); 346*53ee8cc1Swenshuai.xi } elsif ($cmd eq '-no-doc-sections') { 347*53ee8cc1Swenshuai.xi $no_doc_sections = 1; 348*53ee8cc1Swenshuai.xi } 349*53ee8cc1Swenshuai.xi} 350*53ee8cc1Swenshuai.xi 351*53ee8cc1Swenshuai.xi# continue execution near EOF; 352*53ee8cc1Swenshuai.xi 353*53ee8cc1Swenshuai.xisub usage { 354*53ee8cc1Swenshuai.xi print "Usage: $0 [ -v ] [ -docbook | -html | -text | -man | -list ]\n"; 355*53ee8cc1Swenshuai.xi print " [ -no-doc-sections ]\n"; 356*53ee8cc1Swenshuai.xi print " [ -function funcname [ -function funcname ...] ]\n"; 357*53ee8cc1Swenshuai.xi print " [ -nofunction funcname [ -nofunction funcname ...] ]\n"; 358*53ee8cc1Swenshuai.xi print " c source file(s) > outputfile\n"; 359*53ee8cc1Swenshuai.xi print " -v : verbose output, more warnings & other info listed\n"; 360*53ee8cc1Swenshuai.xi exit 1; 361*53ee8cc1Swenshuai.xi} 362*53ee8cc1Swenshuai.xi 363*53ee8cc1Swenshuai.xi# get kernel version from env 364*53ee8cc1Swenshuai.xisub get_kernel_version() { 365*53ee8cc1Swenshuai.xi my $version = 'unknown kernel version'; 366*53ee8cc1Swenshuai.xi 367*53ee8cc1Swenshuai.xi if (defined($ENV{'KERNELVERSION'})) { 368*53ee8cc1Swenshuai.xi $version = $ENV{'KERNELVERSION'}; 369*53ee8cc1Swenshuai.xi } 370*53ee8cc1Swenshuai.xi return $version; 371*53ee8cc1Swenshuai.xi} 372*53ee8cc1Swenshuai.xi 373*53ee8cc1Swenshuai.xi## 374*53ee8cc1Swenshuai.xi# dumps section contents to arrays/hashes intended for that purpose. 375*53ee8cc1Swenshuai.xi# 376*53ee8cc1Swenshuai.xisub dump_section { 377*53ee8cc1Swenshuai.xi my $file = shift; 378*53ee8cc1Swenshuai.xi my $name = shift; 379*53ee8cc1Swenshuai.xi my $contents = join "\n", @_; 380*53ee8cc1Swenshuai.xi 381*53ee8cc1Swenshuai.xi if ($name =~ m/$type_constant/) { 382*53ee8cc1Swenshuai.xi $name = $1; 383*53ee8cc1Swenshuai.xi# print STDERR "constant section '$1' = '$contents'\n"; 384*53ee8cc1Swenshuai.xi $constants{$name} = $contents; 385*53ee8cc1Swenshuai.xi } elsif ($name =~ m/$type_param/) { 386*53ee8cc1Swenshuai.xi# print STDERR "parameter def '$1' = '$contents'\n"; 387*53ee8cc1Swenshuai.xi $name = $1; 388*53ee8cc1Swenshuai.xi $parameterdescs{$name} = $contents; 389*53ee8cc1Swenshuai.xi $sectcheck = $sectcheck . $name . " "; 390*53ee8cc1Swenshuai.xi } elsif ($name eq "@\.\.\.") { 391*53ee8cc1Swenshuai.xi# print STDERR "parameter def '...' = '$contents'\n"; 392*53ee8cc1Swenshuai.xi $name = "..."; 393*53ee8cc1Swenshuai.xi $parameterdescs{$name} = $contents; 394*53ee8cc1Swenshuai.xi $sectcheck = $sectcheck . $name . " "; 395*53ee8cc1Swenshuai.xi } else { 396*53ee8cc1Swenshuai.xi# print STDERR "other section '$name' = '$contents'\n"; 397*53ee8cc1Swenshuai.xi if (defined($sections{$name}) && ($sections{$name} ne "")) { 398*53ee8cc1Swenshuai.xi print STDERR "Error(${file}:$.): duplicate section name '$name'\n"; 399*53ee8cc1Swenshuai.xi ++$errors; 400*53ee8cc1Swenshuai.xi } 401*53ee8cc1Swenshuai.xi $sections{$name} = $contents; 402*53ee8cc1Swenshuai.xi push @sectionlist, $name; 403*53ee8cc1Swenshuai.xi } 404*53ee8cc1Swenshuai.xi} 405*53ee8cc1Swenshuai.xi 406*53ee8cc1Swenshuai.xi## 407*53ee8cc1Swenshuai.xi# dump DOC: section after checking that it should go out 408*53ee8cc1Swenshuai.xi# 409*53ee8cc1Swenshuai.xisub dump_doc_section { 410*53ee8cc1Swenshuai.xi my $file = shift; 411*53ee8cc1Swenshuai.xi my $name = shift; 412*53ee8cc1Swenshuai.xi my $contents = join "\n", @_; 413*53ee8cc1Swenshuai.xi 414*53ee8cc1Swenshuai.xi if ($no_doc_sections) { 415*53ee8cc1Swenshuai.xi return; 416*53ee8cc1Swenshuai.xi } 417*53ee8cc1Swenshuai.xi 418*53ee8cc1Swenshuai.xi if (($function_only == 0) || 419*53ee8cc1Swenshuai.xi ( $function_only == 1 && defined($function_table{$name})) || 420*53ee8cc1Swenshuai.xi ( $function_only == 2 && !defined($function_table{$name}))) 421*53ee8cc1Swenshuai.xi { 422*53ee8cc1Swenshuai.xi dump_section($file, $name, $contents); 423*53ee8cc1Swenshuai.xi output_blockhead({'sectionlist' => \@sectionlist, 424*53ee8cc1Swenshuai.xi 'sections' => \%sections, 425*53ee8cc1Swenshuai.xi 'module' => $modulename, 426*53ee8cc1Swenshuai.xi 'content-only' => ($function_only != 0), }); 427*53ee8cc1Swenshuai.xi } 428*53ee8cc1Swenshuai.xi} 429*53ee8cc1Swenshuai.xi 430*53ee8cc1Swenshuai.xi## 431*53ee8cc1Swenshuai.xi# output function 432*53ee8cc1Swenshuai.xi# 433*53ee8cc1Swenshuai.xi# parameterdescs, a hash. 434*53ee8cc1Swenshuai.xi# function => "function name" 435*53ee8cc1Swenshuai.xi# parameterlist => @list of parameters 436*53ee8cc1Swenshuai.xi# parameterdescs => %parameter descriptions 437*53ee8cc1Swenshuai.xi# sectionlist => @list of sections 438*53ee8cc1Swenshuai.xi# sections => %section descriptions 439*53ee8cc1Swenshuai.xi# 440*53ee8cc1Swenshuai.xi 441*53ee8cc1Swenshuai.xisub output_highlight { 442*53ee8cc1Swenshuai.xi my $contents = join "\n",@_; 443*53ee8cc1Swenshuai.xi my $line; 444*53ee8cc1Swenshuai.xi 445*53ee8cc1Swenshuai.xi# DEBUG 446*53ee8cc1Swenshuai.xi# if (!defined $contents) { 447*53ee8cc1Swenshuai.xi# use Carp; 448*53ee8cc1Swenshuai.xi# confess "output_highlight got called with no args?\n"; 449*53ee8cc1Swenshuai.xi# } 450*53ee8cc1Swenshuai.xi 451*53ee8cc1Swenshuai.xi if ($output_mode eq "html" || $output_mode eq "xml") { 452*53ee8cc1Swenshuai.xi $contents = local_unescape($contents); 453*53ee8cc1Swenshuai.xi # convert data read & converted thru xml_escape() into &xyz; format: 454*53ee8cc1Swenshuai.xi $contents =~ s/\\\\\\/\&/g; 455*53ee8cc1Swenshuai.xi } 456*53ee8cc1Swenshuai.xi# print STDERR "contents b4:$contents\n"; 457*53ee8cc1Swenshuai.xi eval $dohighlight; 458*53ee8cc1Swenshuai.xi die $@ if $@; 459*53ee8cc1Swenshuai.xi# print STDERR "contents af:$contents\n"; 460*53ee8cc1Swenshuai.xi 461*53ee8cc1Swenshuai.xi foreach $line (split "\n", $contents) { 462*53ee8cc1Swenshuai.xi if ($line eq ""){ 463*53ee8cc1Swenshuai.xi print $lineprefix, local_unescape($blankline); 464*53ee8cc1Swenshuai.xi } else { 465*53ee8cc1Swenshuai.xi $line =~ s/\\\\\\/\&/g; 466*53ee8cc1Swenshuai.xi if ($output_mode eq "man" && substr($line, 0, 1) eq ".") { 467*53ee8cc1Swenshuai.xi print "\\&$line"; 468*53ee8cc1Swenshuai.xi } else { 469*53ee8cc1Swenshuai.xi print $lineprefix, $line; 470*53ee8cc1Swenshuai.xi } 471*53ee8cc1Swenshuai.xi } 472*53ee8cc1Swenshuai.xi print "\n"; 473*53ee8cc1Swenshuai.xi } 474*53ee8cc1Swenshuai.xi} 475*53ee8cc1Swenshuai.xi 476*53ee8cc1Swenshuai.xi#output sections in html 477*53ee8cc1Swenshuai.xisub output_section_html(%) { 478*53ee8cc1Swenshuai.xi my %args = %{$_[0]}; 479*53ee8cc1Swenshuai.xi my $section; 480*53ee8cc1Swenshuai.xi 481*53ee8cc1Swenshuai.xi foreach $section (@{$args{'sectionlist'}}) { 482*53ee8cc1Swenshuai.xi print "<h3>$section</h3>\n"; 483*53ee8cc1Swenshuai.xi print "<blockquote>\n"; 484*53ee8cc1Swenshuai.xi output_highlight($args{'sections'}{$section}); 485*53ee8cc1Swenshuai.xi print "</blockquote>\n"; 486*53ee8cc1Swenshuai.xi } 487*53ee8cc1Swenshuai.xi} 488*53ee8cc1Swenshuai.xi 489*53ee8cc1Swenshuai.xi# output enum in html 490*53ee8cc1Swenshuai.xisub output_enum_html(%) { 491*53ee8cc1Swenshuai.xi my %args = %{$_[0]}; 492*53ee8cc1Swenshuai.xi my ($parameter); 493*53ee8cc1Swenshuai.xi my $count; 494*53ee8cc1Swenshuai.xi print "<h2>enum " . $args{'enum'} . "</h2>\n"; 495*53ee8cc1Swenshuai.xi 496*53ee8cc1Swenshuai.xi print "<b>enum " . $args{'enum'} . "</b> {<br>\n"; 497*53ee8cc1Swenshuai.xi $count = 0; 498*53ee8cc1Swenshuai.xi foreach $parameter (@{$args{'parameterlist'}}) { 499*53ee8cc1Swenshuai.xi print " <b>" . $parameter . "</b>"; 500*53ee8cc1Swenshuai.xi if ($count != $#{$args{'parameterlist'}}) { 501*53ee8cc1Swenshuai.xi $count++; 502*53ee8cc1Swenshuai.xi print ",\n"; 503*53ee8cc1Swenshuai.xi } 504*53ee8cc1Swenshuai.xi print "<br>"; 505*53ee8cc1Swenshuai.xi } 506*53ee8cc1Swenshuai.xi print "};<br>\n"; 507*53ee8cc1Swenshuai.xi 508*53ee8cc1Swenshuai.xi print "<h3>Constants</h3>\n"; 509*53ee8cc1Swenshuai.xi print "<dl>\n"; 510*53ee8cc1Swenshuai.xi foreach $parameter (@{$args{'parameterlist'}}) { 511*53ee8cc1Swenshuai.xi print "<dt><b>" . $parameter . "</b>\n"; 512*53ee8cc1Swenshuai.xi print "<dd>"; 513*53ee8cc1Swenshuai.xi output_highlight($args{'parameterdescs'}{$parameter}); 514*53ee8cc1Swenshuai.xi } 515*53ee8cc1Swenshuai.xi print "</dl>\n"; 516*53ee8cc1Swenshuai.xi output_section_html(@_); 517*53ee8cc1Swenshuai.xi print "<hr>\n"; 518*53ee8cc1Swenshuai.xi} 519*53ee8cc1Swenshuai.xi 520*53ee8cc1Swenshuai.xi# output typedef in html 521*53ee8cc1Swenshuai.xisub output_typedef_html(%) { 522*53ee8cc1Swenshuai.xi my %args = %{$_[0]}; 523*53ee8cc1Swenshuai.xi my ($parameter); 524*53ee8cc1Swenshuai.xi my $count; 525*53ee8cc1Swenshuai.xi print "<h2>typedef " . $args{'typedef'} . "</h2>\n"; 526*53ee8cc1Swenshuai.xi 527*53ee8cc1Swenshuai.xi print "<b>typedef " . $args{'typedef'} . "</b>\n"; 528*53ee8cc1Swenshuai.xi output_section_html(@_); 529*53ee8cc1Swenshuai.xi print "<hr>\n"; 530*53ee8cc1Swenshuai.xi} 531*53ee8cc1Swenshuai.xi 532*53ee8cc1Swenshuai.xi# output struct in html 533*53ee8cc1Swenshuai.xisub output_struct_html(%) { 534*53ee8cc1Swenshuai.xi my %args = %{$_[0]}; 535*53ee8cc1Swenshuai.xi my ($parameter); 536*53ee8cc1Swenshuai.xi 537*53ee8cc1Swenshuai.xi print "<h2>" . $args{'type'} . " " . $args{'struct'} . " - " . $args{'purpose'} . "</h2>\n"; 538*53ee8cc1Swenshuai.xi print "<b>" . $args{'type'} . " " . $args{'struct'} . "</b> {<br>\n"; 539*53ee8cc1Swenshuai.xi foreach $parameter (@{$args{'parameterlist'}}) { 540*53ee8cc1Swenshuai.xi if ($parameter =~ /^#/) { 541*53ee8cc1Swenshuai.xi print "$parameter<br>\n"; 542*53ee8cc1Swenshuai.xi next; 543*53ee8cc1Swenshuai.xi } 544*53ee8cc1Swenshuai.xi my $parameter_name = $parameter; 545*53ee8cc1Swenshuai.xi $parameter_name =~ s/\[.*//; 546*53ee8cc1Swenshuai.xi 547*53ee8cc1Swenshuai.xi ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next; 548*53ee8cc1Swenshuai.xi $type = $args{'parametertypes'}{$parameter}; 549*53ee8cc1Swenshuai.xi if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) { 550*53ee8cc1Swenshuai.xi # pointer-to-function 551*53ee8cc1Swenshuai.xi print " <i>$1</i><b>$parameter</b>) <i>($2)</i>;<br>\n"; 552*53ee8cc1Swenshuai.xi } elsif ($type =~ m/^(.*?)\s*(:.*)/) { 553*53ee8cc1Swenshuai.xi # bitfield 554*53ee8cc1Swenshuai.xi print " <i>$1</i> <b>$parameter</b>$2;<br>\n"; 555*53ee8cc1Swenshuai.xi } else { 556*53ee8cc1Swenshuai.xi print " <i>$type</i> <b>$parameter</b>;<br>\n"; 557*53ee8cc1Swenshuai.xi } 558*53ee8cc1Swenshuai.xi } 559*53ee8cc1Swenshuai.xi print "};<br>\n"; 560*53ee8cc1Swenshuai.xi 561*53ee8cc1Swenshuai.xi print "<h3>Members</h3>\n"; 562*53ee8cc1Swenshuai.xi print "<dl>\n"; 563*53ee8cc1Swenshuai.xi foreach $parameter (@{$args{'parameterlist'}}) { 564*53ee8cc1Swenshuai.xi ($parameter =~ /^#/) && next; 565*53ee8cc1Swenshuai.xi 566*53ee8cc1Swenshuai.xi my $parameter_name = $parameter; 567*53ee8cc1Swenshuai.xi $parameter_name =~ s/\[.*//; 568*53ee8cc1Swenshuai.xi 569*53ee8cc1Swenshuai.xi ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next; 570*53ee8cc1Swenshuai.xi print "<dt><b>" . $parameter . "</b>\n"; 571*53ee8cc1Swenshuai.xi print "<dd>"; 572*53ee8cc1Swenshuai.xi output_highlight($args{'parameterdescs'}{$parameter_name}); 573*53ee8cc1Swenshuai.xi } 574*53ee8cc1Swenshuai.xi print "</dl>\n"; 575*53ee8cc1Swenshuai.xi output_section_html(@_); 576*53ee8cc1Swenshuai.xi print "<hr>\n"; 577*53ee8cc1Swenshuai.xi} 578*53ee8cc1Swenshuai.xi 579*53ee8cc1Swenshuai.xi# output function in html 580*53ee8cc1Swenshuai.xisub output_function_html(%) { 581*53ee8cc1Swenshuai.xi my %args = %{$_[0]}; 582*53ee8cc1Swenshuai.xi my ($parameter, $section); 583*53ee8cc1Swenshuai.xi my $count; 584*53ee8cc1Swenshuai.xi 585*53ee8cc1Swenshuai.xi print "<h2>" . $args{'function'} . " - " . $args{'purpose'} . "</h2>\n"; 586*53ee8cc1Swenshuai.xi print "<i>" . $args{'functiontype'} . "</i>\n"; 587*53ee8cc1Swenshuai.xi print "<b>" . $args{'function'} . "</b>\n"; 588*53ee8cc1Swenshuai.xi print "("; 589*53ee8cc1Swenshuai.xi $count = 0; 590*53ee8cc1Swenshuai.xi foreach $parameter (@{$args{'parameterlist'}}) { 591*53ee8cc1Swenshuai.xi $type = $args{'parametertypes'}{$parameter}; 592*53ee8cc1Swenshuai.xi if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) { 593*53ee8cc1Swenshuai.xi # pointer-to-function 594*53ee8cc1Swenshuai.xi print "<i>$1</i><b>$parameter</b>) <i>($2)</i>"; 595*53ee8cc1Swenshuai.xi } else { 596*53ee8cc1Swenshuai.xi print "<i>" . $type . "</i> <b>" . $parameter . "</b>"; 597*53ee8cc1Swenshuai.xi } 598*53ee8cc1Swenshuai.xi if ($count != $#{$args{'parameterlist'}}) { 599*53ee8cc1Swenshuai.xi $count++; 600*53ee8cc1Swenshuai.xi print ",\n"; 601*53ee8cc1Swenshuai.xi } 602*53ee8cc1Swenshuai.xi } 603*53ee8cc1Swenshuai.xi print ")\n"; 604*53ee8cc1Swenshuai.xi 605*53ee8cc1Swenshuai.xi print "<h3>Arguments</h3>\n"; 606*53ee8cc1Swenshuai.xi print "<dl>\n"; 607*53ee8cc1Swenshuai.xi foreach $parameter (@{$args{'parameterlist'}}) { 608*53ee8cc1Swenshuai.xi my $parameter_name = $parameter; 609*53ee8cc1Swenshuai.xi $parameter_name =~ s/\[.*//; 610*53ee8cc1Swenshuai.xi 611*53ee8cc1Swenshuai.xi ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next; 612*53ee8cc1Swenshuai.xi print "<dt><b>" . $parameter . "</b>\n"; 613*53ee8cc1Swenshuai.xi print "<dd>"; 614*53ee8cc1Swenshuai.xi output_highlight($args{'parameterdescs'}{$parameter_name}); 615*53ee8cc1Swenshuai.xi } 616*53ee8cc1Swenshuai.xi print "</dl>\n"; 617*53ee8cc1Swenshuai.xi output_section_html(@_); 618*53ee8cc1Swenshuai.xi print "<hr>\n"; 619*53ee8cc1Swenshuai.xi} 620*53ee8cc1Swenshuai.xi 621*53ee8cc1Swenshuai.xi# output DOC: block header in html 622*53ee8cc1Swenshuai.xisub output_blockhead_html(%) { 623*53ee8cc1Swenshuai.xi my %args = %{$_[0]}; 624*53ee8cc1Swenshuai.xi my ($parameter, $section); 625*53ee8cc1Swenshuai.xi my $count; 626*53ee8cc1Swenshuai.xi 627*53ee8cc1Swenshuai.xi foreach $section (@{$args{'sectionlist'}}) { 628*53ee8cc1Swenshuai.xi print "<h3>$section</h3>\n"; 629*53ee8cc1Swenshuai.xi print "<ul>\n"; 630*53ee8cc1Swenshuai.xi output_highlight($args{'sections'}{$section}); 631*53ee8cc1Swenshuai.xi print "</ul>\n"; 632*53ee8cc1Swenshuai.xi } 633*53ee8cc1Swenshuai.xi print "<hr>\n"; 634*53ee8cc1Swenshuai.xi} 635*53ee8cc1Swenshuai.xi 636*53ee8cc1Swenshuai.xisub output_section_xml(%) { 637*53ee8cc1Swenshuai.xi my %args = %{$_[0]}; 638*53ee8cc1Swenshuai.xi my $section; 639*53ee8cc1Swenshuai.xi # print out each section 640*53ee8cc1Swenshuai.xi $lineprefix=" "; 641*53ee8cc1Swenshuai.xi foreach $section (@{$args{'sectionlist'}}) { 642*53ee8cc1Swenshuai.xi print "<refsect1>\n"; 643*53ee8cc1Swenshuai.xi print "<title>$section</title>\n"; 644*53ee8cc1Swenshuai.xi if ($section =~ m/EXAMPLE/i) { 645*53ee8cc1Swenshuai.xi print "<informalexample><programlisting>\n"; 646*53ee8cc1Swenshuai.xi } else { 647*53ee8cc1Swenshuai.xi print "<para>\n"; 648*53ee8cc1Swenshuai.xi } 649*53ee8cc1Swenshuai.xi output_highlight($args{'sections'}{$section}); 650*53ee8cc1Swenshuai.xi if ($section =~ m/EXAMPLE/i) { 651*53ee8cc1Swenshuai.xi print "</programlisting></informalexample>\n"; 652*53ee8cc1Swenshuai.xi } else { 653*53ee8cc1Swenshuai.xi print "</para>\n"; 654*53ee8cc1Swenshuai.xi } 655*53ee8cc1Swenshuai.xi print "</refsect1>\n"; 656*53ee8cc1Swenshuai.xi } 657*53ee8cc1Swenshuai.xi} 658*53ee8cc1Swenshuai.xi 659*53ee8cc1Swenshuai.xi# output function in XML DocBook 660*53ee8cc1Swenshuai.xisub output_function_xml(%) { 661*53ee8cc1Swenshuai.xi my %args = %{$_[0]}; 662*53ee8cc1Swenshuai.xi my ($parameter, $section); 663*53ee8cc1Swenshuai.xi my $count; 664*53ee8cc1Swenshuai.xi my $id; 665*53ee8cc1Swenshuai.xi 666*53ee8cc1Swenshuai.xi $id = "API-" . $args{'function'}; 667*53ee8cc1Swenshuai.xi $id =~ s/[^A-Za-z0-9]/-/g; 668*53ee8cc1Swenshuai.xi 669*53ee8cc1Swenshuai.xi print "<refentry id=\"$id\">\n"; 670*53ee8cc1Swenshuai.xi print "<refentryinfo>\n"; 671*53ee8cc1Swenshuai.xi print " <title>LINUX</title>\n"; 672*53ee8cc1Swenshuai.xi print " <productname>Kernel Hackers Manual</productname>\n"; 673*53ee8cc1Swenshuai.xi print " <date>$man_date</date>\n"; 674*53ee8cc1Swenshuai.xi print "</refentryinfo>\n"; 675*53ee8cc1Swenshuai.xi print "<refmeta>\n"; 676*53ee8cc1Swenshuai.xi print " <refentrytitle><phrase>" . $args{'function'} . "</phrase></refentrytitle>\n"; 677*53ee8cc1Swenshuai.xi print " <manvolnum>9</manvolnum>\n"; 678*53ee8cc1Swenshuai.xi print " <refmiscinfo class=\"version\">" . $kernelversion . "</refmiscinfo>\n"; 679*53ee8cc1Swenshuai.xi print "</refmeta>\n"; 680*53ee8cc1Swenshuai.xi print "<refnamediv>\n"; 681*53ee8cc1Swenshuai.xi print " <refname>" . $args{'function'} . "</refname>\n"; 682*53ee8cc1Swenshuai.xi print " <refpurpose>\n"; 683*53ee8cc1Swenshuai.xi print " "; 684*53ee8cc1Swenshuai.xi output_highlight ($args{'purpose'}); 685*53ee8cc1Swenshuai.xi print " </refpurpose>\n"; 686*53ee8cc1Swenshuai.xi print "</refnamediv>\n"; 687*53ee8cc1Swenshuai.xi 688*53ee8cc1Swenshuai.xi print "<refsynopsisdiv>\n"; 689*53ee8cc1Swenshuai.xi print " <title>Synopsis</title>\n"; 690*53ee8cc1Swenshuai.xi print " <funcsynopsis><funcprototype>\n"; 691*53ee8cc1Swenshuai.xi print " <funcdef>" . $args{'functiontype'} . " "; 692*53ee8cc1Swenshuai.xi print "<function>" . $args{'function'} . " </function></funcdef>\n"; 693*53ee8cc1Swenshuai.xi 694*53ee8cc1Swenshuai.xi $count = 0; 695*53ee8cc1Swenshuai.xi if ($#{$args{'parameterlist'}} >= 0) { 696*53ee8cc1Swenshuai.xi foreach $parameter (@{$args{'parameterlist'}}) { 697*53ee8cc1Swenshuai.xi $type = $args{'parametertypes'}{$parameter}; 698*53ee8cc1Swenshuai.xi if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) { 699*53ee8cc1Swenshuai.xi # pointer-to-function 700*53ee8cc1Swenshuai.xi print " <paramdef>$1<parameter>$parameter</parameter>)\n"; 701*53ee8cc1Swenshuai.xi print " <funcparams>$2</funcparams></paramdef>\n"; 702*53ee8cc1Swenshuai.xi } else { 703*53ee8cc1Swenshuai.xi print " <paramdef>" . $type; 704*53ee8cc1Swenshuai.xi print " <parameter>$parameter</parameter></paramdef>\n"; 705*53ee8cc1Swenshuai.xi } 706*53ee8cc1Swenshuai.xi } 707*53ee8cc1Swenshuai.xi } else { 708*53ee8cc1Swenshuai.xi print " <void/>\n"; 709*53ee8cc1Swenshuai.xi } 710*53ee8cc1Swenshuai.xi print " </funcprototype></funcsynopsis>\n"; 711*53ee8cc1Swenshuai.xi print "</refsynopsisdiv>\n"; 712*53ee8cc1Swenshuai.xi 713*53ee8cc1Swenshuai.xi # print parameters 714*53ee8cc1Swenshuai.xi print "<refsect1>\n <title>Arguments</title>\n"; 715*53ee8cc1Swenshuai.xi if ($#{$args{'parameterlist'}} >= 0) { 716*53ee8cc1Swenshuai.xi print " <variablelist>\n"; 717*53ee8cc1Swenshuai.xi foreach $parameter (@{$args{'parameterlist'}}) { 718*53ee8cc1Swenshuai.xi my $parameter_name = $parameter; 719*53ee8cc1Swenshuai.xi $parameter_name =~ s/\[.*//; 720*53ee8cc1Swenshuai.xi 721*53ee8cc1Swenshuai.xi print " <varlistentry>\n <term><parameter>$parameter</parameter></term>\n"; 722*53ee8cc1Swenshuai.xi print " <listitem>\n <para>\n"; 723*53ee8cc1Swenshuai.xi $lineprefix=" "; 724*53ee8cc1Swenshuai.xi output_highlight($args{'parameterdescs'}{$parameter_name}); 725*53ee8cc1Swenshuai.xi print " </para>\n </listitem>\n </varlistentry>\n"; 726*53ee8cc1Swenshuai.xi } 727*53ee8cc1Swenshuai.xi print " </variablelist>\n"; 728*53ee8cc1Swenshuai.xi } else { 729*53ee8cc1Swenshuai.xi print " <para>\n None\n </para>\n"; 730*53ee8cc1Swenshuai.xi } 731*53ee8cc1Swenshuai.xi print "</refsect1>\n"; 732*53ee8cc1Swenshuai.xi 733*53ee8cc1Swenshuai.xi output_section_xml(@_); 734*53ee8cc1Swenshuai.xi print "</refentry>\n\n"; 735*53ee8cc1Swenshuai.xi} 736*53ee8cc1Swenshuai.xi 737*53ee8cc1Swenshuai.xi# output struct in XML DocBook 738*53ee8cc1Swenshuai.xisub output_struct_xml(%) { 739*53ee8cc1Swenshuai.xi my %args = %{$_[0]}; 740*53ee8cc1Swenshuai.xi my ($parameter, $section); 741*53ee8cc1Swenshuai.xi my $id; 742*53ee8cc1Swenshuai.xi 743*53ee8cc1Swenshuai.xi $id = "API-struct-" . $args{'struct'}; 744*53ee8cc1Swenshuai.xi $id =~ s/[^A-Za-z0-9]/-/g; 745*53ee8cc1Swenshuai.xi 746*53ee8cc1Swenshuai.xi print "<refentry id=\"$id\">\n"; 747*53ee8cc1Swenshuai.xi print "<refentryinfo>\n"; 748*53ee8cc1Swenshuai.xi print " <title>LINUX</title>\n"; 749*53ee8cc1Swenshuai.xi print " <productname>Kernel Hackers Manual</productname>\n"; 750*53ee8cc1Swenshuai.xi print " <date>$man_date</date>\n"; 751*53ee8cc1Swenshuai.xi print "</refentryinfo>\n"; 752*53ee8cc1Swenshuai.xi print "<refmeta>\n"; 753*53ee8cc1Swenshuai.xi print " <refentrytitle><phrase>" . $args{'type'} . " " . $args{'struct'} . "</phrase></refentrytitle>\n"; 754*53ee8cc1Swenshuai.xi print " <manvolnum>9</manvolnum>\n"; 755*53ee8cc1Swenshuai.xi print " <refmiscinfo class=\"version\">" . $kernelversion . "</refmiscinfo>\n"; 756*53ee8cc1Swenshuai.xi print "</refmeta>\n"; 757*53ee8cc1Swenshuai.xi print "<refnamediv>\n"; 758*53ee8cc1Swenshuai.xi print " <refname>" . $args{'type'} . " " . $args{'struct'} . "</refname>\n"; 759*53ee8cc1Swenshuai.xi print " <refpurpose>\n"; 760*53ee8cc1Swenshuai.xi print " "; 761*53ee8cc1Swenshuai.xi output_highlight ($args{'purpose'}); 762*53ee8cc1Swenshuai.xi print " </refpurpose>\n"; 763*53ee8cc1Swenshuai.xi print "</refnamediv>\n"; 764*53ee8cc1Swenshuai.xi 765*53ee8cc1Swenshuai.xi print "<refsynopsisdiv>\n"; 766*53ee8cc1Swenshuai.xi print " <title>Synopsis</title>\n"; 767*53ee8cc1Swenshuai.xi print " <programlisting>\n"; 768*53ee8cc1Swenshuai.xi print $args{'type'} . " " . $args{'struct'} . " {\n"; 769*53ee8cc1Swenshuai.xi foreach $parameter (@{$args{'parameterlist'}}) { 770*53ee8cc1Swenshuai.xi if ($parameter =~ /^#/) { 771*53ee8cc1Swenshuai.xi my $prm = $parameter; 772*53ee8cc1Swenshuai.xi # convert data read & converted thru xml_escape() into &xyz; format: 773*53ee8cc1Swenshuai.xi # This allows us to have #define macros interspersed in a struct. 774*53ee8cc1Swenshuai.xi $prm =~ s/\\\\\\/\&/g; 775*53ee8cc1Swenshuai.xi print "$prm\n"; 776*53ee8cc1Swenshuai.xi next; 777*53ee8cc1Swenshuai.xi } 778*53ee8cc1Swenshuai.xi 779*53ee8cc1Swenshuai.xi my $parameter_name = $parameter; 780*53ee8cc1Swenshuai.xi $parameter_name =~ s/\[.*//; 781*53ee8cc1Swenshuai.xi 782*53ee8cc1Swenshuai.xi defined($args{'parameterdescs'}{$parameter_name}) || next; 783*53ee8cc1Swenshuai.xi ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next; 784*53ee8cc1Swenshuai.xi $type = $args{'parametertypes'}{$parameter}; 785*53ee8cc1Swenshuai.xi if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) { 786*53ee8cc1Swenshuai.xi # pointer-to-function 787*53ee8cc1Swenshuai.xi print " $1 $parameter) ($2);\n"; 788*53ee8cc1Swenshuai.xi } elsif ($type =~ m/^(.*?)\s*(:.*)/) { 789*53ee8cc1Swenshuai.xi # bitfield 790*53ee8cc1Swenshuai.xi print " $1 $parameter$2;\n"; 791*53ee8cc1Swenshuai.xi } else { 792*53ee8cc1Swenshuai.xi print " " . $type . " " . $parameter . ";\n"; 793*53ee8cc1Swenshuai.xi } 794*53ee8cc1Swenshuai.xi } 795*53ee8cc1Swenshuai.xi print "};"; 796*53ee8cc1Swenshuai.xi print " </programlisting>\n"; 797*53ee8cc1Swenshuai.xi print "</refsynopsisdiv>\n"; 798*53ee8cc1Swenshuai.xi 799*53ee8cc1Swenshuai.xi print " <refsect1>\n"; 800*53ee8cc1Swenshuai.xi print " <title>Members</title>\n"; 801*53ee8cc1Swenshuai.xi 802*53ee8cc1Swenshuai.xi if ($#{$args{'parameterlist'}} >= 0) { 803*53ee8cc1Swenshuai.xi print " <variablelist>\n"; 804*53ee8cc1Swenshuai.xi foreach $parameter (@{$args{'parameterlist'}}) { 805*53ee8cc1Swenshuai.xi ($parameter =~ /^#/) && next; 806*53ee8cc1Swenshuai.xi 807*53ee8cc1Swenshuai.xi my $parameter_name = $parameter; 808*53ee8cc1Swenshuai.xi $parameter_name =~ s/\[.*//; 809*53ee8cc1Swenshuai.xi 810*53ee8cc1Swenshuai.xi defined($args{'parameterdescs'}{$parameter_name}) || next; 811*53ee8cc1Swenshuai.xi ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next; 812*53ee8cc1Swenshuai.xi print " <varlistentry>"; 813*53ee8cc1Swenshuai.xi print " <term>$parameter</term>\n"; 814*53ee8cc1Swenshuai.xi print " <listitem><para>\n"; 815*53ee8cc1Swenshuai.xi output_highlight($args{'parameterdescs'}{$parameter_name}); 816*53ee8cc1Swenshuai.xi print " </para></listitem>\n"; 817*53ee8cc1Swenshuai.xi print " </varlistentry>\n"; 818*53ee8cc1Swenshuai.xi } 819*53ee8cc1Swenshuai.xi print " </variablelist>\n"; 820*53ee8cc1Swenshuai.xi } else { 821*53ee8cc1Swenshuai.xi print " <para>\n None\n </para>\n"; 822*53ee8cc1Swenshuai.xi } 823*53ee8cc1Swenshuai.xi print " </refsect1>\n"; 824*53ee8cc1Swenshuai.xi 825*53ee8cc1Swenshuai.xi output_section_xml(@_); 826*53ee8cc1Swenshuai.xi 827*53ee8cc1Swenshuai.xi print "</refentry>\n\n"; 828*53ee8cc1Swenshuai.xi} 829*53ee8cc1Swenshuai.xi 830*53ee8cc1Swenshuai.xi# output enum in XML DocBook 831*53ee8cc1Swenshuai.xisub output_enum_xml(%) { 832*53ee8cc1Swenshuai.xi my %args = %{$_[0]}; 833*53ee8cc1Swenshuai.xi my ($parameter, $section); 834*53ee8cc1Swenshuai.xi my $count; 835*53ee8cc1Swenshuai.xi my $id; 836*53ee8cc1Swenshuai.xi 837*53ee8cc1Swenshuai.xi $id = "API-enum-" . $args{'enum'}; 838*53ee8cc1Swenshuai.xi $id =~ s/[^A-Za-z0-9]/-/g; 839*53ee8cc1Swenshuai.xi 840*53ee8cc1Swenshuai.xi print "<refentry id=\"$id\">\n"; 841*53ee8cc1Swenshuai.xi print "<refentryinfo>\n"; 842*53ee8cc1Swenshuai.xi print " <title>LINUX</title>\n"; 843*53ee8cc1Swenshuai.xi print " <productname>Kernel Hackers Manual</productname>\n"; 844*53ee8cc1Swenshuai.xi print " <date>$man_date</date>\n"; 845*53ee8cc1Swenshuai.xi print "</refentryinfo>\n"; 846*53ee8cc1Swenshuai.xi print "<refmeta>\n"; 847*53ee8cc1Swenshuai.xi print " <refentrytitle><phrase>enum " . $args{'enum'} . "</phrase></refentrytitle>\n"; 848*53ee8cc1Swenshuai.xi print " <manvolnum>9</manvolnum>\n"; 849*53ee8cc1Swenshuai.xi print " <refmiscinfo class=\"version\">" . $kernelversion . "</refmiscinfo>\n"; 850*53ee8cc1Swenshuai.xi print "</refmeta>\n"; 851*53ee8cc1Swenshuai.xi print "<refnamediv>\n"; 852*53ee8cc1Swenshuai.xi print " <refname>enum " . $args{'enum'} . "</refname>\n"; 853*53ee8cc1Swenshuai.xi print " <refpurpose>\n"; 854*53ee8cc1Swenshuai.xi print " "; 855*53ee8cc1Swenshuai.xi output_highlight ($args{'purpose'}); 856*53ee8cc1Swenshuai.xi print " </refpurpose>\n"; 857*53ee8cc1Swenshuai.xi print "</refnamediv>\n"; 858*53ee8cc1Swenshuai.xi 859*53ee8cc1Swenshuai.xi print "<refsynopsisdiv>\n"; 860*53ee8cc1Swenshuai.xi print " <title>Synopsis</title>\n"; 861*53ee8cc1Swenshuai.xi print " <programlisting>\n"; 862*53ee8cc1Swenshuai.xi print "enum " . $args{'enum'} . " {\n"; 863*53ee8cc1Swenshuai.xi $count = 0; 864*53ee8cc1Swenshuai.xi foreach $parameter (@{$args{'parameterlist'}}) { 865*53ee8cc1Swenshuai.xi print " $parameter"; 866*53ee8cc1Swenshuai.xi if ($count != $#{$args{'parameterlist'}}) { 867*53ee8cc1Swenshuai.xi $count++; 868*53ee8cc1Swenshuai.xi print ","; 869*53ee8cc1Swenshuai.xi } 870*53ee8cc1Swenshuai.xi print "\n"; 871*53ee8cc1Swenshuai.xi } 872*53ee8cc1Swenshuai.xi print "};"; 873*53ee8cc1Swenshuai.xi print " </programlisting>\n"; 874*53ee8cc1Swenshuai.xi print "</refsynopsisdiv>\n"; 875*53ee8cc1Swenshuai.xi 876*53ee8cc1Swenshuai.xi print "<refsect1>\n"; 877*53ee8cc1Swenshuai.xi print " <title>Constants</title>\n"; 878*53ee8cc1Swenshuai.xi print " <variablelist>\n"; 879*53ee8cc1Swenshuai.xi foreach $parameter (@{$args{'parameterlist'}}) { 880*53ee8cc1Swenshuai.xi my $parameter_name = $parameter; 881*53ee8cc1Swenshuai.xi $parameter_name =~ s/\[.*//; 882*53ee8cc1Swenshuai.xi 883*53ee8cc1Swenshuai.xi print " <varlistentry>"; 884*53ee8cc1Swenshuai.xi print " <term>$parameter</term>\n"; 885*53ee8cc1Swenshuai.xi print " <listitem><para>\n"; 886*53ee8cc1Swenshuai.xi output_highlight($args{'parameterdescs'}{$parameter_name}); 887*53ee8cc1Swenshuai.xi print " </para></listitem>\n"; 888*53ee8cc1Swenshuai.xi print " </varlistentry>\n"; 889*53ee8cc1Swenshuai.xi } 890*53ee8cc1Swenshuai.xi print " </variablelist>\n"; 891*53ee8cc1Swenshuai.xi print "</refsect1>\n"; 892*53ee8cc1Swenshuai.xi 893*53ee8cc1Swenshuai.xi output_section_xml(@_); 894*53ee8cc1Swenshuai.xi 895*53ee8cc1Swenshuai.xi print "</refentry>\n\n"; 896*53ee8cc1Swenshuai.xi} 897*53ee8cc1Swenshuai.xi 898*53ee8cc1Swenshuai.xi# output typedef in XML DocBook 899*53ee8cc1Swenshuai.xisub output_typedef_xml(%) { 900*53ee8cc1Swenshuai.xi my %args = %{$_[0]}; 901*53ee8cc1Swenshuai.xi my ($parameter, $section); 902*53ee8cc1Swenshuai.xi my $id; 903*53ee8cc1Swenshuai.xi 904*53ee8cc1Swenshuai.xi $id = "API-typedef-" . $args{'typedef'}; 905*53ee8cc1Swenshuai.xi $id =~ s/[^A-Za-z0-9]/-/g; 906*53ee8cc1Swenshuai.xi 907*53ee8cc1Swenshuai.xi print "<refentry id=\"$id\">\n"; 908*53ee8cc1Swenshuai.xi print "<refentryinfo>\n"; 909*53ee8cc1Swenshuai.xi print " <title>LINUX</title>\n"; 910*53ee8cc1Swenshuai.xi print " <productname>Kernel Hackers Manual</productname>\n"; 911*53ee8cc1Swenshuai.xi print " <date>$man_date</date>\n"; 912*53ee8cc1Swenshuai.xi print "</refentryinfo>\n"; 913*53ee8cc1Swenshuai.xi print "<refmeta>\n"; 914*53ee8cc1Swenshuai.xi print " <refentrytitle><phrase>typedef " . $args{'typedef'} . "</phrase></refentrytitle>\n"; 915*53ee8cc1Swenshuai.xi print " <manvolnum>9</manvolnum>\n"; 916*53ee8cc1Swenshuai.xi print "</refmeta>\n"; 917*53ee8cc1Swenshuai.xi print "<refnamediv>\n"; 918*53ee8cc1Swenshuai.xi print " <refname>typedef " . $args{'typedef'} . "</refname>\n"; 919*53ee8cc1Swenshuai.xi print " <refpurpose>\n"; 920*53ee8cc1Swenshuai.xi print " "; 921*53ee8cc1Swenshuai.xi output_highlight ($args{'purpose'}); 922*53ee8cc1Swenshuai.xi print " </refpurpose>\n"; 923*53ee8cc1Swenshuai.xi print "</refnamediv>\n"; 924*53ee8cc1Swenshuai.xi 925*53ee8cc1Swenshuai.xi print "<refsynopsisdiv>\n"; 926*53ee8cc1Swenshuai.xi print " <title>Synopsis</title>\n"; 927*53ee8cc1Swenshuai.xi print " <synopsis>typedef " . $args{'typedef'} . ";</synopsis>\n"; 928*53ee8cc1Swenshuai.xi print "</refsynopsisdiv>\n"; 929*53ee8cc1Swenshuai.xi 930*53ee8cc1Swenshuai.xi output_section_xml(@_); 931*53ee8cc1Swenshuai.xi 932*53ee8cc1Swenshuai.xi print "</refentry>\n\n"; 933*53ee8cc1Swenshuai.xi} 934*53ee8cc1Swenshuai.xi 935*53ee8cc1Swenshuai.xi# output in XML DocBook 936*53ee8cc1Swenshuai.xisub output_blockhead_xml(%) { 937*53ee8cc1Swenshuai.xi my %args = %{$_[0]}; 938*53ee8cc1Swenshuai.xi my ($parameter, $section); 939*53ee8cc1Swenshuai.xi my $count; 940*53ee8cc1Swenshuai.xi 941*53ee8cc1Swenshuai.xi my $id = $args{'module'}; 942*53ee8cc1Swenshuai.xi $id =~ s/[^A-Za-z0-9]/-/g; 943*53ee8cc1Swenshuai.xi 944*53ee8cc1Swenshuai.xi # print out each section 945*53ee8cc1Swenshuai.xi $lineprefix=" "; 946*53ee8cc1Swenshuai.xi foreach $section (@{$args{'sectionlist'}}) { 947*53ee8cc1Swenshuai.xi if (!$args{'content-only'}) { 948*53ee8cc1Swenshuai.xi print "<refsect1>\n <title>$section</title>\n"; 949*53ee8cc1Swenshuai.xi } 950*53ee8cc1Swenshuai.xi if ($section =~ m/EXAMPLE/i) { 951*53ee8cc1Swenshuai.xi print "<example><para>\n"; 952*53ee8cc1Swenshuai.xi } else { 953*53ee8cc1Swenshuai.xi print "<para>\n"; 954*53ee8cc1Swenshuai.xi } 955*53ee8cc1Swenshuai.xi output_highlight($args{'sections'}{$section}); 956*53ee8cc1Swenshuai.xi if ($section =~ m/EXAMPLE/i) { 957*53ee8cc1Swenshuai.xi print "</para></example>\n"; 958*53ee8cc1Swenshuai.xi } else { 959*53ee8cc1Swenshuai.xi print "</para>"; 960*53ee8cc1Swenshuai.xi } 961*53ee8cc1Swenshuai.xi if (!$args{'content-only'}) { 962*53ee8cc1Swenshuai.xi print "\n</refsect1>\n"; 963*53ee8cc1Swenshuai.xi } 964*53ee8cc1Swenshuai.xi } 965*53ee8cc1Swenshuai.xi 966*53ee8cc1Swenshuai.xi print "\n\n"; 967*53ee8cc1Swenshuai.xi} 968*53ee8cc1Swenshuai.xi 969*53ee8cc1Swenshuai.xi# output in XML DocBook 970*53ee8cc1Swenshuai.xisub output_function_gnome { 971*53ee8cc1Swenshuai.xi my %args = %{$_[0]}; 972*53ee8cc1Swenshuai.xi my ($parameter, $section); 973*53ee8cc1Swenshuai.xi my $count; 974*53ee8cc1Swenshuai.xi my $id; 975*53ee8cc1Swenshuai.xi 976*53ee8cc1Swenshuai.xi $id = $args{'module'} . "-" . $args{'function'}; 977*53ee8cc1Swenshuai.xi $id =~ s/[^A-Za-z0-9]/-/g; 978*53ee8cc1Swenshuai.xi 979*53ee8cc1Swenshuai.xi print "<sect2>\n"; 980*53ee8cc1Swenshuai.xi print " <title id=\"$id\">" . $args{'function'} . "</title>\n"; 981*53ee8cc1Swenshuai.xi 982*53ee8cc1Swenshuai.xi print " <funcsynopsis>\n"; 983*53ee8cc1Swenshuai.xi print " <funcdef>" . $args{'functiontype'} . " "; 984*53ee8cc1Swenshuai.xi print "<function>" . $args{'function'} . " "; 985*53ee8cc1Swenshuai.xi print "</function></funcdef>\n"; 986*53ee8cc1Swenshuai.xi 987*53ee8cc1Swenshuai.xi $count = 0; 988*53ee8cc1Swenshuai.xi if ($#{$args{'parameterlist'}} >= 0) { 989*53ee8cc1Swenshuai.xi foreach $parameter (@{$args{'parameterlist'}}) { 990*53ee8cc1Swenshuai.xi $type = $args{'parametertypes'}{$parameter}; 991*53ee8cc1Swenshuai.xi if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) { 992*53ee8cc1Swenshuai.xi # pointer-to-function 993*53ee8cc1Swenshuai.xi print " <paramdef>$1 <parameter>$parameter</parameter>)\n"; 994*53ee8cc1Swenshuai.xi print " <funcparams>$2</funcparams></paramdef>\n"; 995*53ee8cc1Swenshuai.xi } else { 996*53ee8cc1Swenshuai.xi print " <paramdef>" . $type; 997*53ee8cc1Swenshuai.xi print " <parameter>$parameter</parameter></paramdef>\n"; 998*53ee8cc1Swenshuai.xi } 999*53ee8cc1Swenshuai.xi } 1000*53ee8cc1Swenshuai.xi } else { 1001*53ee8cc1Swenshuai.xi print " <void>\n"; 1002*53ee8cc1Swenshuai.xi } 1003*53ee8cc1Swenshuai.xi print " </funcsynopsis>\n"; 1004*53ee8cc1Swenshuai.xi if ($#{$args{'parameterlist'}} >= 0) { 1005*53ee8cc1Swenshuai.xi print " <informaltable pgwide=\"1\" frame=\"none\" role=\"params\">\n"; 1006*53ee8cc1Swenshuai.xi print "<tgroup cols=\"2\">\n"; 1007*53ee8cc1Swenshuai.xi print "<colspec colwidth=\"2*\">\n"; 1008*53ee8cc1Swenshuai.xi print "<colspec colwidth=\"8*\">\n"; 1009*53ee8cc1Swenshuai.xi print "<tbody>\n"; 1010*53ee8cc1Swenshuai.xi foreach $parameter (@{$args{'parameterlist'}}) { 1011*53ee8cc1Swenshuai.xi my $parameter_name = $parameter; 1012*53ee8cc1Swenshuai.xi $parameter_name =~ s/\[.*//; 1013*53ee8cc1Swenshuai.xi 1014*53ee8cc1Swenshuai.xi print " <row><entry align=\"right\"><parameter>$parameter</parameter></entry>\n"; 1015*53ee8cc1Swenshuai.xi print " <entry>\n"; 1016*53ee8cc1Swenshuai.xi $lineprefix=" "; 1017*53ee8cc1Swenshuai.xi output_highlight($args{'parameterdescs'}{$parameter_name}); 1018*53ee8cc1Swenshuai.xi print " </entry></row>\n"; 1019*53ee8cc1Swenshuai.xi } 1020*53ee8cc1Swenshuai.xi print " </tbody></tgroup></informaltable>\n"; 1021*53ee8cc1Swenshuai.xi } else { 1022*53ee8cc1Swenshuai.xi print " <para>\n None\n </para>\n"; 1023*53ee8cc1Swenshuai.xi } 1024*53ee8cc1Swenshuai.xi 1025*53ee8cc1Swenshuai.xi # print out each section 1026*53ee8cc1Swenshuai.xi $lineprefix=" "; 1027*53ee8cc1Swenshuai.xi foreach $section (@{$args{'sectionlist'}}) { 1028*53ee8cc1Swenshuai.xi print "<simplesect>\n <title>$section</title>\n"; 1029*53ee8cc1Swenshuai.xi if ($section =~ m/EXAMPLE/i) { 1030*53ee8cc1Swenshuai.xi print "<example><programlisting>\n"; 1031*53ee8cc1Swenshuai.xi } else { 1032*53ee8cc1Swenshuai.xi } 1033*53ee8cc1Swenshuai.xi print "<para>\n"; 1034*53ee8cc1Swenshuai.xi output_highlight($args{'sections'}{$section}); 1035*53ee8cc1Swenshuai.xi print "</para>\n"; 1036*53ee8cc1Swenshuai.xi if ($section =~ m/EXAMPLE/i) { 1037*53ee8cc1Swenshuai.xi print "</programlisting></example>\n"; 1038*53ee8cc1Swenshuai.xi } else { 1039*53ee8cc1Swenshuai.xi } 1040*53ee8cc1Swenshuai.xi print " </simplesect>\n"; 1041*53ee8cc1Swenshuai.xi } 1042*53ee8cc1Swenshuai.xi 1043*53ee8cc1Swenshuai.xi print "</sect2>\n\n"; 1044*53ee8cc1Swenshuai.xi} 1045*53ee8cc1Swenshuai.xi 1046*53ee8cc1Swenshuai.xi## 1047*53ee8cc1Swenshuai.xi# output function in man 1048*53ee8cc1Swenshuai.xisub output_function_man(%) { 1049*53ee8cc1Swenshuai.xi my %args = %{$_[0]}; 1050*53ee8cc1Swenshuai.xi my ($parameter, $section); 1051*53ee8cc1Swenshuai.xi my $count; 1052*53ee8cc1Swenshuai.xi 1053*53ee8cc1Swenshuai.xi print ".TH \"$args{'function'}\" 9 \"$args{'function'}\" \"$man_date\" \"Kernel Hacker's Manual\" LINUX\n"; 1054*53ee8cc1Swenshuai.xi 1055*53ee8cc1Swenshuai.xi print ".SH NAME\n"; 1056*53ee8cc1Swenshuai.xi print $args{'function'} . " \\- " . $args{'purpose'} . "\n"; 1057*53ee8cc1Swenshuai.xi 1058*53ee8cc1Swenshuai.xi print ".SH SYNOPSIS\n"; 1059*53ee8cc1Swenshuai.xi if ($args{'functiontype'} ne "") { 1060*53ee8cc1Swenshuai.xi print ".B \"" . $args{'functiontype'} . "\" " . $args{'function'} . "\n"; 1061*53ee8cc1Swenshuai.xi } else { 1062*53ee8cc1Swenshuai.xi print ".B \"" . $args{'function'} . "\n"; 1063*53ee8cc1Swenshuai.xi } 1064*53ee8cc1Swenshuai.xi $count = 0; 1065*53ee8cc1Swenshuai.xi my $parenth = "("; 1066*53ee8cc1Swenshuai.xi my $post = ","; 1067*53ee8cc1Swenshuai.xi foreach my $parameter (@{$args{'parameterlist'}}) { 1068*53ee8cc1Swenshuai.xi if ($count == $#{$args{'parameterlist'}}) { 1069*53ee8cc1Swenshuai.xi $post = ");"; 1070*53ee8cc1Swenshuai.xi } 1071*53ee8cc1Swenshuai.xi $type = $args{'parametertypes'}{$parameter}; 1072*53ee8cc1Swenshuai.xi if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) { 1073*53ee8cc1Swenshuai.xi # pointer-to-function 1074*53ee8cc1Swenshuai.xi print ".BI \"" . $parenth . $1 . "\" " . $parameter . " \") (" . $2 . ")" . $post . "\"\n"; 1075*53ee8cc1Swenshuai.xi } else { 1076*53ee8cc1Swenshuai.xi $type =~ s/([^\*])$/$1 /; 1077*53ee8cc1Swenshuai.xi print ".BI \"" . $parenth . $type . "\" " . $parameter . " \"" . $post . "\"\n"; 1078*53ee8cc1Swenshuai.xi } 1079*53ee8cc1Swenshuai.xi $count++; 1080*53ee8cc1Swenshuai.xi $parenth = ""; 1081*53ee8cc1Swenshuai.xi } 1082*53ee8cc1Swenshuai.xi 1083*53ee8cc1Swenshuai.xi print ".SH ARGUMENTS\n"; 1084*53ee8cc1Swenshuai.xi foreach $parameter (@{$args{'parameterlist'}}) { 1085*53ee8cc1Swenshuai.xi my $parameter_name = $parameter; 1086*53ee8cc1Swenshuai.xi $parameter_name =~ s/\[.*//; 1087*53ee8cc1Swenshuai.xi 1088*53ee8cc1Swenshuai.xi print ".IP \"" . $parameter . "\" 12\n"; 1089*53ee8cc1Swenshuai.xi output_highlight($args{'parameterdescs'}{$parameter_name}); 1090*53ee8cc1Swenshuai.xi } 1091*53ee8cc1Swenshuai.xi foreach $section (@{$args{'sectionlist'}}) { 1092*53ee8cc1Swenshuai.xi print ".SH \"", uc $section, "\"\n"; 1093*53ee8cc1Swenshuai.xi output_highlight($args{'sections'}{$section}); 1094*53ee8cc1Swenshuai.xi } 1095*53ee8cc1Swenshuai.xi} 1096*53ee8cc1Swenshuai.xi 1097*53ee8cc1Swenshuai.xi## 1098*53ee8cc1Swenshuai.xi# output enum in man 1099*53ee8cc1Swenshuai.xisub output_enum_man(%) { 1100*53ee8cc1Swenshuai.xi my %args = %{$_[0]}; 1101*53ee8cc1Swenshuai.xi my ($parameter, $section); 1102*53ee8cc1Swenshuai.xi my $count; 1103*53ee8cc1Swenshuai.xi 1104*53ee8cc1Swenshuai.xi print ".TH \"$args{'module'}\" 9 \"enum $args{'enum'}\" \"$man_date\" \"API Manual\" LINUX\n"; 1105*53ee8cc1Swenshuai.xi 1106*53ee8cc1Swenshuai.xi print ".SH NAME\n"; 1107*53ee8cc1Swenshuai.xi print "enum " . $args{'enum'} . " \\- " . $args{'purpose'} . "\n"; 1108*53ee8cc1Swenshuai.xi 1109*53ee8cc1Swenshuai.xi print ".SH SYNOPSIS\n"; 1110*53ee8cc1Swenshuai.xi print "enum " . $args{'enum'} . " {\n"; 1111*53ee8cc1Swenshuai.xi $count = 0; 1112*53ee8cc1Swenshuai.xi foreach my $parameter (@{$args{'parameterlist'}}) { 1113*53ee8cc1Swenshuai.xi print ".br\n.BI \" $parameter\"\n"; 1114*53ee8cc1Swenshuai.xi if ($count == $#{$args{'parameterlist'}}) { 1115*53ee8cc1Swenshuai.xi print "\n};\n"; 1116*53ee8cc1Swenshuai.xi last; 1117*53ee8cc1Swenshuai.xi } 1118*53ee8cc1Swenshuai.xi else { 1119*53ee8cc1Swenshuai.xi print ", \n.br\n"; 1120*53ee8cc1Swenshuai.xi } 1121*53ee8cc1Swenshuai.xi $count++; 1122*53ee8cc1Swenshuai.xi } 1123*53ee8cc1Swenshuai.xi 1124*53ee8cc1Swenshuai.xi print ".SH Constants\n"; 1125*53ee8cc1Swenshuai.xi foreach $parameter (@{$args{'parameterlist'}}) { 1126*53ee8cc1Swenshuai.xi my $parameter_name = $parameter; 1127*53ee8cc1Swenshuai.xi $parameter_name =~ s/\[.*//; 1128*53ee8cc1Swenshuai.xi 1129*53ee8cc1Swenshuai.xi print ".IP \"" . $parameter . "\" 12\n"; 1130*53ee8cc1Swenshuai.xi output_highlight($args{'parameterdescs'}{$parameter_name}); 1131*53ee8cc1Swenshuai.xi } 1132*53ee8cc1Swenshuai.xi foreach $section (@{$args{'sectionlist'}}) { 1133*53ee8cc1Swenshuai.xi print ".SH \"$section\"\n"; 1134*53ee8cc1Swenshuai.xi output_highlight($args{'sections'}{$section}); 1135*53ee8cc1Swenshuai.xi } 1136*53ee8cc1Swenshuai.xi} 1137*53ee8cc1Swenshuai.xi 1138*53ee8cc1Swenshuai.xi## 1139*53ee8cc1Swenshuai.xi# output struct in man 1140*53ee8cc1Swenshuai.xisub output_struct_man(%) { 1141*53ee8cc1Swenshuai.xi my %args = %{$_[0]}; 1142*53ee8cc1Swenshuai.xi my ($parameter, $section); 1143*53ee8cc1Swenshuai.xi 1144*53ee8cc1Swenshuai.xi print ".TH \"$args{'module'}\" 9 \"" . $args{'type'} . " " . $args{'struct'} . "\" \"$man_date\" \"API Manual\" LINUX\n"; 1145*53ee8cc1Swenshuai.xi 1146*53ee8cc1Swenshuai.xi print ".SH NAME\n"; 1147*53ee8cc1Swenshuai.xi print $args{'type'} . " " . $args{'struct'} . " \\- " . $args{'purpose'} . "\n"; 1148*53ee8cc1Swenshuai.xi 1149*53ee8cc1Swenshuai.xi print ".SH SYNOPSIS\n"; 1150*53ee8cc1Swenshuai.xi print $args{'type'} . " " . $args{'struct'} . " {\n.br\n"; 1151*53ee8cc1Swenshuai.xi 1152*53ee8cc1Swenshuai.xi foreach my $parameter (@{$args{'parameterlist'}}) { 1153*53ee8cc1Swenshuai.xi if ($parameter =~ /^#/) { 1154*53ee8cc1Swenshuai.xi print ".BI \"$parameter\"\n.br\n"; 1155*53ee8cc1Swenshuai.xi next; 1156*53ee8cc1Swenshuai.xi } 1157*53ee8cc1Swenshuai.xi my $parameter_name = $parameter; 1158*53ee8cc1Swenshuai.xi $parameter_name =~ s/\[.*//; 1159*53ee8cc1Swenshuai.xi 1160*53ee8cc1Swenshuai.xi ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next; 1161*53ee8cc1Swenshuai.xi $type = $args{'parametertypes'}{$parameter}; 1162*53ee8cc1Swenshuai.xi if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) { 1163*53ee8cc1Swenshuai.xi # pointer-to-function 1164*53ee8cc1Swenshuai.xi print ".BI \" " . $1 . "\" " . $parameter . " \") (" . $2 . ")" . "\"\n;\n"; 1165*53ee8cc1Swenshuai.xi } elsif ($type =~ m/^(.*?)\s*(:.*)/) { 1166*53ee8cc1Swenshuai.xi # bitfield 1167*53ee8cc1Swenshuai.xi print ".BI \" " . $1 . "\ \" " . $parameter . $2 . " \"" . "\"\n;\n"; 1168*53ee8cc1Swenshuai.xi } else { 1169*53ee8cc1Swenshuai.xi $type =~ s/([^\*])$/$1 /; 1170*53ee8cc1Swenshuai.xi print ".BI \" " . $type . "\" " . $parameter . " \"" . "\"\n;\n"; 1171*53ee8cc1Swenshuai.xi } 1172*53ee8cc1Swenshuai.xi print "\n.br\n"; 1173*53ee8cc1Swenshuai.xi } 1174*53ee8cc1Swenshuai.xi print "};\n.br\n"; 1175*53ee8cc1Swenshuai.xi 1176*53ee8cc1Swenshuai.xi print ".SH Members\n"; 1177*53ee8cc1Swenshuai.xi foreach $parameter (@{$args{'parameterlist'}}) { 1178*53ee8cc1Swenshuai.xi ($parameter =~ /^#/) && next; 1179*53ee8cc1Swenshuai.xi 1180*53ee8cc1Swenshuai.xi my $parameter_name = $parameter; 1181*53ee8cc1Swenshuai.xi $parameter_name =~ s/\[.*//; 1182*53ee8cc1Swenshuai.xi 1183*53ee8cc1Swenshuai.xi ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next; 1184*53ee8cc1Swenshuai.xi print ".IP \"" . $parameter . "\" 12\n"; 1185*53ee8cc1Swenshuai.xi output_highlight($args{'parameterdescs'}{$parameter_name}); 1186*53ee8cc1Swenshuai.xi } 1187*53ee8cc1Swenshuai.xi foreach $section (@{$args{'sectionlist'}}) { 1188*53ee8cc1Swenshuai.xi print ".SH \"$section\"\n"; 1189*53ee8cc1Swenshuai.xi output_highlight($args{'sections'}{$section}); 1190*53ee8cc1Swenshuai.xi } 1191*53ee8cc1Swenshuai.xi} 1192*53ee8cc1Swenshuai.xi 1193*53ee8cc1Swenshuai.xi## 1194*53ee8cc1Swenshuai.xi# output typedef in man 1195*53ee8cc1Swenshuai.xisub output_typedef_man(%) { 1196*53ee8cc1Swenshuai.xi my %args = %{$_[0]}; 1197*53ee8cc1Swenshuai.xi my ($parameter, $section); 1198*53ee8cc1Swenshuai.xi 1199*53ee8cc1Swenshuai.xi print ".TH \"$args{'module'}\" 9 \"$args{'typedef'}\" \"$man_date\" \"API Manual\" LINUX\n"; 1200*53ee8cc1Swenshuai.xi 1201*53ee8cc1Swenshuai.xi print ".SH NAME\n"; 1202*53ee8cc1Swenshuai.xi print "typedef " . $args{'typedef'} . " \\- " . $args{'purpose'} . "\n"; 1203*53ee8cc1Swenshuai.xi 1204*53ee8cc1Swenshuai.xi foreach $section (@{$args{'sectionlist'}}) { 1205*53ee8cc1Swenshuai.xi print ".SH \"$section\"\n"; 1206*53ee8cc1Swenshuai.xi output_highlight($args{'sections'}{$section}); 1207*53ee8cc1Swenshuai.xi } 1208*53ee8cc1Swenshuai.xi} 1209*53ee8cc1Swenshuai.xi 1210*53ee8cc1Swenshuai.xisub output_blockhead_man(%) { 1211*53ee8cc1Swenshuai.xi my %args = %{$_[0]}; 1212*53ee8cc1Swenshuai.xi my ($parameter, $section); 1213*53ee8cc1Swenshuai.xi my $count; 1214*53ee8cc1Swenshuai.xi 1215*53ee8cc1Swenshuai.xi print ".TH \"$args{'module'}\" 9 \"$args{'module'}\" \"$man_date\" \"API Manual\" LINUX\n"; 1216*53ee8cc1Swenshuai.xi 1217*53ee8cc1Swenshuai.xi foreach $section (@{$args{'sectionlist'}}) { 1218*53ee8cc1Swenshuai.xi print ".SH \"$section\"\n"; 1219*53ee8cc1Swenshuai.xi output_highlight($args{'sections'}{$section}); 1220*53ee8cc1Swenshuai.xi } 1221*53ee8cc1Swenshuai.xi} 1222*53ee8cc1Swenshuai.xi 1223*53ee8cc1Swenshuai.xi## 1224*53ee8cc1Swenshuai.xi# output in text 1225*53ee8cc1Swenshuai.xisub output_function_text(%) { 1226*53ee8cc1Swenshuai.xi my %args = %{$_[0]}; 1227*53ee8cc1Swenshuai.xi my ($parameter, $section); 1228*53ee8cc1Swenshuai.xi my $start; 1229*53ee8cc1Swenshuai.xi 1230*53ee8cc1Swenshuai.xi print "Name:\n\n"; 1231*53ee8cc1Swenshuai.xi print $args{'function'} . " - " . $args{'purpose'} . "\n"; 1232*53ee8cc1Swenshuai.xi 1233*53ee8cc1Swenshuai.xi print "\nSynopsis:\n\n"; 1234*53ee8cc1Swenshuai.xi if ($args{'functiontype'} ne "") { 1235*53ee8cc1Swenshuai.xi $start = $args{'functiontype'} . " " . $args{'function'} . " ("; 1236*53ee8cc1Swenshuai.xi } else { 1237*53ee8cc1Swenshuai.xi $start = $args{'function'} . " ("; 1238*53ee8cc1Swenshuai.xi } 1239*53ee8cc1Swenshuai.xi print $start; 1240*53ee8cc1Swenshuai.xi 1241*53ee8cc1Swenshuai.xi my $count = 0; 1242*53ee8cc1Swenshuai.xi foreach my $parameter (@{$args{'parameterlist'}}) { 1243*53ee8cc1Swenshuai.xi $type = $args{'parametertypes'}{$parameter}; 1244*53ee8cc1Swenshuai.xi if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) { 1245*53ee8cc1Swenshuai.xi # pointer-to-function 1246*53ee8cc1Swenshuai.xi print $1 . $parameter . ") (" . $2; 1247*53ee8cc1Swenshuai.xi } else { 1248*53ee8cc1Swenshuai.xi print $type . " " . $parameter; 1249*53ee8cc1Swenshuai.xi } 1250*53ee8cc1Swenshuai.xi if ($count != $#{$args{'parameterlist'}}) { 1251*53ee8cc1Swenshuai.xi $count++; 1252*53ee8cc1Swenshuai.xi print ",\n"; 1253*53ee8cc1Swenshuai.xi print " " x length($start); 1254*53ee8cc1Swenshuai.xi } else { 1255*53ee8cc1Swenshuai.xi print ");\n\n"; 1256*53ee8cc1Swenshuai.xi } 1257*53ee8cc1Swenshuai.xi } 1258*53ee8cc1Swenshuai.xi 1259*53ee8cc1Swenshuai.xi print "Arguments:\n\n"; 1260*53ee8cc1Swenshuai.xi foreach $parameter (@{$args{'parameterlist'}}) { 1261*53ee8cc1Swenshuai.xi my $parameter_name = $parameter; 1262*53ee8cc1Swenshuai.xi $parameter_name =~ s/\[.*//; 1263*53ee8cc1Swenshuai.xi 1264*53ee8cc1Swenshuai.xi print $parameter . "\n\t" . $args{'parameterdescs'}{$parameter_name} . "\n"; 1265*53ee8cc1Swenshuai.xi } 1266*53ee8cc1Swenshuai.xi output_section_text(@_); 1267*53ee8cc1Swenshuai.xi} 1268*53ee8cc1Swenshuai.xi 1269*53ee8cc1Swenshuai.xi#output sections in text 1270*53ee8cc1Swenshuai.xisub output_section_text(%) { 1271*53ee8cc1Swenshuai.xi my %args = %{$_[0]}; 1272*53ee8cc1Swenshuai.xi my $section; 1273*53ee8cc1Swenshuai.xi 1274*53ee8cc1Swenshuai.xi print "\n"; 1275*53ee8cc1Swenshuai.xi foreach $section (@{$args{'sectionlist'}}) { 1276*53ee8cc1Swenshuai.xi print "$section:\n\n"; 1277*53ee8cc1Swenshuai.xi output_highlight($args{'sections'}{$section}); 1278*53ee8cc1Swenshuai.xi } 1279*53ee8cc1Swenshuai.xi print "\n\n"; 1280*53ee8cc1Swenshuai.xi} 1281*53ee8cc1Swenshuai.xi 1282*53ee8cc1Swenshuai.xi# output enum in text 1283*53ee8cc1Swenshuai.xisub output_enum_text(%) { 1284*53ee8cc1Swenshuai.xi my %args = %{$_[0]}; 1285*53ee8cc1Swenshuai.xi my ($parameter); 1286*53ee8cc1Swenshuai.xi my $count; 1287*53ee8cc1Swenshuai.xi print "Enum:\n\n"; 1288*53ee8cc1Swenshuai.xi 1289*53ee8cc1Swenshuai.xi print "enum " . $args{'enum'} . " - " . $args{'purpose'} . "\n\n"; 1290*53ee8cc1Swenshuai.xi print "enum " . $args{'enum'} . " {\n"; 1291*53ee8cc1Swenshuai.xi $count = 0; 1292*53ee8cc1Swenshuai.xi foreach $parameter (@{$args{'parameterlist'}}) { 1293*53ee8cc1Swenshuai.xi print "\t$parameter"; 1294*53ee8cc1Swenshuai.xi if ($count != $#{$args{'parameterlist'}}) { 1295*53ee8cc1Swenshuai.xi $count++; 1296*53ee8cc1Swenshuai.xi print ","; 1297*53ee8cc1Swenshuai.xi } 1298*53ee8cc1Swenshuai.xi print "\n"; 1299*53ee8cc1Swenshuai.xi } 1300*53ee8cc1Swenshuai.xi print "};\n\n"; 1301*53ee8cc1Swenshuai.xi 1302*53ee8cc1Swenshuai.xi print "Constants:\n\n"; 1303*53ee8cc1Swenshuai.xi foreach $parameter (@{$args{'parameterlist'}}) { 1304*53ee8cc1Swenshuai.xi print "$parameter\n\t"; 1305*53ee8cc1Swenshuai.xi print $args{'parameterdescs'}{$parameter} . "\n"; 1306*53ee8cc1Swenshuai.xi } 1307*53ee8cc1Swenshuai.xi 1308*53ee8cc1Swenshuai.xi output_section_text(@_); 1309*53ee8cc1Swenshuai.xi} 1310*53ee8cc1Swenshuai.xi 1311*53ee8cc1Swenshuai.xi# output typedef in text 1312*53ee8cc1Swenshuai.xisub output_typedef_text(%) { 1313*53ee8cc1Swenshuai.xi my %args = %{$_[0]}; 1314*53ee8cc1Swenshuai.xi my ($parameter); 1315*53ee8cc1Swenshuai.xi my $count; 1316*53ee8cc1Swenshuai.xi print "Typedef:\n\n"; 1317*53ee8cc1Swenshuai.xi 1318*53ee8cc1Swenshuai.xi print "typedef " . $args{'typedef'} . " - " . $args{'purpose'} . "\n"; 1319*53ee8cc1Swenshuai.xi output_section_text(@_); 1320*53ee8cc1Swenshuai.xi} 1321*53ee8cc1Swenshuai.xi 1322*53ee8cc1Swenshuai.xi# output struct as text 1323*53ee8cc1Swenshuai.xisub output_struct_text(%) { 1324*53ee8cc1Swenshuai.xi my %args = %{$_[0]}; 1325*53ee8cc1Swenshuai.xi my ($parameter); 1326*53ee8cc1Swenshuai.xi 1327*53ee8cc1Swenshuai.xi print $args{'type'} . " " . $args{'struct'} . " - " . $args{'purpose'} . "\n\n"; 1328*53ee8cc1Swenshuai.xi print $args{'type'} . " " . $args{'struct'} . " {\n"; 1329*53ee8cc1Swenshuai.xi foreach $parameter (@{$args{'parameterlist'}}) { 1330*53ee8cc1Swenshuai.xi if ($parameter =~ /^#/) { 1331*53ee8cc1Swenshuai.xi print "$parameter\n"; 1332*53ee8cc1Swenshuai.xi next; 1333*53ee8cc1Swenshuai.xi } 1334*53ee8cc1Swenshuai.xi 1335*53ee8cc1Swenshuai.xi my $parameter_name = $parameter; 1336*53ee8cc1Swenshuai.xi $parameter_name =~ s/\[.*//; 1337*53ee8cc1Swenshuai.xi 1338*53ee8cc1Swenshuai.xi ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next; 1339*53ee8cc1Swenshuai.xi $type = $args{'parametertypes'}{$parameter}; 1340*53ee8cc1Swenshuai.xi if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) { 1341*53ee8cc1Swenshuai.xi # pointer-to-function 1342*53ee8cc1Swenshuai.xi print "\t$1 $parameter) ($2);\n"; 1343*53ee8cc1Swenshuai.xi } elsif ($type =~ m/^(.*?)\s*(:.*)/) { 1344*53ee8cc1Swenshuai.xi # bitfield 1345*53ee8cc1Swenshuai.xi print "\t$1 $parameter$2;\n"; 1346*53ee8cc1Swenshuai.xi } else { 1347*53ee8cc1Swenshuai.xi print "\t" . $type . " " . $parameter . ";\n"; 1348*53ee8cc1Swenshuai.xi } 1349*53ee8cc1Swenshuai.xi } 1350*53ee8cc1Swenshuai.xi print "};\n\n"; 1351*53ee8cc1Swenshuai.xi 1352*53ee8cc1Swenshuai.xi print "Members:\n\n"; 1353*53ee8cc1Swenshuai.xi foreach $parameter (@{$args{'parameterlist'}}) { 1354*53ee8cc1Swenshuai.xi ($parameter =~ /^#/) && next; 1355*53ee8cc1Swenshuai.xi 1356*53ee8cc1Swenshuai.xi my $parameter_name = $parameter; 1357*53ee8cc1Swenshuai.xi $parameter_name =~ s/\[.*//; 1358*53ee8cc1Swenshuai.xi 1359*53ee8cc1Swenshuai.xi ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next; 1360*53ee8cc1Swenshuai.xi print "$parameter\n\t"; 1361*53ee8cc1Swenshuai.xi print $args{'parameterdescs'}{$parameter_name} . "\n"; 1362*53ee8cc1Swenshuai.xi } 1363*53ee8cc1Swenshuai.xi print "\n"; 1364*53ee8cc1Swenshuai.xi output_section_text(@_); 1365*53ee8cc1Swenshuai.xi} 1366*53ee8cc1Swenshuai.xi 1367*53ee8cc1Swenshuai.xisub output_blockhead_text(%) { 1368*53ee8cc1Swenshuai.xi my %args = %{$_[0]}; 1369*53ee8cc1Swenshuai.xi my ($parameter, $section); 1370*53ee8cc1Swenshuai.xi 1371*53ee8cc1Swenshuai.xi foreach $section (@{$args{'sectionlist'}}) { 1372*53ee8cc1Swenshuai.xi print " $section:\n"; 1373*53ee8cc1Swenshuai.xi print " -> "; 1374*53ee8cc1Swenshuai.xi output_highlight($args{'sections'}{$section}); 1375*53ee8cc1Swenshuai.xi } 1376*53ee8cc1Swenshuai.xi} 1377*53ee8cc1Swenshuai.xi 1378*53ee8cc1Swenshuai.xi## list mode output functions 1379*53ee8cc1Swenshuai.xi 1380*53ee8cc1Swenshuai.xisub output_function_list(%) { 1381*53ee8cc1Swenshuai.xi my %args = %{$_[0]}; 1382*53ee8cc1Swenshuai.xi 1383*53ee8cc1Swenshuai.xi print $args{'function'} . "\n"; 1384*53ee8cc1Swenshuai.xi} 1385*53ee8cc1Swenshuai.xi 1386*53ee8cc1Swenshuai.xi# output enum in list 1387*53ee8cc1Swenshuai.xisub output_enum_list(%) { 1388*53ee8cc1Swenshuai.xi my %args = %{$_[0]}; 1389*53ee8cc1Swenshuai.xi print $args{'enum'} . "\n"; 1390*53ee8cc1Swenshuai.xi} 1391*53ee8cc1Swenshuai.xi 1392*53ee8cc1Swenshuai.xi# output typedef in list 1393*53ee8cc1Swenshuai.xisub output_typedef_list(%) { 1394*53ee8cc1Swenshuai.xi my %args = %{$_[0]}; 1395*53ee8cc1Swenshuai.xi print $args{'typedef'} . "\n"; 1396*53ee8cc1Swenshuai.xi} 1397*53ee8cc1Swenshuai.xi 1398*53ee8cc1Swenshuai.xi# output struct as list 1399*53ee8cc1Swenshuai.xisub output_struct_list(%) { 1400*53ee8cc1Swenshuai.xi my %args = %{$_[0]}; 1401*53ee8cc1Swenshuai.xi 1402*53ee8cc1Swenshuai.xi print $args{'struct'} . "\n"; 1403*53ee8cc1Swenshuai.xi} 1404*53ee8cc1Swenshuai.xi 1405*53ee8cc1Swenshuai.xisub output_blockhead_list(%) { 1406*53ee8cc1Swenshuai.xi my %args = %{$_[0]}; 1407*53ee8cc1Swenshuai.xi my ($parameter, $section); 1408*53ee8cc1Swenshuai.xi 1409*53ee8cc1Swenshuai.xi foreach $section (@{$args{'sectionlist'}}) { 1410*53ee8cc1Swenshuai.xi print "DOC: $section\n"; 1411*53ee8cc1Swenshuai.xi } 1412*53ee8cc1Swenshuai.xi} 1413*53ee8cc1Swenshuai.xi 1414*53ee8cc1Swenshuai.xi## 1415*53ee8cc1Swenshuai.xi# generic output function for all types (function, struct/union, typedef, enum); 1416*53ee8cc1Swenshuai.xi# calls the generated, variable output_ function name based on 1417*53ee8cc1Swenshuai.xi# functype and output_mode 1418*53ee8cc1Swenshuai.xisub output_declaration { 1419*53ee8cc1Swenshuai.xi no strict 'refs'; 1420*53ee8cc1Swenshuai.xi my $name = shift; 1421*53ee8cc1Swenshuai.xi my $functype = shift; 1422*53ee8cc1Swenshuai.xi my $func = "output_${functype}_$output_mode"; 1423*53ee8cc1Swenshuai.xi if (($function_only==0) || 1424*53ee8cc1Swenshuai.xi ( $function_only == 1 && defined($function_table{$name})) || 1425*53ee8cc1Swenshuai.xi ( $function_only == 2 && !defined($function_table{$name}))) 1426*53ee8cc1Swenshuai.xi { 1427*53ee8cc1Swenshuai.xi &$func(@_); 1428*53ee8cc1Swenshuai.xi $section_counter++; 1429*53ee8cc1Swenshuai.xi } 1430*53ee8cc1Swenshuai.xi} 1431*53ee8cc1Swenshuai.xi 1432*53ee8cc1Swenshuai.xi## 1433*53ee8cc1Swenshuai.xi# generic output function - calls the right one based on current output mode. 1434*53ee8cc1Swenshuai.xisub output_blockhead { 1435*53ee8cc1Swenshuai.xi no strict 'refs'; 1436*53ee8cc1Swenshuai.xi my $func = "output_blockhead_" . $output_mode; 1437*53ee8cc1Swenshuai.xi &$func(@_); 1438*53ee8cc1Swenshuai.xi $section_counter++; 1439*53ee8cc1Swenshuai.xi} 1440*53ee8cc1Swenshuai.xi 1441*53ee8cc1Swenshuai.xi## 1442*53ee8cc1Swenshuai.xi# takes a declaration (struct, union, enum, typedef) and 1443*53ee8cc1Swenshuai.xi# invokes the right handler. NOT called for functions. 1444*53ee8cc1Swenshuai.xisub dump_declaration($$) { 1445*53ee8cc1Swenshuai.xi no strict 'refs'; 1446*53ee8cc1Swenshuai.xi my ($prototype, $file) = @_; 1447*53ee8cc1Swenshuai.xi my $func = "dump_" . $decl_type; 1448*53ee8cc1Swenshuai.xi &$func(@_); 1449*53ee8cc1Swenshuai.xi} 1450*53ee8cc1Swenshuai.xi 1451*53ee8cc1Swenshuai.xisub dump_union($$) { 1452*53ee8cc1Swenshuai.xi dump_struct(@_); 1453*53ee8cc1Swenshuai.xi} 1454*53ee8cc1Swenshuai.xi 1455*53ee8cc1Swenshuai.xisub dump_struct($$) { 1456*53ee8cc1Swenshuai.xi my $x = shift; 1457*53ee8cc1Swenshuai.xi my $file = shift; 1458*53ee8cc1Swenshuai.xi my $nested; 1459*53ee8cc1Swenshuai.xi 1460*53ee8cc1Swenshuai.xi if ($x =~ /(struct|union)\s+(\w+)\s*{(.*)}/) { 1461*53ee8cc1Swenshuai.xi #my $decl_type = $1; 1462*53ee8cc1Swenshuai.xi $declaration_name = $2; 1463*53ee8cc1Swenshuai.xi my $members = $3; 1464*53ee8cc1Swenshuai.xi 1465*53ee8cc1Swenshuai.xi # ignore embedded structs or unions 1466*53ee8cc1Swenshuai.xi $members =~ s/({.*})//g; 1467*53ee8cc1Swenshuai.xi $nested = $1; 1468*53ee8cc1Swenshuai.xi 1469*53ee8cc1Swenshuai.xi # ignore members marked private: 1470*53ee8cc1Swenshuai.xi $members =~ s/\/\*\s*private:.*?\/\*\s*public:.*?\*\///gos; 1471*53ee8cc1Swenshuai.xi $members =~ s/\/\*\s*private:.*//gos; 1472*53ee8cc1Swenshuai.xi # strip comments: 1473*53ee8cc1Swenshuai.xi $members =~ s/\/\*.*?\*\///gos; 1474*53ee8cc1Swenshuai.xi $nested =~ s/\/\*.*?\*\///gos; 1475*53ee8cc1Swenshuai.xi # strip kmemcheck_bitfield_{begin,end}.*; 1476*53ee8cc1Swenshuai.xi $members =~ s/kmemcheck_bitfield_.*?;//gos; 1477*53ee8cc1Swenshuai.xi # strip attributes 1478*53ee8cc1Swenshuai.xi $members =~ s/__aligned\s*\(\d+\)//gos; 1479*53ee8cc1Swenshuai.xi 1480*53ee8cc1Swenshuai.xi create_parameterlist($members, ';', $file); 1481*53ee8cc1Swenshuai.xi check_sections($file, $declaration_name, "struct", $sectcheck, $struct_actual, $nested); 1482*53ee8cc1Swenshuai.xi 1483*53ee8cc1Swenshuai.xi output_declaration($declaration_name, 1484*53ee8cc1Swenshuai.xi 'struct', 1485*53ee8cc1Swenshuai.xi {'struct' => $declaration_name, 1486*53ee8cc1Swenshuai.xi 'module' => $modulename, 1487*53ee8cc1Swenshuai.xi 'parameterlist' => \@parameterlist, 1488*53ee8cc1Swenshuai.xi 'parameterdescs' => \%parameterdescs, 1489*53ee8cc1Swenshuai.xi 'parametertypes' => \%parametertypes, 1490*53ee8cc1Swenshuai.xi 'sectionlist' => \@sectionlist, 1491*53ee8cc1Swenshuai.xi 'sections' => \%sections, 1492*53ee8cc1Swenshuai.xi 'purpose' => $declaration_purpose, 1493*53ee8cc1Swenshuai.xi 'type' => $decl_type 1494*53ee8cc1Swenshuai.xi }); 1495*53ee8cc1Swenshuai.xi } 1496*53ee8cc1Swenshuai.xi else { 1497*53ee8cc1Swenshuai.xi print STDERR "Error(${file}:$.): Cannot parse struct or union!\n"; 1498*53ee8cc1Swenshuai.xi ++$errors; 1499*53ee8cc1Swenshuai.xi } 1500*53ee8cc1Swenshuai.xi} 1501*53ee8cc1Swenshuai.xi 1502*53ee8cc1Swenshuai.xisub dump_enum($$) { 1503*53ee8cc1Swenshuai.xi my $x = shift; 1504*53ee8cc1Swenshuai.xi my $file = shift; 1505*53ee8cc1Swenshuai.xi 1506*53ee8cc1Swenshuai.xi $x =~ s@/\*.*?\*/@@gos; # strip comments. 1507*53ee8cc1Swenshuai.xi $x =~ s/^#\s*define\s+.*$//; # strip #define macros inside enums 1508*53ee8cc1Swenshuai.xi 1509*53ee8cc1Swenshuai.xi if ($x =~ /enum\s+(\w+)\s*{(.*)}/) { 1510*53ee8cc1Swenshuai.xi $declaration_name = $1; 1511*53ee8cc1Swenshuai.xi my $members = $2; 1512*53ee8cc1Swenshuai.xi 1513*53ee8cc1Swenshuai.xi foreach my $arg (split ',', $members) { 1514*53ee8cc1Swenshuai.xi $arg =~ s/^\s*(\w+).*/$1/; 1515*53ee8cc1Swenshuai.xi push @parameterlist, $arg; 1516*53ee8cc1Swenshuai.xi if (!$parameterdescs{$arg}) { 1517*53ee8cc1Swenshuai.xi $parameterdescs{$arg} = $undescribed; 1518*53ee8cc1Swenshuai.xi print STDERR "Warning(${file}:$.): Enum value '$arg' ". 1519*53ee8cc1Swenshuai.xi "not described in enum '$declaration_name'\n"; 1520*53ee8cc1Swenshuai.xi } 1521*53ee8cc1Swenshuai.xi 1522*53ee8cc1Swenshuai.xi } 1523*53ee8cc1Swenshuai.xi 1524*53ee8cc1Swenshuai.xi output_declaration($declaration_name, 1525*53ee8cc1Swenshuai.xi 'enum', 1526*53ee8cc1Swenshuai.xi {'enum' => $declaration_name, 1527*53ee8cc1Swenshuai.xi 'module' => $modulename, 1528*53ee8cc1Swenshuai.xi 'parameterlist' => \@parameterlist, 1529*53ee8cc1Swenshuai.xi 'parameterdescs' => \%parameterdescs, 1530*53ee8cc1Swenshuai.xi 'sectionlist' => \@sectionlist, 1531*53ee8cc1Swenshuai.xi 'sections' => \%sections, 1532*53ee8cc1Swenshuai.xi 'purpose' => $declaration_purpose 1533*53ee8cc1Swenshuai.xi }); 1534*53ee8cc1Swenshuai.xi } 1535*53ee8cc1Swenshuai.xi else { 1536*53ee8cc1Swenshuai.xi print STDERR "Error(${file}:$.): Cannot parse enum!\n"; 1537*53ee8cc1Swenshuai.xi ++$errors; 1538*53ee8cc1Swenshuai.xi } 1539*53ee8cc1Swenshuai.xi} 1540*53ee8cc1Swenshuai.xi 1541*53ee8cc1Swenshuai.xisub dump_typedef($$) { 1542*53ee8cc1Swenshuai.xi my $x = shift; 1543*53ee8cc1Swenshuai.xi my $file = shift; 1544*53ee8cc1Swenshuai.xi 1545*53ee8cc1Swenshuai.xi $x =~ s@/\*.*?\*/@@gos; # strip comments. 1546*53ee8cc1Swenshuai.xi while (($x =~ /\(*.\)\s*;$/) || ($x =~ /\[*.\]\s*;$/)) { 1547*53ee8cc1Swenshuai.xi $x =~ s/\(*.\)\s*;$/;/; 1548*53ee8cc1Swenshuai.xi $x =~ s/\[*.\]\s*;$/;/; 1549*53ee8cc1Swenshuai.xi } 1550*53ee8cc1Swenshuai.xi 1551*53ee8cc1Swenshuai.xi if ($x =~ /typedef.*\s+(\w+)\s*;/) { 1552*53ee8cc1Swenshuai.xi $declaration_name = $1; 1553*53ee8cc1Swenshuai.xi 1554*53ee8cc1Swenshuai.xi output_declaration($declaration_name, 1555*53ee8cc1Swenshuai.xi 'typedef', 1556*53ee8cc1Swenshuai.xi {'typedef' => $declaration_name, 1557*53ee8cc1Swenshuai.xi 'module' => $modulename, 1558*53ee8cc1Swenshuai.xi 'sectionlist' => \@sectionlist, 1559*53ee8cc1Swenshuai.xi 'sections' => \%sections, 1560*53ee8cc1Swenshuai.xi 'purpose' => $declaration_purpose 1561*53ee8cc1Swenshuai.xi }); 1562*53ee8cc1Swenshuai.xi } 1563*53ee8cc1Swenshuai.xi else { 1564*53ee8cc1Swenshuai.xi print STDERR "Error(${file}:$.): Cannot parse typedef!\n"; 1565*53ee8cc1Swenshuai.xi ++$errors; 1566*53ee8cc1Swenshuai.xi } 1567*53ee8cc1Swenshuai.xi} 1568*53ee8cc1Swenshuai.xi 1569*53ee8cc1Swenshuai.xisub save_struct_actual($) { 1570*53ee8cc1Swenshuai.xi my $actual = shift; 1571*53ee8cc1Swenshuai.xi 1572*53ee8cc1Swenshuai.xi # strip all spaces from the actual param so that it looks like one string item 1573*53ee8cc1Swenshuai.xi $actual =~ s/\s*//g; 1574*53ee8cc1Swenshuai.xi $struct_actual = $struct_actual . $actual . " "; 1575*53ee8cc1Swenshuai.xi} 1576*53ee8cc1Swenshuai.xi 1577*53ee8cc1Swenshuai.xisub create_parameterlist($$$) { 1578*53ee8cc1Swenshuai.xi my $args = shift; 1579*53ee8cc1Swenshuai.xi my $splitter = shift; 1580*53ee8cc1Swenshuai.xi my $file = shift; 1581*53ee8cc1Swenshuai.xi my $type; 1582*53ee8cc1Swenshuai.xi my $param; 1583*53ee8cc1Swenshuai.xi 1584*53ee8cc1Swenshuai.xi # temporarily replace commas inside function pointer definition 1585*53ee8cc1Swenshuai.xi while ($args =~ /(\([^\),]+),/) { 1586*53ee8cc1Swenshuai.xi $args =~ s/(\([^\),]+),/$1#/g; 1587*53ee8cc1Swenshuai.xi } 1588*53ee8cc1Swenshuai.xi 1589*53ee8cc1Swenshuai.xi foreach my $arg (split($splitter, $args)) { 1590*53ee8cc1Swenshuai.xi # strip comments 1591*53ee8cc1Swenshuai.xi $arg =~ s/\/\*.*\*\///; 1592*53ee8cc1Swenshuai.xi # strip leading/trailing spaces 1593*53ee8cc1Swenshuai.xi $arg =~ s/^\s*//; 1594*53ee8cc1Swenshuai.xi $arg =~ s/\s*$//; 1595*53ee8cc1Swenshuai.xi $arg =~ s/\s+/ /; 1596*53ee8cc1Swenshuai.xi 1597*53ee8cc1Swenshuai.xi if ($arg =~ /^#/) { 1598*53ee8cc1Swenshuai.xi # Treat preprocessor directive as a typeless variable just to fill 1599*53ee8cc1Swenshuai.xi # corresponding data structures "correctly". Catch it later in 1600*53ee8cc1Swenshuai.xi # output_* subs. 1601*53ee8cc1Swenshuai.xi push_parameter($arg, "", $file); 1602*53ee8cc1Swenshuai.xi } elsif ($arg =~ m/\(.+\)\s*\(/) { 1603*53ee8cc1Swenshuai.xi # pointer-to-function 1604*53ee8cc1Swenshuai.xi $arg =~ tr/#/,/; 1605*53ee8cc1Swenshuai.xi $arg =~ m/[^\(]+\(\*?\s*(\w*)\s*\)/; 1606*53ee8cc1Swenshuai.xi $param = $1; 1607*53ee8cc1Swenshuai.xi $type = $arg; 1608*53ee8cc1Swenshuai.xi $type =~ s/([^\(]+\(\*?)\s*$param/$1/; 1609*53ee8cc1Swenshuai.xi save_struct_actual($param); 1610*53ee8cc1Swenshuai.xi push_parameter($param, $type, $file); 1611*53ee8cc1Swenshuai.xi } elsif ($arg) { 1612*53ee8cc1Swenshuai.xi $arg =~ s/\s*:\s*/:/g; 1613*53ee8cc1Swenshuai.xi $arg =~ s/\s*\[/\[/g; 1614*53ee8cc1Swenshuai.xi 1615*53ee8cc1Swenshuai.xi my @args = split('\s*,\s*', $arg); 1616*53ee8cc1Swenshuai.xi if ($args[0] =~ m/\*/) { 1617*53ee8cc1Swenshuai.xi $args[0] =~ s/(\*+)\s*/ $1/; 1618*53ee8cc1Swenshuai.xi } 1619*53ee8cc1Swenshuai.xi 1620*53ee8cc1Swenshuai.xi my @first_arg; 1621*53ee8cc1Swenshuai.xi if ($args[0] =~ /^(.*\s+)(.*?\[.*\].*)$/) { 1622*53ee8cc1Swenshuai.xi shift @args; 1623*53ee8cc1Swenshuai.xi push(@first_arg, split('\s+', $1)); 1624*53ee8cc1Swenshuai.xi push(@first_arg, $2); 1625*53ee8cc1Swenshuai.xi } else { 1626*53ee8cc1Swenshuai.xi @first_arg = split('\s+', shift @args); 1627*53ee8cc1Swenshuai.xi } 1628*53ee8cc1Swenshuai.xi 1629*53ee8cc1Swenshuai.xi unshift(@args, pop @first_arg); 1630*53ee8cc1Swenshuai.xi $type = join " ", @first_arg; 1631*53ee8cc1Swenshuai.xi 1632*53ee8cc1Swenshuai.xi foreach $param (@args) { 1633*53ee8cc1Swenshuai.xi if ($param =~ m/^(\*+)\s*(.*)/) { 1634*53ee8cc1Swenshuai.xi save_struct_actual($2); 1635*53ee8cc1Swenshuai.xi push_parameter($2, "$type $1", $file); 1636*53ee8cc1Swenshuai.xi } 1637*53ee8cc1Swenshuai.xi elsif ($param =~ m/(.*?):(\d+)/) { 1638*53ee8cc1Swenshuai.xi if ($type ne "") { # skip unnamed bit-fields 1639*53ee8cc1Swenshuai.xi save_struct_actual($1); 1640*53ee8cc1Swenshuai.xi push_parameter($1, "$type:$2", $file) 1641*53ee8cc1Swenshuai.xi } 1642*53ee8cc1Swenshuai.xi } 1643*53ee8cc1Swenshuai.xi else { 1644*53ee8cc1Swenshuai.xi save_struct_actual($param); 1645*53ee8cc1Swenshuai.xi push_parameter($param, $type, $file); 1646*53ee8cc1Swenshuai.xi } 1647*53ee8cc1Swenshuai.xi } 1648*53ee8cc1Swenshuai.xi } 1649*53ee8cc1Swenshuai.xi } 1650*53ee8cc1Swenshuai.xi} 1651*53ee8cc1Swenshuai.xi 1652*53ee8cc1Swenshuai.xisub push_parameter($$$) { 1653*53ee8cc1Swenshuai.xi my $param = shift; 1654*53ee8cc1Swenshuai.xi my $type = shift; 1655*53ee8cc1Swenshuai.xi my $file = shift; 1656*53ee8cc1Swenshuai.xi 1657*53ee8cc1Swenshuai.xi if (($anon_struct_union == 1) && ($type eq "") && 1658*53ee8cc1Swenshuai.xi ($param eq "}")) { 1659*53ee8cc1Swenshuai.xi return; # ignore the ending }; from anon. struct/union 1660*53ee8cc1Swenshuai.xi } 1661*53ee8cc1Swenshuai.xi 1662*53ee8cc1Swenshuai.xi $anon_struct_union = 0; 1663*53ee8cc1Swenshuai.xi my $param_name = $param; 1664*53ee8cc1Swenshuai.xi $param_name =~ s/\[.*//; 1665*53ee8cc1Swenshuai.xi 1666*53ee8cc1Swenshuai.xi if ($type eq "" && $param =~ /\.\.\.$/) 1667*53ee8cc1Swenshuai.xi { 1668*53ee8cc1Swenshuai.xi if (!defined $parameterdescs{$param} || $parameterdescs{$param} eq "") { 1669*53ee8cc1Swenshuai.xi $parameterdescs{$param} = "variable arguments"; 1670*53ee8cc1Swenshuai.xi } 1671*53ee8cc1Swenshuai.xi } 1672*53ee8cc1Swenshuai.xi elsif ($type eq "" && ($param eq "" or $param eq "void")) 1673*53ee8cc1Swenshuai.xi { 1674*53ee8cc1Swenshuai.xi $param="void"; 1675*53ee8cc1Swenshuai.xi $parameterdescs{void} = "no arguments"; 1676*53ee8cc1Swenshuai.xi } 1677*53ee8cc1Swenshuai.xi elsif ($type eq "" && ($param eq "struct" or $param eq "union")) 1678*53ee8cc1Swenshuai.xi # handle unnamed (anonymous) union or struct: 1679*53ee8cc1Swenshuai.xi { 1680*53ee8cc1Swenshuai.xi $type = $param; 1681*53ee8cc1Swenshuai.xi $param = "{unnamed_" . $param . "}"; 1682*53ee8cc1Swenshuai.xi $parameterdescs{$param} = "anonymous\n"; 1683*53ee8cc1Swenshuai.xi $anon_struct_union = 1; 1684*53ee8cc1Swenshuai.xi } 1685*53ee8cc1Swenshuai.xi 1686*53ee8cc1Swenshuai.xi # warn if parameter has no description 1687*53ee8cc1Swenshuai.xi # (but ignore ones starting with # as these are not parameters 1688*53ee8cc1Swenshuai.xi # but inline preprocessor statements); 1689*53ee8cc1Swenshuai.xi # also ignore unnamed structs/unions; 1690*53ee8cc1Swenshuai.xi if (!$anon_struct_union) { 1691*53ee8cc1Swenshuai.xi if (!defined $parameterdescs{$param_name} && $param_name !~ /^#/) { 1692*53ee8cc1Swenshuai.xi 1693*53ee8cc1Swenshuai.xi $parameterdescs{$param_name} = $undescribed; 1694*53ee8cc1Swenshuai.xi 1695*53ee8cc1Swenshuai.xi if (($type eq 'function') || ($type eq 'enum')) { 1696*53ee8cc1Swenshuai.xi print STDERR "Warning(${file}:$.): Function parameter ". 1697*53ee8cc1Swenshuai.xi "or member '$param' not " . 1698*53ee8cc1Swenshuai.xi "described in '$declaration_name'\n"; 1699*53ee8cc1Swenshuai.xi } 1700*53ee8cc1Swenshuai.xi print STDERR "Warning(${file}:$.):" . 1701*53ee8cc1Swenshuai.xi " No description found for parameter '$param'\n"; 1702*53ee8cc1Swenshuai.xi ++$warnings; 1703*53ee8cc1Swenshuai.xi } 1704*53ee8cc1Swenshuai.xi } 1705*53ee8cc1Swenshuai.xi 1706*53ee8cc1Swenshuai.xi $param = xml_escape($param); 1707*53ee8cc1Swenshuai.xi 1708*53ee8cc1Swenshuai.xi # strip spaces from $param so that it is one continuous string 1709*53ee8cc1Swenshuai.xi # on @parameterlist; 1710*53ee8cc1Swenshuai.xi # this fixes a problem where check_sections() cannot find 1711*53ee8cc1Swenshuai.xi # a parameter like "addr[6 + 2]" because it actually appears 1712*53ee8cc1Swenshuai.xi # as "addr[6", "+", "2]" on the parameter list; 1713*53ee8cc1Swenshuai.xi # but it's better to maintain the param string unchanged for output, 1714*53ee8cc1Swenshuai.xi # so just weaken the string compare in check_sections() to ignore 1715*53ee8cc1Swenshuai.xi # "[blah" in a parameter string; 1716*53ee8cc1Swenshuai.xi ###$param =~ s/\s*//g; 1717*53ee8cc1Swenshuai.xi push @parameterlist, $param; 1718*53ee8cc1Swenshuai.xi $parametertypes{$param} = $type; 1719*53ee8cc1Swenshuai.xi} 1720*53ee8cc1Swenshuai.xi 1721*53ee8cc1Swenshuai.xisub check_sections($$$$$$) { 1722*53ee8cc1Swenshuai.xi my ($file, $decl_name, $decl_type, $sectcheck, $prmscheck, $nested) = @_; 1723*53ee8cc1Swenshuai.xi my @sects = split ' ', $sectcheck; 1724*53ee8cc1Swenshuai.xi my @prms = split ' ', $prmscheck; 1725*53ee8cc1Swenshuai.xi my $err; 1726*53ee8cc1Swenshuai.xi my ($px, $sx); 1727*53ee8cc1Swenshuai.xi my $prm_clean; # strip trailing "[array size]" and/or beginning "*" 1728*53ee8cc1Swenshuai.xi 1729*53ee8cc1Swenshuai.xi foreach $sx (0 .. $#sects) { 1730*53ee8cc1Swenshuai.xi $err = 1; 1731*53ee8cc1Swenshuai.xi foreach $px (0 .. $#prms) { 1732*53ee8cc1Swenshuai.xi $prm_clean = $prms[$px]; 1733*53ee8cc1Swenshuai.xi $prm_clean =~ s/\[.*\]//; 1734*53ee8cc1Swenshuai.xi $prm_clean =~ s/__attribute__\s*\(\([a-z,_\*\s\(\)]*\)\)//i; 1735*53ee8cc1Swenshuai.xi # ignore array size in a parameter string; 1736*53ee8cc1Swenshuai.xi # however, the original param string may contain 1737*53ee8cc1Swenshuai.xi # spaces, e.g.: addr[6 + 2] 1738*53ee8cc1Swenshuai.xi # and this appears in @prms as "addr[6" since the 1739*53ee8cc1Swenshuai.xi # parameter list is split at spaces; 1740*53ee8cc1Swenshuai.xi # hence just ignore "[..." for the sections check; 1741*53ee8cc1Swenshuai.xi $prm_clean =~ s/\[.*//; 1742*53ee8cc1Swenshuai.xi 1743*53ee8cc1Swenshuai.xi ##$prm_clean =~ s/^\**//; 1744*53ee8cc1Swenshuai.xi if ($prm_clean eq $sects[$sx]) { 1745*53ee8cc1Swenshuai.xi $err = 0; 1746*53ee8cc1Swenshuai.xi last; 1747*53ee8cc1Swenshuai.xi } 1748*53ee8cc1Swenshuai.xi } 1749*53ee8cc1Swenshuai.xi if ($err) { 1750*53ee8cc1Swenshuai.xi if ($decl_type eq "function") { 1751*53ee8cc1Swenshuai.xi print STDERR "Warning(${file}:$.): " . 1752*53ee8cc1Swenshuai.xi "Excess function parameter " . 1753*53ee8cc1Swenshuai.xi "'$sects[$sx]' " . 1754*53ee8cc1Swenshuai.xi "description in '$decl_name'\n"; 1755*53ee8cc1Swenshuai.xi ++$warnings; 1756*53ee8cc1Swenshuai.xi } else { 1757*53ee8cc1Swenshuai.xi if ($nested !~ m/\Q$sects[$sx]\E/) { 1758*53ee8cc1Swenshuai.xi print STDERR "Warning(${file}:$.): " . 1759*53ee8cc1Swenshuai.xi "Excess struct/union/enum/typedef member " . 1760*53ee8cc1Swenshuai.xi "'$sects[$sx]' " . 1761*53ee8cc1Swenshuai.xi "description in '$decl_name'\n"; 1762*53ee8cc1Swenshuai.xi ++$warnings; 1763*53ee8cc1Swenshuai.xi } 1764*53ee8cc1Swenshuai.xi } 1765*53ee8cc1Swenshuai.xi } 1766*53ee8cc1Swenshuai.xi } 1767*53ee8cc1Swenshuai.xi} 1768*53ee8cc1Swenshuai.xi 1769*53ee8cc1Swenshuai.xi## 1770*53ee8cc1Swenshuai.xi# takes a function prototype and the name of the current file being 1771*53ee8cc1Swenshuai.xi# processed and spits out all the details stored in the global 1772*53ee8cc1Swenshuai.xi# arrays/hashes. 1773*53ee8cc1Swenshuai.xisub dump_function($$) { 1774*53ee8cc1Swenshuai.xi my $prototype = shift; 1775*53ee8cc1Swenshuai.xi my $file = shift; 1776*53ee8cc1Swenshuai.xi 1777*53ee8cc1Swenshuai.xi $prototype =~ s/^static +//; 1778*53ee8cc1Swenshuai.xi $prototype =~ s/^extern +//; 1779*53ee8cc1Swenshuai.xi $prototype =~ s/^asmlinkage +//; 1780*53ee8cc1Swenshuai.xi $prototype =~ s/^inline +//; 1781*53ee8cc1Swenshuai.xi $prototype =~ s/^__inline__ +//; 1782*53ee8cc1Swenshuai.xi $prototype =~ s/^__inline +//; 1783*53ee8cc1Swenshuai.xi $prototype =~ s/^__always_inline +//; 1784*53ee8cc1Swenshuai.xi $prototype =~ s/^noinline +//; 1785*53ee8cc1Swenshuai.xi $prototype =~ s/__devinit +//; 1786*53ee8cc1Swenshuai.xi $prototype =~ s/__init +//; 1787*53ee8cc1Swenshuai.xi $prototype =~ s/__init_or_module +//; 1788*53ee8cc1Swenshuai.xi $prototype =~ s/^#\s*define\s+//; #ak added 1789*53ee8cc1Swenshuai.xi $prototype =~ s/__attribute__\s*\(\([a-z,]*\)\)//; 1790*53ee8cc1Swenshuai.xi 1791*53ee8cc1Swenshuai.xi # Yes, this truly is vile. We are looking for: 1792*53ee8cc1Swenshuai.xi # 1. Return type (may be nothing if we're looking at a macro) 1793*53ee8cc1Swenshuai.xi # 2. Function name 1794*53ee8cc1Swenshuai.xi # 3. Function parameters. 1795*53ee8cc1Swenshuai.xi # 1796*53ee8cc1Swenshuai.xi # All the while we have to watch out for function pointer parameters 1797*53ee8cc1Swenshuai.xi # (which IIRC is what the two sections are for), C types (these 1798*53ee8cc1Swenshuai.xi # regexps don't even start to express all the possibilities), and 1799*53ee8cc1Swenshuai.xi # so on. 1800*53ee8cc1Swenshuai.xi # 1801*53ee8cc1Swenshuai.xi # If you mess with these regexps, it's a good idea to check that 1802*53ee8cc1Swenshuai.xi # the following functions' documentation still comes out right: 1803*53ee8cc1Swenshuai.xi # - parport_register_device (function pointer parameters) 1804*53ee8cc1Swenshuai.xi # - atomic_set (macro) 1805*53ee8cc1Swenshuai.xi # - pci_match_device, __copy_to_user (long return type) 1806*53ee8cc1Swenshuai.xi 1807*53ee8cc1Swenshuai.xi if ($prototype =~ m/^()([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ || 1808*53ee8cc1Swenshuai.xi $prototype =~ m/^(\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ || 1809*53ee8cc1Swenshuai.xi $prototype =~ m/^(\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ || 1810*53ee8cc1Swenshuai.xi $prototype =~ m/^(\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ || 1811*53ee8cc1Swenshuai.xi $prototype =~ m/^(\w+\s+\w+\s*\*+)\s*([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ || 1812*53ee8cc1Swenshuai.xi $prototype =~ m/^(\w+\s+\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ || 1813*53ee8cc1Swenshuai.xi $prototype =~ m/^(\w+\s+\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\(]*)\)/ || 1814*53ee8cc1Swenshuai.xi $prototype =~ m/^()([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ || 1815*53ee8cc1Swenshuai.xi $prototype =~ m/^(\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ || 1816*53ee8cc1Swenshuai.xi $prototype =~ m/^(\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ || 1817*53ee8cc1Swenshuai.xi $prototype =~ m/^(\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ || 1818*53ee8cc1Swenshuai.xi $prototype =~ m/^(\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ || 1819*53ee8cc1Swenshuai.xi $prototype =~ m/^(\w+\s+\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ || 1820*53ee8cc1Swenshuai.xi $prototype =~ m/^(\w+\s+\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ || 1821*53ee8cc1Swenshuai.xi $prototype =~ m/^(\w+\s+\w+\s+\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ || 1822*53ee8cc1Swenshuai.xi $prototype =~ m/^(\w+\s+\w+\s+\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ || 1823*53ee8cc1Swenshuai.xi $prototype =~ m/^(\w+\s+\w+\s*\*\s*\w+\s*\*\s*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/) { 1824*53ee8cc1Swenshuai.xi $return_type = $1; 1825*53ee8cc1Swenshuai.xi $declaration_name = $2; 1826*53ee8cc1Swenshuai.xi my $args = $3; 1827*53ee8cc1Swenshuai.xi 1828*53ee8cc1Swenshuai.xi create_parameterlist($args, ',', $file); 1829*53ee8cc1Swenshuai.xi } else { 1830*53ee8cc1Swenshuai.xi print STDERR "Error(${file}:$.): cannot understand prototype: '$prototype'\n"; 1831*53ee8cc1Swenshuai.xi ++$errors; 1832*53ee8cc1Swenshuai.xi return; 1833*53ee8cc1Swenshuai.xi } 1834*53ee8cc1Swenshuai.xi 1835*53ee8cc1Swenshuai.xi my $prms = join " ", @parameterlist; 1836*53ee8cc1Swenshuai.xi check_sections($file, $declaration_name, "function", $sectcheck, $prms, ""); 1837*53ee8cc1Swenshuai.xi 1838*53ee8cc1Swenshuai.xi output_declaration($declaration_name, 1839*53ee8cc1Swenshuai.xi 'function', 1840*53ee8cc1Swenshuai.xi {'function' => $declaration_name, 1841*53ee8cc1Swenshuai.xi 'module' => $modulename, 1842*53ee8cc1Swenshuai.xi 'functiontype' => $return_type, 1843*53ee8cc1Swenshuai.xi 'parameterlist' => \@parameterlist, 1844*53ee8cc1Swenshuai.xi 'parameterdescs' => \%parameterdescs, 1845*53ee8cc1Swenshuai.xi 'parametertypes' => \%parametertypes, 1846*53ee8cc1Swenshuai.xi 'sectionlist' => \@sectionlist, 1847*53ee8cc1Swenshuai.xi 'sections' => \%sections, 1848*53ee8cc1Swenshuai.xi 'purpose' => $declaration_purpose 1849*53ee8cc1Swenshuai.xi }); 1850*53ee8cc1Swenshuai.xi} 1851*53ee8cc1Swenshuai.xi 1852*53ee8cc1Swenshuai.xisub reset_state { 1853*53ee8cc1Swenshuai.xi $function = ""; 1854*53ee8cc1Swenshuai.xi %constants = (); 1855*53ee8cc1Swenshuai.xi %parameterdescs = (); 1856*53ee8cc1Swenshuai.xi %parametertypes = (); 1857*53ee8cc1Swenshuai.xi @parameterlist = (); 1858*53ee8cc1Swenshuai.xi %sections = (); 1859*53ee8cc1Swenshuai.xi @sectionlist = (); 1860*53ee8cc1Swenshuai.xi $sectcheck = ""; 1861*53ee8cc1Swenshuai.xi $struct_actual = ""; 1862*53ee8cc1Swenshuai.xi $prototype = ""; 1863*53ee8cc1Swenshuai.xi 1864*53ee8cc1Swenshuai.xi $state = 0; 1865*53ee8cc1Swenshuai.xi} 1866*53ee8cc1Swenshuai.xi 1867*53ee8cc1Swenshuai.xisub tracepoint_munge($) { 1868*53ee8cc1Swenshuai.xi my $file = shift; 1869*53ee8cc1Swenshuai.xi my $tracepointname = 0; 1870*53ee8cc1Swenshuai.xi my $tracepointargs = 0; 1871*53ee8cc1Swenshuai.xi 1872*53ee8cc1Swenshuai.xi if ($prototype =~ m/TRACE_EVENT\((.*?),/) { 1873*53ee8cc1Swenshuai.xi $tracepointname = $1; 1874*53ee8cc1Swenshuai.xi } 1875*53ee8cc1Swenshuai.xi if ($prototype =~ m/DEFINE_SINGLE_EVENT\((.*?),/) { 1876*53ee8cc1Swenshuai.xi $tracepointname = $1; 1877*53ee8cc1Swenshuai.xi } 1878*53ee8cc1Swenshuai.xi if ($prototype =~ m/DEFINE_EVENT\((.*?),(.*?),/) { 1879*53ee8cc1Swenshuai.xi $tracepointname = $2; 1880*53ee8cc1Swenshuai.xi } 1881*53ee8cc1Swenshuai.xi $tracepointname =~ s/^\s+//; #strip leading whitespace 1882*53ee8cc1Swenshuai.xi if ($prototype =~ m/TP_PROTO\((.*?)\)/) { 1883*53ee8cc1Swenshuai.xi $tracepointargs = $1; 1884*53ee8cc1Swenshuai.xi } 1885*53ee8cc1Swenshuai.xi if (($tracepointname eq 0) || ($tracepointargs eq 0)) { 1886*53ee8cc1Swenshuai.xi print STDERR "Warning(${file}:$.): Unrecognized tracepoint format: \n". 1887*53ee8cc1Swenshuai.xi "$prototype\n"; 1888*53ee8cc1Swenshuai.xi } else { 1889*53ee8cc1Swenshuai.xi $prototype = "static inline void trace_$tracepointname($tracepointargs)"; 1890*53ee8cc1Swenshuai.xi } 1891*53ee8cc1Swenshuai.xi} 1892*53ee8cc1Swenshuai.xi 1893*53ee8cc1Swenshuai.xisub syscall_munge() { 1894*53ee8cc1Swenshuai.xi my $void = 0; 1895*53ee8cc1Swenshuai.xi 1896*53ee8cc1Swenshuai.xi $prototype =~ s@[\r\n\t]+@ @gos; # strip newlines/CR's/tabs 1897*53ee8cc1Swenshuai.xi## if ($prototype =~ m/SYSCALL_DEFINE0\s*\(\s*(a-zA-Z0-9_)*\s*\)/) { 1898*53ee8cc1Swenshuai.xi if ($prototype =~ m/SYSCALL_DEFINE0/) { 1899*53ee8cc1Swenshuai.xi $void = 1; 1900*53ee8cc1Swenshuai.xi## $prototype = "long sys_$1(void)"; 1901*53ee8cc1Swenshuai.xi } 1902*53ee8cc1Swenshuai.xi 1903*53ee8cc1Swenshuai.xi $prototype =~ s/SYSCALL_DEFINE.*\(/long sys_/; # fix return type & func name 1904*53ee8cc1Swenshuai.xi if ($prototype =~ m/long (sys_.*?),/) { 1905*53ee8cc1Swenshuai.xi $prototype =~ s/,/\(/; 1906*53ee8cc1Swenshuai.xi } elsif ($void) { 1907*53ee8cc1Swenshuai.xi $prototype =~ s/\)/\(void\)/; 1908*53ee8cc1Swenshuai.xi } 1909*53ee8cc1Swenshuai.xi 1910*53ee8cc1Swenshuai.xi # now delete all of the odd-number commas in $prototype 1911*53ee8cc1Swenshuai.xi # so that arg types & arg names don't have a comma between them 1912*53ee8cc1Swenshuai.xi my $count = 0; 1913*53ee8cc1Swenshuai.xi my $len = length($prototype); 1914*53ee8cc1Swenshuai.xi if ($void) { 1915*53ee8cc1Swenshuai.xi $len = 0; # skip the for-loop 1916*53ee8cc1Swenshuai.xi } 1917*53ee8cc1Swenshuai.xi for (my $ix = 0; $ix < $len; $ix++) { 1918*53ee8cc1Swenshuai.xi if (substr($prototype, $ix, 1) eq ',') { 1919*53ee8cc1Swenshuai.xi $count++; 1920*53ee8cc1Swenshuai.xi if ($count % 2 == 1) { 1921*53ee8cc1Swenshuai.xi substr($prototype, $ix, 1) = ' '; 1922*53ee8cc1Swenshuai.xi } 1923*53ee8cc1Swenshuai.xi } 1924*53ee8cc1Swenshuai.xi } 1925*53ee8cc1Swenshuai.xi} 1926*53ee8cc1Swenshuai.xi 1927*53ee8cc1Swenshuai.xisub process_state3_function($$) { 1928*53ee8cc1Swenshuai.xi my $x = shift; 1929*53ee8cc1Swenshuai.xi my $file = shift; 1930*53ee8cc1Swenshuai.xi 1931*53ee8cc1Swenshuai.xi $x =~ s@\/\/.*$@@gos; # strip C99-style comments to end of line 1932*53ee8cc1Swenshuai.xi 1933*53ee8cc1Swenshuai.xi if ($x =~ m#\s*/\*\s+MACDOC\s*#io || ($x =~ /^#/ && $x !~ /^#\s*define/)) { 1934*53ee8cc1Swenshuai.xi # do nothing 1935*53ee8cc1Swenshuai.xi } 1936*53ee8cc1Swenshuai.xi elsif ($x =~ /([^\{]*)/) { 1937*53ee8cc1Swenshuai.xi $prototype .= $1; 1938*53ee8cc1Swenshuai.xi } 1939*53ee8cc1Swenshuai.xi 1940*53ee8cc1Swenshuai.xi if (($x =~ /\{/) || ($x =~ /\#\s*define/) || ($x =~ /;/)) { 1941*53ee8cc1Swenshuai.xi $prototype =~ s@/\*.*?\*/@@gos; # strip comments. 1942*53ee8cc1Swenshuai.xi $prototype =~ s@[\r\n]+@ @gos; # strip newlines/cr's. 1943*53ee8cc1Swenshuai.xi $prototype =~ s@^\s+@@gos; # strip leading spaces 1944*53ee8cc1Swenshuai.xi if ($prototype =~ /SYSCALL_DEFINE/) { 1945*53ee8cc1Swenshuai.xi syscall_munge(); 1946*53ee8cc1Swenshuai.xi } 1947*53ee8cc1Swenshuai.xi if ($prototype =~ /TRACE_EVENT/ || $prototype =~ /DEFINE_EVENT/ || 1948*53ee8cc1Swenshuai.xi $prototype =~ /DEFINE_SINGLE_EVENT/) 1949*53ee8cc1Swenshuai.xi { 1950*53ee8cc1Swenshuai.xi tracepoint_munge($file); 1951*53ee8cc1Swenshuai.xi } 1952*53ee8cc1Swenshuai.xi dump_function($prototype, $file); 1953*53ee8cc1Swenshuai.xi reset_state(); 1954*53ee8cc1Swenshuai.xi } 1955*53ee8cc1Swenshuai.xi} 1956*53ee8cc1Swenshuai.xi 1957*53ee8cc1Swenshuai.xisub process_state3_type($$) { 1958*53ee8cc1Swenshuai.xi my $x = shift; 1959*53ee8cc1Swenshuai.xi my $file = shift; 1960*53ee8cc1Swenshuai.xi 1961*53ee8cc1Swenshuai.xi $x =~ s@[\r\n]+@ @gos; # strip newlines/cr's. 1962*53ee8cc1Swenshuai.xi $x =~ s@^\s+@@gos; # strip leading spaces 1963*53ee8cc1Swenshuai.xi $x =~ s@\s+$@@gos; # strip trailing spaces 1964*53ee8cc1Swenshuai.xi $x =~ s@\/\/.*$@@gos; # strip C99-style comments to end of line 1965*53ee8cc1Swenshuai.xi 1966*53ee8cc1Swenshuai.xi if ($x =~ /^#/) { 1967*53ee8cc1Swenshuai.xi # To distinguish preprocessor directive from regular declaration later. 1968*53ee8cc1Swenshuai.xi $x .= ";"; 1969*53ee8cc1Swenshuai.xi } 1970*53ee8cc1Swenshuai.xi 1971*53ee8cc1Swenshuai.xi while (1) { 1972*53ee8cc1Swenshuai.xi if ( $x =~ /([^{};]*)([{};])(.*)/ ) { 1973*53ee8cc1Swenshuai.xi $prototype .= $1 . $2; 1974*53ee8cc1Swenshuai.xi ($2 eq '{') && $brcount++; 1975*53ee8cc1Swenshuai.xi ($2 eq '}') && $brcount--; 1976*53ee8cc1Swenshuai.xi if (($2 eq ';') && ($brcount == 0)) { 1977*53ee8cc1Swenshuai.xi dump_declaration($prototype, $file); 1978*53ee8cc1Swenshuai.xi reset_state(); 1979*53ee8cc1Swenshuai.xi last; 1980*53ee8cc1Swenshuai.xi } 1981*53ee8cc1Swenshuai.xi $x = $3; 1982*53ee8cc1Swenshuai.xi } else { 1983*53ee8cc1Swenshuai.xi $prototype .= $x; 1984*53ee8cc1Swenshuai.xi last; 1985*53ee8cc1Swenshuai.xi } 1986*53ee8cc1Swenshuai.xi } 1987*53ee8cc1Swenshuai.xi} 1988*53ee8cc1Swenshuai.xi 1989*53ee8cc1Swenshuai.xi# xml_escape: replace <, >, and & in the text stream; 1990*53ee8cc1Swenshuai.xi# 1991*53ee8cc1Swenshuai.xi# however, formatting controls that are generated internally/locally in the 1992*53ee8cc1Swenshuai.xi# kernel-doc script are not escaped here; instead, they begin life like 1993*53ee8cc1Swenshuai.xi# $blankline_html (4 of '\' followed by a mnemonic + ':'), then these strings 1994*53ee8cc1Swenshuai.xi# are converted to their mnemonic-expected output, without the 4 * '\' & ':', 1995*53ee8cc1Swenshuai.xi# just before actual output; (this is done by local_unescape()) 1996*53ee8cc1Swenshuai.xisub xml_escape($) { 1997*53ee8cc1Swenshuai.xi my $text = shift; 1998*53ee8cc1Swenshuai.xi if (($output_mode eq "text") || ($output_mode eq "man")) { 1999*53ee8cc1Swenshuai.xi return $text; 2000*53ee8cc1Swenshuai.xi } 2001*53ee8cc1Swenshuai.xi $text =~ s/\&/\\\\\\amp;/g; 2002*53ee8cc1Swenshuai.xi $text =~ s/\</\\\\\\lt;/g; 2003*53ee8cc1Swenshuai.xi $text =~ s/\>/\\\\\\gt;/g; 2004*53ee8cc1Swenshuai.xi return $text; 2005*53ee8cc1Swenshuai.xi} 2006*53ee8cc1Swenshuai.xi 2007*53ee8cc1Swenshuai.xi# convert local escape strings to html 2008*53ee8cc1Swenshuai.xi# local escape strings look like: '\\\\menmonic:' (that's 4 backslashes) 2009*53ee8cc1Swenshuai.xisub local_unescape($) { 2010*53ee8cc1Swenshuai.xi my $text = shift; 2011*53ee8cc1Swenshuai.xi if (($output_mode eq "text") || ($output_mode eq "man")) { 2012*53ee8cc1Swenshuai.xi return $text; 2013*53ee8cc1Swenshuai.xi } 2014*53ee8cc1Swenshuai.xi $text =~ s/\\\\\\\\lt:/</g; 2015*53ee8cc1Swenshuai.xi $text =~ s/\\\\\\\\gt:/>/g; 2016*53ee8cc1Swenshuai.xi return $text; 2017*53ee8cc1Swenshuai.xi} 2018*53ee8cc1Swenshuai.xi 2019*53ee8cc1Swenshuai.xisub process_file($) { 2020*53ee8cc1Swenshuai.xi my $file; 2021*53ee8cc1Swenshuai.xi my $identifier; 2022*53ee8cc1Swenshuai.xi my $func; 2023*53ee8cc1Swenshuai.xi my $descr; 2024*53ee8cc1Swenshuai.xi my $in_purpose = 0; 2025*53ee8cc1Swenshuai.xi my $initial_section_counter = $section_counter; 2026*53ee8cc1Swenshuai.xi 2027*53ee8cc1Swenshuai.xi if (defined($ENV{'SRCTREE'})) { 2028*53ee8cc1Swenshuai.xi $file = "$ENV{'SRCTREE'}" . "/" . "@_"; 2029*53ee8cc1Swenshuai.xi } 2030*53ee8cc1Swenshuai.xi else { 2031*53ee8cc1Swenshuai.xi $file = "@_"; 2032*53ee8cc1Swenshuai.xi } 2033*53ee8cc1Swenshuai.xi if (defined($source_map{$file})) { 2034*53ee8cc1Swenshuai.xi $file = $source_map{$file}; 2035*53ee8cc1Swenshuai.xi } 2036*53ee8cc1Swenshuai.xi 2037*53ee8cc1Swenshuai.xi if (!open(IN,"<$file")) { 2038*53ee8cc1Swenshuai.xi print STDERR "Error: Cannot open file $file\n"; 2039*53ee8cc1Swenshuai.xi ++$errors; 2040*53ee8cc1Swenshuai.xi return; 2041*53ee8cc1Swenshuai.xi } 2042*53ee8cc1Swenshuai.xi 2043*53ee8cc1Swenshuai.xi $. = 1; 2044*53ee8cc1Swenshuai.xi 2045*53ee8cc1Swenshuai.xi $section_counter = 0; 2046*53ee8cc1Swenshuai.xi while (<IN>) { 2047*53ee8cc1Swenshuai.xi if ($state == 0) { 2048*53ee8cc1Swenshuai.xi if (/$doc_start/o) { 2049*53ee8cc1Swenshuai.xi $state = 1; # next line is always the function name 2050*53ee8cc1Swenshuai.xi $in_doc_sect = 0; 2051*53ee8cc1Swenshuai.xi } 2052*53ee8cc1Swenshuai.xi } elsif ($state == 1) { # this line is the function name (always) 2053*53ee8cc1Swenshuai.xi if (/$doc_block/o) { 2054*53ee8cc1Swenshuai.xi $state = 4; 2055*53ee8cc1Swenshuai.xi $contents = ""; 2056*53ee8cc1Swenshuai.xi if ( $1 eq "" ) { 2057*53ee8cc1Swenshuai.xi $section = $section_intro; 2058*53ee8cc1Swenshuai.xi } else { 2059*53ee8cc1Swenshuai.xi $section = $1; 2060*53ee8cc1Swenshuai.xi } 2061*53ee8cc1Swenshuai.xi } 2062*53ee8cc1Swenshuai.xi elsif (/$doc_decl/o) { 2063*53ee8cc1Swenshuai.xi $identifier = $1; 2064*53ee8cc1Swenshuai.xi if (/\s*([\w\s]+?)\s*-/) { 2065*53ee8cc1Swenshuai.xi $identifier = $1; 2066*53ee8cc1Swenshuai.xi } 2067*53ee8cc1Swenshuai.xi 2068*53ee8cc1Swenshuai.xi $state = 2; 2069*53ee8cc1Swenshuai.xi if (/-(.*)/) { 2070*53ee8cc1Swenshuai.xi # strip leading/trailing/multiple spaces 2071*53ee8cc1Swenshuai.xi $descr= $1; 2072*53ee8cc1Swenshuai.xi $descr =~ s/^\s*//; 2073*53ee8cc1Swenshuai.xi $descr =~ s/\s*$//; 2074*53ee8cc1Swenshuai.xi $descr =~ s/\s+/ /; 2075*53ee8cc1Swenshuai.xi $declaration_purpose = xml_escape($descr); 2076*53ee8cc1Swenshuai.xi $in_purpose = 1; 2077*53ee8cc1Swenshuai.xi } else { 2078*53ee8cc1Swenshuai.xi $declaration_purpose = ""; 2079*53ee8cc1Swenshuai.xi } 2080*53ee8cc1Swenshuai.xi 2081*53ee8cc1Swenshuai.xi if (($declaration_purpose eq "") && $verbose) { 2082*53ee8cc1Swenshuai.xi print STDERR "Warning(${file}:$.): missing initial short description on line:\n"; 2083*53ee8cc1Swenshuai.xi print STDERR $_; 2084*53ee8cc1Swenshuai.xi ++$warnings; 2085*53ee8cc1Swenshuai.xi } 2086*53ee8cc1Swenshuai.xi 2087*53ee8cc1Swenshuai.xi if ($identifier =~ m/^struct/) { 2088*53ee8cc1Swenshuai.xi $decl_type = 'struct'; 2089*53ee8cc1Swenshuai.xi } elsif ($identifier =~ m/^union/) { 2090*53ee8cc1Swenshuai.xi $decl_type = 'union'; 2091*53ee8cc1Swenshuai.xi } elsif ($identifier =~ m/^enum/) { 2092*53ee8cc1Swenshuai.xi $decl_type = 'enum'; 2093*53ee8cc1Swenshuai.xi } elsif ($identifier =~ m/^typedef/) { 2094*53ee8cc1Swenshuai.xi $decl_type = 'typedef'; 2095*53ee8cc1Swenshuai.xi } else { 2096*53ee8cc1Swenshuai.xi $decl_type = 'function'; 2097*53ee8cc1Swenshuai.xi } 2098*53ee8cc1Swenshuai.xi 2099*53ee8cc1Swenshuai.xi if ($verbose) { 2100*53ee8cc1Swenshuai.xi print STDERR "Info(${file}:$.): Scanning doc for $identifier\n"; 2101*53ee8cc1Swenshuai.xi } 2102*53ee8cc1Swenshuai.xi } else { 2103*53ee8cc1Swenshuai.xi print STDERR "Warning(${file}:$.): Cannot understand $_ on line $.", 2104*53ee8cc1Swenshuai.xi " - I thought it was a doc line\n"; 2105*53ee8cc1Swenshuai.xi ++$warnings; 2106*53ee8cc1Swenshuai.xi $state = 0; 2107*53ee8cc1Swenshuai.xi } 2108*53ee8cc1Swenshuai.xi } elsif ($state == 2) { # look for head: lines, and include content 2109*53ee8cc1Swenshuai.xi if (/$doc_sect/o) { 2110*53ee8cc1Swenshuai.xi $newsection = $1; 2111*53ee8cc1Swenshuai.xi $newcontents = $2; 2112*53ee8cc1Swenshuai.xi 2113*53ee8cc1Swenshuai.xi if (($contents ne "") && ($contents ne "\n")) { 2114*53ee8cc1Swenshuai.xi if (!$in_doc_sect && $verbose) { 2115*53ee8cc1Swenshuai.xi print STDERR "Warning(${file}:$.): contents before sections\n"; 2116*53ee8cc1Swenshuai.xi ++$warnings; 2117*53ee8cc1Swenshuai.xi } 2118*53ee8cc1Swenshuai.xi dump_section($file, $section, xml_escape($contents)); 2119*53ee8cc1Swenshuai.xi $section = $section_default; 2120*53ee8cc1Swenshuai.xi } 2121*53ee8cc1Swenshuai.xi 2122*53ee8cc1Swenshuai.xi $in_doc_sect = 1; 2123*53ee8cc1Swenshuai.xi $in_purpose = 0; 2124*53ee8cc1Swenshuai.xi $contents = $newcontents; 2125*53ee8cc1Swenshuai.xi if ($contents ne "") { 2126*53ee8cc1Swenshuai.xi while ((substr($contents, 0, 1) eq " ") || 2127*53ee8cc1Swenshuai.xi substr($contents, 0, 1) eq "\t") { 2128*53ee8cc1Swenshuai.xi $contents = substr($contents, 1); 2129*53ee8cc1Swenshuai.xi } 2130*53ee8cc1Swenshuai.xi $contents .= "\n"; 2131*53ee8cc1Swenshuai.xi } 2132*53ee8cc1Swenshuai.xi $section = $newsection; 2133*53ee8cc1Swenshuai.xi } elsif (/$doc_end/) { 2134*53ee8cc1Swenshuai.xi 2135*53ee8cc1Swenshuai.xi if (($contents ne "") && ($contents ne "\n")) { 2136*53ee8cc1Swenshuai.xi dump_section($file, $section, xml_escape($contents)); 2137*53ee8cc1Swenshuai.xi $section = $section_default; 2138*53ee8cc1Swenshuai.xi $contents = ""; 2139*53ee8cc1Swenshuai.xi } 2140*53ee8cc1Swenshuai.xi # look for doc_com + <text> + doc_end: 2141*53ee8cc1Swenshuai.xi if ($_ =~ m'\s*\*\s*[a-zA-Z_0-9:\.]+\*/') { 2142*53ee8cc1Swenshuai.xi print STDERR "Warning(${file}:$.): suspicious ending line: $_"; 2143*53ee8cc1Swenshuai.xi ++$warnings; 2144*53ee8cc1Swenshuai.xi } 2145*53ee8cc1Swenshuai.xi 2146*53ee8cc1Swenshuai.xi $prototype = ""; 2147*53ee8cc1Swenshuai.xi $state = 3; 2148*53ee8cc1Swenshuai.xi $brcount = 0; 2149*53ee8cc1Swenshuai.xi# print STDERR "end of doc comment, looking for prototype\n"; 2150*53ee8cc1Swenshuai.xi } elsif (/$doc_content/) { 2151*53ee8cc1Swenshuai.xi # miguel-style comment kludge, look for blank lines after 2152*53ee8cc1Swenshuai.xi # @parameter line to signify start of description 2153*53ee8cc1Swenshuai.xi if ($1 eq "") { 2154*53ee8cc1Swenshuai.xi if ($section =~ m/^@/ || $section eq $section_context) { 2155*53ee8cc1Swenshuai.xi dump_section($file, $section, xml_escape($contents)); 2156*53ee8cc1Swenshuai.xi $section = $section_default; 2157*53ee8cc1Swenshuai.xi $contents = ""; 2158*53ee8cc1Swenshuai.xi } else { 2159*53ee8cc1Swenshuai.xi $contents .= "\n"; 2160*53ee8cc1Swenshuai.xi } 2161*53ee8cc1Swenshuai.xi $in_purpose = 0; 2162*53ee8cc1Swenshuai.xi } elsif ($in_purpose == 1) { 2163*53ee8cc1Swenshuai.xi # Continued declaration purpose 2164*53ee8cc1Swenshuai.xi chomp($declaration_purpose); 2165*53ee8cc1Swenshuai.xi $declaration_purpose .= " " . xml_escape($1); 2166*53ee8cc1Swenshuai.xi } else { 2167*53ee8cc1Swenshuai.xi $contents .= $1 . "\n"; 2168*53ee8cc1Swenshuai.xi } 2169*53ee8cc1Swenshuai.xi } else { 2170*53ee8cc1Swenshuai.xi # i dont know - bad line? ignore. 2171*53ee8cc1Swenshuai.xi print STDERR "Warning(${file}:$.): bad line: $_"; 2172*53ee8cc1Swenshuai.xi ++$warnings; 2173*53ee8cc1Swenshuai.xi } 2174*53ee8cc1Swenshuai.xi } elsif ($state == 3) { # scanning for function '{' (end of prototype) 2175*53ee8cc1Swenshuai.xi if ($decl_type eq 'function') { 2176*53ee8cc1Swenshuai.xi process_state3_function($_, $file); 2177*53ee8cc1Swenshuai.xi } else { 2178*53ee8cc1Swenshuai.xi process_state3_type($_, $file); 2179*53ee8cc1Swenshuai.xi } 2180*53ee8cc1Swenshuai.xi } elsif ($state == 4) { 2181*53ee8cc1Swenshuai.xi # Documentation block 2182*53ee8cc1Swenshuai.xi if (/$doc_block/) { 2183*53ee8cc1Swenshuai.xi dump_doc_section($file, $section, xml_escape($contents)); 2184*53ee8cc1Swenshuai.xi $contents = ""; 2185*53ee8cc1Swenshuai.xi $function = ""; 2186*53ee8cc1Swenshuai.xi %constants = (); 2187*53ee8cc1Swenshuai.xi %parameterdescs = (); 2188*53ee8cc1Swenshuai.xi %parametertypes = (); 2189*53ee8cc1Swenshuai.xi @parameterlist = (); 2190*53ee8cc1Swenshuai.xi %sections = (); 2191*53ee8cc1Swenshuai.xi @sectionlist = (); 2192*53ee8cc1Swenshuai.xi $prototype = ""; 2193*53ee8cc1Swenshuai.xi if ( $1 eq "" ) { 2194*53ee8cc1Swenshuai.xi $section = $section_intro; 2195*53ee8cc1Swenshuai.xi } else { 2196*53ee8cc1Swenshuai.xi $section = $1; 2197*53ee8cc1Swenshuai.xi } 2198*53ee8cc1Swenshuai.xi } 2199*53ee8cc1Swenshuai.xi elsif (/$doc_end/) 2200*53ee8cc1Swenshuai.xi { 2201*53ee8cc1Swenshuai.xi dump_doc_section($file, $section, xml_escape($contents)); 2202*53ee8cc1Swenshuai.xi $contents = ""; 2203*53ee8cc1Swenshuai.xi $function = ""; 2204*53ee8cc1Swenshuai.xi %constants = (); 2205*53ee8cc1Swenshuai.xi %parameterdescs = (); 2206*53ee8cc1Swenshuai.xi %parametertypes = (); 2207*53ee8cc1Swenshuai.xi @parameterlist = (); 2208*53ee8cc1Swenshuai.xi %sections = (); 2209*53ee8cc1Swenshuai.xi @sectionlist = (); 2210*53ee8cc1Swenshuai.xi $prototype = ""; 2211*53ee8cc1Swenshuai.xi $state = 0; 2212*53ee8cc1Swenshuai.xi } 2213*53ee8cc1Swenshuai.xi elsif (/$doc_content/) 2214*53ee8cc1Swenshuai.xi { 2215*53ee8cc1Swenshuai.xi if ( $1 eq "" ) 2216*53ee8cc1Swenshuai.xi { 2217*53ee8cc1Swenshuai.xi $contents .= $blankline; 2218*53ee8cc1Swenshuai.xi } 2219*53ee8cc1Swenshuai.xi else 2220*53ee8cc1Swenshuai.xi { 2221*53ee8cc1Swenshuai.xi $contents .= $1 . "\n"; 2222*53ee8cc1Swenshuai.xi } 2223*53ee8cc1Swenshuai.xi } 2224*53ee8cc1Swenshuai.xi } 2225*53ee8cc1Swenshuai.xi } 2226*53ee8cc1Swenshuai.xi if ($initial_section_counter == $section_counter) { 2227*53ee8cc1Swenshuai.xi print STDERR "Warning(${file}): no structured comments found\n"; 2228*53ee8cc1Swenshuai.xi if ($output_mode eq "xml") { 2229*53ee8cc1Swenshuai.xi # The template wants at least one RefEntry here; make one. 2230*53ee8cc1Swenshuai.xi print "<refentry>\n"; 2231*53ee8cc1Swenshuai.xi print " <refnamediv>\n"; 2232*53ee8cc1Swenshuai.xi print " <refname>\n"; 2233*53ee8cc1Swenshuai.xi print " ${file}\n"; 2234*53ee8cc1Swenshuai.xi print " </refname>\n"; 2235*53ee8cc1Swenshuai.xi print " <refpurpose>\n"; 2236*53ee8cc1Swenshuai.xi print " Document generation inconsistency\n"; 2237*53ee8cc1Swenshuai.xi print " </refpurpose>\n"; 2238*53ee8cc1Swenshuai.xi print " </refnamediv>\n"; 2239*53ee8cc1Swenshuai.xi print " <refsect1>\n"; 2240*53ee8cc1Swenshuai.xi print " <title>\n"; 2241*53ee8cc1Swenshuai.xi print " Oops\n"; 2242*53ee8cc1Swenshuai.xi print " </title>\n"; 2243*53ee8cc1Swenshuai.xi print " <warning>\n"; 2244*53ee8cc1Swenshuai.xi print " <para>\n"; 2245*53ee8cc1Swenshuai.xi print " The template for this document tried to insert\n"; 2246*53ee8cc1Swenshuai.xi print " the structured comment from the file\n"; 2247*53ee8cc1Swenshuai.xi print " <filename>${file}</filename> at this point,\n"; 2248*53ee8cc1Swenshuai.xi print " but none was found.\n"; 2249*53ee8cc1Swenshuai.xi print " This dummy section is inserted to allow\n"; 2250*53ee8cc1Swenshuai.xi print " generation to continue.\n"; 2251*53ee8cc1Swenshuai.xi print " </para>\n"; 2252*53ee8cc1Swenshuai.xi print " </warning>\n"; 2253*53ee8cc1Swenshuai.xi print " </refsect1>\n"; 2254*53ee8cc1Swenshuai.xi print "</refentry>\n"; 2255*53ee8cc1Swenshuai.xi } 2256*53ee8cc1Swenshuai.xi } 2257*53ee8cc1Swenshuai.xi} 2258*53ee8cc1Swenshuai.xi 2259*53ee8cc1Swenshuai.xi 2260*53ee8cc1Swenshuai.xi$kernelversion = get_kernel_version(); 2261*53ee8cc1Swenshuai.xi 2262*53ee8cc1Swenshuai.xi# generate a sequence of code that will splice in highlighting information 2263*53ee8cc1Swenshuai.xi# using the s// operator. 2264*53ee8cc1Swenshuai.xiforeach my $pattern (keys %highlights) { 2265*53ee8cc1Swenshuai.xi# print STDERR "scanning pattern:$pattern, highlight:($highlights{$pattern})\n"; 2266*53ee8cc1Swenshuai.xi $dohighlight .= "\$contents =~ s:$pattern:$highlights{$pattern}:gs;\n"; 2267*53ee8cc1Swenshuai.xi} 2268*53ee8cc1Swenshuai.xi 2269*53ee8cc1Swenshuai.xi# Read the file that maps relative names to absolute names for 2270*53ee8cc1Swenshuai.xi# separate source and object directories and for shadow trees. 2271*53ee8cc1Swenshuai.xiif (open(SOURCE_MAP, "<.tmp_filelist.txt")) { 2272*53ee8cc1Swenshuai.xi my ($relname, $absname); 2273*53ee8cc1Swenshuai.xi while(<SOURCE_MAP>) { 2274*53ee8cc1Swenshuai.xi chop(); 2275*53ee8cc1Swenshuai.xi ($relname, $absname) = (split())[0..1]; 2276*53ee8cc1Swenshuai.xi $relname =~ s:^/+::; 2277*53ee8cc1Swenshuai.xi $source_map{$relname} = $absname; 2278*53ee8cc1Swenshuai.xi } 2279*53ee8cc1Swenshuai.xi close(SOURCE_MAP); 2280*53ee8cc1Swenshuai.xi} 2281*53ee8cc1Swenshuai.xi 2282*53ee8cc1Swenshuai.xiforeach (@ARGV) { 2283*53ee8cc1Swenshuai.xi chomp; 2284*53ee8cc1Swenshuai.xi process_file($_); 2285*53ee8cc1Swenshuai.xi} 2286*53ee8cc1Swenshuai.xiif ($verbose && $errors) { 2287*53ee8cc1Swenshuai.xi print STDERR "$errors errors\n"; 2288*53ee8cc1Swenshuai.xi} 2289*53ee8cc1Swenshuai.xiif ($verbose && $warnings) { 2290*53ee8cc1Swenshuai.xi print STDERR "$warnings warnings\n"; 2291*53ee8cc1Swenshuai.xi} 2292*53ee8cc1Swenshuai.xi 2293*53ee8cc1Swenshuai.xiexit($errors); 2294