reports.c Source Code

Go to: Contents; Previous section; Beginning of section; Next file in section; Previous file in section.

Routines In This File (Alphabetical)

 Line Name
----- ----
  402 fold_string
  547 isfirst_in_file
  572 islast_in_file
  784 needs_tree
  649 next_defined
  495 next_defining_file
  597 next_tree
  701 next_undefined
  675 prev_defined
  521 prev_defining_file
  623 prev_tree
  727 prev_undefined
 1448 report_by_file
  995 report_calls
  849 report_defined
  284 report_end_routine
  283 report_entry_routine
 1560 report_files
  476 report_filext
  282 report_hdr_routine
 1627 report_source
 1202 report_tree
  922 report_undefined
 1084 report_xrefs
   88 rpt_byfile_rtf_end
   87 rpt_byfile_rtf_entry
   86 rpt_byfile_rtf_hdr
   85 rpt_byfile_text_end
   84 rpt_byfile_text_entry
   83 rpt_byfile_text_hdr
   94 rpt_byfile_vmshelp_end
   93 rpt_byfile_vmshelp_entry
   92 rpt_byfile_vmshelp_hdr
   91 rpt_byfile_winhelp_end
   90 rpt_byfile_winhelp_entry
   89 rpt_byfile_winhelp_hdr
   55 rpt_calls_rtf_end
   54 rpt_calls_rtf_entry
   53 rpt_calls_rtf_hdr
   61 rpt_calls_vmshelp_end
   60 rpt_calls_vmshelp_entry
   59 rpt_calls_vmshelp_hdr
   58 rpt_calls_winhelp_end
   57 rpt_calls_winhelp_entry
   56 rpt_calls_winhelp_hdr
   35 rpt_defined_rtf_end
   34 rpt_defined_rtf_entry
   33 rpt_defined_rtf_hdr
   41 rpt_defined_vmshelp_end
   40 rpt_defined_vmshelp_entry
   39 rpt_defined_vmshelp_hdr
   38 rpt_defined_winhelp_end
   37 rpt_defined_winhelp_entry
   36 rpt_defined_winhelp_hdr
  101 rpt_file_rtf_end
  100 rpt_file_rtf_entry
   99 rpt_file_rtf_hdr
   98 rpt_file_text_end
   97 rpt_file_text_entry
   96 rpt_file_text_hdr
  107 rpt_file_vmshelp_end
  106 rpt_file_vmshelp_entry
  105 rpt_file_vmshelp_hdr
  104 rpt_file_winhelp_end
  103 rpt_file_winhelp_entry
  102 rpt_file_winhelp_hdr
  114 rpt_source_rtf_end
  113 rpt_source_rtf_entry
  112 rpt_source_rtf_hdr
  111 rpt_source_text_end
  110 rpt_source_text_entry
  109 rpt_source_text_hdr
  120 rpt_source_vmshelp_end
  119 rpt_source_vmshelp_entry
  118 rpt_source_vmshelp_hdr
  117 rpt_source_winhelp_end
  116 rpt_source_winhelp_entry
  115 rpt_source_winhelp_hdr
   75 rpt_tree_rtf_end
   74 rpt_tree_rtf_entry
   73 rpt_tree_rtf_hdr
   81 rpt_tree_vmshelp_end
   80 rpt_tree_vmshelp_entry
   79 rpt_tree_vmshelp_hdr
   78 rpt_tree_winhelp_end
   77 rpt_tree_winhelp_entry
   76 rpt_tree_winhelp_hdr
   45 rpt_undefined_rtf_end
   44 rpt_undefined_rtf_entry
   43 rpt_undefined_rtf_hdr
   51 rpt_undefined_vmshelp_end
   50 rpt_undefined_vmshelp_entry
   49 rpt_undefined_vmshelp_hdr
   48 rpt_undefined_winhelp_end
   47 rpt_undefined_winhelp_entry
   46 rpt_undefined_winhelp_hdr
   65 rpt_xref_rtf_end
   64 rpt_xref_rtf_entry
   63 rpt_xref_rtf_hdr
   71 rpt_xref_vmshelp_end
   70 rpt_xref_vmshelp_entry
   69 rpt_xref_vmshelp_hdr
   68 rpt_xref_winhelp_end
   67 rpt_xref_winhelp_entry
   66 rpt_xref_winhelp_hdr
  753 separate_tree
   28 tree_greater_than
  361 tree_size

BEGINNING OF FILE

     1: /****************************************************************************/
     2: /*									    */
     3: /*  FACILITY:	Routine Analyzer					    */
     4: /*									    */
     5: /*  MODULE:	Report Generation					    */
     6: /*									    */
     7: /*  AUTHOR:	Steve Branam, Network Product Support Group, Digital	    */
     8: /*		Equipment Corporation, Littleton, MA, USA.		    */
     9: /*									    */
    10: /*  DESCRIPTION: This module contains the routines for generating Routine   */
    11: /*  Analyzer reports, for all output formats.				    */
    12: /*									    */
    13: /*  REVISION HISTORY:							    */
    14: /*									    */
    15: /*  V0.1-00 24-AUG-1994 Steve Branam					    */
    16: /*									    */
    17: /*	Original version.						    */
    18: /*									    */
    19: /****************************************************************************/
    20: 
    21: #include <stdio.h>
    22: #include <ctype.h>
    23: #include "ranalyzer.h"
    24: #include "reports.h"
    25: 
    26: extern GLOBAL_DATABASE gGlobalDatabase;
    27: 

ROUTINE tree_greater_than. Go to: Next routine in file; Routines in this file.

    28: int tree_greater_than(){return 1;} /* dummy */
END tree_greater_than. Go to: Beginning of routine.


    29: 
    30: 
    31: /* dummy routines for currently unimplemented report formats		    */
    32: 

ROUTINE rpt_defined_rtf_hdr. Go to: Next routine in file; Routines in this file.

    33: void rpt_defined_rtf_hdr(){}
END rpt_defined_rtf_hdr. Go to: Beginning of routine.



ROUTINE rpt_defined_rtf_entry. Go to: Next routine in file; Routines in this file.

    34: void rpt_defined_rtf_entry(){}
END rpt_defined_rtf_entry. Go to: Beginning of routine.



ROUTINE rpt_defined_rtf_end. Go to: Next routine in file; Routines in this file.

    35: void rpt_defined_rtf_end(){}
END rpt_defined_rtf_end. Go to: Beginning of routine.



ROUTINE rpt_defined_winhelp_hdr. Go to: Next routine in file; Routines in this file.

    36: void rpt_defined_winhelp_hdr(){}
END rpt_defined_winhelp_hdr. Go to: Beginning of routine.



ROUTINE rpt_defined_winhelp_entry. Go to: Next routine in file; Routines in this file.

    37: void rpt_defined_winhelp_entry(){}
END rpt_defined_winhelp_entry. Go to: Beginning of routine.



ROUTINE rpt_defined_winhelp_end. Go to: Next routine in file; Routines in this file.

    38: void rpt_defined_winhelp_end(){}
END rpt_defined_winhelp_end. Go to: Beginning of routine.



ROUTINE rpt_defined_vmshelp_hdr. Go to: Next routine in file; Routines in this file.

    39: void rpt_defined_vmshelp_hdr(){}
END rpt_defined_vmshelp_hdr. Go to: Beginning of routine.



ROUTINE rpt_defined_vmshelp_entry. Go to: Next routine in file; Routines in this file.

    40: void rpt_defined_vmshelp_entry(){}
END rpt_defined_vmshelp_entry. Go to: Beginning of routine.



ROUTINE rpt_defined_vmshelp_end. Go to: Next routine in file; Routines in this file.

    41: void rpt_defined_vmshelp_end(){}
END rpt_defined_vmshelp_end. Go to: Beginning of routine.


    42: 

ROUTINE rpt_undefined_rtf_hdr. Go to: Next routine in file; Routines in this file.

    43: void rpt_undefined_rtf_hdr(){}
END rpt_undefined_rtf_hdr. Go to: Beginning of routine.



ROUTINE rpt_undefined_rtf_entry. Go to: Next routine in file; Routines in this file.

    44: void rpt_undefined_rtf_entry(){}
END rpt_undefined_rtf_entry. Go to: Beginning of routine.



ROUTINE rpt_undefined_rtf_end. Go to: Next routine in file; Routines in this file.

    45: void rpt_undefined_rtf_end(){}
END rpt_undefined_rtf_end. Go to: Beginning of routine.



ROUTINE rpt_undefined_winhelp_hdr. Go to: Next routine in file; Routines in this file.

    46: void rpt_undefined_winhelp_hdr(){}
END rpt_undefined_winhelp_hdr. Go to: Beginning of routine.



ROUTINE rpt_undefined_winhelp_entry. Go to: Next routine in file; Routines in this file.

    47: void rpt_undefined_winhelp_entry(){}
END rpt_undefined_winhelp_entry. Go to: Beginning of routine.



ROUTINE rpt_undefined_winhelp_end. Go to: Next routine in file; Routines in this file.

    48: void rpt_undefined_winhelp_end(){}
END rpt_undefined_winhelp_end. Go to: Beginning of routine.



ROUTINE rpt_undefined_vmshelp_hdr. Go to: Next routine in file; Routines in this file.

    49: void rpt_undefined_vmshelp_hdr(){}
END rpt_undefined_vmshelp_hdr. Go to: Beginning of routine.



ROUTINE rpt_undefined_vmshelp_entry. Go to: Next routine in file; Routines in this file.

    50: void rpt_undefined_vmshelp_entry(){}
END rpt_undefined_vmshelp_entry. Go to: Beginning of routine.



ROUTINE rpt_undefined_vmshelp_end. Go to: Next routine in file; Routines in this file.

    51: void rpt_undefined_vmshelp_end(){}
END rpt_undefined_vmshelp_end. Go to: Beginning of routine.


    52: 

ROUTINE rpt_calls_rtf_hdr. Go to: Next routine in file; Routines in this file.

    53: void rpt_calls_rtf_hdr(){}
END rpt_calls_rtf_hdr. Go to: Beginning of routine.



ROUTINE rpt_calls_rtf_entry. Go to: Next routine in file; Routines in this file.

    54: void rpt_calls_rtf_entry(){}
END rpt_calls_rtf_entry. Go to: Beginning of routine.



ROUTINE rpt_calls_rtf_end. Go to: Next routine in file; Routines in this file.

    55: void rpt_calls_rtf_end(){}
END rpt_calls_rtf_end. Go to: Beginning of routine.



ROUTINE rpt_calls_winhelp_hdr. Go to: Next routine in file; Routines in this file.

    56: void rpt_calls_winhelp_hdr(){}
END rpt_calls_winhelp_hdr. Go to: Beginning of routine.



ROUTINE rpt_calls_winhelp_entry. Go to: Next routine in file; Routines in this file.

    57: void rpt_calls_winhelp_entry(){}
END rpt_calls_winhelp_entry. Go to: Beginning of routine.



ROUTINE rpt_calls_winhelp_end. Go to: Next routine in file; Routines in this file.

    58: void rpt_calls_winhelp_end(){}
END rpt_calls_winhelp_end. Go to: Beginning of routine.



ROUTINE rpt_calls_vmshelp_hdr. Go to: Next routine in file; Routines in this file.

    59: void rpt_calls_vmshelp_hdr(){}
END rpt_calls_vmshelp_hdr. Go to: Beginning of routine.



ROUTINE rpt_calls_vmshelp_entry. Go to: Next routine in file; Routines in this file.

    60: void rpt_calls_vmshelp_entry(){}
END rpt_calls_vmshelp_entry. Go to: Beginning of routine.



ROUTINE rpt_calls_vmshelp_end. Go to: Next routine in file; Routines in this file.

    61: void rpt_calls_vmshelp_end(){}
END rpt_calls_vmshelp_end. Go to: Beginning of routine.


    62: 

ROUTINE rpt_xref_rtf_hdr. Go to: Next routine in file; Routines in this file.

    63: void rpt_xref_rtf_hdr(){}
END rpt_xref_rtf_hdr. Go to: Beginning of routine.



ROUTINE rpt_xref_rtf_entry. Go to: Next routine in file; Routines in this file.

    64: void rpt_xref_rtf_entry(){}
END rpt_xref_rtf_entry. Go to: Beginning of routine.



ROUTINE rpt_xref_rtf_end. Go to: Next routine in file; Routines in this file.

    65: void rpt_xref_rtf_end(){}
END rpt_xref_rtf_end. Go to: Beginning of routine.



ROUTINE rpt_xref_winhelp_hdr. Go to: Next routine in file; Routines in this file.

    66: void rpt_xref_winhelp_hdr(){}
END rpt_xref_winhelp_hdr. Go to: Beginning of routine.



ROUTINE rpt_xref_winhelp_entry. Go to: Next routine in file; Routines in this file.

    67: void rpt_xref_winhelp_entry(){}
END rpt_xref_winhelp_entry. Go to: Beginning of routine.



ROUTINE rpt_xref_winhelp_end. Go to: Next routine in file; Routines in this file.

    68: void rpt_xref_winhelp_end(){}
END rpt_xref_winhelp_end. Go to: Beginning of routine.



ROUTINE rpt_xref_vmshelp_hdr. Go to: Next routine in file; Routines in this file.

    69: void rpt_xref_vmshelp_hdr(){}
END rpt_xref_vmshelp_hdr. Go to: Beginning of routine.



ROUTINE rpt_xref_vmshelp_entry. Go to: Next routine in file; Routines in this file.

    70: void rpt_xref_vmshelp_entry(){}
END rpt_xref_vmshelp_entry. Go to: Beginning of routine.



ROUTINE rpt_xref_vmshelp_end. Go to: Next routine in file; Routines in this file.

    71: void rpt_xref_vmshelp_end(){}
END rpt_xref_vmshelp_end. Go to: Beginning of routine.


    72: 

ROUTINE rpt_tree_rtf_hdr. Go to: Next routine in file; Routines in this file.

    73: void rpt_tree_rtf_hdr(){}
END rpt_tree_rtf_hdr. Go to: Beginning of routine.



ROUTINE rpt_tree_rtf_entry. Go to: Next routine in file; Routines in this file.

    74: void rpt_tree_rtf_entry(){}
END rpt_tree_rtf_entry. Go to: Beginning of routine.



ROUTINE rpt_tree_rtf_end. Go to: Next routine in file; Routines in this file.

    75: void rpt_tree_rtf_end(){}
END rpt_tree_rtf_end. Go to: Beginning of routine.



ROUTINE rpt_tree_winhelp_hdr. Go to: Next routine in file; Routines in this file.

    76: void rpt_tree_winhelp_hdr(){}
END rpt_tree_winhelp_hdr. Go to: Beginning of routine.



ROUTINE rpt_tree_winhelp_entry. Go to: Next routine in file; Routines in this file.

    77: void rpt_tree_winhelp_entry(){}
END rpt_tree_winhelp_entry. Go to: Beginning of routine.



ROUTINE rpt_tree_winhelp_end. Go to: Next routine in file; Routines in this file.

    78: void rpt_tree_winhelp_end(){}
END rpt_tree_winhelp_end. Go to: Beginning of routine.



ROUTINE rpt_tree_vmshelp_hdr. Go to: Next routine in file; Routines in this file.

    79: void rpt_tree_vmshelp_hdr(){}
END rpt_tree_vmshelp_hdr. Go to: Beginning of routine.



ROUTINE rpt_tree_vmshelp_entry. Go to: Next routine in file; Routines in this file.

    80: void rpt_tree_vmshelp_entry(){}
END rpt_tree_vmshelp_entry. Go to: Beginning of routine.



ROUTINE rpt_tree_vmshelp_end. Go to: Next routine in file; Routines in this file.

    81: void rpt_tree_vmshelp_end(){}
END rpt_tree_vmshelp_end. Go to: Beginning of routine.


    82: 

ROUTINE rpt_byfile_text_hdr. Go to: Next routine in file; Routines in this file.

    83: void rpt_byfile_text_hdr(){}
END rpt_byfile_text_hdr. Go to: Beginning of routine.



ROUTINE rpt_byfile_text_entry. Go to: Next routine in file; Routines in this file.

    84: void rpt_byfile_text_entry(){}
END rpt_byfile_text_entry. Go to: Beginning of routine.



ROUTINE rpt_byfile_text_end. Go to: Next routine in file; Routines in this file.

    85: void rpt_byfile_text_end(){}
END rpt_byfile_text_end. Go to: Beginning of routine.



ROUTINE rpt_byfile_rtf_hdr. Go to: Next routine in file; Routines in this file.

    86: void rpt_byfile_rtf_hdr(){}
END rpt_byfile_rtf_hdr. Go to: Beginning of routine.



ROUTINE rpt_byfile_rtf_entry. Go to: Next routine in file; Routines in this file.

    87: void rpt_byfile_rtf_entry(){}
END rpt_byfile_rtf_entry. Go to: Beginning of routine.



ROUTINE rpt_byfile_rtf_end. Go to: Next routine in file; Routines in this file.

    88: void rpt_byfile_rtf_end(){}
END rpt_byfile_rtf_end. Go to: Beginning of routine.



ROUTINE rpt_byfile_winhelp_hdr. Go to: Next routine in file; Routines in this file.

    89: void rpt_byfile_winhelp_hdr(){}
END rpt_byfile_winhelp_hdr. Go to: Beginning of routine.



ROUTINE rpt_byfile_winhelp_entry. Go to: Next routine in file; Routines in this file.

    90: void rpt_byfile_winhelp_entry(){}
END rpt_byfile_winhelp_entry. Go to: Beginning of routine.



ROUTINE rpt_byfile_winhelp_end. Go to: Next routine in file; Routines in this file.

    91: void rpt_byfile_winhelp_end(){}
END rpt_byfile_winhelp_end. Go to: Beginning of routine.



ROUTINE rpt_byfile_vmshelp_hdr. Go to: Next routine in file; Routines in this file.

    92: void rpt_byfile_vmshelp_hdr(){}
END rpt_byfile_vmshelp_hdr. Go to: Beginning of routine.



ROUTINE rpt_byfile_vmshelp_entry. Go to: Next routine in file; Routines in this file.

    93: void rpt_byfile_vmshelp_entry(){}
END rpt_byfile_vmshelp_entry. Go to: Beginning of routine.



ROUTINE rpt_byfile_vmshelp_end. Go to: Next routine in file; Routines in this file.

    94: void rpt_byfile_vmshelp_end(){}
END rpt_byfile_vmshelp_end. Go to: Beginning of routine.


    95: 

ROUTINE rpt_file_text_hdr. Go to: Next routine in file; Routines in this file.

    96: void rpt_file_text_hdr(){}
END rpt_file_text_hdr. Go to: Beginning of routine.



ROUTINE rpt_file_text_entry. Go to: Next routine in file; Routines in this file.

    97: void rpt_file_text_entry(){}
END rpt_file_text_entry. Go to: Beginning of routine.



ROUTINE rpt_file_text_end. Go to: Next routine in file; Routines in this file.

    98: void rpt_file_text_end(){}
END rpt_file_text_end. Go to: Beginning of routine.



ROUTINE rpt_file_rtf_hdr. Go to: Next routine in file; Routines in this file.

    99: void rpt_file_rtf_hdr(){}
END rpt_file_rtf_hdr. Go to: Beginning of routine.



ROUTINE rpt_file_rtf_entry. Go to: Next routine in file; Routines in this file.

   100: void rpt_file_rtf_entry(){}
END rpt_file_rtf_entry. Go to: Beginning of routine.



ROUTINE rpt_file_rtf_end. Go to: Next routine in file; Routines in this file.

   101: void rpt_file_rtf_end(){}
END rpt_file_rtf_end. Go to: Beginning of routine.



ROUTINE rpt_file_winhelp_hdr. Go to: Next routine in file; Routines in this file.

   102: void rpt_file_winhelp_hdr(){}
END rpt_file_winhelp_hdr. Go to: Beginning of routine.



ROUTINE rpt_file_winhelp_entry. Go to: Next routine in file; Routines in this file.

   103: void rpt_file_winhelp_entry(){}
END rpt_file_winhelp_entry. Go to: Beginning of routine.



ROUTINE rpt_file_winhelp_end. Go to: Next routine in file; Routines in this file.

   104: void rpt_file_winhelp_end(){}
END rpt_file_winhelp_end. Go to: Beginning of routine.



ROUTINE rpt_file_vmshelp_hdr. Go to: Next routine in file; Routines in this file.

   105: void rpt_file_vmshelp_hdr(){}
END rpt_file_vmshelp_hdr. Go to: Beginning of routine.



ROUTINE rpt_file_vmshelp_entry. Go to: Next routine in file; Routines in this file.

   106: void rpt_file_vmshelp_entry(){}
END rpt_file_vmshelp_entry. Go to: Beginning of routine.



ROUTINE rpt_file_vmshelp_end. Go to: Next routine in file; Routines in this file.

   107: void rpt_file_vmshelp_end(){}
END rpt_file_vmshelp_end. Go to: Beginning of routine.


   108: 

ROUTINE rpt_source_text_hdr. Go to: Next routine in file; Routines in this file.

   109: void rpt_source_text_hdr(){}
END rpt_source_text_hdr. Go to: Beginning of routine.



ROUTINE rpt_source_text_entry. Go to: Next routine in file; Routines in this file.

   110: void rpt_source_text_entry(){}
END rpt_source_text_entry. Go to: Beginning of routine.



ROUTINE rpt_source_text_end. Go to: Next routine in file; Routines in this file.

   111: void rpt_source_text_end(){}
END rpt_source_text_end. Go to: Beginning of routine.



ROUTINE rpt_source_rtf_hdr. Go to: Next routine in file; Routines in this file.

   112: void rpt_source_rtf_hdr(){}
END rpt_source_rtf_hdr. Go to: Beginning of routine.



ROUTINE rpt_source_rtf_entry. Go to: Next routine in file; Routines in this file.

   113: void rpt_source_rtf_entry(){}
END rpt_source_rtf_entry. Go to: Beginning of routine.



ROUTINE rpt_source_rtf_end. Go to: Next routine in file; Routines in this file.

   114: void rpt_source_rtf_end(){}
END rpt_source_rtf_end. Go to: Beginning of routine.



ROUTINE rpt_source_winhelp_hdr. Go to: Next routine in file; Routines in this file.

   115: void rpt_source_winhelp_hdr(){}
END rpt_source_winhelp_hdr. Go to: Beginning of routine.



ROUTINE rpt_source_winhelp_entry. Go to: Next routine in file; Routines in this file.

   116: void rpt_source_winhelp_entry(){}
END rpt_source_winhelp_entry. Go to: Beginning of routine.



ROUTINE rpt_source_winhelp_end. Go to: Next routine in file; Routines in this file.

   117: void rpt_source_winhelp_end(){}
END rpt_source_winhelp_end. Go to: Beginning of routine.



ROUTINE rpt_source_vmshelp_hdr. Go to: Next routine in file; Routines in this file.

   118: void rpt_source_vmshelp_hdr(){}
END rpt_source_vmshelp_hdr. Go to: Beginning of routine.



ROUTINE rpt_source_vmshelp_entry. Go to: Next routine in file; Routines in this file.

   119: void rpt_source_vmshelp_entry(){}
END rpt_source_vmshelp_entry. Go to: Beginning of routine.



ROUTINE rpt_source_vmshelp_end. Go to: Next routine in file; Routines in this file.

   120: void rpt_source_vmshelp_end(){}
END rpt_source_vmshelp_end. Go to: Beginning of routine.


   121: 
   122: /*									    */
   123: /* Formatter routines forward declarations.				    */
   124: /*									    */
   125: 
   126: void rpt_defined_text_hdr();
   127: void rpt_defined_text_entry();
   128: void rpt_defined_text_end();
   129: void rpt_defined_sdml_hdr();
   130: void rpt_defined_sdml_entry();
   131: void rpt_defined_sdml_end();
   132: void rpt_defined_html_hdr();
   133: void rpt_defined_html_entry();
   134: void rpt_defined_html_end();
   135: void rpt_defined_rtf_hdr();
   136: void rpt_defined_rtf_entry();
   137: void rpt_defined_rtf_end();
   138: void rpt_defined_winhelp_hdr();
   139: void rpt_defined_winhelp_entry();
   140: void rpt_defined_winhelp_end();
   141: void rpt_defined_vmshelp_hdr();
   142: void rpt_defined_vmshelp_entry();
   143: void rpt_defined_vmshelp_end();
   144: 
   145: void rpt_undefined_text_hdr();
   146: void rpt_undefined_text_entry();
   147: void rpt_undefined_text_end();
   148: void rpt_undefined_sdml_hdr();
   149: void rpt_undefined_sdml_entry();
   150: void rpt_undefined_sdml_end();
   151: void rpt_undefined_html_hdr();
   152: void rpt_undefined_html_entry();
   153: void rpt_undefined_html_end();
   154: void rpt_undefined_rtf_hdr();
   155: void rpt_undefined_rtf_entry();
   156: void rpt_undefined_rtf_end();
   157: void rpt_undefined_winhelp_hdr();
   158: void rpt_undefined_winhelp_entry();
   159: void rpt_undefined_winhelp_end();
   160: void rpt_undefined_vmshelp_hdr();
   161: void rpt_undefined_vmshelp_entry();
   162: void rpt_undefined_vmshelp_end();
   163: 
   164: void rpt_calls_text_hdr();
   165: void rpt_calls_text_entry();
   166: void rpt_calls_text_end();
   167: void rpt_calls_sdml_hdr();
   168: void rpt_calls_sdml_entry();
   169: void rpt_calls_sdml_end();
   170: void rpt_calls_html_hdr();
   171: void rpt_calls_html_entry();
   172: void rpt_calls_html_end();
   173: void rpt_calls_rtf_hdr();
   174: void rpt_calls_rtf_entry();
   175: void rpt_calls_rtf_end();
   176: void rpt_calls_winhelp_hdr();
   177: void rpt_calls_winhelp_entry();
   178: void rpt_calls_winhelp_end();
   179: void rpt_calls_vmshelp_hdr();
   180: void rpt_calls_vmshelp_entry();
   181: void rpt_calls_vmshelp_end();
   182: 
   183: void rpt_xref_text_hdr();
   184: void rpt_xref_text_entry();
   185: void rpt_xref_text_end();
   186: void rpt_xref_sdml_hdr();
   187: void rpt_xref_sdml_entry();
   188: void rpt_xref_sdml_end();
   189: void rpt_xref_html_hdr();
   190: void rpt_xref_html_entry();
   191: void rpt_xref_html_end();
   192: void rpt_xref_rtf_hdr();
   193: void rpt_xref_rtf_entry();
   194: void rpt_xref_rtf_end();
   195: void rpt_xref_winhelp_hdr();
   196: void rpt_xref_winhelp_entry();
   197: void rpt_xref_winhelp_end();
   198: void rpt_xref_vmshelp_hdr();
   199: void rpt_xref_vmshelp_entry();
   200: void rpt_xref_vmshelp_end();
   201: 
   202: void rpt_tree_text_hdr();
   203: void rpt_tree_text_entry();
   204: void rpt_tree_text_end();
   205: void rpt_tree_sdml_hdr();
   206: void rpt_tree_sdml_entry();
   207: void rpt_tree_sdml_end();
   208: void rpt_tree_html_hdr();
   209: void rpt_tree_html_entry();
   210: void rpt_tree_html_end();
   211: void rpt_tree_rtf_hdr();
   212: void rpt_tree_rtf_entry();
   213: void rpt_tree_rtf_end();
   214: void rpt_tree_winhelp_hdr();
   215: void rpt_tree_winhelp_entry();
   216: void rpt_tree_winhelp_end();
   217: void rpt_tree_vmshelp_hdr();
   218: void rpt_tree_vmshelp_entry();
   219: void rpt_tree_vmshelp_end();
   220: 
   221: void rpt_byfile_text_hdr();
   222: void rpt_byfile_text_entry();
   223: void rpt_byfile_text_end();
   224: void rpt_byfile_sdml_hdr();
   225: void rpt_byfile_sdml_entry();
   226: void rpt_byfile_sdml_end();
   227: void rpt_byfile_html_hdr();
   228: void rpt_byfile_html_entry();
   229: void rpt_byfile_html_end();
   230: void rpt_byfile_rtf_hdr();
   231: void rpt_byfile_rtf_entry();
   232: void rpt_byfile_rtf_end();
   233: void rpt_byfile_winhelp_hdr();
   234: void rpt_byfile_winhelp_entry();
   235: void rpt_byfile_winhelp_end();
   236: void rpt_byfile_vmshelp_hdr();
   237: void rpt_byfile_vmshelp_entry();
   238: void rpt_byfile_vmshelp_end();
   239: 
   240: void rpt_file_text_hdr();
   241: void rpt_file_text_entry();
   242: void rpt_file_text_end();
   243: void rpt_file_sdml_hdr();
   244: void rpt_file_sdml_entry();
   245: void rpt_file_sdml_end();
   246: void rpt_file_html_hdr();
   247: void rpt_file_html_entry();
   248: void rpt_file_html_end();
   249: void rpt_file_rtf_hdr();
   250: void rpt_file_rtf_entry();
   251: void rpt_file_rtf_end();
   252: void rpt_file_winhelp_hdr();
   253: void rpt_file_winhelp_entry();
   254: void rpt_file_winhelp_end();
   255: void rpt_file_vmshelp_hdr();
   256: void rpt_file_vmshelp_entry();
   257: void rpt_file_vmshelp_end();
   258: 
   259: void rpt_source_text_hdr();
   260: void rpt_source_text_entry();
   261: void rpt_source_text_end();
   262: void rpt_source_sdml_hdr();
   263: void rpt_source_sdml_entry();
   264: void rpt_source_sdml_end();
   265: void rpt_source_html_hdr();
   266: void rpt_source_html_entry();
   267: void rpt_source_html_end();
   268: void rpt_source_rtf_hdr();
   269: void rpt_source_rtf_entry();
   270: void rpt_source_rtf_end();
   271: void rpt_source_winhelp_hdr();
   272: void rpt_source_winhelp_entry();
   273: void rpt_source_winhelp_end();
   274: void rpt_source_vmshelp_hdr();
   275: void rpt_source_vmshelp_entry();
   276: void rpt_source_vmshelp_end();
   277: 
   278: /*									    */
   279: /* Report formatting dispatch tables.					    */
   280: /*									    */
   281: 

ROUTINE report_hdr_routine. Go to: Next routine in file; Routines in this file.

   282: #define report_hdr_routine(t) ((t)[report_format()][0])
END report_hdr_routine. Go to: Beginning of routine.



ROUTINE report_entry_routine. Go to: Next routine in file; Routines in this file.

   283: #define report_entry_routine(t) ((t)[report_format()][1])
END report_entry_routine. Go to: Beginning of routine.



ROUTINE report_end_routine. Go to: Next routine in file; Routines in this file.

   284: #define report_end_routine(t) ((t)[report_format()][2])
END report_end_routine. Go to: Beginning of routine.


   285: 
   286: typedef void (*FORMATTER)();
   287: 
   288: static FORMATTER rpt_defined_routines[][3] = {
   289:     {rpt_defined_text_hdr, rpt_defined_text_entry, rpt_defined_text_end},
   290:     {rpt_defined_sdml_hdr, rpt_defined_sdml_entry, rpt_defined_sdml_end},
   291:     {rpt_defined_html_hdr, rpt_defined_html_entry, rpt_defined_html_end},
   292:     {rpt_defined_rtf_hdr,  rpt_defined_rtf_entry,  rpt_defined_rtf_end},
   293:     {rpt_defined_winhelp_hdr, rpt_defined_winhelp_entry, rpt_defined_winhelp_end},
   294:     {rpt_defined_vmshelp_hdr, rpt_defined_vmshelp_entry, rpt_defined_vmshelp_end}
   295: };
   296: 
   297: static FORMATTER rpt_undefined_routines[][3] = {
   298:     {rpt_undefined_text_hdr, rpt_undefined_text_entry, rpt_undefined_text_end},
   299:     {rpt_undefined_sdml_hdr, rpt_undefined_sdml_entry, rpt_undefined_sdml_end},
   300:     {rpt_undefined_html_hdr, rpt_undefined_html_entry, rpt_undefined_html_end},
   301:     {rpt_undefined_rtf_hdr,  rpt_undefined_rtf_entry,  rpt_undefined_rtf_end},
   302:     {rpt_undefined_winhelp_hdr, rpt_undefined_winhelp_entry, rpt_undefined_winhelp_end},
   303:     {rpt_undefined_vmshelp_hdr, rpt_undefined_vmshelp_entry, rpt_undefined_vmshelp_end}
   304: };
   305: 
   306: static FORMATTER rpt_calls_routines[][3] = {
   307:     {rpt_calls_text_hdr, rpt_calls_text_entry, rpt_calls_text_end},
   308:     {rpt_calls_sdml_hdr, rpt_calls_sdml_entry, rpt_calls_sdml_end},
   309:     {rpt_calls_html_hdr, rpt_calls_html_entry, rpt_calls_html_end},
   310:     {rpt_calls_rtf_hdr,  rpt_calls_rtf_entry,  rpt_calls_rtf_end},
   311:     {rpt_calls_winhelp_hdr, rpt_calls_winhelp_entry, rpt_calls_winhelp_end},
   312:     {rpt_calls_vmshelp_hdr, rpt_calls_vmshelp_entry, rpt_calls_vmshelp_end}
   313: };
   314: 
   315: static FORMATTER rpt_xref_routines[][3] = {
   316:     {rpt_xref_text_hdr, rpt_xref_text_entry, rpt_xref_text_end},
   317:     {rpt_xref_sdml_hdr, rpt_xref_sdml_entry, rpt_xref_sdml_end},
   318:     {rpt_xref_html_hdr, rpt_xref_html_entry, rpt_xref_html_end},
   319:     {rpt_xref_rtf_hdr,  rpt_xref_rtf_entry,  rpt_xref_rtf_end},
   320:     {rpt_xref_winhelp_hdr, rpt_xref_winhelp_entry, rpt_xref_winhelp_end},
   321:     {rpt_xref_vmshelp_hdr, rpt_xref_vmshelp_entry, rpt_xref_vmshelp_end}
   322: };
   323: 
   324: static FORMATTER rpt_tree_routines[][3] = {
   325:     {rpt_tree_text_hdr, rpt_tree_text_entry, rpt_tree_text_end},
   326:     {rpt_tree_sdml_hdr, rpt_tree_sdml_entry, rpt_tree_sdml_end},
   327:     {rpt_tree_html_hdr, rpt_tree_html_entry, rpt_tree_html_end},
   328:     {rpt_tree_rtf_hdr,  rpt_tree_rtf_entry,  rpt_tree_rtf_end},
   329:     {rpt_tree_winhelp_hdr, rpt_tree_winhelp_entry, rpt_tree_winhelp_end},
   330:     {rpt_tree_vmshelp_hdr, rpt_tree_vmshelp_entry, rpt_tree_vmshelp_end}
   331: };
   332: 
   333: static FORMATTER rpt_byfile_routines[][3] = {
   334:     {rpt_byfile_text_hdr, rpt_byfile_text_entry, rpt_byfile_text_end},
   335:     {rpt_byfile_sdml_hdr, rpt_byfile_sdml_entry, rpt_byfile_sdml_end},
   336:     {rpt_byfile_html_hdr, rpt_byfile_html_entry, rpt_byfile_html_end},
   337:     {rpt_byfile_rtf_hdr,  rpt_byfile_rtf_entry,  rpt_byfile_rtf_end},
   338:     {rpt_byfile_winhelp_hdr, rpt_byfile_winhelp_entry, rpt_byfile_winhelp_end},
   339:     {rpt_byfile_vmshelp_hdr, rpt_byfile_vmshelp_entry, rpt_byfile_vmshelp_end}
   340: };
   341: 
   342: static FORMATTER rpt_file_routines[][3] = {
   343:     {rpt_file_text_hdr, rpt_file_text_entry, rpt_file_text_end},
   344:     {rpt_file_sdml_hdr, rpt_file_sdml_entry, rpt_file_sdml_end},
   345:     {rpt_file_html_hdr, rpt_file_html_entry, rpt_file_html_end},
   346:     {rpt_file_rtf_hdr,  rpt_file_rtf_entry,  rpt_file_rtf_end},
   347:     {rpt_file_winhelp_hdr, rpt_file_winhelp_entry, rpt_file_winhelp_end},
   348:     {rpt_file_vmshelp_hdr, rpt_file_vmshelp_entry, rpt_file_vmshelp_end}
   349: };
   350: 
   351: static FORMATTER rpt_source_routines[][3] = {
   352:     {rpt_source_text_hdr, rpt_source_text_entry, rpt_source_text_end},
   353:     {rpt_source_sdml_hdr, rpt_source_sdml_entry, rpt_source_sdml_end},
   354:     {rpt_source_html_hdr, rpt_source_html_entry, rpt_source_html_end},
   355:     {rpt_source_rtf_hdr,  rpt_source_rtf_entry,  rpt_source_rtf_end},
   356:     {rpt_source_winhelp_hdr, rpt_source_winhelp_entry, rpt_source_winhelp_end},
   357:     {rpt_source_vmshelp_hdr, rpt_source_vmshelp_entry, rpt_source_vmshelp_end}
   358: };
   359: 
   360: /*************************************************************************++*/

ROUTINE tree_size. Go to: Next routine in file; Routines in this file.

   361: int tree_size(
   362: /* Computes the size (number of nodes) of a routine's call tree. The	    */
   363: /* current implementation is only an approximation, showing a minimal	    */
   364: /* tree size, since it only looks down one level; deep trees will throw it  */
   365: /* off.									    */
   366: 
   367:     DEFINITION
   368: 	    *aDef
   369: 	    /* (MODIFY, BY ADDR):  					    */
   370: 	    /* Definition to check. The tree size will be cached in this    */
   371: 	    /* definition.						    */
   372: 
   373: )	/* Returns size of tree.					    */
   374: 	/*****************************************************************--*/
   375: 
   376: {
   377:     int	    nodes;			    /* Node counter.		    */
   378:     REFERENCE				    /* Current reference entry.     */
   379: 	    *called;
   380:     DEFINITION				    /* Definition for current	    */
   381: 	    *curdef;			    /* reference entry.		    */
   382: 
   383:     if (def_tree_size(aDef) != 0) {	    /* Already been computed.	    */
   384: 	return def_tree_size(aDef);
   385:     }
   386:     else if (!needs_tree(aDef)) {	    /* No tree for routine.	    */
   387: 	return 0;
   388:     }
   389:     else {				    /* Check called routines.	    */
   390: 	for (nodes = 0, called = list_first(def_refs(aDef));
   391: 	     called != NULL; nodes++, called = next_entry(called)) {
   392: 	    if (needs_tree(ref_definition(called))) {
   393: 		nodes += def_num_calls(ref_definition(called));
   394: 	    }
   395: 	}
   396: 	set_def_tree_size(aDef, nodes);
   397: 	return nodes;
   398:     }
   399: }
END tree_size. Go to: Beginning of routine.


   400: 
   401: /*************************************************************************++*/

ROUTINE fold_string. Go to: Next routine in file; Routines in this file.

   402: int fold_string(
   403: /* Folds a string at the non-alphanumeric nearest the right margin. A	    */
   404: /* whitespace is removed; anything else is left in front of the fold.	    */
   405: 
   406:     char    *aSrc,
   407: 	    /* (READ, BY ADDR):  					    */
   408: 	    /* Source string to be folded.				    */
   409: 
   410:     int	    vPos,
   411: 	    /* (READ, BY VAL):						    */
   412: 	    /* Position in source string where characters should be copied  */
   413: 	    /* from. When repeatedly folding a long string, this should	    */
   414: 	    /* be the return value from a previous call to fold_string. It  */
   415: 	    /* is assumed to be less than the length of aSrc.		    */
   416: 
   417:     char    *aPrefix,
   418: 	    /* (READ, BY VAL):						    */
   419: 	    /* Optional prefix string to be written to aDest before	    */
   420: 	    /* characters from aSrc. Must be shorter than vLength, or it    */
   421: 	    /* will be ignored. If NULL ptr is passed, no prefix is used.   */
   422: 
   423:     char    *aDest,
   424: 	    /* (WRITE, BY ADDR):					    */
   425: 	    /* Destination buffer into which string is to be folded. It is  */
   426: 	    /* assumed to be at least vLength + 1 characters long.	    */
   427: 
   428:     int	    vLength
   429: 	    /* (READ, BY VAL):						    */
   430: 	    /* Maximum length of string to be written into aDest.	    */
   431: 
   432: )	/* Returns position in aStr where copying stopped. It will be equal */
   433: 	/* to the length of aSrc when all characters have been copied from  */
   434: 	/* aSrc.  This may be used as the vPos value on a successive call   */
   435: 	/* to fold_string.						    */
   436: 	/*****************************************************************--*/
   437: 
   438: {
   439:     int	    curlen = 0;			    /* Length accumulator.	    */
   440:     int	    remlen;			    /* Remaining length of string.  */
   441:     int	    fold;			    /* Point at which to fold it.   */
   442:     int	    spaceflag = 0;		    /* Flag: fold at space.	    */
   443: 
   444:     if (aPrefix != NULL && (curlen = strlen(aPrefix)) < vLength) {
   445: 	strcpy(aDest, aPrefix);		    /* Copy prefix first.	    */
   446:     }
   447: 
   448:     remlen = strlen(&aSrc[vPos]);
   449:     if (curlen + remlen <= vLength) {	    /* Remainder of string fits	    */
   450: 	strcpy(&aDest[curlen], &aSrc[vPos]);/* without folding.		    */
   451: 	return vPos + remlen;
   452:     }
   453:     else {				    /* Need to fold it, find fold   */
   454: 					    /* point.			    */
   455: 	for (fold = vPos + vLength - curlen - 1;
   456: 	    fold > vPos && isalnum(aSrc[fold]);
   457: 	    fold--);
   458: 	if (fold == vPos) {		    /* Fold point not found, fold   */
   459: 	    fold = vPos + vLength - 1;	    /* it at right margin.	    */
   460: 	}
   461: 	else if (!(spaceflag = isspace(aSrc[fold]))) {
   462: 					    /* Folding at non-alphanum,	    */
   463: 	    fold++;			    /* non-space, fold after it.    */
   464: 	}
   465: 					    /* Copy folded part of string.  */
   466: 	strncpy(&aDest[curlen], &aSrc[vPos], fold - vPos);
   467: 	aDest[fold - vPos] = '\0';
   468: 	if (spaceflag) {		    /* Remove whitespace at fold.   */
   469: 	    fold++;
   470: 	}
   471: 	return fold;			    /* Next fold will start after   */
   472:     }					    /* this one.		    */
   473: }
END fold_string. Go to: Beginning of routine.


   474: 
   475: /*************************************************************************++*/

ROUTINE report_filext. Go to: Next routine in file; Routines in this file.

   476: char *report_filext(
   477: /* Returns the file extension string to be used for report files, based on  */
   478: /* the type of report output requested.					    */
   479: 
   480:     /* No arguments.							    */
   481: 
   482: )	/* Returns ptr to file name extension string.			    */
   483: 	/*****************************************************************--*/
   484: 
   485: {
   486:     if (rpt_sdml_enabled())	return OUTFILE_EXT_SDML;
   487:     if (rpt_html_enabled())	return OUTFILE_EXT_HTML;
   488:     if (rpt_rtf_enabled())	return OUTFILE_EXT_RTF;
   489:     if (rpt_winhelp_enabled())	return OUTFILE_EXT_WINHELP;
   490:     if (rpt_vmshelp_enabled())	return OUTFILE_EXT_VMSHELP;
   491:     return OUTFILE_EXT_TEXT;		    /* Default output format.	    */
   492: }
END report_filext. Go to: Beginning of routine.


   493: 
   494: /*************************************************************************++*/

ROUTINE next_defining_file. Go to: Next routine in file; Routines in this file.

   495: SOURCEFILE *next_defining_file(
   496: /* Returns next source file containing routine definitions.		    */
   497: 
   498:     SOURCEFILE
   499: 	    *aSourceFile
   500: 	    /* (READ, BY ADDR):  					    */
   501: 	    /* Source file to check.					    */
   502: 
   503: )	/* Returns ptr to source file, or NULL if one not found.	    */
   504: 	/*****************************************************************--*/
   505: 
   506: {
   507:     SOURCEFILE				    /* Current file being checked.  */
   508: 	    *curfile;
   509: 	    
   510:     for (curfile = next_entry(aSourceFile); /* Scan rest of file list.	    */
   511: 	curfile != NULL;
   512: 	curfile = next_entry(curfile)) {
   513: 	if (source_routines(curfile) > 0) { 
   514: 	    return curfile;		    /* Found another with defs.	    */
   515: 	}
   516:     }
   517:     return NULL;			    /* No more with defs.	    */
   518: }
END next_defining_file. Go to: Beginning of routine.


   519: 
   520: /*************************************************************************++*/

ROUTINE prev_defining_file. Go to: Next routine in file; Routines in this file.

   521: SOURCEFILE *prev_defining_file(
   522: /* Returns previous source file containing routine definitions.		    */
   523: 
   524:     SOURCEFILE
   525: 	    *aSourceFile
   526: 	    /* (READ, BY ADDR):  					    */
   527: 	    /* Source file to check.					    */
   528: 
   529: )	/* Returns ptr to source file, or NULL if one not found.	    */
   530: 	/*****************************************************************--*/
   531: 
   532: {
   533:     SOURCEFILE				    /* Current file being checked.  */
   534: 	    *curfile;
   535: 	    
   536:     for (curfile = prev_entry(aSourceFile); /* Scan prior file list.	    */
   537: 	curfile != NULL;
   538: 	curfile = prev_entry(curfile)) {
   539: 	if (source_routines(curfile) > 0) { 
   540: 	    return curfile;		    /* Found another with defs.	    */
   541: 	}
   542:     }
   543:     return NULL;			    /* No prior with defs.	    */
   544: }
END prev_defining_file. Go to: Beginning of routine.


   545: 
   546: /*************************************************************************++*/

ROUTINE isfirst_in_file. Go to: Next routine in file; Routines in this file.

   547: int isfirst_in_file(
   548: /* Determines whether a definition entry is the first one in its source	    */
   549: /* file, assuming the definitions are currently sorted in file order.	    */
   550: 
   551:     DEFINITION
   552: 	    *aDef
   553: 	    /* (READ, BY ADDR):  					    */
   554: 	    /* Definition to check.					    */
   555: 
   556: )	/* Returns flag indicating whether definition is first:		    */
   557: 	/*  1 - Definition is first in file.				    */
   558: 	/*  0 - Definition is not first in file.			    */
   559: 	/*****************************************************************--*/
   560: 
   561: {
   562:     DEFINITION				    /* Ptr to prev def.		    */
   563: 	    *prevdef;
   564: 
   565:     if ((prevdef = prev_entry(aDef)) != NULL) {
   566: 	return (def_source(aDef) != def_source(prevdef));
   567:     }
   568:     return 1;
   569: }
END isfirst_in_file. Go to: Beginning of routine.


   570: 
   571: /*************************************************************************++*/

ROUTINE islast_in_file. Go to: Next routine in file; Routines in this file.

   572: int islast_in_file(
   573: /* Determines whether a definition entry is the last one in its source	    */
   574: /* file, assuming the definitions are currently sorted in file order.	    */
   575: 
   576:     DEFINITION
   577: 	    *aDef
   578: 	    /* (READ, BY ADDR):  					    */
   579: 	    /* Definition to check.					    */
   580: 
   581: )	/* Returns flag indicating whether definition is last:		    */
   582: 	/*  1 - Definition is lasst in file.				    */
   583: 	/*  0 - Definition is not last in file.				    */
   584: 	/*****************************************************************--*/
   585: 
   586: {
   587:     DEFINITION				    /* Ptr to next def.		    */
   588: 	    *nextdef;
   589: 
   590:     if ((nextdef = next_entry(aDef)) != NULL) {
   591: 	return (def_source(aDef) != def_source(nextdef));
   592:     }
   593:     return 1;
   594: }
END islast_in_file. Go to: Beginning of routine.


   595: 
   596: /*************************************************************************++*/

ROUTINE next_tree. Go to: Next routine in file; Routines in this file.

   597: DEFINITION *next_tree(
   598: /* Returns next definition that needs a call tree.			    */
   599: 
   600:     DEFINITION
   601: 	    *aDef
   602: 	    /* (READ, BY ADDR):  					    */
   603: 	    /* Definition to check.					    */
   604: 
   605: )	/* Returns ptr to definition, or NULL if none found.		    */
   606: 	/*****************************************************************--*/
   607: 
   608: {
   609:     DEFINITION				    /* Current def being checked.   */
   610: 	    *curdef;
   611: 	    
   612:     for (curdef = next_entry(aDef);	    /* Scan rest of def list.	    */
   613: 	curdef != NULL;
   614: 	curdef = next_entry(curdef)) {
   615: 	if (needs_tree(curdef)) { 
   616: 	    return curdef;		    /* Found another needing tree.  */
   617: 	}
   618:     }
   619:     return NULL;			    /* No more needing tree.	    */
   620: }
END next_tree. Go to: Beginning of routine.


   621: 
   622: /*************************************************************************++*/

ROUTINE prev_tree. Go to: Next routine in file; Routines in this file.

   623: DEFINITION *prev_tree(
   624: /* Returns previous definition that needs a call tree.			    */
   625: 
   626:     DEFINITION
   627: 	    *aDef
   628: 	    /* (READ, BY ADDR):  					    */
   629: 	    /* Definition to check.					    */
   630: 
   631: )	/* Returns ptr to definition, or NULL if none found.		    */
   632: 	/*****************************************************************--*/
   633: 
   634: {
   635:     DEFINITION				    /* Current def being checked.   */
   636: 	    *curdef;
   637: 	    
   638:     for (curdef = prev_entry(aDef);	    /* Scan prior def list.	    */
   639: 	curdef != NULL;
   640: 	curdef = prev_entry(curdef)) {
   641: 	if (needs_tree(curdef)) { 
   642: 	    return curdef;		    /* Found another needing tree.  */
   643: 	}
   644:     }
   645:     return NULL;			    /* No prior needing tree.	    */
   646: }
END prev_tree. Go to: Beginning of routine.


   647: 
   648: /*************************************************************************++*/

ROUTINE next_defined. Go to: Next routine in file; Routines in this file.

   649: DEFINITION *next_defined(
   650: /* Returns next definition for a defined routine.			    */
   651: 
   652:     DEFINITION
   653: 	    *aDef
   654: 	    /* (READ, BY ADDR):  					    */
   655: 	    /* Definition to check.					    */
   656: 
   657: )	/* Returns ptr to definition, or NULL if none found.		    */
   658: 	/*****************************************************************--*/
   659: 
   660: {
   661:     DEFINITION				    /* Current def being checked.   */
   662: 	    *curdef;
   663: 	    
   664:     for (curdef = next_entry(aDef);	    /* Scan rest of def list.	    */
   665: 	curdef != NULL;
   666: 	curdef = next_entry(curdef)) {
   667: 	if (isdefined_routine(curdef)) { 
   668: 	    return curdef;		    /* Found another defined one.  */
   669: 	}
   670:     }
   671:     return NULL;			    /* No more.			    */
   672: }
END next_defined. Go to: Beginning of routine.


   673: 
   674: /*************************************************************************++*/

ROUTINE prev_defined. Go to: Next routine in file; Routines in this file.

   675: DEFINITION *prev_defined(
   676: /* Returns previous definition of a defined routine.			    */
   677: 
   678:     DEFINITION
   679: 	    *aDef
   680: 	    /* (READ, BY ADDR):  					    */
   681: 	    /* Definition to check.					    */
   682: 
   683: )	/* Returns ptr to definition, or NULL if none found.		    */
   684: 	/*****************************************************************--*/
   685: 
   686: {
   687:     DEFINITION				    /* Current def being checked.   */
   688: 	    *curdef;
   689: 	    
   690:     for (curdef = prev_entry(aDef);	    /* Scan prior def list.	    */
   691: 	curdef != NULL;
   692: 	curdef = prev_entry(curdef)) {
   693: 	if (isdefined_routine(curdef)) { 
   694: 	    return curdef;		    /* Found another defined one.   */
   695: 	}
   696:     }
   697:     return NULL;			    /* No prior one.		    */
   698: }
END prev_defined. Go to: Beginning of routine.


   699: 
   700: /*************************************************************************++*/

ROUTINE next_undefined. Go to: Next routine in file; Routines in this file.

   701: DEFINITION *next_undefined(
   702: /* Returns next definition for an undefined routine.			    */
   703: 
   704:     DEFINITION
   705: 	    *aDef
   706: 	    /* (READ, BY ADDR):  					    */
   707: 	    /* Definition to check.					    */
   708: 
   709: )	/* Returns ptr to definition, or NULL if none found.		    */
   710: 	/*****************************************************************--*/
   711: 
   712: {
   713:     DEFINITION				    /* Current def being checked.   */
   714: 	    *curdef;
   715: 	    
   716:     for (curdef = next_entry(aDef);	    /* Scan rest of def list.	    */
   717: 	curdef != NULL;
   718: 	curdef = next_entry(curdef)) {
   719: 	if (!isdefined_routine(curdef)) { 
   720: 	    return curdef;		    /* Found another undefined one. */
   721: 	}
   722:     }
   723:     return NULL;			    /* No more.			    */
   724: }
END next_undefined. Go to: Beginning of routine.


   725: 
   726: /*************************************************************************++*/

ROUTINE prev_undefined. Go to: Next routine in file; Routines in this file.

   727: DEFINITION *prev_undefined(
   728: /* Returns previous definition of an undefined routine.			    */
   729: 
   730:     DEFINITION
   731: 	    *aDef
   732: 	    /* (READ, BY ADDR):  					    */
   733: 	    /* Definition to check.					    */
   734: 
   735: )	/* Returns ptr to definition, or NULL if none found.		    */
   736: 	/*****************************************************************--*/
   737: 
   738: {
   739:     DEFINITION				    /* Current def being checked.   */
   740: 	    *curdef;
   741: 	    
   742:     for (curdef = prev_entry(aDef);	    /* Scan prior def list.	    */
   743: 	curdef != NULL;
   744: 	curdef = prev_entry(curdef)) {
   745: 	if (!isdefined_routine(curdef)) { 
   746: 	    return curdef;		    /* Found another undefined one. */
   747: 	}
   748:     }
   749:     return NULL;			    /* No prior one.		    */
   750: }
END prev_undefined. Go to: Beginning of routine.


   751: 
   752: /*************************************************************************++*/

ROUTINE separate_tree. Go to: Next routine in file; Routines in this file.

   753: int separate_tree(
   754: /* Determines whether or not the user has requested a separate call tree    */
   755: /* for a routine.							    */
   756: 
   757:     DEFINITION
   758: 	    *aDef
   759: 	    /* (READ, BY ADDR):  					    */
   760: 	    /* Routine definition to check.				    */
   761: 
   762: )	/* Returns status flag:						    */
   763: 	/*  1 - User has requested separate tree for this routine.	    */
   764: 	/*  0 - User has not requested separate tree for this routine.	    */
   765: 	/*****************************************************************--*/
   766: 
   767: {
   768:     char    **rlist;			    /* Routine name list ptr.	    */
   769: 
   770:     if ((rlist = separate_list()) == NULL) {    
   771: 	return 0;			    /* No list to worry about.	    */
   772:     }
   773:     else {				    /* Otherwise, check each name   */
   774: 	while (*rlist != NULL) {	    /* in list.			    */
   775: 	    if (strcmp(*rlist++, def_name(aDef)) == 0) {
   776: 		return 1;		    /* Found it, separate tree.	    */
   777: 	    }
   778: 	}
   779: 	return 0;			    /* Routine is not in list.	    */
   780:     }
   781: }
END separate_tree. Go to: Beginning of routine.


   782: 
   783: /*************************************************************************++*/

ROUTINE needs_tree. Go to: Next routine in file; Routines in this file.

   784: int needs_tree(
   785: /* Determines whether or not a routine definition needs a separate call	    */
   786: /* tree. See the description of report_call_trees for details.		    */
   787: 
   788:     DEFINITION
   789: 	    *aDef
   790: 	    /* (MODIFY, BY ADDR):					    */
   791: 	    /* Routine definition entry to check. If the routine has not    */
   792: 	    /* already been checked, the results of the			    */
   793: 	    /* evalution are cached in the definition.			    */
   794: 
   795: )	/* Returns flag indicating whether or not tree is needed:	    */
   796: 	/*  1	- Separate tree is needed.				    */
   797: 	/*  0	- Separate tree is not needed, routine should be expanded   */
   798: 	/*	  in callers.						    */
   799: 	/*****************************************************************--*/
   800: 
   801: {
   802:     int	    status;			    /* Evaluation status.	    */
   803:     DEFINITION				    /* Current definition ptr.	    */
   804: 	    *curdef;
   805: 
   806:     curdef = next_entry(aDef);
   807:     if (def_tree_required(aDef) != NOT_YET_EVALUATED) {
   808: 	return (def_tree_required(aDef) == TREE_REQUIRED);
   809:     }
   810:     else if (def_num_calls(aDef) == 0) {    /* Does not call anything, no   */
   811: 	status = 0;			    /* tree to worry about.	    */
   812:     }
   813:     else if (tree_inline_disabled()) {	    /* User says separate tree for  */
   814: 	status = 1;			    /* all routines.		    */
   815:     }
   816:     else if (separate_tree(aDef)) {	    /* User says make this one	    */
   817: 	status = 1;			    /* separate.		    */
   818:     }
   819:     else if (!isend_of_list(aDef) &&
   820: 	     strcmp(def_name(aDef), def_name(curdef)) == 0) {
   821: 	status = 1;			    /* Multiply-defined routine,    */
   822: 	curdef = aDef;			    /* all versions of it need a    */
   823: 	for (curdef = aDef;		    /* tree.			    */
   824: 	    curdef != NULL && strcmp(def_name(aDef), def_name(curdef)) == 0;
   825: 	    curdef = next_entry(curdef)) {
   826: 	    set_def_tree_req(curdef, TREE_REQUIRED);
   827: 	}
   828:     }
   829:     else if (def_num_callers(aDef) >= 1 &&   
   830: 	    def_num_callers(aDef) <= max_callers()) {
   831: 	status = 0;			    /* Too few callers for separate */
   832:     }					    /* tree.			    */
   833:     else if (!tree_greater_than(aDef, MIN_TREE_SIZE)) {
   834: 	status = 0;			    /* Tree is trivial.		    */
   835:     }
   836:     else {
   837: 	status = 1;			    /* Generate separate tree!	    */
   838:     }
   839:     if (status) {			    /* Cache evaluation result.	    */
   840: 	set_def_tree_req(aDef, TREE_REQUIRED);
   841:     }
   842:     else {
   843: 	set_def_tree_req(aDef, TREE_NOT_REQUIRED);
   844:     }
   845:     return status;
   846: }
END needs_tree. Go to: Beginning of routine.


   847: 
   848: /*************************************************************************++*/

ROUTINE report_defined. Go to: Next routine in file; Routines in this file.

   849: void report_defined(
   850: /* Reports the defined routines in alphabetical order to a file.	    */
   851: 
   852:     char    *aFileName
   853: 	    /* (READ, BY ADDR):						    */
   854: 	    /* Report output file name.					    */
   855: 
   856: )	/* No return value.						    */
   857: 	/*****************************************************************--*/
   858: 
   859: {
   860:     void    (*report_hdr)();		    /* Ptr to report header	    */
   861: 					    /* routine.			    */
   862:     void    (*report_entry)();		    /* Ptr to report line routine.  */
   863:     void    (*report_end)();		    /* Ptr to report end routine.   */
   864:     FILE    *rptfile;			    /* Report file ptr.		    */
   865:     DEFINITION				    /* Current routine entry.	    */
   866: 	    *curdef;
   867:     long    total;			    /* Total defined routines.	    */
   868: 
   869:     /*+									    */
   870:     /*	Select appropriate set of output formatter routines. Then open file */
   871:     /*	and write report header. Next, for each defined routine (i.e. each  */
   872:     /*	routine for which the source file is known), write a report line.   */
   873:     /*	Finally, write report trailer and close file.			    */
   874:     /*-									    */
   875:     
   876:     report_hdr   = report_hdr_routine(rpt_defined_routines);
   877:     report_entry = report_entry_routine(rpt_defined_routines);
   878:     report_end   = report_end_routine(rpt_defined_routines);
   879: 
   880:     if ((rptfile = fopen(aFileName, "w")) == NULL) {
   881: 	printf("ERROR: Unable to open %s for report output\n", aFileName);
   882:     }
   883:     else {
   884: 	if (list_enabled()) {
   885: 	    fprintf(list_file(), "\nREPORT Defined routines in file %s\n",
   886: 		aFileName);
   887: 	}
   888: 	if (log_enabled()) {
   889: 	    printf("REPORT Defined routines in file %s\n", aFileName);
   890: 	}
   891: 	(*report_hdr)(rptfile);		    /* Write header.		    */
   892: 	for (total = 0, curdef = list_first(global_deflist()); curdef != NULL;
   893: 	    curdef = next_entry(curdef)) {
   894: 	    if (isdefined_routine(curdef)) {
   895: 					    /* Write entry line.	    */
   896: 		if (trace_rpt_enabled()) {
   897: 		    printf("TRACE: Report defined routine %s @ %lxh\n",
   898: 			def_name(curdef), curdef);
   899: 		}
   900: 		(*report_entry)(rptfile, curdef, (total == 0),
   901: 		    islast_defined(curdef));
   902: 		total++;
   903: 	    }
   904: 	    else if (trace_rpt_enabled()) {
   905: 		printf(
   906: 		"TRACE: Report defined, skipping undefined routine %s @ %lxh\n",
   907: 		    def_name(curdef), curdef);
   908: 	    }
   909: 	}
   910: 	(*report_end)(rptfile, total);	    /* Write trailer.		    */
   911: 	fclose(rptfile);
   912: 	if (list_enabled()) {
   913: 	    fprintf(list_file(), "       %ld Defined routines\n", total);
   914: 	}
   915: 	if (log_full_enabled()) {
   916: 	    printf("       %ld Defined routines\n\n", total);
   917: 	}
   918:     }
   919: }
END report_defined. Go to: Beginning of routine.


   920: 
   921: /*************************************************************************++*/

ROUTINE report_undefined. Go to: Next routine in file; Routines in this file.

   922: void report_undefined(
   923: /* Reports the undefined routines in alphabetical order to a file.	    */
   924: 
   925:     char    *aFileName
   926: 	    /* (READ, BY ADDR):						    */
   927: 	    /* Report output file name.					    */
   928: 
   929: )	/* No return value.						    */
   930: 	/*****************************************************************--*/
   931: 
   932: {
   933:     void    (*report_hdr)();		    /* Ptr to report header	    */
   934: 					    /* routine.			    */
   935:     void    (*report_entry)();		    /* Ptr to report line routine.  */
   936:     void    (*report_end)();		    /* Ptr to report end routine.   */
   937:     FILE    *rptfile;			    /* Report file ptr.		    */
   938:     DEFINITION				    /* Current routine entry.	    */
   939: 	    *curdef;
   940:     long    total;			    /* Total undefined routines.    */
   941: 
   942:     /*+									    */
   943:     /*	Select appropriate set of output formatter routines. Then open file */
   944:     /*	and write report header. Next, for each undefined routine (i.e.	    */
   945:     /*	each routine for which the source file is not known), write a	    */
   946:     /*	report line.  Finally, write report trailer and close file.	    */
   947:     /*-									    */
   948: 
   949:     report_hdr   = report_hdr_routine(rpt_undefined_routines);
   950:     report_entry = report_entry_routine(rpt_undefined_routines);
   951:     report_end   = report_end_routine(rpt_undefined_routines);
   952: 
   953:     if ((rptfile = fopen(aFileName, "w")) == NULL) {
   954: 	printf("ERROR: Unable to open %s for report output\n", aFileName);
   955:     }
   956:     else {
   957: 	if (list_enabled()) {
   958: 	    fprintf(list_file(), "\nREPORT External routines in file %s\n",
   959: 		aFileName);
   960: 	}
   961: 	if (log_enabled()) {
   962: 	    printf("REPORT External routines in file %s\n", aFileName);
   963: 	}
   964: 	(*report_hdr)(rptfile);		    /* Write header.		    */
   965: 	for (total = 0, curdef = list_first(global_deflist()); curdef != NULL;
   966: 	    curdef = next_entry(curdef)) {
   967: 	    if (!isdefined_routine(curdef)) {
   968: 					    /* Write entry line.	    */
   969: 		if (trace_rpt_enabled()) {
   970: 		    printf("TRACE: Report external routine %s @ %lxh\n",
   971: 			def_name(curdef), curdef);
   972: 		}
   973: 		(*report_entry)(rptfile, curdef, (total == 0),
   974: 		    islast_undefined(curdef));
   975: 		total++;
   976: 	    }
   977: 	    else if (trace_rpt_enabled()) {
   978: 		printf(
   979: 		"TRACE: Report external, skipping defined routine %s @ %lxh\n",
   980: 		    def_name(curdef), curdef);
   981: 	    }
   982: 	}
   983: 	(*report_end)(rptfile, total);	    /* Write trailer.		    */
   984: 	fclose(rptfile);
   985: 	if (list_enabled()) {
   986: 	    fprintf(list_file(), "       %ld External routines\n", total);
   987: 	}
   988: 	if (log_full_enabled()) {
   989: 	    printf("       %ld External routines\n\n", total);
   990: 	}
   991:     }
   992: }
END report_undefined. Go to: Beginning of routine.


   993: 
   994: /*************************************************************************++*/

ROUTINE report_calls. Go to: Next routine in file; Routines in this file.

   995: void report_calls(
   996: /* Reports the calls and callers of the defined routines in alphabetical    */
   997: /* order to a file.							    */
   998: 
   999:     char    *aFileName
  1000: 	    /* (READ, BY ADDR):						    */
  1001: 	    /* Report output file name.					    */
  1002: 
  1003: )	/* No return value.						    */
  1004: 	/*****************************************************************--*/
  1005: 
  1006: {
  1007:     void    (*report_hdr)();		    /* Ptr to section header	    */
  1008: 					    /* routine.			    */
  1009:     void    (*report_entry)();		    /* Ptr to report line routine.  */
  1010:     void    (*report_end)();		    /* Ptr to section end routine.  */
  1011:     FILE    *rptfile;			    /* Report file ptr.		    */
  1012:     DEFINITION				    /* Current routine entry.	    */
  1013: 	    *curdef;
  1014:     REFERENCE				    /* Current caller ref.	    */
  1015: 	    *caller;
  1016:     REFERENCE				    /* Current called ref.	    */
  1017: 	    *called;
  1018:     long    total;			    /* Total defined routines.	    */
  1019: 
  1020:     /*+									    */
  1021:     /*	Select appropriate set of output formatter routines and open file.  */
  1022:     /*	For each defined routine, write a header section. For each	    */
  1023:     /*	reference and caller in a routine definition, write a report line   */
  1024:     /*	(they are output in side-by-side pairs until both lists are	    */
  1025:     /*	exhausted, although there is no relationship implied by the	    */
  1026:     /*	pairing). Then write a trailer section for the defined routine.	    */
  1027:     /*	Last, close the file.						    */
  1028:     /*-									    */
  1029: 
  1030:     report_hdr   = report_hdr_routine(rpt_calls_routines);
  1031:     report_entry = report_entry_routine(rpt_calls_routines);
  1032:     report_end   = report_end_routine(rpt_calls_routines);
  1033: 
  1034:     if ((rptfile = fopen(aFileName, "w")) == NULL) {
  1035: 	printf("ERROR: Unable to open %s for report output\n", aFileName);
  1036:     }
  1037:     else {
  1038: 	if (list_enabled()) {
  1039: 	    fprintf(list_file(),
  1040: 		"\nREPORT Defined routine calls/callers in file %s\n",
  1041: 		aFileName);
  1042: 	}
  1043: 	if (log_enabled()) {
  1044: 	    printf("REPORT Defined routine calls/callers in file %s\n",
  1045: 		aFileName);
  1046: 	}
  1047: 	for (total = 0, curdef = list_first(global_deflist()); curdef != NULL;
  1048: 	    curdef = next_entry(curdef)) {
  1049: 	    if (isdefined_routine(curdef)) {
  1050: 					    /* Write header section.	    */
  1051: 		if (trace_rpt_enabled()) {
  1052: 		    printf(
  1053: 			"TRACE: Report calls/callers for routine %s @ %lxh\n",
  1054: 			def_name(curdef), curdef);
  1055: 		}
  1056: 		(*report_hdr)(rptfile, curdef);
  1057: 		for (called = list_first(def_refs(curdef)),
  1058: 		     caller = list_first(def_callers(curdef));
  1059: 		     called != NULL || caller != NULL;
  1060: 		     caller = next_entry(caller), called = next_entry(called)) {
  1061: 					    /* Write calls/caller line.	    */
  1062: 		    (*report_entry)(rptfile, called, caller);
  1063: 		}			    /* Write trailer section.	    */
  1064: 		(*report_end)(rptfile, curdef);
  1065: 		total++;
  1066: 	    }
  1067: 	    else if (trace_rpt_enabled()) {
  1068: 		printf(
  1069: 	"TRACE: Report calls/callers, skipping external routine %s @ %lxh\n",
  1070: 		    def_name(curdef), curdef);
  1071: 	    }
  1072: 	}
  1073: 	fclose(rptfile);
  1074: 	if (list_enabled()) {
  1075: 	    fprintf(list_file(), "       %ld Defined routines\n", total);
  1076: 	}
  1077: 	if (log_full_enabled()) {
  1078: 	    printf("       %ld Defined routines\n\n", total);
  1079: 	}
  1080:     }
  1081: }
END report_calls. Go to: Beginning of routine.


  1082: 
  1083: /*************************************************************************++*/

ROUTINE report_xrefs. Go to: Next routine in file; Routines in this file.

  1084: void report_xrefs(
  1085: /* Reports caller cross references for all routines (defined and undefined) */
  1086: /* in alphabetical order to a file.					    */
  1087: 
  1088:     char    *aFileName
  1089: 	    /* (READ, BY ADDR):						    */
  1090: 	    /* Report output file name.					    */
  1091: 
  1092: )	/* No return value.						    */
  1093: 	/*****************************************************************--*/
  1094: 
  1095: {
  1096:     void report_tree();
  1097: 
  1098:     void    (*report_hdr)();		    /* Ptr to report header	    */
  1099: 					    /* routine.			    */
  1100:     void    (*report_entry)();		    /* Ptr to report line routine.  */
  1101:     void    (*report_entry_tree)();	    /* Ptr to report line routine.  */
  1102:     void    (*report_end)();		    /* Ptr to report end routine.   */
  1103:     void    (*report_end_tree)();	    /* Ptr to report end routine.   */
  1104:     FILE    *rptfile;			    /* Report file ptr.		    */
  1105:     DEFINITION				    /* Current routine entry.	    */
  1106: 	    *curdef;
  1107:     DEFINITION				    /* Temporary def to hold call   */
  1108: 	    *treedef;			    /* tree.			    */
  1109:     REFERENCE				    /* Temporary ref to current	    */
  1110: 	    *curref;			    /* definition.		    */
  1111:     long    total;			    /* Total defined routines.	    */
  1112:     int	    xreffile = 0;		    /* Xref report file number.	    */
  1113: 
  1114:     /*+									    */
  1115:     /*	Select appropriate set of output formatter routines. Then open file */
  1116:     /*	and write report header. Next, for each routine, write a report	    */
  1117:     /*	line.  Finally, write report trailer and close file.		    */
  1118:     /*									    */
  1119: 
  1120:     report_hdr   = report_hdr_routine(rpt_xref_routines);
  1121:     report_entry = report_entry_routine(rpt_xref_routines);
  1122:     report_entry_tree = report_entry_routine(rpt_tree_routines);
  1123:     report_end_tree = report_end_routine(rpt_tree_routines);
  1124:     report_end   = report_end_routine(rpt_xref_routines);
  1125: 
  1126:     if ((rptfile = fopen(aFileName, "w")) == NULL) {
  1127: 	printf("ERROR: Unable to open %s for report output\n", aFileName);
  1128:     }
  1129:     else {
  1130: 	if (list_enabled()) {
  1131: 	    fprintf(list_file(),
  1132: 		"\nREPORT Caller cross references in file %s\n",
  1133: 		aFileName);
  1134: 	}
  1135: 	if (log_enabled()) {
  1136: 	    printf("REPORT Caller cross references in file %s\n", aFileName);
  1137: 	}
  1138: 	(*report_hdr)(rptfile);		    /* Write header.		    */
  1139: 	for (total = 0, curdef = list_first(global_deflist());
  1140: 	    curdef != NULL;
  1141: 	    curdef = next_entry(curdef)) {
  1142: 	    if (rpt_html_enabled() && def_xreffile(curdef) != xreffile) {
  1143: 		xreffile = rpt_html_continue(&rptfile, CALLER_XREF_SECTION,
  1144: 				curdef, xreffile, def_xreffile(curdef));
  1145: 	    }
  1146: 					    /* Write entry line.	    */
  1147: 	    if (trace_rpt_enabled()) {
  1148: 		printf("TRACE: Report caller xref for routine %s @ %lxh\n",
  1149: 		    def_name(curdef), curdef);
  1150: 	    }
  1151: 	    (*report_entry)(rptfile, curdef, !total, isend_of_list(curdef));
  1152: 
  1153: 	    if (def_num_calls(curdef) != 0) {
  1154: 
  1155: 	    /******* The following code adapted from report_call_trees ********/
  1156: 
  1157: 		curref  = new_ref(0, curdef, NULL);
  1158: 		if (trace_rpt_enabled()) {
  1159: 		    printf("TRACE: Report call tree for routine %s @ %lxh\n",
  1160: 			def_name(curdef), curdef);
  1161: 		}
  1162: 		(*report_entry_tree)(rptfile, curref, 0, 0);
  1163: 		free_ref(curref);
  1164: 					    
  1165: 		/*+							    */
  1166: 		/* Generate the subtree. Create a temporary def to serve as */
  1167: 		/* the tree root and set its tree root to the current	    */
  1168: 		/* definition as a context value. This is used in detection */
  1169: 		/* of duplicate and recursive expansions. Use the ref list  */
  1170: 		/* of this tree to build a stack of caller refs. Push a ref */
  1171: 		/* for the current routine to this stack, reflecting the    */
  1172: 		/* fact that it is the first caller, then report the tree.  */
  1173: 		/* Then pop the reference and free the root definition.	    */
  1174: 		/*-							    */
  1175: 
  1176: 		treedef = new_def(def_name(curdef), def_source(curdef));
  1177: 		set_def_root(treedef, curdef);
  1178: 		push_ref(treedef, new_ref(0, curdef, NULL));
  1179: 		report_tree(rptfile, report_entry_tree, curdef, 1, treedef);
  1180: 		free_ref(pop_ref(treedef));
  1181: 		free_def(treedef);
  1182: 					    /* Write trailer section.	    */
  1183: 		(*report_end_tree)(rptfile, curdef, (total == 0), 1);
  1184: 
  1185: 	    /****** The preceding code adapted from report_call_trees *********/
  1186: 
  1187: 	    }
  1188: 	    total++;
  1189: 	}
  1190: 	(*report_end)(rptfile, total);	    /* Write trailer.		    */
  1191: 	fclose(rptfile);
  1192: 	if (list_enabled()) {
  1193: 	    fprintf(list_file(), "       %ld Routines\n", total);
  1194: 	}
  1195: 	if (log_full_enabled()) {
  1196: 	    printf("       %ld Routines\n\n", total);
  1197: 	}
  1198:     }
  1199: }
END report_xrefs. Go to: Beginning of routine.


  1200: 
  1201: /*************************************************************************++*/

ROUTINE report_tree. Go to: Next routine in file; Routines in this file.

  1202: void report_tree(
  1203: /* Recursively reports one line for each routine in the call tree. The	    */
  1204: /* recursion is depth first (i.e. expanding each referenced routine before  */
  1205: /* showing the next at the same level). The recursion nesting level	    */
  1206: /* controls indentation of the called routine names.			    */
  1207: 
  1208:     FILE    *aRptFile,
  1209: 	    /* (READ, BY ADDR):						    */
  1210: 	    /* Report output file. Must be opened by caller.		    */
  1211: 
  1212:     void    (*aReportEntry)(),
  1213: 	    /* (EXEC, BY ADDR):						    */
  1214: 	    /* Report line formatter routine.				    */
  1215: 
  1216:     DEFINITION
  1217: 	    *aDef,
  1218: 	    /* (MODIFY, BY ADDR):					    */
  1219: 	    /* Routine definition entry to report. The tree root for the    */
  1220: 	    /* definition will be set to aTreeRoot.			    */
  1221:     
  1222:     int	    vLevel,
  1223: 	    /* (READ, BY VAL):						    */
  1224: 	    /* Recursion nesting level. Level 0 is the top level.	    */
  1225: 
  1226:     DEFINITION
  1227: 	    *aTreeRoot
  1228: 	    /* (MODIFY, BY ADDR):					    */
  1229: 	    /* Routine definition entry that acts as root of this call	    */
  1230: 	    /* tree.  References to the routines in the call tree will be   */
  1231: 	    /* added to this definition. Its root field is used as the	    */
  1232: 	    /* context value for this tree expansion.			    */
  1233:     
  1234: )	/* No return value.						    */
  1235: 	/*****************************************************************--*/
  1236: 
  1237: {
  1238:     REFERENCE				    /* Current reference entry.     */
  1239: 	    *called;
  1240:     DEFINITION				    /* Definition for current	    */
  1241: 	    *curdef;			    /* reference entry.		    */
  1242:     int	    expanded;			    /* Flag indicating routine	    */
  1243: 					    /* has already been reported.   */
  1244:     int	    recursive;			    /* Flag indicating routine is   */
  1245: 					    /* called recursively.	    */
  1246:     char    errmsg[256];		    /* Error message buffer.	    */
  1247: 
  1248:     /*+									    */
  1249:     /*	For each referenced routine, report the routine. If the routine has */
  1250:     /*	not already been expanded in this tree, is defined, and does not    */
  1251:     /*	have a separate tree (and we have not exceeded max tree depth),	    */
  1252:     /*	generate its subtree recursively.				    */
  1253:     /*-									    */
  1254: 
  1255:     for (called = list_first(def_refs(aDef));
  1256: 	 called != NULL; called = next_entry(called)) {
  1257: 	 
  1258: 					    /* Get current def ptr and find */
  1259: 					    /* out expanded/recursive	    */
  1260: 	curdef    = ref_definition(called); /* conditions.		    */
  1261: 	recursive = isrecursive_ref(called, aTreeRoot);
  1262: 	expanded  = (!recursive && !needs_tree(curdef) &&
  1263: 		    isalready_expanded(curdef, def_root(aTreeRoot)));
  1264: 
  1265: 	(*aReportEntry)(aRptFile, called, vLevel, expanded, recursive);
  1266: 
  1267: 					    /* Mark def as part of tree.    */
  1268: 	set_def_root(curdef, def_root(aTreeRoot));
  1269: 	
  1270: 	if (!expanded && !recursive &&
  1271: 	    isdefined_routine(curdef) && !needs_tree(curdef)) {
  1272: 	    if (vLevel < max_tree_depth()) {
  1273: 
  1274: 		/*+							    */
  1275: 		/*  A subtree needs to be generated. Push a reference to    */
  1276: 		/*  the current routine to the call stack for recursion	    */
  1277: 		/*  detection at lower levels, do the lower level subtree,  */
  1278: 		/*  and discard the added reference.			    */
  1279: 		/*-							    */
  1280: 
  1281: 		push_ref(aTreeRoot, new_ref(0, curdef, NULL));
  1282: 		report_tree(aRptFile, aReportEntry, curdef, vLevel + 1,
  1283: 		    aTreeRoot);
  1284: 		free_ref(pop_ref(aTreeRoot));
  1285: 	    }
  1286: 	    else if (vLevel == MAX_TREE_DEPTH) {
  1287: 		sprintf(errmsg,
  1288: 	    "\nWARNING: %s tree depth exceeds %d levels, halting expansion\n",
  1289: 		    def_name(aTreeRoot), MAX_TREE_DEPTH);
  1290: 		fputs(errmsg, aRptFile);
  1291: 		if (list_enabled()) {
  1292: 		    fputs(errmsg, list_file());
  1293: 		}
  1294: 		puts(errmsg);
  1295: 		break;
  1296: 	    }
  1297: 	}
  1298:     }
  1299: }
END report_tree. Go to: Beginning of routine.


  1300: 
  1301: #if 0
  1302: /*************************************************************************++*/
  1303: void report_call_trees(
  1304: /* Reports the call trees for the defined routines in alphabetical order to */
  1305: /* a file. The report attempts to minimize the number of trivial trees	    */
  1306: /* generated and maximize tree depth, while limiting the amount of	    */
  1307: /* repetitive subtree expansion. To meet this goal, a separate call tree    */
  1308: /* will not be generated in the following cases:			    */
  1309: /*									    */
  1310: /*	1) a routine that calls no other routines (this eliminates empty    */
  1311: /*	   call trees);							    */
  1312: /*									    */
  1313: /*	2) a routine that calls one or more other routines, but is called   */
  1314: /*	   from only 1-x other routines, where x is a user-settable limit   */
  1315: /*	   (this eliminates low-usage routines that can be better shown	    */
  1316: /*	   as subtrees of their callers);				    */
  1317: /*									    */
  1318: /*	3) a routine that is called from more than x other routines, but    */
  1319: /*	   that has a total tree expansion of only 1-4 nodes (this	    */
  1320: /*	   eliminates very simple call trees that can be easily shown as    */
  1321: /*	   subtrees of their callers).					    */
  1322: /*									    */
  1323: /* In these cases, any call relationships will be shown in the call trees   */
  1324: /* of any caller. There is one special exception to cases 2 and 3, where a  */
  1325: /* routine is multiply-defined. This indicates multiple, alternate	    */
  1326: /* implementations of the same routine, possibly with different call	    */
  1327: /* structures. Until the product is linked, it cannot be determined which   */
  1328: /* version of the routine will be called; therefore a separate tree will be */
  1329: /* generated for each version of the routine.				    */
  1330: /*									    */
  1331: /* In all other cases, a separate call tree will be generated for a	    */
  1332: /* routine. Specifically, this means routines that are not called from any  */
  1333: /* other, and frequently-used routines with complex call trees. There are   */
  1334: /* also two user-selectable overrides to this behavior. The "separate"	    */
  1335: /* option allows the user to specify a file containing a list of routine    */
  1336: /* names for which separate trees must be generated if they call anything.  */
  1337: /* The "noinline" option forces separate trees for all routines that call   */
  1338: /* anything.								    */
  1339: 
  1340:     char    *aFileName
  1341: 	    /* (READ, BY ADDR):						    */
  1342: 	    /* Report output file name.					    */
  1343: 
  1344: )	/* No return value.						    */
  1345: 	/*****************************************************************--*/
  1346: 
  1347: {
  1348:     void    (*report_hdr)();		    /* Ptr to section header	    */
  1349: 					    /* routine.			    */
  1350:     void    (*report_entry)();		    /* Ptr to report line routine.  */
  1351:     void    (*report_end)();		    /* Ptr to section end routine.  */
  1352:     FILE    *rptfile;			    /* Report file ptr.		    */
  1353:     DEFINITION				    /* Current routine entry.	    */
  1354: 	    *curdef;
  1355:     DEFINITION				    /* Temporary def to hold call   */
  1356: 	    *treedef;			    /* tree.			    */
  1357:     int	    lastdef;			    /* Flag indicating last def	    */
  1358: 					    /* with separate call tree.     */
  1359:     REFERENCE				    /* Temporary ref to current	    */
  1360: 	    *curref;			    /* definition.		    */
  1361:     long    total;			    /* Total defined routines.	    */
  1362:     int	    treefile = 0;		    /* Tree report file number.	    */
  1363: 
  1364:     /*+									    */
  1365:     /*	Select appropriate set of output formatter routines and open file.  */
  1366:     /*	For each defined routine that warrants a separate call tree, write  */
  1367:     /*	a header section. Then do a depth-first recursive traversal of the  */
  1368:     /*	routine references and write a report line for each reference.	    */
  1369:     /*	Then write a trailer section for the defined routine.  Last, close  */
  1370:     /*	the file.							    */
  1371:     /*-									    */
  1372: 
  1373:     report_hdr   = report_hdr_routine(rpt_tree_routines);
  1374:     report_entry = report_entry_routine(rpt_tree_routines);
  1375:     report_end   = report_end_routine(rpt_tree_routines);
  1376: 
  1377:     if ((rptfile = fopen(aFileName, "w")) == NULL) {
  1378: 	printf("ERROR: Unable to open %s for report output\n", aFileName);
  1379:     }
  1380:     else {
  1381: 	if (list_enabled()) {
  1382: 	    fprintf(list_file(),
  1383: 		"\nREPORT Defined routine call trees in file %s\n",
  1384: 		aFileName);
  1385: 	}
  1386: 	if (log_enabled()) {
  1387: 	    printf("REPORT Defined routine call trees in file %s\n",
  1388: 		aFileName);
  1389: 	}
  1390: 	for (total = 0, curdef = list_first(global_deflist()); curdef != NULL;
  1391: 	    curdef = next_entry(curdef)) {
  1392: 	    if (needs_tree(curdef)) {	    /* If routine needs tree, write */
  1393: 					    /* header section and toplevel  */
  1394: 					    /* line.			    */
  1395: 		if (rpt_html_enabled() && def_treefile(curdef) != treefile) {
  1396: 		    treefile = rpt_html_continue(&rptfile, CALL_TREE_SECTION,
  1397: 				    curdef, treefile, def_treefile(curdef));
  1398: 		}
  1399: 		lastdef = islast_tree(curdef);
  1400: 		(*report_hdr)(rptfile, curdef, (total == 0), lastdef);
  1401: 		curref  = new_ref(0, curdef, NULL);
  1402: 		if (trace_rpt_enabled()) {
  1403: 		    printf("TRACE: Report call tree for routine %s @ %lxh\n",
  1404: 			def_name(curdef), curdef);
  1405: 		}
  1406: 		(*report_entry)(rptfile, curref, 0, 0);
  1407: 		free_ref(curref);
  1408: 					    
  1409: 		/*+							    */
  1410: 		/* Generate the subtree. Create a temporary def to serve as */
  1411: 		/* the tree root and set its tree root to the current	    */
  1412: 		/* definition as a context value. This is used in detection */
  1413: 		/* of duplicate and recursive expansions. Use the ref list  */
  1414: 		/* of this tree to build a stack of caller refs. Push a ref */
  1415: 		/* for the current routine to this stack, reflecting the    */
  1416: 		/* fact that it is the first caller, then report the tree.  */
  1417: 		/* Then pop the reference and free the root definition.	    */
  1418: 		/*-							    */
  1419: 
  1420: 		treedef = new_def(def_name(curdef), def_source(curdef));
  1421: 		set_def_root(treedef, curdef);
  1422: 		push_ref(treedef, new_ref(0, curdef, NULL));
  1423: 		report_tree(rptfile, report_entry, curdef, 1, treedef);
  1424: 		free_ref(pop_ref(treedef));
  1425: 		free_def(treedef);
  1426: 					    /* Write trailer section.	    */
  1427: 		(*report_end)(rptfile, curdef, (total == 0), lastdef);
  1428: 		total++;
  1429: 	    }
  1430: 	    else if (trace_rpt_enabled()) {
  1431: 		printf("TRACE: Report call tree, skipping routine %s @ %lxh\n",
  1432: 		    def_name(curdef), curdef);
  1433: 	    }
  1434: 
  1435: 	}
  1436: 	fclose(rptfile);
  1437: 	if (list_enabled()) {
  1438: 	    fprintf(list_file(), "       %ld Trees generated\n", total);
  1439: 	}
  1440: 	if (log_full_enabled()) {
  1441: 	    printf("       %ld Trees generated\n\n", total);
  1442: 	}
  1443:     }
  1444: }
  1445: #endif
  1446: 
  1447: /*************************************************************************++*/

ROUTINE report_by_file. Go to: Next routine in file; Routines in this file.

  1448: void report_by_file(
  1449: /* Reports the defined routines in the order in which they occurred in the  */
  1450: /* source files to a file. The files themselves are ordered alphabetically. */
  1451: /* Since this report is driven by the list of defined routines, if a file   */
  1452: /* contains no routine definitions, it will not be reported here.	    */
  1453: 
  1454:     char    *aFileName
  1455: 	    /* (READ, BY ADDR):						    */
  1456: 	    /* Report output file name.					    */
  1457: 
  1458: )	/* No return value.						    */
  1459: 	/*****************************************************************--*/
  1460: 
  1461: {
  1462:     void    (*report_hdr)();		    /* Ptr to section header	    */
  1463: 					    /* routine.			    */
  1464:     void    (*report_entry)();		    /* Ptr to report line routine.  */
  1465:     void    (*report_end)();		    /* Ptr to section end routine.  */
  1466:     FILE    *rptfile;			    /* Report file ptr.		    */
  1467:     DEFINITION				    /* Current routine entry.	    */
  1468: 	    *curdef;
  1469:     SOURCEFILE				    /* Current file entry.	    */
  1470: 	    *curfile;
  1471:     long    total;			    /* Total defined routines.	    */
  1472:     int	    totfiles;			    /* Total number of files.	    */
  1473:     int	    lastfile;			    /* Flag indicating last file    */
  1474: 					    /* with defs.		    */
  1475:     int	    byfilefile = 0;		    /* By-file report file number.	    */
  1476: 
  1477:     /*+									    */
  1478:     /*	Select appropriate set of output formatter routines and open file.  */
  1479:     /*	For each source file, write a header section. For each routine in   */
  1480:     /*	that file, write a report list. Then write a trailer section for    */
  1481:     /*	the file. Last, close the file.					    */
  1482:     /*-									    */
  1483: 
  1484:     report_hdr   = report_hdr_routine(rpt_byfile_routines);
  1485:     report_entry = report_entry_routine(rpt_byfile_routines);
  1486:     report_end   = report_end_routine(rpt_byfile_routines);
  1487: 
  1488:     if ((rptfile = fopen(aFileName, "w")) == NULL) {
  1489: 	printf("ERROR: Unable to open %s for report output\n", aFileName);
  1490:     }
  1491:     else {
  1492: 	if (list_enabled()) {
  1493: 	    fprintf(list_file(),
  1494: 		"\nREPORT Routines by source file in file %s\n",
  1495: 		aFileName);
  1496: 	}
  1497: 	if (log_enabled()) {
  1498: 	    printf("REPORT Routines by source file in file %s\n", aFileName);
  1499: 	}
  1500: 					    /* Skip past undefined	    */
  1501: 					    /* routines.		    */
  1502: 	for (curdef = list_first(global_deflist());
  1503: 	    curdef != NULL && !isdefined_routine(curdef);
  1504: 	    curdef = next_entry(curdef)) {
  1505: 	    if (trace_rpt_enabled()) {
  1506: 		printf(
  1507: 		"TRACE: Report file, skipping external routine %s @ %lxh\n",
  1508: 		    def_name(curdef), curdef);
  1509: 	    }
  1510: 	}
  1511: 					    /* Report each file's routines. */
  1512: 	for (total = totfiles = 0,
  1513: 		curdef != NULL ? curfile = def_source(curdef) : NULL;
  1514: 	    curdef != NULL;
  1515: 	    curdef != NULL ? curfile = def_source(curdef) : NULL) {
  1516: 	    lastfile = islast_defining_file(curfile);
  1517: 	    
  1518: 	    if (rpt_html_enabled()
  1519: 		&& source_byfilefile(curfile) != byfilefile) {
  1520: 		byfilefile = rpt_html_continue(&rptfile,
  1521: 				ROUTINES_BY_FILE_SECTION, curfile, byfilefile,
  1522: 				source_byfilefile(curfile));
  1523: 	    }
  1524: 					    /* Write header section.	    */
  1525: 	    (*report_hdr)(rptfile, curfile, (totfiles == 0), lastfile);
  1526: 	    if (trace_rpt_enabled()) {
  1527: 		printf("TRACE: Report routines in file %s @ %lxh\n",
  1528: 		    source_name(curfile), curfile);
  1529: 	    }
  1530: 	    do {
  1531: 					    /* Write entry line.	    */
  1532: 		if (trace_rpt_enabled()) {
  1533: 		    printf("TRACE: Report file %s routine %s @ %lxh\n",
  1534: 			source_name(def_source(curdef)), def_name(curdef),
  1535: 			curdef);
  1536: 		}
  1537: 		(*report_entry)(rptfile, curdef, isfirst_in_file(curdef),
  1538: 		    islast_in_file(curdef));
  1539: 		total++;
  1540: 		curdef = next_entry(curdef);
  1541: 	    } while (curdef != NULL && def_source(curdef) == curfile);
  1542: 
  1543: 					    /* Write trailer section.	    */
  1544: 	    (*report_end)(rptfile, curfile, (totfiles == 0), lastfile);
  1545: 	    totfiles++;
  1546: 	}
  1547: 	fclose(rptfile);
  1548: 	if (list_enabled()) {
  1549: 	    fprintf(list_file(), "       %ld Defined routines in %d files\n",
  1550: 		total, totfiles);
  1551: 	}
  1552: 	if (log_full_enabled()) {
  1553: 	    printf("       %ld Defined routines in %d files\n\n", total,
  1554: 		totfiles);
  1555: 	}
  1556:     }
  1557: }
END report_by_file. Go to: Beginning of routine.


  1558: 
  1559: /*************************************************************************++*/

ROUTINE report_files. Go to: Next routine in file; Routines in this file.

  1560: void report_files(
  1561: /* Reports the source files in alphabetical order to a file.		    */
  1562: 
  1563:     char    *aFileName
  1564: 	    /* (READ, BY ADDR):						    */
  1565: 	    /* Report output file name.					    */
  1566: 
  1567: )	/* No return value.						    */
  1568: 	/*****************************************************************--*/
  1569: 
  1570: {
  1571:     void    (*report_hdr)();		    /* Ptr to report header	    */
  1572: 					    /* routine.			    */
  1573:     void    (*report_entry)();		    /* Ptr to report line routine.  */
  1574:     void    (*report_end)();		    /* Ptr to report end routine.   */
  1575:     FILE    *rptfile;			    /* Report file ptr.		    */
  1576:     SOURCEFILE				    /* Current file entry.	    */
  1577: 	    *curfile;
  1578:     int	    total;			    /* Total defined routines.	    */
  1579: 
  1580:     /*+									    */
  1581:     /*	Select appropriate set of output formatter routines. Open file and  */
  1582:     /*	write a header section. For each source file, write a report line.  */
  1583:     /*	Then write a trailer section and close the file.		    */
  1584:     /*-									    */
  1585: 
  1586:     report_hdr   = report_hdr_routine(rpt_file_routines);
  1587:     report_entry = report_entry_routine(rpt_file_routines);
  1588:     report_end   = report_end_routine(rpt_file_routines);
  1589: 
  1590:     if ((rptfile = fopen(aFileName, "w")) == NULL) {
  1591: 	printf("ERROR: Unable to open %s for report output\n", aFileName);
  1592:     }
  1593:     else {
  1594: 	if (list_enabled()) {
  1595: 	    fprintf(list_file(),
  1596: 		"\nREPORT Source files in file %s\n", aFileName);
  1597: 	}
  1598: 	if (log_enabled()) {
  1599: 	    printf("REPORT Source files in file %s\n", aFileName);
  1600: 	}
  1601: 
  1602: 	(*report_hdr)(rptfile);		    /* Write header.		    */
  1603: 	for (total = 0, curfile = list_first(global_filelist());
  1604: 	    curfile != NULL;
  1605: 	    curfile = next_entry(curfile)) {
  1606: 					    /* Write entry line.	    */
  1607: 	    if (trace_rpt_enabled()) {
  1608: 		printf("TRACE: Report source file %s @ %lxh\n",
  1609: 		    source_name(curfile), curfile);
  1610: 	    }
  1611: 	    (*report_entry)(rptfile, curfile, isbegin_of_list(curfile),
  1612: 		isend_of_list(curfile));
  1613: 	    total++;
  1614: 	}
  1615: 	(*report_end)(rptfile, total);	    /* Write trailer.		    */
  1616: 	fclose(rptfile);
  1617: 	if (list_enabled()) {
  1618: 	    fprintf(list_file(), "       %d files\n", total);
  1619: 	}
  1620: 	if (log_full_enabled()) {
  1621: 	    printf("       %d files\n\n", total);
  1622: 	}
  1623:     }
  1624: }
END report_files. Go to: Beginning of routine.


  1625: 
  1626: /*************************************************************************++*/

ROUTINE report_source. Go to: Next routine in file; Routines in this file.

  1627: void report_source(
  1628: /* Reports annotated source files with line numbers. The sources are	    */
  1629: /* reported in separate files.						    */
  1630: 
  1631:     char    *aFileName
  1632: 	    /* (READ, BY ADDR):						    */
  1633: 	    /* Report output file name format string.			    */
  1634: 
  1635: )	/* No return value.						    */
  1636: 	/*****************************************************************--*/
  1637: 
  1638: {
  1639:     void    (*report_hdr)();		    /* Ptr to section header	    */
  1640: 					    /* routine.			    */
  1641:     void    (*report_entry)();		    /* Ptr to report line routine.  */
  1642:     void    (*report_end)();		    /* Ptr to section end routine.  */
  1643:     char    rptname[MAX_FILE_NAME + 1];	    /* Report file name prefix.	    */
  1644:     char    outputname[MAX_FILE_NAME + 1];  /* Report file name buffer.	    */
  1645:     char    srcline[MAX_FILE_NAME * 2];	    /* Source line buffer.	    */
  1646:     FILE    *rptfile;			    /* Report file ptr.		    */
  1647:     FILE    *srcfile;			    /* Source file ptr.		    */
  1648:     DEFINITION				    /* Current routine entry.	    */
  1649: 	    *curdef;
  1650:     SOURCEFILE				    /* Current file entry.	    */
  1651: 	    *curfile;
  1652:     long    line;			    /* Current line number in file. */
  1653:     long    total;			    /* Total source lines.	    */
  1654:     int	    totfiles;			    /* Total number of files.	    */
  1655: 
  1656:     /*+									    */
  1657:     /*	Select appropriate set of output formatter routines.  For each	    */
  1658:     /*	source file, open source and report files and write a header	    */
  1659:     /*	section.  Write each line in the file, merging with the routine	    */
  1660:     /*	definitions.  Then write a trailer section for the file and close   */
  1661:     /*	the source and report files.					    */
  1662:     /*-									    */
  1663: 
  1664:     report_hdr   = report_hdr_routine(rpt_source_routines);
  1665:     report_entry = report_entry_routine(rpt_source_routines);
  1666:     report_end   = report_end_routine(rpt_source_routines);
  1667: 
  1668:     if (list_enabled()) {
  1669: 	fputs("\nREPORT Annotated source files\n", list_file());
  1670:     }
  1671:     if (log_enabled()) {
  1672: 	puts("REPORT Annotated source files");
  1673:     }
  1674: 					    /* Skip past undefined	    */
  1675: 					    /* routines.		    */
  1676:     for (curdef = list_first(global_deflist());
  1677: 	curdef != NULL && !isdefined_routine(curdef);
  1678: 	curdef = next_entry(curdef)) {
  1679: 	if (trace_rpt_enabled()) {
  1680: 	    printf(
  1681: 	    "TRACE: Report sources, skipping external routine %s @ %lxh\n",
  1682: 		def_name(curdef), curdef);
  1683: 	}
  1684:     }
  1685: 					    /* Report each file's contents. */
  1686:     for (total = totfiles = 0, curfile = list_first(global_filelist());
  1687: 	curfile != NULL; curfile = next_entry(curfile)) {
  1688: 
  1689: 	line = 0;
  1690: 	sprintf(rptname, aFileName, source_seq(curfile));
  1691: 	if ((srcfile = fopen(source_name(curfile), "r")) == NULL) {
  1692: 	    printf("ERROR: Unable to open %s for input\n",
  1693: 		source_name(curfile));
  1694: 	}
  1695: 	else if ((rptfile = fopen(make_filename(outfile_prefix(), rptname,
  1696: 	        report_filext(), outputname), "w")) == NULL) {
  1697: 	    printf("ERROR: Unable to open %s for report output\n", rptname);
  1698: 	}
  1699: 	else {				    /* Write header section.	    */
  1700: 	    (*report_hdr)(rptfile, curfile, (totfiles == 0),
  1701: 		isend_of_list(curfile));
  1702: 	    if (trace_rpt_enabled()) {
  1703: 		printf("TRACE: Report annotated source in file %s @ %lxh\n",
  1704: 		    source_name(curfile), curfile);
  1705: 	    }
  1706: 					    /* Report lines through last    */
  1707: 					    /* routine defined in this	    */
  1708: 					    /* file.			    */
  1709: 	    while (curdef != NULL && def_source(curdef) == curfile) {
  1710: 		while (line < def_end(curdef)) {
  1711: 					    /* Copy source line.	    */
  1712: 		    fgets(srcline, sizeof(srcline), srcfile);
  1713: 		    (*report_entry)(rptfile, curdef, srcline, ++line,
  1714: 			source_tabsize(curfile));
  1715: 		    total++;
  1716: 		}
  1717: 		curdef = next_entry(curdef);
  1718: 	    }
  1719: 					    /* Report rest of file.	    */
  1720: 	    while (fgets(srcline, sizeof(srcline), srcfile) != NULL) {
  1721: 		(*report_entry)(rptfile, NULL, srcline, ++line,
  1722: 		    source_tabsize(curfile));
  1723: 		total++;
  1724: 	    }
  1725: 					    /* Write trailer section.	    */
  1726: 	    (*report_end)(rptfile, curfile, (totfiles == 0),
  1727: 		isend_of_list(curfile));
  1728: 	    totfiles++;
  1729: 	    fclose(srcfile);
  1730: 	    fclose(rptfile);
  1731: 	}
  1732:     }
  1733:     if (list_enabled()) {
  1734: 	fprintf(list_file(), "       %ld Lines in %d files\n",
  1735: 	    total, totfiles);
  1736:     }
  1737:     if (log_full_enabled()) {
  1738: 	printf("       %ld Lines in %d files\n\n", total, totfiles);
  1739:     }
  1740: }
END report_source. Go to: Beginning of routine.


  1741: 

END OF FILE TOTAL: 108 routines, 12 Avg Length

Go to: Contents; Previous section; Beginning of section; Next file in section; Previous file in section.