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