checkLibraryDoc.tcl
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:7k
源码类别:

通讯编程

开发平台:

Visual C++

  1. # checkLibraryDoc.tcl --
  2. #
  3. # This script attempts to determine what APIs exist in the source base that 
  4. # have not been documented.  By grepping through all of the doc/*.3 man 
  5. # pages, looking for "Pkg_*" (e.g., Tcl_ or Tk_), and comparing this list
  6. # against the list of Pkg_ APIs found in the source (e.g., tcl8.2/*/*.[ch])
  7. # we create six lists:
  8. #      1) APIs in Source not in Docs.
  9. #      2) APIs in Docs not in Source.
  10. #      3) Internal APIs and structs.
  11. #      4) Misc APIs and structs that we are not documenting.
  12. #      5) Command APIs (e.g., Tcl_ArrayObjCmd.)
  13. #      6) Proc pointers (e.g., Tcl_CloseProc.)
  14. # Note: Each list is "a best guess" approximation.  If developers write
  15. # non-standard code, this script will produce erroneous results.  Each
  16. # list should be carefully checked for accuracy. 
  17. #
  18. # Copyright (c) 1998-1999 by Scriptics Corporation.
  19. # All rights reserved.
  20. # RCS: @(#) $Id: checkLibraryDoc.tcl,v 1.7 2002/01/15 17:55:30 dgp Exp $
  21. lappend auto_path "c:/program files/tclpro1.2/win32-ix86/bin"
  22. #lappend auto_path "/home/surles/cvs/tclx8.0/tcl/unix"
  23. if {[catch {package require Tclx}]} {
  24.     puts "error: could not load TclX.  Please set TCL_LIBRARY."
  25.     exit 1
  26. }
  27. # A list of structs that are known to be undocumented.
  28. set StructList {
  29.     Tcl_AsyncHandler 
  30.     Tcl_CallFrame 
  31.     Tcl_Condition 
  32.     Tcl_Encoding 
  33.     Tcl_EncodingState 
  34.     Tcl_EncodingType 
  35.     Tcl_HashEntry 
  36.     Tcl_HashSearch 
  37.     Tcl_HashTable 
  38.     Tcl_Mutex 
  39.     Tcl_Pid 
  40.     Tcl_QueuePosition 
  41.     Tcl_ResolvedVarInfo 
  42.     Tcl_SavedResult 
  43.     Tcl_ThreadDataKey 
  44.     Tcl_ThreadId 
  45.     Tcl_Time 
  46.     Tcl_TimerToken 
  47.     Tcl_Token 
  48.     Tcl_Trace 
  49.     Tcl_Value 
  50.     Tcl_ValueType 
  51.     Tcl_Var 
  52.     Tk_3DBorder 
  53.     Tk_ArgvInfo 
  54.     Tk_BindingTable 
  55.     Tk_Canvas 
  56.     Tk_CanvasTextInfo 
  57.     Tk_ConfigSpec 
  58.     Tk_ConfigTypes 
  59.     Tk_Cursor 
  60.     Tk_CustomOption 
  61.     Tk_ErrorHandler 
  62.     Tk_FakeWin 
  63.     Tk_Font 
  64.     Tk_FontMetrics 
  65.     Tk_GeomMgr 
  66.     Tk_Image 
  67.     Tk_ImageMaster 
  68.     Tk_ImageType 
  69.     Tk_Item 
  70.     Tk_ItemType 
  71.     Tk_OptionSpec
  72.     Tk_OptionTable 
  73.     Tk_OptionType 
  74.     Tk_PhotoHandle 
  75.     Tk_PhotoImageBlock 
  76.     Tk_PhotoImageFormat 
  77.     Tk_PostscriptInfo 
  78.     Tk_SavedOption 
  79.     Tk_SavedOptions 
  80.     Tk_SegType 
  81.     Tk_TextLayout 
  82.     Tk_Window 
  83. }
  84. # Misc junk that appears in the comments of the source.  This just 
  85. # allows us to filter comments that "fool" the script.
  86. set CommentList {
  87.     Tcl_Create[Obj]Command 
  88.     Tcl_DecrRefCount\n 
  89.     Tcl_NewObj\n 
  90.     Tk_GetXXX 
  91. }
  92. # Main entry point to this script.
  93. proc main {} {
  94.     global argv0 
  95.     global argv 
  96.     set len [llength $argv]
  97.     if {($len != 2) && ($len != 3)} {
  98. puts "usage: $argv0 pkgName pkgDir [outFile]"
  99. puts "   pkgName == Tcl,Tk"
  100. puts "   pkgDir  == /home/surles/cvs/tcl8.2"
  101. exit 1
  102.     }
  103.     set pkg [lindex $argv 0]
  104.     set dir [lindex $argv 1]
  105.     if {[llength $argv] == 3} {
  106. set file [open [lindex $argv 2] w]
  107.     } else {
  108. set file stdout
  109.     }
  110.     foreach {c d} [compare [grepCode $dir $pkg] [grepDocs $dir $pkg]] {}
  111.     filter $c $d $dir $pkg $file
  112.     if {$file != "stdout"} {
  113. close $file
  114.     }
  115.     return
  116. }
  117.     
  118. # Intersect the two list and write out the sets of APIs in one
  119. # list that is not in the other.
  120. proc compare {list1 list2} {
  121.     set inter [intersect3 $list1 $list2]
  122.     return [list [lindex $inter 0] [lindex $inter 2]]
  123. }
  124. # Filter the lists into the six lists we report on.  Then write
  125. # the results to the file.
  126. proc filter {code docs dir pkg {outFile stdout}} {
  127.     set apis  {}
  128.     # A list of Tcl command APIs.  These are not documented.
  129.     # This list should just be verified for accuracy.
  130.     set cmds  {}
  131.     
  132.     # A list of proc pointer structs.  These are not documented.
  133.     # This list should just be verified for accuracy.
  134.     set procs {}
  135.     # A list of internal declarations.  These are not documented.
  136.     # This list should just be verified for accuracy.
  137.     set decls [grepDecl $dir $pkg]
  138.     # A list of misc. procedure declarations that are not documented.
  139.     # This list should just be verified for accuracy.
  140.     set misc [grepMisc $dir $pkg]
  141.     set pat1 ".*(${pkg}_[A-z0-9]+).*$"
  142.     
  143.     # A list of APIs in the source, not in the docs.
  144.     # This list should just be verified for accuracy.
  145.     foreach x $code {
  146. if {[string match *Cmd $x]} {
  147.     if {[string match ${pkg}* $x]} {
  148. lappend cmds $x
  149.     }
  150. } elseif {[string match *Proc $x]} {
  151.     if {[string match ${pkg}* $x]} {
  152. lappend procs $x
  153.     }
  154. } elseif {[lsearch -exact $decls $x] >= 0} {
  155.     # No Op.
  156. } elseif {[lsearch -exact $misc $x] >= 0} {
  157.     # No Op.
  158. } else {
  159.     lappend apis $x
  160. }
  161.     }
  162.     dump $apis  "APIs in Source not in Docs." $outFile
  163.     dump $docs  "APIs in Docs not in Source." $outFile
  164.     dump $decls "Internal APIs and structs."  $outFile
  165.     dump $misc  "Misc APIs and structs that we are not documenting." $outFile
  166.     dump $cmds  "Command APIs."  $outFile
  167.     dump $procs "Proc pointers." $outFile
  168.     return
  169. }
  170. # Print the list of APIs if the list is not null.
  171. proc dump {list title file} {
  172.     if {$list != {}} {
  173. puts $file ""
  174. puts $file $title
  175. puts $file "---------------------------------------------------------"
  176. foreach x $list {
  177.     puts $file $x
  178. }
  179.     }
  180. }
  181. # Grep into "dir/*/*.[ch]" looking for APIs that match $pkg_*.
  182. # (e.g., Tcl_Exit).  Return a list of APIs.
  183. proc grepCode {dir pkg} {
  184.     set apis [myGrep "${pkg}_.*" "${dir}/*/*.[ch]"]
  185.     set pat1 ".*(${pkg}_[A-z0-9]+).*$"
  186.     foreach a $apis {
  187. if {[regexp --  $pat1 $a main n1]} {
  188.     set result([string trim $n1]) 1
  189. }
  190.     }
  191.     return [lsort [array names result]]
  192. }
  193. # Grep into "dir/doc/*.3" looking for APIs that match $pkg_*.
  194. # (e.g., Tcl_Exit).  Return a list of APIs.
  195. proc grepDocs {dir pkg} {
  196.     set apis [myGrep "\fB${pkg}_.*\fR" "${dir}/doc/*.3"]
  197.     set pat1 ".*(${pkg}_[A-z0-9]+)\\fR.*$"
  198.     foreach a $apis {
  199. if {[regexp -- $pat1 $a main n1]} {
  200.     set result([string trim $n1]) 1
  201. }
  202.     }
  203.     return [lsort [array names result]]
  204. }
  205. # Grep into "generic/pkgIntDecls.h" looking for APIs that match $pkg_*.
  206. # (e.g., Tcl_Export).  Return a list of APIs.
  207. proc grepDecl {dir pkg} {
  208.     set file [file join $dir generic "[string tolower $pkg]IntDecls.h"] 
  209.     set apis [myGrep "^EXTERN.*[ t]${pkg}_.*" $file]
  210.     set pat1 ".*(${pkg}_[A-z0-9]+).*$"
  211.     foreach a $apis {
  212. if {[regexp -- $pat1 $a main n1]} {
  213.     set result([string trim $n1]) 1
  214. }
  215.     }
  216.     return [lsort [array names result]]
  217. }
  218. # Grep into "*/*.[ch]" looking for APIs that match $pkg_Db*.
  219. # (e.g., Tcl_DbCkalloc).  Return a list of APIs.
  220. proc grepMisc {dir pkg} {
  221.     global CommentList
  222.     global StructList
  223.     
  224.     set apis [myGrep "^EXTERN.*[ t]${pkg}_Db.*" "${dir}/*/*.[ch]"]
  225.     set pat1 ".*(${pkg}_[A-z0-9]+).*$"
  226.     foreach a $apis {
  227. if {[regexp -- $pat1 $a main n1]} {
  228.     set dbg([string trim $n1]) 1
  229. }
  230.     }
  231.     set result {}
  232.     eval {lappend result} $StructList
  233.     eval {lappend result} [lsort [array names dbg]]
  234.     eval {lappend result} $CommentList
  235.     return $result
  236. }
  237. proc myGrep {searchPat globPat} {
  238.     set result {}
  239.     foreach file [glob -nocomplain $globPat] {
  240. set file [open $file r]
  241. set data [read $file]
  242. close $file
  243. foreach line [split $data "n"] {
  244.     if {[regexp "^.*${searchPat}.*$" $line]} {
  245. lappend result $line
  246.     }
  247. }
  248.     }
  249.     return $result
  250. }
  251. main