Provided by: complexity_1.13-1_amd64 bug

NAME

       complexity - Measure complexity of C source

SYNOPSIS

       complexity [-flags] [-flag [value]] [--option-name[[=| ]value]] [ <file-name> ... ]

       The  operands that this program operates on may be specified either on the command line or
       read from standard input, one per line.  In that input, leading and trailing  white  space
       is stripped, blank lines are ignored.  Standard input may not be a terminal.

       Compute  the  complexity  of  source code not just with a path-through-the-code count, but
       also amplifying line counts by logic level nesting.

       Compute the complexity of code by counting lines of non-comment source and multiplying  by
       a nested logic weight factor.  By default, 1.9.

DESCRIPTION

       The  weight  of  each  statement is the number of lines the statement uses.  This value is
       multiplied by the nested logic weighting (1.9 by default) for each layer  of  logic.   For
       example, this snippet:

           if (foo) {
             if (bar) {
               bumble; baz;
             }
           }

       will score 11.  This score is then scaled to approximate pmccabe results by dividing by 20
       and rounding.  This scores "1" at the end.  pmccabe scores higher on simple procedures and
       complexity scores higher with more deeply nested logic.

       The  scoring  can  be  tweaked by adjusting the --nesting-penalty and --scale-ing factors.
       The default values were calibrated by comparing the average results of millions  of  lines
       of code with the results of pmccabe.

       For  the  purposes  of  this  program,  a  procedure is identified by a name followed by a
       parenthesized expression and then an opening curly brace.  It ends with  a  closing  curly
       brace in column 1.

       This  program  will perform its function for every file named on the command line or every
       file named in a list read from stdin.  The arguments or input names must  be  pre-existing
       files.  The input list may contain comments, which are blank lines or lines beginning with
       a '#' character.

OPTIONS

       -t minimum, --threshold=minimum
              Reporting threshold.  This option takes an integer number  as  its  argument.   The
              default minimum for this option is:
                   30

              Ignore  any procedures with a complexity measure below this threshold.  By default,
              a complexity score of under 30  is  not  printed.   However,  if  a  histogram  and
              statistics are to be printed, but not individual procedure scores, then the default
              is set to zero.  Procedures below this limit are not counted in the statistics.

       --horrid-threshold=minimum
              zero exit threshold.  This option takes an integer number  as  its  argument.   The
              default minimum for this option is:
                   100

              If any procedures score higher than this threshold, then the program will exit non-
              zero.  (4/COMPLEX_EXIT_HORRID_FUNCTION, if no other problems are encountered.)   By
              default,  this  program  exits zero unless one function exceeds the horrid score of
              100.

       -n factor, --nesting-penalty=factor
              score multiplier for nested code.

              Linguistic constructs weigh more heavily the  more  deeply  nested  they  are.   By
              default,  each  layer  penalizes  by  a  factor  of  1.9.  The option argument is a
              floating point number.  The penalty may be 1, but not less.

       --demi-nesting-penalty=factor
              score multiplier for nested expressions.

              By  default,  this  value  is  halfway  between  1.0  and   the   nesting   penalty
              (specifically,   the  square  root  of  the  nesting  penalty).   It  refers  to  a
              parenthesized sub-expression. e.g.
                  ((a > b) && (c > d))
              contains two parenthesized sub-expressions.  This would count 3.5 points.   On  the
              other hand, this:
                  (a > b && c > d)
              contains  two  relation  operators and a logical operator at the same level.  These
              nested counts will be multiplied together and yield 2.5 * 2.5, or 6.25.   Don't  do
              that.  It gets even worse if you have logical ands and ors at the same level.

       -s factor, --scale=factor
              complexity scaling factor.  This option takes an integer number as its argument.

              By  default,  the  scaling  is  20  which  divides  the  raw score by 20.  This was
              normalized to roughly correspond to the pmccabe scores:

              0-9 Easily maintained code.

              10-19 Maintained with little trouble.

              20-29 Maintained with some effort.

              30-39 Difficult to maintain code.

              40-49 Hard to maintain code.

              50-99 Unmaintainable code.

              100-199 Crazy making difficult code.

              200+ I only wish I were kidding.
                  Score | ln-ct | nc-lns| file-name(line): proc-name
                   4707    3815    2838   lib/vasnprintf.c(1747): VASNPRINTF

       -h, --histogram, --no-histogram
              Display histogram of complexity numbers.  The no-histogram form  will  disable  the
              option.    This  option  may  not  be  preset  with  environment  variables  or  in
              initialization (rc) files.

              Instead of printing out each function's score, a summary  is  printed  at  the  end
              showing  how  many  functions  had particular ranges of scores.  Unless --scores is
              specifically called out, the scores will not print with this option specified.  The
              minimum  scoring  threshold will also be reduced to zero (0), unless --threshold is
              specified.

       -c, --scores, --no-scores
              Display the score for each procedure.  The no-scores form will disable the  option.
              This  option may not be preset with environment variables or in initialization (rc)
              files.

              If you specify --histogram, individual scores will not be  displayed,  unless  this
              option is specified.

       -I string, --ignore=string
              procedure name to be ignored.  This option may appear an unlimited number of times.

              Some  code  has  macros defined that confuse the lexical analysis.  This will cause
              them to be ignored.  Other ways to cause functions to be ignored are:

              Use K&R syntax for a procedure header.

              Use a preprocessing macro to assemble the procedure header.

              Simplify your code.
              Generally speaking, anything you do that alters normal C syntax  will  confuse  the
              lexical  analysis.   If  a procedure is not seen, then it will not get counted.  If
              code within a procedure is incomprehensible,  you  will  likely  get  inappropriate
              results.

       -H, --no-header
              do  not  print  scoring  header.   This  option  may not be preset with environment
              variables or in initialization (rc) files.

              If a script is going to process the scoring output, parsing  is  easier  without  a
              header.  The histogram output will always have a header.

       -u unifdef-opt, --unifdef=unifdef-opt
              Run  the  source(s)  through  unifdef(1BSD).   This  option may appear an unlimited
              number of times.

              Strip out sections  of  code  surrounded  by  #if/#endif  directives.   The  option
              argument is passed as an argument to the unifdef(1BSD) program.  For example:
                  complexity -u-Dsymbol
              would  cause  symbol  to be defined and remove sections of code preceded by #ifndef
              symbol directives.

              Please see the unifdef documentation for more information.

       --unif-exe=prog
              Specify the unifdef program.

              Alternate program to use for unifdef-ing the input.

       -i file-name, --input=file-name
              file of file list.

              Instead of either a command line list of input files or reading them from  standard
              input, read the list of files from this file.

       --trace=file-name
              trace output file.

              Print intermediate scores to a trace file.

       -?, --help
              Display usage information and exit.

       -!, --more-help
              Pass the extended usage information through a pager.

       -> [cfgfile], --save-opts [=cfgfile]
              Save  the  option  state  to  cfgfile.   The default is the last configuration file
              listed in the OPTION PRESETS section, below.  The command will exit after  updating
              the config file.

       -< cfgfile, --load-opts=cfgfile, --no-load-opts
              Load  options  from  cfgfile.   The  no-load-opts  form will disable the loading of
              earlier config/rc/ini files.  --no-load-opts is handled early, out of order.

       -v [{v|c|n --version [{v|c|n}]}]
              Output version of program and exit.  The default mode is  `v',  a  simple  version.
              The `c' mode will print copyright information and `n' will print the full copyright
              notice.

OPTION PRESETS

       Any option that is not marked as not presettable may be  preset  by  loading  values  from
       configuration ("RC" or ".INI") file(s) and values from environment variables named:
         COMPLEXITY_<option-name> or COMPLEXITY
       The  environmental  presets  take  precedence (are processed later than) the configuration
       files.  The homerc files are "$@/complex.conf", "$HOME", "$PROJECT_ROOT/complex.conf", and
       ".".   If any of these are directories, then the file .complexityrc is searched for within
       those directories.

ENVIRONMENT

       See OPTION PRESETS for configuration environment variables.

FILES

       See OPTION PRESETS for configuration files.

EXIT STATUS

       One of the following exit values will be returned:

       0  (EXIT_SUCCESS)
              Successful program execution.

       1  (EXIT_FAILURE)
              The operation failed or the command syntax was not valid.

       3  (EXIT_NOMEM)
              insufficient memory to run program

       4  (EXIT_HORRID_FUNCTION)
              One or more functions scored over 100

       5  (EXIT_NO_DATA)
              No qualifying procedures were found.

       6  (EXIT_ASSERT)
              Assertion failed

       32  (EXIT_BAD_FILE)
              one or more input files were unreadable or empty.

       66  (EX_NOINPUT)
              A specified configuration file could not be loaded.

       70  (EX_SOFTWARE)
              libopts  had  an  internal  operational  error.   Please  report  it  to   autogen-
              users@lists.sourceforge.net.  Thank you.

AUTHORS

       Bruce Korb

COPYRIGHT

       Copyright  (C)  2011-2020  Bruce Korb all rights reserved.  This program is released under
       the terms of the GNU General Public License, version 3 or later.

BUGS

       This program does not recognize K&R procedure headers.

       Some procedures  still  get  missed.   Usually,  these  are  procedures  that  use  the  C
       pre-processor to extend the C language in some way.

       Initialized  variable definitions within procedures have the initializing elements counted
       in the complexity calculation.

       Please send bug reports to: bkorb@gnu.org

NOTES

       This manual page was AutoGen-erated from the complexity option definitions.