NAME

 dcc - Disciplined C Checker (version 2.7X)


SYNOPSIS

 Syntax : dcc [options] [sourceFile [sourceFile [sourceFile ...]]]


DESCRIPTION

dcc is a C checker program, described in the December 1995 issue of ACM SIGPLAN Notices (see also 'dccarticle.ps' and 'dccarticle.ascii' included files).


Copyright

 Copyright Ecole Superieure d'Electricite ('Supelec'), France, 1995.
 All Rights Reserved.


Agreement

 TITLE.   Title,  ownership rights, and intellectual property rights in
 and to the Software shall remain in Supelec and/or its suppliers.  The
 Software is protected by international copyright treaties.

 DISCLAIMER  OF  WARRANTY.   Since  the  Software  is  provided free of
 charge, the Software is provided on an "AS IS" basis, without warranty
 of   any   kind,   including  without  limitation  the  warranties  of
 merchantability,   fitness    for    a    particular    purpose    and
 non-infringement.   The  entire risk as to the quality and performance
 of the Software is borne by you.  Should the Software prove defective,
 you  and not Supelec assume the entire cost of any service and repair.
 This disclaimer of warranty  constitutes  an  essential  part  of  the
 agreement. SOME STATES/COUNTRIES DO NOT ALLOW EXCLUSIONS OF AN IMPLIED
 WARRANTY, SO THIS DISCLAIMER MAY NOT APPLY TO YOU  AND  YOU  MAY  HAVE
 OTHER LEGAL RIGHTS THAT VARY FROM STATE/COUNTRY TO STATE/COUNTRY OR BY
 JURISDICTION.

 LIMITATION  OF  LIABILITY.   UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL
 THEORY, TORT, CONTRACT, OR OTHERWISE, SHALL SUPELEC OR  ITS  SUPPLIERS
 OR  RESELLERS  BE  LIABLE TO YOU OR ANY OTHER PERSON FOR ANY INDIRECT,
 SPECIAL,  INCIDENTAL,  OR  CONSEQUENTIAL  DAMAGES  OF  ANY   CHARACTER
 INCLUDING,  WITHOUT  LIMITATION,  DAMAGES  FOR  LOSS OF GOODWILL, WORK
 STOPPAGE, COMPUTER FAILURE  OR  MALFUNCTION,  OR  ANY  AND  ALL  OTHER
 COMMERCIAL  DAMAGES OR LOSSES.  SOME STATES/COUNTRIES DO NOT ALLOW THE
 EXCLUSION OR LIMITATION OF INCIDENTAL  OR  CONSEQUENTIAL  DAMAGES,  SO
 THIS LIMITATION AND EXCLUSION MAY NOT APPLY TO YOU.


Version&Author

 dcc version 2.7,    February 19th 2001

 Yves Noyelle (<Yves.Noyelle@supelec.fr>)
 Supelec, Service Informatique,
 Plateau de Moulon, F-91192 Gif/Yvette Cedex


Contents

  1 - Generalities
  2 - In the event of bug
  3 - Distribution files
  4 - Configuration, compilation and installation of dcc
  5 - Execution files
  6 - Test files
  7 - Article
  8 - Available d-pragmas
  9 - Indentation rules
 10 - Options
 11 - Environment variables
 12 - Exit statuses
 13 - Badly implemented features (as of now)
 14 - Unimplemented features (as of now)
 15 - Known bug(s)
 16 - Main changes with respect to previous version
 17 - About '16 bits int' platforms


- 1 - Generalities

 dcc  verifies  that a C  source  file  complies  with the  precepts of
 Disciplined C, a set of rules aiming at elevating ANSI C to  the  rank
 of high level language (as opposed to portable assembly language), and
 making as much semantics as possible  flow  from  the  design  to  the
 source   code.    This   is   achieved   mainly  via  quasi-compulsory
 types/constants naming and 'const' qualifier use.

 It  also  detects  most  of  the pitfalls of the C language, helps the
 programmer organize his program modules and write them  so  that  they
 are  well structured, well encapsulated and more portable, and finally
 gives some much-needed compile-time checking tools.

 dcc  is quite fast (from 5 to 10 times faster than a compiler), and is
 itself written in Disciplined C.


- 2 - In the event of bug

 No  guarantee  is  given  that  this  version  of dcc is free of bugs,
 although every efforts are made to chase and eliminate them.

 If  you  uncover  one  (or  more...),  please  let  me know (at e-mail
 <dccsupport@supelec.fr>); a bug report should include a description of
 the  problem  and  a  short  source  file  causing  it, along with the
 version/release number of dcc (see  paragraph  10)  and  the  platform
 (machine/system) used.


- 3 - Distribution files

There are five sets of files :

- program files
  configdc.th
  dccFiles.mng
  dc.th
  dcblk.c/h/ph
  dcdecl.c/h/ph
  dcdir.c/h/ph
  dcexp.c/h/ph
  dcext.c/h/ph
  dcfmt.c/h
  dcinst.c/h/ph
  dcmain.c/h/ph
  dcprag.c/h/ph
  dcrec.c/h/ph
  dcrecdir.c/ph/th
  dctxttok.c/h
  dcmsg.*

- installation files
  adaptStarterFile     (UNIX)    (courtesy of C. Bocage, CRI Supelec)
  adaptstarterfilevms.com (VMS)  (courtesy of C. Bocage, CRI Supelec)
  askfordfltopt.com    (VMS)
  chooseMsgLanguage    (UNIX)
  chooseStarterFile    (UNIX)
  createLocalFilesMngFile (UNIX) (courtesy of C. Bocage, CRI Supelec)
  createlocalexec      (UNIX)
  descrip.mms          (VMS)
  extracthdrfilesvms.com (VMS)   (courtesy of J. Lauret, SUNY@SB, USA)
  frsttime.mms         (VMS)
  installdccvms.com    (VMS)
  installfile          (UNIX)
  makefile             (UNIX)    (courtesy of C. Bocage, CRI Supelec)
  makefile.win32       (WINDOWS) (courtesy of C. Enache, UPB student,
                                                               Romania)
  rmdirvms.com         (VMS)

- execution files
  *.adj                (adjustment files)
  dynarray.h           (header file for dynamic arrays, independent of
                                                                   dcc)
  predefmacvmsvax.txt
  predefmacvmsalpha.txt
  starter.dccCcHP715   (courtesy of F. Mullet, alumnus)
  starter.dccClWin32   (courtesy of E. Bezine, alumnus)
  starter.dccDjgpp     (courtesy of J.F. Tilman, alumnus)
  starter.dccGccAlphaSkel
  starter.dccGccHPUXSkel
  starter.dccGccLinuxSkel (courtesy of Ch. Duverger, alumnus)
  starter.dccGccMipsSkel
  starter.dccGccSunosSkel (courtesy of Ch. Duverger, alumnus)
  starter.dccVmsAlpha
  starter.dccVmsVax
  starter.dccXlcAix    (courtesy of W. Briscoe, freelance, UK)

- test files
  tstdcc
  tstdccvms.com
  trydcc.c/h
  restrydcc.txt
  srchdiffrestry.com

- files describing dcc
  dccarticle.ps
  dccarticle.ascii

 FILES  FROM  OLD DISTRIBUTIONS SHOULD BE DISCARDED BEFORE INSTALLING A
 NEW VERSION (except possibly local adjustment files).

 Note :  each dcc source file begins with a  /* <fileName> */  comment,
         and ends with a /* End <fileName> */ comment, to  make it easy
         to check that it has not been truncated by error.


- 4 - Configuration, compilation and installation of dcc

 The   configuration   phase   means   possible  adaptations  of  files
 'configdc.th',  'dccFiles.mng',  and  'dcmsg.txt'.   Choice  of   file
 'starter.dcc' is discussed paragraph 5.

 File 'configdc.th' serves to configurate dcc (buffer sizes and so on);
 most settings should be valid on any machine (except  perhaps  smaller
 memory  machines or machines  where NULL is  not all-zeros);  comments
 are  supposed to be  meaningful enough  to make clear  the use of each
 defined symbol.
 The  symbol  LONGLONG  should only be  defined on  platforms  having a
 larger integer size than 'long'; its value is then the  naming of that
 type (e.g. "#define LONGLONG long long" or "#define LONGLONG __int64".)
 In the latter case, a "#define __int64 long long" should be put in the
 starter  file. If LONGLONG  is  not  defined,  the  syntax  for  'long
 long'  numerical constants ("LL") is not recognized (except in  system
 header  files).
 The  macro  IsVisibleChar governs what an 'invisible character' is; it
 is to  be  adapted  to  locally  used  character  set  extension.
 The  SignedChar/SignedIntField  symbols  may  have to be adapted  from
 their default value.
 EBCDIC character coding could be supported by  changing the 'charInfo'
 array (file 'dcrec.c').
 Input/output  is  done  entirely  via   fopen/fread/feof/fflush/fputs/
 fclose/getchar/setvbuf. The  only other  used  system  functions  are:
 malloc/realloc/free,  setjmp/longjmp, exit/abort, system (to pass con-
 trol to the local compiler), fileno/isatty, and getenv.

 File 'dccFiles.mng' is to be adapted to local conditions; it indicates
 the directory where dcc execution  files  (adjustment  files  and  the
 starter file) are to be found, and the system header files  directory.
 If there are several  system  header  files  directories,  use  symbol
 'PredefDCCDFLTS'  (see  paragraph  10; for gcc  platforms, the command
 file 'createLocalFilesMngFile'  computes the value  of  this  symbol).
 The content of environment  variable DCCFILES, if defined,  supersedes
 these values; its format is:
   <dccExecFilesDir> or
   <dccExecFilesDir> <space> <sysHdrDir>.

 Files   'dcmsg.###'  contain  the  text  of  all  messages  (including
 errors/warnings); since these messages are C string literals, they may
 be  changed  at will.  '###' indicates the language used for messages;
 at present, there exist "eng"lish  and  "fre"nch  versions.  In  these
 files,  the  character  sequence '@x', where x is a digit in the range
 '1'-'9', is not outputted as such, but replaced by a text generated by
 dcc.  The  character  sequence  '@0'  toggles  a flip-flop controlling
 output  of  the  '@0'  parenthesized  message  chunks  (output  if  in
 interactive  mode after 'e'/'E' command, or if options '+zve', '+zvve'
 activated).


UNIX OS

 On an UNIX system, once these files set, compilation is done by typing
 'make'. The 'make install' command installs dcc into the system (first
 edit file 'installfile' to define where you want it to be; unmodified,
 this file installs dcc in /usr/local/bin/, and the  'execution'  files
 in  /usr/local/lib/DccExecFiles/  (if  changed,  change  also value of
 DccExecFilesDir symbol in file  'dccFiles.mng').   Then  test  dcc  on
 itself  (command  file  'tstdcc'): this should  generate  no error nor
 warning.


VMS OS

 On  a VMS system, use the 'installdccvms.com' file.  The following DCL
 logical names have to be defined beforehand:

dccexecfilesdir
 directory where dcc execution files are installed,

dccsyshdrdir
 directory  where system header files ('stdio.h' etc.) can be found (in
 text form).

 Also,  'dcc'  has  to  be  defined as a "foreign" command ($ dcc :== $
 <complete executable file name>). The test file is 'tstdccvms.com'.


WindowsXX OS

 On WindowsXX, with Microsoft VisualC++ 4.0, use 'makefile.win32' file;
 do not forget to set the INCLUDE, LIB, and PATH environment variables,
 e.g. :

    set INCLUDE=C:\Program Files\DevStudio\VC\include
    set LIB=C:\Program Files\DevStudio\VC\lib
    set PATH=C:\Program Files\DevStudio\VC\bin;C:\Program Files\
                                                DevStudio\SharedIDE\bin


Other

 On other systems, you are on your own...

 Note : possible  local  compiler  warnings  while  compiling  dcc  may 
        safely be ignored (provided the compiler is mature).


- 5 - Execution files

 Several files are needed by dcc to execute correctly:


Starter file

 Its  purpose  is  to  define  those symbols that are predefined by the
 local compiler.  It also gives the name of the compiler (via a  string
 literal,  that  must  be  the  value  of  the '__dcc' symbol), and can
 override local features (such as specific  specifiers/qualifiers, e.g.
 the "globalvalue" specifier of VMS C compilers). Starter files for VMS
 C compilers (both VAXs and  ALPHAs), the ULTRIX gcc compiler, the OSF1
 gcc  compiler,  the  HP-UX cc/gcc  compilers, the LINUX gcc  compiler,
 the SUNOS gcc compiler, the AIX xlc compiler, the  Djgpp  compiler and
 the Windows VisualC++ cl compiler are included. For SUNOS, the  system
 header files directory must be the gcc header files directory.

 When  the  value  of  the  '__dcc'  symbol  indicates  gcc (or cc on a
 VMS/Alpha  platform),  a  'skeleton'  starter  file  is  automatically
 completed   with   the   compiler  predefined  macros  (command  files
 adaptStarterFile*).  This could be done for other compilers,  provided
 they give a mean to obtain these macros.

 Note 1 : the  called  compiler  can  be  changed  from the  default by 
          redefining  the '__dcc'  symbol in the dcc  command line ('-D'
          or '/DEF' option), but then the  starter  file may have to be
          changed.

 Note 2 : system  include files  are  configurated via several symbols,
          such as _XOPEN_SOURCE  or _POSIX_C_SOURCE; these symbols  are
          not defined  by default in dcc (except if the called compiler
          is gcc or VMS/Alpha cc), which may result in 'undefined func-
          tion' messages. To set such a symbol, either define it in the
          'starter.dcc'  file  (then it  is  global  for all users), or
          define it  using  the  '-D'  command  line  option  (possibly
          via the DCCDFLTS environment variable, see paragraph 10).


Adjustment files

 Their  purpose  is  to  amend system header files, so that they do not
 cause dcc to issue undue warnings.  Conceptually, an  adjustment  file 
 is  appended  to the  end of the  corresponding header file (after the
 first   inclusion,   or    after    each    inclusion    if     symbol
 ADJFILES_INCLUDED_AT_EACH_INCL is defined in the starter file; cf file
 'time.adj').

 An  adjustment  file  cannot  declare/define   anything  not declared/
 defined  by the  corresponding  header  file  (except if  something is
 missing in it, e.g. the prototype for the "sbrk" function in stdlib.h;
 see then d-pragma /*~AddedObj*/, paragraph  8). They  may redeclare at
 will  system  function, objects, typedefs (even already used ones) and
 macros.

 An identifier not declared in the corresponding  system header file is
 ignored.  There  may be  several  redefinitions for a given  function/
 structure/union; the  one that is  chosen is the one of  the same sort
 and with the same number of parameters/fields.

 A system  macro (with  parameter, that is not a  symbol), for  example
 "setjmp", after  having been  met once in an  adjustment  file, is not
 expanded any more (being replaced by a function prototype).

 The 'bool' type is implicitely  defined inside an adjustment file, but
 precautions  should be taken if is also  defined by the  corresponding
 system header file (cf. 'curses.adj').

 Any  preprocessor feature can be used in an adjustment file.  Besides,
 the  'cdefined'  function,  similar  to  the  'defined'   preprocessor
 function  but  answering  True if  its parameter  is a defined  system
 'program' identifier (as  opposed to a 'preprocessor' identifier), can
 also be used (see for example 'signal.adj').

 By   convention,   for   a  system  header  file  named  'xxx.h',  the
 corresponding adjustment file is named 'xxx.adj', and is  searched  by
 default  in  the  DccExecFilesDir  directory.   If  one  wants another
 suffix, or wants to put (some) adjustment files in other  directories,
 one  has  to  create  an  'adjFiles.dcc'  file  in the DccExecFilesDir
 directory, file whose format is (for each line):

   "<system header file name>" , "<corresponding adjustment file
                                     full name (with absolute path)>" ;

 Example of 'adjFiles.dcc' file:
   #define X11AdjDir "/usr/local/include/DccAdj/"
   "icon.h", X11AdjDir "icon.adj";
   "Kn/Knvas.h", X11AdjDir "Knvas.adj";
   ...
   #undef X11AdjDir

 Should  any  header  file  reveal  to be unamendable, it can be purely
 replaced by the  corresponding  adjustment  file.   It  must  then  be
 described in the 'adjFiles. dcc' file, and the corresponding line must
 be prefixed by an exclamation point ('!').

 Adjustment  files  for most C system header files (curses.h:  courtesy
 of W. Briscoe, freelance, UK) are included; adjustment files  for  the
 X-Window library are available, but only partially checked.


- 6 - Test files

 The  command  files  'tstdcc*' just check dcc on its own source files;
 this check should not generate any error nor warning.

 You can get a feeling of what dcc can do for you by typing the command
 "dcc trydcc.c".  You can also limit dcc scrutiny by using  appropriate
 options  (see paragraph 10) or by  conditional  compilation  using the
 '__dcc' symbol.

 There  are  many  more  non-regression  check  files, but they are not
 included.


- 7 - Article

 Unfortunatly,  the wrong version of the paper was published in SIGPLAN
 Notices; so the right version  (in  fact  updated  and  somewhat  more
 detailed)  is  included,  in  Postscript form, along with a pure ASCII
 form (for 'diff' purposes).


- 8 - Available d-pragmas

 For  the following, a "file identifier" is defined to be composed of a
 "file access path" (machine name, directories...), followed first by a
 "file  name"  and  then by a "file suffix" that begins on the last dot
 '.' seen in the file identifier.

 A "header" file is a source file whose file suffix contains the letter
 'h' at least once, and which is included via the '#include' directive;
 a  "system  header"  file  is a header file whose '#include' directive
 uses the '<...>' form. A "body" file is a source file which is neither
 a header file, nor a file included by a header file.

 Except  /*~DccCompliant*/, /*~DollarSign*/, /*~NoWarn*/, /*~PopWarn*/,
 /*~Private*/,   /*~PrivateTo*/,   /*~Public*/,   /*~TypeCombination*/,
 /*~Warn*/, d-pragmas have purely local effect, that is they have to be
 used each time the corresponding situation occurs.

/*~AddedObj*/

   allows a new function/object/type to be added in an adjustment file:
       void sbrk/*~AddedObj*/(long);

/*~BackBranch*/

   avoids warning on backward branches:
       goto alrdDefLabel /*~BackBranch*/;

/*~CastTo <type> */

   allows pseudo-cast between parallel types; also to  be used to avoid
   warning on comparison of difference(s) of unsigned int:
       typedef struct {int x;}Ts; typedef Ts Ts1;
       Ts s; Ts1 s1; unsigned int ui1, ui2;
       ...
       s1 = /*~CastTo Ts1*/ s;
       if (/*~CastTo unsigned int */ (ui2 - ui1) > 1) ...

/*~ComposingHdr*/

   tells  that the whole service provided by the included header file is to
   be part of the service offered by the including header file:
       #include <math.h> /*~ComposingHdr*/
   Permits also a header file to carry a name  different from its body file
   (through a dummy header file carrying the right name).

/*~DccCompliant*/

   in a system  header file, indicates  that the (remaining portion of the)
   file  conforms to dcc  requirements, and  that  'typedefs'  will  create
   parallel types if applicable; usable anywhere (in a system header file).

/*~DollarSign*/

   must be at  beginning of module (possibly after comments); autorizes '$'
   in identifiers.

/*~DynInit*/

   avoids  warning on  dynamic  initialization  (by constants) of  compound
   objects:
       [auto] struct _s toto = {...} /*~DynInit*/;

/*~EndLongjmpCallable*/

   tells the 'volatile'  qualifier  checking  algorithm that the  "longjmp"
   function won't  be called  beyond  this point.   Usable  anywhere in the
   body of a function, after a "setjmp"-controlled 'if' statement.
.

/*~ExactCmp*/

   avoids warning on floating point comparison for (in)equality:
       if (fltVar == 0 /*~ExactCmp*/) ...

/*~FullEnum*/

   asks dcc to warn if not every  constant  of the (enum)  switch  type has
   been  used as case values; only useful if  a  'default'  clause  is used
   (for example to catch possible "strange" values of the enum expression):
       default: /*~FullEnum*/ ...

/*~Generic*/

   tells dcc that the  returned  type of a function is  compatible with any
   non-closed descendant  of this  type (subtyping) or, in case of 'void *'
   returning function, with  any  pointer. Not  valid if any  parameter  is
   marked /*~ResultType*/ or /*~ResultPtr*/;incompatible with /*~Utility*/:
       int atoi(const char *) /*~Generic*/;
       double sin(double) /*~Generic*/;
       void *allocateChunk() /*~Generic*/;
   The variant /*~Generic <fctList> */ is allowed  only in adjustment files
   (see /*~RootTyp*/).
   /*~Generic*/ can also be used with function  parameters, to specify that
   the  so-qualified  formal  parameter is  compatible with any  descendant
   (closed or not):
       size_t strlen(const char * /*~Generic*/);
       void (*savPSCF)(char /*~Generic*/);

/*~Ignore*/

   tells  dcc  to  ignore  object-like  or  function-like calls to  defined
   pseudo-macro. Allowed only in starter files:
       #define /*~Ignore*/ __asm

/*~IndexType <type> */

   specifies  type of index  values usable for an  array, allocated  either
   statically or dynamically  (default  index type for static  arrays: type
   of bound, except if bound given by a plain arithmetic constant; then any
   integral arithmetic type), or that can be added to a pointer. To be used
   in array/pointer declaration:
       Color arr[ArrSiz /*~IndexType ColorIndex */];
       bool * /*~IndexType Trow*/ * /*~IndexType Tcol*/ twoDimSwitchArray;
   or pointer creation:
       & /*~IndexType Tcol*/ col

/*~Init <listVar>*/

   tells the  initialization-checking  algorithm  that, from  now on, all 
   variables in the list  can be considered as initialized. Very specific
   (see X-Window  applications,  or  adjustment  files). Usable  anywhere
   (in the  scope  of the variables):
       XtSetArg(arg[0], XmNchildren, /*~Init children*/ &children);

/*~LiteralCst*/

   tells  that expressions  of a so qualified  parallel type accept unnamed
   constants without  warnings (see also options '-zuc', '-zgpr', paragraph
   10):
       typedef int Int /*~LiteralCst*/;

/*~LocalAdr*/

   avoids  warning when returning  address of local object from a function,
   or assigning such address to global/external pointer:
       gblPtr = &localObject + 1 /*~ LocalAdr */;

/*~Masking*/

   avoids  warning  if a macro  name  is the same as  an  already  existing
   identifier:
       #define /*~Masking*/ macroName macroBody

/*~MayModify*/

   indicates  that  modifications  may  occur through a  supposedly  const-
   pointing  pointer  parameter (via  casting), or  through a  struct/union
   parameter  containing  non-const pointers. To be used in functions whose
   name  implies  modifications (such as freeing  functions), or in case of
   (possible) slight modifications:
       void freeTree(const struct _tree *x /*~MayModify*/);
       void clipTree(struct _tree x /*~MayModify*/);
   See also /*~ResultPtr*/ d-pragma.

/*~NeverReturns*/

   documents that a void function never returns control:
       static void errExit(...) /*~NeverReturns*/;
   The variant  /*~NeverReturns <fctList> */  is allowed only in adjustment
   files (see /*~RootTyp*/).

/*~NoBreak*/

   avoids warning if falling through the end of a 'case' statement:
       case C1 : i = 1;  /*~NoBreak*/
       case C2 : i++;  break;

/*~NoDefault*/

   avoids  warning  if no 'default'  case at  end of 'switch'  statement on
   enumeration  (not  needed of course if all  constants have  been used as
   case values):
       case Cn : i = ... ;
       /*~NoDefault*/

/*~NonConstExp*/

   makes dcc believe that a (parenthesized) expression is not constant:
       if ((~0==-1)/*~NonConstExp*/) ...
   Notice  that the  Pascalian  form "while (TRUE)"  can be  advantageously
   replaced by the C idiom "for (;;)",

/*~NotUsed*/

   prevents  warning on  not-used  object or enum constant  or formal para-
   meter (function or macro):
       enum {Ce1, Ce2 /*~NotUsed*/, Ce3 ...}
       static void shift(Tstring x, TtypeElt y /*~NotUsed*/);
       #define Sink(x /*~ NotUsed */)
       static const char *versionName = "Version 3.3.1" /*~NotUsed*/;

/*~NoWarn*/

   to be  used in front of  sections of code not (yet)  dcc-compliant  (see
   also /*~Warn*/, /*~PopWarn*/ d-pragmas);  usable anywhere.  Warnings are
   automatically disabled inside system header files.

/*~OddCast*/

   to make dcc swallow a cast it frowns upon:
       ptrInt = (int * /*~OddCast*/) ptrStruct;

/*~PopWarn*/

   goes  back to  previous  Warn/NoWarn  state (see /*~Warn*/, /*~No Warn*/
   d-pragmas); usable anywhere. At least 16 levels kept.

/*~PortableQM*/

   to make dcc swallow a cast it has good reasons to believe not portable:
       ptrFloat = (float * /*~PortableQM*/)ptrDbl;

/*~Private*/

   if used in  header file X.*h*, is strictly  equivalent  to  /*~PrivateTo
   "<currentFile>", "X.c" */.

/*~PrivateTo "<fileName>" [, "<fileName>"]* */

   indicates  that struct/union members, or enum constants, declared there-
   after are  only visible  from  the  indicated  file(s),  or from  macros
   defined in the  indicated file(s) or called by such macros. Also  needed
   to  indicate  in which file is  defined an incomplete  struct/union  (if
   /*~Private* */  indicates several  files, this file is taken as the last
   one).
   Usable  anywhere (in a header file).
   Scope: until  next /*~Private*/, /*~PrivateTo*/ or /*~Public*/ d-pragma;
   an '#include' of (another) header file  creates a hole in the  scope for
   the  duration of the include. File names  may contain  joker  characters
   ('*' matches any set of characters; '%' matches any character):
       /*~PrivateTo "dcrec.c", "dc%%%.*h*" */

/*~PseudoVoid*/

   authorizes a so-declared (non  void-returning) function  to be used as a
   statement:
       char *strcpy(char *x, const char *y) /*~PseudoVoid*/;
   The variant  /*~PseudoVoid <fctList> */  is  allowed  only in adjustment
   files (see /*~RootTyp*/).

/*~Public*/

   indicates end of last /*~Private#*/ scope; usable  anywhere (in a header
   file).

/*~ResultPtr*/

   to be used for (pointer)  parameters that are  returned  as result; same
   effect  as  /*~ResultType*/,  plus  allows (at calling level) "should be
   'const'" pointer checking propagation:
       char *strchr(const char * /*~ResultPtr*/, char);

/*~ResultType*/

   indicates  that the result type of a function  call is the type (or  the
   smallest common type) of the current  actual parameter(s)  corresponding
   to the so qualified formal parameter(s):
       void *realloc(void *old /*~ResultType*/, size_t size);
       Window mergeWindow(Window/*~ResultType*/, Window/*~ResultType*/);
       long sum(long m /*~ResultType*/, long n /*~ResultType*/);
       short s; signed char b; unsigned char ub;

       s = sum(b, s);  /* OK; returned type behaves as 'short' from dcc
                                                             standpoint. */
       s = sum(ub, s); /* idem */
       b = sum(SCHAR_MAX + 1, b); /* WRONG, because return type is
                                                                'short'. */

/*~RootType*/

   closes (renders incompatible with its hierarchy) the type subtree headed
   by the so qualified (parallel) type:
       typedef unsigned int Talgn /*~RootType*/;
   The  variant  /*~RootType  <typeList>*/  is  allowed  only in adjustment
   files:
       /*~RootType wchar_t, wint_t*/

/*~SameValue*/

   avoids  warning if an enum  constant have the same value that a previous
   constant of the same enum:
       enum _colors {BEG_COLORS, INFRARED=BEG_COLORS /* ~SameValue not
          necessary here, because 'BEG_COLORS' is last defined constant */,
           RED, ORANGE, YELLOW, ..., BEG_VISIBLE_COLORS=RED /*~SameValue*/}

/*~Saved*/

   to be  used  if a  formal  parameter  which is a  pointer is saved  into
   permanent storage (static/extern):
       void qio(Semaphore * /*~Saved*/);

/*~SideEffectOK*/

   tells that a side effect via a macro parameter is OK:
       #define DangerousMin(x, y/*~SideEffectOK*/) (x<y)? x : y

       DangerousMin(oldMin, tab[i++])

/*~SizeOfMemBlk*/

   allows  to  check,  for   'malloc'-like  functions   using  'sizeof'  as
   parameter,  whether the type of the (first) sizeof  argument is the type
   pointed by the receiving pointer:
       void *malloc(size_t /*~SizeOfMemBlk*/);

/*~SizeOK*/

   avoids  warning  when  no  width  limit  is  specified  in a  conversion
   specification  of  'sscanf', or  when a large  struct/union is passed as
   parameter:
       (void)sscanf(charPtr1, "%s", charPtr2/*~SizeOK*/);

/*~TypeCombination <combList>*/

   indicates allowed combinations  between (a priori incompatible) parallel
   types. Syntax:
       <combList>::= <combElt> [ , <combElt> ]*
       <combElt> ::= <typeIdent> <operator> <typeIdent> -> <typeIdent>
   The possible operators are:  +, -, *, /, %, ~+ (non-commutative add) and
   ~* (non-commutative multiply).  For the / operator, if one operand is  a
   descendant  of  the other, the result type can be a native type (for use
   as a generic coefficient). Besides, some combinations  are automatically
   deduced:
   - for '+', from Ta + Tb -> Tc are deduced:
                   Tb + Ta -> Tc   (1)
                   Ta - Tb -> Tc   (2) (deduced only if Tc = Ta)
   - for '*', from Ta * Tb -> Tc are deduced:
                   Tb * Ta -> Tc   (3)
                   Tc / Ta -> Tb   (4)
                   Tc % Ta -> Tc   (5)
                   Tc / Tb -> Ta   (6)
                   Tc % Tb -> Tc   (7)
     Lines 5 and 7 are deduced only if Ta and Tb are of integer type.
   If necessary, type  hierarchy  is  searched  to find  an  applying  type
   combination.  D-pragma usable  only  outside  of any  block. Once given,
   cannot be desactivated:
       typedef float Volt, Amp, Watt, Ohm;
       typedef int Tgen;   /* 'generic' type */
       typedef Tgen Tspe;  /* specialization of Tgen */
       /*~TypeCombination Volt  * Amp  -> Watt,
                          Amp   * Ohm  -> Volt,
                          Watt  / Watt -> float,
                          Tspe ~+ Tgen -> Tspe */
       typedef int Fruit;
       typedef Fruit Apple, Pear;
       /*~TypeCombination Apple + Pear -> Fruit */
       {
         Volt v; Amp i; Watt p, p1; Ohm r; Tspe spe; Tgen gen;
         typedef Apple MacIntosh;
         MacIntosh macIntosh; Fruit fruit; Pear pear;

         p = r * i * i;    /* OK */
         p = v * (v / r);  /* OK */
         r *= p/p1;        /* OK */
         spe -= gen;       /* OK; illegal if no ~TypeCombination, because
                                contrary to dcc default hierarchy rules. */
         fruit = pear + macIntosh;  /* idem */
        }

/*~Undef <listIdent>*/ =head2 /*~UndefTag <listIdent>*/

   terminates  (for dcc) the scope of all indicated  identifiers ('general'
   or 'tag' name space); usable anywhere (outside of any block):
       /*~Undef TpermSto, headPermSto*/

/*~Utility*/

   to be used for  functions  returning a  representation  type that has no
   reason to be named. Incompatible with /*~Generic*/:
       int scanf(const char *, ...) /*~Utility*/;
   Can also be used for a function formal parameter, to specify that actual
   parameter cannot be of parallel type.

/*~VoidToOther*/

   autorizes  automatic  conversion from (non-generic) 'void *' type to any
   other pointer type, or to read, via scanf, into a 'void *' variable:
       objPtr = /*~VoidToOther*/ ptrOnVoid;
       scanf("%i", /*~VoidToOther*/ ptrOnVoid);

/*~Warn*/

   to be used in front of dcc-compliant code (default state at beginning of
   program,  except  if  '-znw'  option  used); usable  anywhere.  See also
   /*~PopWarn*/, /*~NoWarn*/ d-pragmas.

/*~zif <boolExp> <stringCst> */

   causes  emission on  stderr (at  dcc  execution  time) of <stringCst> if
   compile-time evaluable <boolExp> is true; can make use of  special 'zif'
   functions  (see "Compile-time checking tool"  paragraph  in the paper on
   dcc), and be used anywhere (also inside macros):
       /*~ zif (sizeof(typArray)/sizeof(typArray[0]) !=
                    __extent(TtypName)+1) "Array 'typArray': bad length" */

       typedef struct{int a, b, c;} AnyStruct;
       static AnyStruct x = {
         0  /*~zif !__member(a) "misplaced init for field 'a'" */,
         3  /*~zif !__member(b) "misplaced init for field 'b'" */,
         -2 /*~zif !__member(c) "misplaced init for field 'c'" */,
         /*~zif !__member() "Structure 'x' not fully initialized" */};

Notes

   - for dcc, a  d-pragma  is   made  up  of  tokens,  the inner ones being
     perfectly  macro-substitutable; for  instance,  the  /*~LocalAdr*/  d-
     pragma consists of the three following tokens:
        /*~         (special token)
        LocalAdr    (identifier)
        */          (special token)
   - an empty d-pragma name is legal; the d-pragma is then  ignored (except
     in the reach of a '#' preprocessing  operator, in which case it trans-
     lates into a space),
   - d-pragmas are visible in the list generated by the '+zlt' option,
   - numerous examples of use of d-pragmas can be found in dcc source files.


- 9 - Indentation rules

 Indentation  is  checked  only on lines  beginning a  declaration or a
 statement.

General case :
 Indentation level is increased on  entering  a  block  (just after its
 opening brace), for the duration of the block, or on entering  a  sub-
 statement  (statement  controlled  by  'if',  'else',  'do',  'while',
 'for'), for the duration of the substatement.

Special cases :
 - no change of indentation level for construct  "else if", both tokens
   being on same line;
 - block as substatement may be lined up with controlling statement;
 - 'case/default's may be lined up with corresponding 'switch'.


- 10 - Options

 Their  list can be  obtained  by  executing  a  dcc  command alone (no
 argument); the version/release number is also given. If the prefix '+'
 is replaced by '-', or vice versa, the option effect is reversed.

 A given option is valid for all files met subsequently in the  command
 line, unless reverted or cancelled (cf. option '+zrst'); options given
 after last file name apply only to last file (VMS).

 Available options :
  -zac  no missing 'const' qualifier check,
  -zbo  no 'bool' type check,
  -zcc  do not call compiler,
  -zcw  call compiler only if no warning/error,
  -zefi no check of inefficient constructs,
  -zfci do not check first character of identifiers,
  -zfrt no unnamed function return type check,
  -zgpr no check of "good programming practices",
  -zinc no '#include' position check,
  -zind no indentation check,
  -zlvlX call compiler only if there is no warning of level >= X,
  -znui no check of unused identifiers,
  -znup no check of unused function parameters,
  -znw  start in "no warning" mode,
  -zpe  no check of various possible errors,
  -zpo  no portability check,
  -zrd  no readability check,
  -zsam no stopping after each message,
  -ztr  no trailer,
  -zuc  no check of unnamed constants,
  -zwa  no warnings,
  -zwr  no forced newline at 80 characters,
  +zae  report all  errors/warnings (default is, after a few  messages,
        to report only first error of each statement or declaration),
  +zafn always display  current file  name  in  error/warning messages,
  +zctn check first character  of  (created)  type  names (if '-zfci'),
  +zdol allows '$' in identifiers,
  +zepl warn on empty formal parameter list,
  +zkwm keywords redefinable (via macro),
  +zlt/+zltX list last tokens  processed before error/warning  (X =
        buffer length),
  +zmcc check all pointers for missing 'const' qualifier,
  +zmic more index type checking,
  +zmsgX  X: maximum number of emitted messages (default is 20),
  +zpnt check that function parameters are of named type,
  +zrhw report only errors or else highest level warnings,
  +zrst reset all previous options,
  +zsy  print each block's symbol table,
  +ztabX  X: tab  spacing (for indentation purposes; 8 is default),
  +zudt warn on tags declared (but not defined) in header files,
  +zusg give 'usage',
  +zve  output more informative error/warning messages,
  +zvve idem '+zve', plus output type descriptions in full.

 Options not  beginning with `+z'/`-z'  are transmitted to compiler, but
 dcc interprets  `-I'/`-D'/`-U' cc options (or their VMS  counterparts),
 besides  passing them to the compiler. For VMS, only one  macro can  be
 defined by a  given /DEF; /DEF, /INCL, /UNDEF options have  to be named
 that way, and separated by spaces.

 The environment variable DCCDFLTS can  contain any part of the command
 line;  its  content  is  logically  added  (just  after  'dcc') to the
 beginning  of  all following  dcc  command  lines.  The  value  of the
 'PrefixDCCDFLTS' symbol (file 'dccFiles. mng') is also added.
 Examples of setting of DCCDFLTS:
 - UNIX         setenv DCCDFLTS '-zsam +zvve +zlt'
 - VMS          $ DCCDFLTS = "-zsam +zvve +zlt"


- 11 - Environment variables

 There are two of them: DCCFILES (see  paragraph  4), and DCCDFLTS (see
 paragraph 10).


- 12 - Exit statuses

 dcc provides six different exit statuses, whose values depend on local
 platform (see file 'configdc.th'):  EXIT_SUCCESS,  two  EXIT_WARNINGS,
 two  EXIT_ERRORS,  and  EXIT_FAILURE  (returned  when  dcc has to stop
 before end).


- 13 - Badly implemented features

 - floating  constants are  recognized  lexically, but ill converted if
   they have a  fractional  part or a non-nul exponent (only noticeable
   in  fancy  array  declaration,  e.g.  "char arr[(int)(2.5+6.5)]"  =>
   arr[4], not [9]),
 - not all cases of non-portability checked.

 Note: 'sizeof' does not take into account alignment holes, but this is
 done on purpose, to render portable some checks via d-pragma /*~zif*/.


- 14 - Unimplemented features

 - check for non-ambiguity of external identifiers,
 - size of objects not given ('+zsy' option),
 - computation of floating-point constant expressions.


- 15 - Known bugs

 None


- 16 - Main changes with respect to version 2.6

 - d-pragma /*~NotUsedAfter*/ removed (not useful anymore),
 - big improvement in management of adjustment files (cf. modifications to
   paragraph 5),
 - revision of all adjustment files,
 - cases of '16-bits int' platforms, and of platforms where NULL is not
   all-zeros, taken care of (but not tested).


- 17 - About 16 bits int platforms

 Portage completed (but not tested).