~DCC.BCKDCC.BCK,BACKUP/INTERCHANGE [...] [-]DCC.BCK/SAVE_SET NOYELLE_SI (v^V7.1 _INFSV4::   _INFSV4$DKB100: V6.2 ~ y*[DCC_DISTRIB]DCCALPHA.EXE;1+,<.g/( 4gf- 0123 KPWOh56JΖT7`{T89G(HJz h(Tm0@J:bDTDCV1.0A11-39$ $ z$ ~$ $J$( 8 DECC$SHR_0014  LIBRTL_0014& LIBOTS_001@>SYS$PUBLIC_VECTORS_00100"P @@ +>0 H0 0"@| 0"h0 `&0"0 xW00000"(  60H0 @< 0p0 H  0" @ @o U`60X 0 P00 0"0 p2 id(s)- \H20 0p P? ~ 25 09P504 6 0  5P`@p0@<O20"  0"P 0"  0"80 0"0 08000" 0# 0 ȕX4p0 H0 `60 H 0#  `&0 0 @0 0 0 `0 400Ё0(~ 0 ~  0"00 p0 P~0 0"0 0 00 0"y@< 8000"f  60"f0 0 (0 08t,0t 0#Hu0s000#i pPP\h 0#tP 0 ` 0x5@<OP3H23x3P0 u0 h 0"e  0 "pvP 0"0g0 @0#H@< 0#(@< 0   hW0 gP P?pN(P1150 R  @/0 XW@< :0 PP  0 |P @ `' Px4+>0 h0 260"zP 0hP5`0 Xp H825bool&0X E H'static'9X>8(20 "wP @/0 60 0"e  0~0"6@< 0"(4@| PX`4zU@P0"P @5^-`8X0"Cp 0x"X8 main[]84@p0@"xp< 0 @< 0@ pp `0#   `&0#(0 ?pNl0 P @ +>0 (@< 0 8@| 0 8 080"   60 `  `@0 ȸ `40p 0 0#@< @h0 ` 4o U8jU0X0 ( P0"0 0 0 0 p00" 0#0 0H" ~X600  00xWH200 ذ@| pzXS@K@@<O0/RHVp00 8? pH2HUXWp]p000000#h` `6H@P0# 0 x0 X 0 0 0 @< 0# 0  p0 x  @50 0 P 0@ p< 4(2x3include (define@0 0` qY@K8pragma5errorlineundef0X#H< @@/#if0"  elififL@hWifndef0`  ifdefendifPelse0#@  `&0h]0 a0 p3 0"\0"T` 00g 0#xZP ~h0 c0 0 0e0 0 XT0 0  P0"XK  060 XP@< p@0080 0v  0 0"i0#hj0 4Px40 v0   P520 nP pih 0"x0 f100"@< 0 `@< X310#L 0#bP 00"P^ 0#P` p50 ` 0 O0 ^0#z P8630@- ptrdiff_t-P0 pB `6h(0 0 40 `R0 0#e0 0 Q  0 ^P 0"J  0"K0 0Ё0 R0 50 P0 x30#@| 0 y0 00 0l P-0 h0 0 @< 0 0 0 X0#u@< EN0 A@< p0 ~@< 0g0 @f0 0(j@0 '0 0#`d@< '0 M0 62`0 (@< 8jUP`p08  'H(0x500 ? ?:((:?0/0 H@< 0 0 ||(0 (0 &&)00  P)| /00 @ )^/00 p )&/00  )P&00 X *00  p*.H200 `? *00 8 +...Hp u*hg Pu&x5size_tp00   P3~casty(sizeof,!@o U0 +  7()@<O[]->.ȕX40H08@/0 0x@< 0 rP return00g0^0 `0 0   0 `@< 0@0 a0 0   0 0 0 (0 0h00 00# P000 @ d 01234567890"0 00  const volatile )~NR~GN}=>|charRT00<p10 @| PP/... ~IT >signed {??]:*~PV0 @| , ; ~RP;:0"0 0"0 0#P 0"H0 `'0 0 ) P?0( 0"0"H0 0#P 0 0 0 L0 x 0 P0 0 P 0 p 0  0 0 0 ȕ 0 P0 0   0 `| ?0&00   @<O0   p0 0  0  0"P 0 @| 0 P 0  0 P 0  0x0"0 @ +>0#@< 0 0 0 `p300 x0 p0"0 0#` &@`6@0 H  p0040 0 Px4p4`400 0 x 0 0 pX34PH208 p| @/000#   @hW`60@#  @zU0 @< @h580 P0 0#0 0%H(00"  60 h0 8=XP0r-pP86if~hH0>@/=0( x casep3R$else0x5XTQ8$x3switch0 P forwhiledo0 ` 0 p 0 0@<  ?>20 + ?0 0 P`?x30   0 p P@\ 0 P0 0 H#@| @0 H0 INTERNAL PB: = H2ctrDescrIdEltctrTypeEltctrSemanEltctrTypCombEltctrTagListEltctrCondStkEltPp@ 0 0 0`ctrCaseEltctrNameStoBlknestLvlctrBlkStkEltctrMacroBlkctrMacStkEltctrDeclElt=ctrInclStkElt0#p0 &`'`60 X 0#"0 0r0@ 0 !0 0   0 `  0"@<  0#' 0#80p  0 $&0/undef=.cX=N` p/incl=p/def=@@' 08 p 0' (p@/PH82`0*0#@P< p0P0#X+@| 08 ` @0X0 0 X0 0"0 @< 0 ` @hWP 0nwnuipopeindmccmicrdvvewrdefine `samusgtr+boacdccdir:DCCDFLTScweplccP0 &Ё8H0 3p8?N 0 " ypYg-@pzU`@ctnfrtadjFiles.dccstarter.dccDCCFILESafnaeuctabsyundef `vewamsgincltpntnup08"P 0"0 `0#`)0 0X'0"@| 0#%P 0"  6 4c2`00  &6x6080 0 0"'` 00  ... ^ : " ***** 0@ 0"p 0 0 0VZ0#,  `&0@"E` X0Px4(20#?0 1H820?00=` 0 X=0 0@<X@0 D  hWqY0 ;  `60"X;  60 8p 2+>@ 00p`40?0 hG x3longp3&10@ P@ @0#>@| 4P3y(0 B` pp (P 'PrivateTozifP0"0/ @8L@/xPublic0H , V0؁@W`0 @| pntvbrfax60 0 40"pt` `)KJHx30 oP| 8@X'0K0   0 0 `60 8j @K0z`0 H@< &0K+-<>=!&|*/%^.+-<>=&|p "2|0"q@| XPP0   0x`&40 Hp h0 h@< ~hP0X~00 h[` 0`00"~ P0 pz 'S40 x@< 0 y0 0q0 i@< 0 h@< 0 f@< 0 (bP ,`S0 _P 0 ^@< 0 ]@< 0 (Z@< 0 X@< 0 V@< 0 0V0 0 PT@< 0 @S@< 0 8R@< 0 R0 (P@| 0 O  0 N@< (GNS/(TNS/(LNS//; nbUnivEltChunks: ; max bucket filling: ; nb buckets used: @D`h( ( ( p( ( ( ( ( ( D( ( ( P( __LINE____FILE____DATE____TIME____STDC__defined__member__extent__index __sametypecdefined@0  u+u-scanfprintffprintfsprintffscanfsscanf,,,,,,,,,,,,,,,,,,,,,,,,,,tppP ppp pXpppppppppppXppHH`pppppppppppppppppppppppppppppppppppppppppp ERror@0empty"left line right ###### sub ~RT ~GN ~UTpAiDtYeTsuTeC:lbLpA/none/static/static/extern/auto/regvoidboolbyteshortintlong__int64floatdoubleenum PtrArray[Fct(VFct(struct union WArning (lvl. bool/signed char/.../unsigned longcomponent of composite of (file already included ?) (e.g. ...*const...) Compilation unit "@1": total number of lines processed = @2 @1 error(s) and @2 warning(s) reported. of file " Last tokens: may occur (through assignment to non 'const' pointer)No error or warning reported. or just beforePress to go onran out of memory.. ***** WArning(s)/ERror(s) found in compilation unit "will occur@0 (through cast or non 'const' pointer field)@0Identifier "@1" already declared/defined line @4@5@6@7@8@9.Label already defined line @4@5@6@7@8.Type already qualified with same qualifier.Option "@1" already positioned.Tag "@1" already /*~Undef*/ined.Case value (@1) already used in same switch statement.Specification "@1" expects an array@0 (type of argument: "@2").Arrow '->' expected.A variadic function must have at least one parameter.'main' should have no attribute.Operator '@1': bad expression type@0 ("@2") for sink type "@3".Bad indentation from line @1 to previous line.Bad indentation from line @1 of file "@2" to previous line.Bad index type@0 ("@2")@0 for array/pointer "@1".Missing integral type; 'int' assumed.Bad type@0 ("@2")@0 for 'main' parameter "@1".Return type@0 "@3"@0 incompatible with function type@0 "@2".'main' return type must be 'int'.Value of '__dcc' symbol not string literal.Boolean expected by operator '@1'@0 (type = "@2").Adjustment file cannot change type/kind of identifiers.Cannot initialize typedef.'case' expected.Non portable (check upper/lower case in header file name).@3 at end of declaration started line @4@5@6@7.':' expected.',' expected.Attempt to compile a header file ("@1").Operator '##' must be followed by token; ';' token added.Constant expression expected.Constant switch driving expression.Member name "@1" already used in same struct/union.Struct/union "@1" already defined@0 on line @4@5@6@7@8.Declaration expected.Directive name expected.D-pragma name expected./*~@1*/ d-pragma only authorized in header file; ignored.'#else' already seen.A function cannot be defined inside another function.Empty struct/union.'*/' expected (end of d-pragma).Excess characters at end of line discarded.Error directive encountered.'extern' declarations should be in header files.Extraneous '}' ignored.A function cannot be initialized.Function declaration/definition illegal inside struct/union.Open failure (non-existant or inaccessible "@1" file).Field not allowed outside of struct/union.Format string exhausted.Qualifiers should be grouped together.Identifier expected.Identifier or ';' expected@2Ignored character(s) at end of option "@1".Invalid array size@0 (@1).Illegal attribute for identifier "@1".Invalid 'bool' type definition (should be 'unsigned int').Type@0 "@1"@0 can't be cast.Type@0 "@1"@0 is an illegal cast target.Illegal character: '@1' (perhaps non-printing).@0 Code: 0x@2.File "@1" should not be marked /*~ComposingHdr*/.Strange hierarchy of file inclusions.Invalid directive name.Ill used @1 d-pragma; ignored.Invalid escape sequence@0 (escape code: 0x@1).Unknown conversion character in specification "@1".Illegal '#include' argument.Illegal in '#if' expression./*~Init*/ d-pragma: nonsense use for variable "@1".Operator '@1': illegal left type@0 ("@2").Illegal octal digit@0 (code: 0x@1).Illegal operand for '@1'@0 ("@2").Specification "@1": invalid flag/length modifier.Specification "@1": bad 'precision' field.Operator '@1': illegal right type@0 ("@2").Specification "@1" invalid for type "@2".Illegal syntax.One of '+ - * / %' operators expected.Illegal type@0: "@1".Ill-parenthetized macro body or parameter ? (operator '@1').Declaration cannot be after statement./*~Undef{Tag}*/ d-pragma to be used only outside functions./*~NeverReturns*/ function "@1" does return ...Result type for '%' should be type of left operand.Macro "@1": incomplete parameter.Function "@1": incomplete or function return type@0 ("@2").Identifier "@1": incomplete/void or function type@0 ("@2").Index value (@1) greater or equal to bound (@2).; if normal, use /*~Init */ d-pragmaRead error (on file "@1").Integral or bool type expected.Unsigned integer expected.'{' expected.Length of character constant not equal to 1.To indicate header file, use 'h', not 'H'.'(' expected.Left parenthesis should be outside macro.Macro name expected.A member cannot be initialized.Labels should be placed in front of statements.Bizarre values for pointer operands ?More than one attribute.Missing 'break'? (if really meant, use /*~NoBreak*/ d-pragma).Operator '##' must be preceded by token; ignored.Missing '#endif'.Missing '==' ?Missing expression. (missing 'extern' or 'typedef' ?)Missing function name.Missing parenthesis after function name ~DCC.BCK< CC_DISTRIB]DCCALPHA.EXE;1g|>?Missing 'if' (or forgotten '}' ?).Missing member name.Function "@1" should be marked /*~NeverReturns*/.Missing variable/function/type name.Missing 'struct'/'union'/'enum' keyword ?'void' should be used to specify empty parameter list.Negative index value.No attribute allowed.No compilation unit name given.No preprocessor directive allowed inside d-pragma; ignored.Object name ("@1") not allowed in type definition.Operator not commutative.Meaningless cast.Non portable type combination@0 (could yield "unsigned @1").Macro "@1" may not be undefined.Label "@1"@0 (defined line @4@5@6@7@8)@0 not visible from here.No preceding '#if'.No qualifier allowed.No 'return' at end of function "@1".Body of which function ?Function '__index' used outside array initialization.Not ASCII character (may be invisible; code: 0x@1).No /*~TypeCombination*/ provided for "@1@2@3".Tag "@1" not defined.Local variable "@1" not initialized@2.Local variable "@1" not initialized (at line @4@5@6@7@8)@2.Not inside loop.Not inside loop or switch.Not inside switch.Not inside switch, or after 'default'.Operator '@1': @2operand do not have an address.Array actual parameter do not have an address.Value of expression not used.Function '__member' used outside struct/union initialization."@1" is not a type.Enum constant "@1" supposedly /*~NotUsed*/ ?!!Variable "@1" supposedly /*~NotUsed*/ ?!!Parameter "@1" supposedly /*~NotUsed*/ ?!!"@1" is not a (local) variable.Invisible character (code: 0x@1).Only attribute allowed is 'register'.Operator '@1': overflow@0 (for type "@2").Overflow.Operator '@1': left truncation@0 (for type "@2").Macro "@1": parameter name "@2" already used.Formal parameters must be named.Macro "@1": parameter name expected.Previous cast useless@0 (from "@2" to "@3").'}' expected.',' or '}' expected.Cannot take address of register or bit-field.'register' attribute incompatible with 'volatile' qualifier.Attempt to return pointer on 'auto' object.Missing ')'.',' or ')' expected.Missing ']'.';' expected.';' expected@2Switch statement should control a block.Unparenthetized boolean expression.Only '=' operator allowed.'sizeof' on char constant => sizeof('int') !'sizeof' operand is not evaluated.Header file should be included before this line.Statement expected.String constant expected.String "@1" too long.No new type may be defined here.Internal error:: @1.Tag "@1" not visible here.Too many brace levels.Too many initializers.Macro "@1": more than @2 parameters.Too many messages; terminated.Too many parameters for 'main'.Identifier too long (more than 31 characters).Type name expected; 'int' assumed.Type "@1" is not a parallel numeric type.Unclosed comment somewhere before ?Unclosed d-pragma ?Address not computable at link time.Missing tag or '{'.Function "@1" undeclared.Identifier "@1" undeclared.Operator '@1': unsized type ("@2").Undefined struct/union.Tag "@1" undefined (declared line @4@5@6@7@8).Operator '@1': underflow.Identifier "@1" not visible from here (marked /*~Undef*/ined).Unclosed character constant.Unfinished comment.Missing '@1'.Unclosed string constant.Unknown d-pragma.Unknown identifier ("@1").Unknown macro ("@1").Operator '@1': member "@3" is not part of struct/union@0 "@2".Unknown option: "@1".Unreachable statement.Operator '@1': unsigned value cannot be negative.Unsuitable field type@0 ("@1").Function "@1" not used@0 (declared/defined line @4@5@6@7@8).Identifier "@1" not used (declared/defined line @4@5@6@7@8).Label "@1" not used (defined line @4@5@6@7@8).Struct/union/enum tag "@1" not used (defined line @4@5@6@7@8).Type identifier "@1" not used (defined line @4@5@6@7@8).Previous value of variable "@1" not used@3. Use /*~TypeCombination*/ d-pragma ?Useless @1 d-pragma.Useless qualifier for function@0 (type: "@1").Useless /*~Init*/ d-pragma for variable "@1".Variable "@1" useless (defined line @4@5@6@7@8).Useless/incoherent type specifier.A 'void' specifier without modifier must be alone.Type "void" illegal (parameter "@1").Warnings already disabled.Warnings already enabled.'while' expected.Wrong number (bad sign/base/suffix combination).Wrong number (bad exponent).'zif' not false; message: "@1".unsigned byteunsigned shortunsigned intunsigned longunsigned __int64long double===>Press after each message to go on, e => more informative message (see option '+zlt'), # => no more stopping (see also option '-zsam'). Option '+zae' causes every error to show. ===>The command 'dcc' alone (without argument) lists all options. C programs checker, version 2.1h. Copyright 1995 Ecole Superieure d'Electrici- te, France. Usage: dcc {options} compilation_unit_name(s) options: -zac no missing 'const' qualifier check, -zbo no 'bool' type check, -zcc do not call compiler, -zctn do not check first letter of type name, -zcw call compiler only if no warning/error, -zfrt no unnamed function return type check, -zinc no '#include' position check, -zind no indentation check, -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 @3 characters, +zae report all errors (default is report merely first error of current statement/declaration), +zafn always display current file name in error/warning messages, +zepl warn on empty formal parameter list, +zlt/+zlt'x' list last tokens processed before error/warning ('x' = buffer length), +zmcc check all pointers for missing 'const' qualifier, +zmic more index type checking, +zmsg'x' 'x': maximum number of emitted messages, +zpnt check that function parameters are of named type, +zsy print each block's symbol table, +ztab'x' 'x': tab spacing (for indentation purposes; @2 is default), +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 @4 options are heeded).Argument collection gets out of calling macro body (called macro "@1", calling macro "@2", call on line @4@5@6@7@8).Array of incomplete/void or function elements@0 (element type: "@2").Function cannot return array nor function@0 (return type: "@1").Function "@2": elements of array "@1"@0 (defined line @4@5@6@7@8)@0 should be qualified 'const'@3."@2" not large enough for maximum number of characters readeable by specification "@1".To convert array to pointer, use construct &array[0][0]..@0. (expression type: "@2"; cast type: "@3").Assignment of 'auto' address to remanent variable (if really needed, use /*~LocalAdr*/ d-pragma).Backwards branch (if really justified, use /*~BackBranch*/ d-pragma).Bad number of actual parameters@0 (function "@1", declared/defined line @4@5@6@7@8)@0.Bad attribute@0 (can be 'static', 'extern', 'typedef', 'register', 'auto', or empty).Bad syntax, or text too long, for '/def'|'/undef' compiler option ("@1").Illegal @3 d-pragma for parameter "@1"@0 (declared line @4@5@6@7@8)@0 of function "@2".Indentation inconsistent with current block/substatement level@0: indentation pitch (@3) x current level (@2) != current indentation (@1 spaces from beginning of line).Bad index/addend type for array/pointer "@1"@0 (declared/defined line @4@5@6@7@8); expected type: "@2", index/addend type: "@3". If necessary, use /*~IndexType */ d-pragma in declaration/definition to specify index type.Header file "@2" should be included in compilation unit body@0 (because "@1" is provided by service "@2", and used services should be mentionned -at the beginning of- each compilation unit). If used by a header file, include it also in that header file. In case of composed header file, use /*~ComposingHdr*/ d-pragma.Second statement included in loop or 'if'/'else' arm? (if so, use a block, else put second statement on next line).Bound of array "@1" should be a named constant@0 (via '#define' or enum); name may also be used in array overflow checking.Bound of array "@1"@0 (declared line @4@5@6@7@8)@0 should be of named type, or use /*~IndexType*/ d-pragma in declaration@0 (index type: "@3"; bound type: "@2").Function with /*~ResultType*/ parameter(s) can't be @1; @1 ignored.Header file "@1" cannot be a /*~ComposingHdr*/ of itself (via file "@2").'const'/'volatile' mismatch in pointers for operator '@1'@0 (expected @4type "@2", expression @4type "@3").'const'/'volatile' mismatch in pointer/array parameters@0 (actual @1type "@3", formal @1type "@2").Left operand of which at least one member is 'const'@0 (@3struct/union "@1", declared/defined line @4@5@6@7@8); type = "@2".Operator '@1': @4operand converted to 'unsigned' (so possible sign lost)@0; left operand type: "@2", right operand type: "@3".Operator '@1': expression converted to 'unsigned' (so possible sign lost)@0; expression type: "@3", sink type: "@2".Concatenation buffer overflow (increment 'MaxConcatLvl' constant in file "configdc.th", and recompile dcc).Constant boolean @1expression; if really needed, use /*~NonConstExp*/ d-pragma (after a right parenthesis).Constant operand should be on right side, for easier understandability (operator '@1').dcc cannot process macro definitions while collecting arguments (collecting for macro "@1", called line @4@5@6@7@8).'default' clause expected at end of switch statement (or use /*~NoDefault*/ d-pragma).Attempt to substract two incompatible pointers@0 (left: "@2"; right: "@3").'.c' files should be compiled separately, not included..@0. (file "@1").Specification "@1" tries to write into 'const' variable@0 (variable type: "@2").The 'while' corresponding to a 'do' should not be lined up with it (to avoid confusion with a while loop). Use '{','}' ?Empty loop or 'if'/'else' arm; if really meant, replace ';' by empty block.External variable/function "@1" declared@0 line @4@5@6@7@8,@0 but not defined.Extraneous ';' at end of macro "@1" ?@0 (defined line @4@5@6@7@8).In header files, only attributes expected are 'extern' and 'typedef'.In function definition, function name ("@1") may not achieve function type via type identifier.Incorrect field size@0 (negative, zero, or larger than the width of an 'int').Equality generally ill-defined on floating quantities (operator '@1'); if guaranteed well defined here, use /*~ExactCmp*/ d-pragma.Hazardous conversion@0 (expression type: "@2"; cast type: "@3")@0; if really meant, use /*~OddCast*/ d-pragma.Hazardous conversion to less qualified type@0 (expression type: "@2"; cast type: "@3")@0; if really meant, use /*~OddCast*/ d-pragma.Only 'static' attribute (or none) legal for function definition ("@1").Type@0 "@1"@0 is an illegal cast target; use /*~CastTo*/ d-pragma.Illegal /*~CastTo*/ d-pragma@0 (types do not have same representation type)@0; ignored (use real cast)@0 (expression type: "@3"; target type: "@2").Illegal character: '$'; can be legalized in identifiers by using /*~DollarSign*/ d-pragma at beginning of compilation unit)./*~ComposingHdr*/ d-pragma illegal in 'body' file, or for including non header file; ignored.Operator '##' creates invalid token `@1`. @2 Replaced by a ';' token./*~DccCompliant*/ d-pragma should only be used in system header files.Identifier "@1" does not name variable or function or enum constant.Variable "@1": initialization not allowed (external declaration).'%' operator not defined on floating type@0 (left: "@2", right: "@3").Specification "@1": illegal type@0 ("@2")@0 for width/precision.Operator '@1': illegal operand types@0 (left: "@2"; right: "@3").File "@2" should be included after file "@3" (because redeclares variable/function "@1").Type of parameter #@1 incoherent with function return type; @4 d-pragma ignored@0 (parameter type: "@2"; return type: "@3").Specified result type@0 ("@1")@0 not coherent with C conversion rules@0 (operand types: "@2", "@3").Array "@1"@0 (declared line @4@5@6@7@8)@0: elements of incomplete/void or function type@0 ("@2").Pointer "@1"@0 (declared/defined line @4@5@6@7@8)@0: pointed elements of incomplete/void or function type@0 ("@2").Operator '@3': incomplete type@0 ("@2")@0 for struct/union "@1"@0 (declared line @4@5@6@7@8).Function "@1": attribute should be @2 (cf declaration line @4@5@6@7@8).Function "@1"@0 (declared/defined line @4@5@6@7@8)@0: incompatible actual/formal parameters@0 (type of actual parameter: "@2"; type of formal parameter: "@3").Operator '@1': incompatible operand types@0 (left: "@2"; right: "@3").@4Array "@1"@0 (declared/defined line @4@5@6@7@8)@0: index type@0 ("@2")@0 too small for bound value@0 (@3).Call to function "@1" passed as parameter to macro using it several times@0: inefficient at best, multiple side effects at worst.Non portable bit-field type (depending on platforms, plain 'int' is interpreted either as signed or unsigned)@0; type = "@1".Operators '#' and '##' only allowed inside macro definition; ignored.Macro "@1" already defined line @4@5@6@7@8@9; new definition ignored.Modifications @3 via formal parameter "@1"@0 (defined line @4@5@6@7@8)@0 of function "@2"@0; if normal, use /*~MayModify*/ d-pragma.External variable "@1" already declared (on line @4@5@6@7@8) with more stringent or incompatible type@0 (declaration type: "@2"; current type: "@3")@0; current declaration ignored., or missing 'const' qualifier in formal parameter to which address of "@1" is passedDeclaration of function "@1": missing attribute ('static' assumed).Specification "@1" should indicate a width limit, to prevent overflow of receiving array.Specification "@1" should indicate a width limit, to prevent overflow of receiving array (if overflow guaranteed not possible, use /*~SizeOK*/ d-pragma).Macro "@1": missing argument(s); replaced by empty one(s)@0 (macro defined line @4@5@6@7@8).Variable/function "@1": missing 'static' attribute ?@0 (or, if really external, should be declared as 'extern' in a "@2.h" header file, which is to be included).Name "@1" already in use (defined on line @4@5@6@7@8); redefined (if that is really what was wanted, use /*~Masking*/ d-pragma).There should be no variable/function definition in a header file@1.There is no "higher" type among the /*~ResultType*/ actual parameters of this function call@0 (previous resultType: "@2", current actual parameter type: "@3").First token of function (after opening brace) should be on new line, and not at beginning of it, to indicate chosen indentation count.Use of d-pragmas not coherent between function "@1" definition and declaration@0 (on line @4@5@6@7@8)@0; declaration wins.Non portable cast ?@0 (expression type: "@2"; cast type: "@3"); if really meant, use /*~PortableQM*/ d-pragma or, if in fact guaranteed always portable, /*~OddCast*/ d-pragma.Operator '@1': non portable assignment@0 (expression type: "@3"; sink type: "@2").Operator '@1': non portable right operand@0 ("@2")@0 for left operand@0 ("@3").Operator '@1': no order relation between pointers on 'void' or function@0 (left type: "@2"; right type: "@3").Arrays can't be cast to integral type@0 (expression type: "@2"; cast type: "@3").Function '__extent': identifier "@1" neither type naming an enum, nor enum tag.Operator '@1': bad expression type@0 ("@2"); expected type: "@3".Operator '#': operand must be a macro parameter; operator ignored.Operator '@2': (left) operand 'const'@0 (@3object "@1", declared/defined line @4@5@6@7@8).Not named struct/union initializer, or literal constants inside.Value of function "@1" not used (if its main effect is a side-effect, it can be marked /*~PseudoVoid*/).Function "@1": not same number of parameters in declaration@0 (line @4@5@6@7@8)@0 and definition.Variable/function "@1": definition type@0 ("@2")@0 does not match declaration type@0 ("@3") on line @4@5@6@7@8@0; definition type ignored.Numeric constants (except 0, 1, -1) should be named@0 (via '#define' or enum constant). See also /*~LiteralCst*/ d-pragma.Numeric constants inside macros should also be named (or else parenthetize them).Declaration of function "@1": only attribute allowed inside block is 'extern'.Operator '@1': @2operand value may lie outside range {0, 1}, so use logical operators '&&', '||', '!', or compare to False.Function "@1": name of formal parameter "@2" does not match corresponding name in function declaration@0 (on line @4@5@6@7@8).Non /*~Generic*/ nor /*~ResultType*/ parameter should not be of representation type@0 (parameter type: "@2").Type of formal parameter "@1"@0 ("@3")@0 inconsistent with function declaration@0 ("@2") on line @4@5@6@7@8@0; ignored.Cast potentially non portable@0 (expression type: "@2"; cast type: "@3")@0; if really meant, use /*~PortableQM*/ d-pragma.Operator '@1': overflow (underflow ?) if unsigned expression too large@0 (expression type: "@3"; sink type: "@2").Type "@2" is private: its constants/members are not visible from here@0 ("@3", defined line @4@5@6@7@8).Specification "@1" expects a pointer@0 (type of argument: "@2").Only pointer on function can be parameter (parameter "@1", type "@2").Function "@2": pointer "@1"@0 (defined line @4@5@6@7@8)@0 should point on 'const' element@3.Pointer should be cast to size_t (or unsigned long(long)); else use /*~OddCast*/ d-pragma@0 (pointer type: "@2"; cast type: "@3").Functions should return information type (e.g. "Position")@0, except if /*~ResultType*/, /*~Generic*/ or /*~Utility*/ d-pragma used (return type is representation type "@1")./*~ResultPtr*/ parameter should have highest type among all /*~ResultType*/ parameters@0 (current parameter type: "@2", @1 type: "@3").Enum constant "@1" has same value (@2) that a previous one ("@3"); if really meant, use /*~SameValue*/ d-pragma.Parameter name "@1" used more than once in this function definition.Statements should be separated from declarations by white line(s) (or use ";;").This declaration of function "@1" should, along with an 'extern' attribute, be in a header file included here.Argument should be array, not pointer on array@0 (array parameters are passed by address, not by value).Side effect via macro parameter used more than once (operator '@1').Initialization of compound automatic objects should be avoided@0 (it is slow and wastes memory). Object should be declared 'static'. If really not appropriate, use /*~DynInit*/ d-pragma.Static function "@1" declared@0 line @4@5@6@7@8,@0 but not defined.Tag names must be preceded by 'enum'/'struct'/'union' to be type names@0 ("@1").Label "@1" is target of at least a 'goto' that can't see it (on line @4@5@6@7@8)./*~TypeCombination*/ "@1@3@2" conflicts/is redundant with combination defined/deduced from line @4@5@6@7@8./*~TypeCombination*/ d-pragma can only be used outside function.Less parameters than required by specification(s) in format string.Call of macro "@1": too many arguments@0 (call on line @4@5@6@7@8).Operator '@1': incompatible operands; try permuting them@0 (left type: "@2"; right type: "@3").Function "@2": label "@1" undefined (used at least line @4@5@6@7@8).Operation '@3' attempted on pointer ("@1"@0, declared/defined line @4@5@6@7@8@0) to unsized type@0 ("@2").Operator '@1': illegal value (@2) for right operand@0 (type:"@3" => undefined result).Call of macro "@1" (on line @4@5@6@7@8): unfinished argument (for parameter #@2).Operator '@1': comparing expressions involving subtraction of 'unsigned' (difference never negative !); rather add to other operand or, if correct, use /*~CastTo */ d-pragma.Enum constant "@1" not used (defined on line @4@5@6@7@8), or missing /*~NotUsed*/ d-pragma ?Macro parameter "@1" not used@0 (defined line @4@5@6@7@8); if appropriate, use /*~NotUsed*/ d-pragma.Function "@2": (final) value of formal parameter "@1" not used, or missing /*~NotUsed*/ d-pragma?@0 (parameter defined line @4@5@6@7@8).(Final) value of variable "@1" not used@3 (variable defined line @4@5@6@7@8).Created type name @0("@1") @0should begin with uppercase letter (e.g. Voltage)./*~IndexType*/ d-pragma should be used in declaration of pointer "@1"@0 (on line @4@5@6@7@8); index/addend type: "@3", but "@2" expected by default.Meaningless attribute@0 (because no object is defined; this statement is only a struct/union/enum declaration).Useless cast@0 (expression type: "@2"; cast type: "@3"); if really needed, use /*~OddCast*/ d-pragma.Useless /*~CastTo*/ d-pragma@0 (expression type: "@3"; target type: "@2").Useless /*~NoDefault*/ d-pragma@0 (switch tests all (distinct) enum constants; if that is how it should be, use /*~FullEnum*/ d-pragma to check it stays so).Function "@1": declaration@0 (line @4@5@6@7@8)@0 variadic and definition not variadic, or vice-versa.External variable/function "@1"@0 (declared at least in header file "@6", line @4)@0 defined in wrong compilation unit@0; should be defined in a compilation unit such that only one of the included header files declares it.Switch type not 'enum', or not all enum constants of type used as 'case' values.External variable/function "@1" declared in wrong header file@0 (declared in file "@6" (line @4), which is neither the header file corresponding to the current compilation unit ("@2"), nor a (non-header) file included in that file.Bad use of /*~SameValue*/ d-pragma: enum constant "@1" (@2) does not have the value of any previous constant of the type.Wrong 'sizeof' argument?@0 (argument type: "@2"; should be: "@3").`,, 0123456789ABCDEFh00xx0dccsysincldir:ctrNotInitVarElt'/def=', '/undef=', '/incl='InitUndefWarnzif/*~*/ BackBranch ComposingHdr DollarSignDynInitExactCmpFullEnumGeneric LiteralCstLocalAdrMasking MayModify NeverReturnsNoBreak NonConstExpNotUsedOddCast PortableQM PseudoVoid ResultPtr ResultTypeRootType SameValue SideEffectOK SizeOfMemBlkSizeOKUtility VoidToOtherCastTo DccCompliant EndAdjFile EndSysFile IndexType NoDefaultNoWarnPopWarn PrivateToPublic SimAdjFile SimSysFileTypeCombinationUndefTag4P8p  (autoconstenumunionvoidfloatcharshortintlongbreakcasedoelseforgotoifwhile:,{([->.?})];~&^|&...!&&||*/*~*/staticexterntypedefregistervolatilestructdoubleunsignedsignedcontinuedefaultreturnsizeofswitch                                            +-=|=^=&=<<=>>=+=-=*=/=%===!=>>=<=<++--*/%<<>>  x x x x @ P@H Xhxxl@Q[discgfeouxpnGEX@[ [ @@sss[@[@[@CY`**@@TTT@`T  ' #% #%' p0x 2*1)0x@lx@l #$%&'()*+, -./0123456789:;<=>?@ABCDEF !aGHIJKLMNOPQRSTUVWXYZ[\]^_`"   nt'"\?vbrfax '"\?  [[[[ ]`x[ ]VI[0]/E@], P]`-9`]\lY\4Y\*yY\LZ]VZ]]]]]]]^^```p`aaaa aȈ(a0a8a@aHaPaXaP`X```h`p`x``````````````h9WQG 0(|@ P!`0JpI.5'!bvKyKa`j 0sc@N/P`ppiJsukN j =@nbM03 0 @P$` pqler1^p (08@HPX` 0@h (08@HPX`hpxZMX[[[p[P[0[[ZZZpZPZ0ZZYYY@PP@P`a`pa`aaaa`` `a0b`bpb(`0`bbbbc8`@`؈H`cPcccc(dHdpdd8dȒ0eX8eP`eeefHfpfffgИHș8gppgggg hPh`hphhx`Xȝh8i(i`ii`iiiX(j@jؠxjjjjk(@kxXkkkkh(lHl@plllll8 m`mmȤm`m(n@PnhnnnЦno0ohoooo pPppp`ppq@qhq8qqr8r`xrrhr s@s`sspssst0tHthtttt u@Xupuuuuu@v0vHvv@vvw(w@wp`wwXww`hxPxxxxxxy0y(hyyyжyzPzhzzzz{`0{xP{{{{|8|X|pH|||| }P}x}}x0xؾ}}}(~`h~~~~~~X~  Hh8Px8HȀ(HxЁ8Pp8Ђ H`ȃXpP `ЅH@Ph@xH00PP PP P@@@@@@ @@@@@@@@@@@@ @_PP@HPX`hpx@%p __dcc;  B P@~DCC.BCK< CC_DISTRIB]DCCALPHA.EXE;1gf||_XW@K0KP@0PG  F!F  k#~^^G ;G0G!GG5b#a@C("0BG]] #kG#~^^G;G0G!GG1b#a@C"0BG]] #kG#~^^G;G0G!GG1b#a@C"0BG]] #kG;!k#tG~^^~ G0,G,G([0HH0{G @PBD1,1HP`@Zk",."HJ #@G]]} 0#kG;!k#~^^GGx{#o_H"CGP@0 բ0BղG]] #kG#4G~^^~ GGGGQb#d@GGGb#@G]]} 0#kG#~^^~ GG{#@C`G 8"b#!!#ac_CG]]} 0#k# ~ F^@@^~ (0޴8@Gx;GGG!1(B D,GBtGp.H bpJP@`F`PZk 'G b# _C &  C G Gb#_C` G]]} (0ݤ8@P#kp#~^^~ (0޴8@H>P^X~`hp޵xGP;{G{#! ,@8b# 1@Р@H 0H@G4G:b#FR@G'C)v J; J`F`F" @ԢpG ɲ ײ47IPG[GIkG0F FxFQ@p@n8`F& j "&"4BBa6!J_ `Xb!J{0@G`8@GP&y"`G G<8`F@ɢ'#?' ֢9#6BBX&u" G,Õ6!J!JX&|"G7FG G"X&" GX`F@X_'{Z# Gû`B`X'z{# G`FX&t" G `F@X_&wR" GX'?'`Fv#xy!xF4GG.b# e@)C@V!H GGGC1b#GGGG!b@ B4GGDG vH.b# F F d@G&1b#C^"GGGG b@5 F D x@E0@DX$&c c" D#GCDxDG.b#4G@ d@&m"I&?&"@EXD)1"X_& ! PEAR"!0@1@ &A"REGG2b#GtGa@I"AIv@IBI D1 8 D  @E@A}@ x@E{@bGGTGxb#%s!r`  @ID bSHEQ I+ G_bIGF@F4&FpFxF-GGxb#4GTG^ @DG$*T?&1b#T&-D)1"'"1D4GGC_@"GC.b#4GXd@,C@-D GGGC1b#GGGGoa@JˡTGG MEt@ENAE˱ G>_GGEb@BIG4G@.b#.d@GCJb#G4G:@GP&1b#C3"GGGua@gǡnG`B4GG5b#J@p@Gb#G4G@Gb#k@Gpb#^@Cr G-I,I0@D%@p`СNG_F" GB4GbsjZkDG'1@G Gc.aI`͠0@P @GB4GbZjZkG'1@J_0!- BmG]]} (0ݤ8@H=P]X}`hpݥx#kG;{!0311 B3k;{!0311 B3k;[ !0211 B2k#~^^ ~(0GG{#_ bGD"84b#4G D`@Gb#@(G4GRb#XW@dG[@ZkGXb# D@G]] }(0@#kX;G3B1 10F@B3Ba.J0 B!5JJkG#~^^~ (0G{G{##c & R@Ӱb#H_ "CGpBG 4G 1xb jZkC"G=b#4G@`G%" 0 @ EE@$G]]} (0@#k;G5BGA! Q4PBB8J2XBRUBAB9PB?C?{ Sk;G1! 1k;1kG@;"!"BC@C1@ GG@G@G@ @ @@_@`GG @@_k;G1! 1k;1kG;! kG#4G~^^~ GGGVb#Gՙ@GGb#@G]]} 0#k? #!F~^A?@^!!H~ (G0GG@tG#. B,#J(bGHP @D{Zk $ GGG]]} (0#kG#~^^~ (0޴8@H>P^X~`G GhCG_ G@ G@@G Gb# _hAD Gb#_*GGJ 0`A_G@0E7GGGJv@JHF`F`F`撖AJ_0"(¦4G4GGb#;@ӈG 0 @ G0"&G@3BDSBD.GDJBPBG}Zk ,TG #fKA9HG&D <@]]} (0ݤ8@#k#4G~^^~ (0޴8@HG@;GP.G0[GPJG%P@B%2HG2B!B 2H!2@8{gZkCH"G>b#4G@ G'H 0 @ E'GBGA4BAGPB@Ű/G hHKPC?}Zk,GGHD<]]} (0ݤ8@HP#kG#G~^^~ G;Ga#0DdC{#_CrAH!.Q!J2F!> 0 @#0B G]]} 0#kG  F!F  k#tG~^^G [B({@1,G1HGP @zZk@G]G] #kG#~  @^CH^P~X`cGGGP[GG"YZk`BhbCc4GCyZkb "G4GEb#$@@DG Gd[@ZkdG4G D[@Zk0G0"0b# @؆DGc@]H]P}X`p#k#G~^^~ (0GGG'b#ll@Ӹb8b#P# $T@X"2H?&QF(G(! b#FF@C=8F b#@CX5q@7B&p" xDD&l"G4G$b# ]@G@"aD[@ZkDcHCF` GGG$C"b#6"GG]@G#b#GGTG]@G]]} (0@#k#G~^^~ (0G{G#e$!@@[@Zk @@ GTGh+b#4G\@eG[@Zk @@ "0@XD!?@F4 DGG]]} (0@#kG#~^^~ (0GGGTGD DG4GGeD@+b# G4G\@GeD`[@ZkGG]]G} (0@#k#~^^~޴>^ ~(08޵@HcGpGGd~{#_CPDxG p4GG&b#JFF&,"a\@X¤pb#!1@!@ `@Cp=_&'$DL 37J2FrFFpF8DpbAxDDDD 8 D@{" &C`_"b#t_x vJF FX F mGGb#Z)@G 4 @p= @T@v#J G2HEb#4GGJ@ӡU@p8DDvJxwEG4Gb#TG_Gb#C4G<_CG &@$b#I"TG.]@'0D'6G]"&TG@$b#$]@P h , H HH@@ &4GBbQ.1"QJ1'J'JhdZk- ID "b#;@ "GTG&@$b#\@GGh[@ZkG8DGG$b#GGTGE&I\@xpTG"II1DGF0FG$b#Д+FG5\@xpIEpH0DGD&V &b#V"D4G[@ӐAyGG%`[@Zk|è%G!g[@Zk|GGg[@ZkG4GTG8Db#_gGd[@Zkp GGxD&b#q0Jh0C`$F"\=4GF[@ӘBPb#d*@ CG hb#@ CG J! F g[@Zk CBGcGG"UWZkBbCc4GvZk4GX=GG0PAXGb#4GG@XG&gX D [@Zk GXG8 DGG$b#TG[@GGTGb#_gCơG[@Zk="4GG8D&b#Z@gG[@ZkPGXGG4G@Ab#0G`GG,@(h=\=AGCh4Gpb#tGMN@hG6$H A G&&b#"4GZ@Gb#GGTG_C\GG\ݡGG0b# c@C\GG\ݡ4GGb#S_C\G`ݡh=C . q@ GΡ n s@`GΡgG8FL[@ZkIíCG `@&Gg8,D [@Zk4GGGGDb#5G .aD Gp_GGb#_CGvI E E DGb#_G !X"b#CCTGX@ C GG$"b#@&3 "E4GGG]@GC $b#GGGG[@\ű\`\\=G\ agX F[@Zkʡʡű\\}EpA\(\= B\=RQ$G8b#`ݢ` ղ,(G,@`  `dݡpIEEkCDEH"GG)+&g8!D [@ZkGG*"&b#4GGY@b#@d["G4G&b#Y@G4Gdb#_ C`vI E xEGGTGd=TG@$b#Z@ӘPb#d%u@ C GGEd]xp= CI CI@ EGG%&b#G4GY@!|ݱ G0B4G}TG8EGj b#G_ӨdGm[@ZkpF"G4G xE&b#sHY@Ӹ¥4GGd!b#0@&_CG+db#4G_C|=( E EGp"Gb#! b@ d GdGG0b#@GGb#4G_Cd]G|=b#@Ө"Gi[@Zk!GcG"B2IE`UZkBCb4GctZkG4GXGb#@@ 8EE!_b#*_1H?$b!FEF 4G_ C5"G4GE&b#Y@4GG4G&b#IEX@`GTG&b#4GX@]8`E[ 0"'#(?'9#qpF0_#aJuFpFF6JpFFvFq7BB  !!!Hp DF;!HzFzG;D16`G&"G&&b#"TG4BB4GX@ G-b#k K_ } GG4G+TG@$b#Y@ӄ}À=a}GG=kQfGiaF`[@ZkGG$b#GTG.Y@8E ئEiGjTGG%b#GtGDX@ӄG4GG &b#sX@3_% GGJ! I /vI A,IvILAG4G` A,IGvILA4G=Xb#A@O@A|=GF A*F!FG} A,IvI"FȢFȲ !@b#PXG0D@Cb#-1A @CnN`@HGi[@Zk db"GG$b#TGX@GÐAb#J_x]GG @ExݡD&y"`G&b#4GW@CECG% k!`#b#?%%@)!@d&"GTGY@hb"4G@d]4G4G@q C Cp +EG/ &b#HH+DW@G&b#tG4GW@G4Gd4Gb#l_CGdb#4G_| DDGdCG0b#^@Cd]b#|=&@4GG4Gdb#_ C@|=jk iE GdGG0b#C@Gd GpF"G4G&b#IW@SGG4Gdb#)_ Cd]G|=b#@ʡD&GH"EʱId=@$b#TG;X@9Gp}CCGd&&b#cIbI/ bI- @E+ @E)"'`4G@RW@ƠG¥"Di[@ZkG7 bE c HF GG%C`$b#GGGX@G G DGD&@$b#e"AITG@ $[X@p]GGGGXb#@pݡCGIpbGGtG@GGcG]]}ݤ=] }(08ݥ@HP#kG#4G~G^^~ (0޴8G{G8H#d"$@ $D[GP FG@ZkG&&b#:"!@w @ 4GV@@Gd@&1@G[@ZkdD0@8#D!1#@GdDGG[D@Zk dxD GDdGG[@Zk F@#f@8@ #DpGD [@Zkà8&1@@ G"&b#4GV@dG[@Zkà&1@@G]G]} (0ݤ8@#k#~^^~ (GGGGGG{#7 @C_& @R"b`2Fs c`Fp`BcGGb#K@0"( !#PCG]]} (0#k#4G~^^~ (0GGGb#GG_CG`b#G4Gq_CvJF Fx F 0GGtGb#@Gb#G4G_CGpCDp@BGbG%xb#REse@ @"G(b# @C?$@?! GAD(@ G]G]} (0@#kG#~x^^~޴>^~޵cGG0G$$ 'D GhG[@Zkb#_GGb# @ CʰFb#@@"!?DDC DGGF_d GG`F/¤f[@Zk8DvHDXD D DG8 4G@-GbH"4G_GHPXDf8@[@ZkG0"P%b#4G}U@8iFG`b#GTG(_G8g<[@ZkGG8G@@G$G" Dq[@ZkG D Gh[@ZkGG@0b#4GxD& D$G?"4GGG!'@b?" +!1D KG G!b#4GDFOFX@G"b#CGTGV@! G!" G%GGb# @ C"4G  Q@8=vAJ` Fբ6+G G#b#AJD_'@&Z#A"ZFGTG3V@bXb# ؎E D@b#.@ GbXb# + (D 0$F @ӈ G C,$F@$F,GdhxaF`[@Zk@ݡ@DcGG2"P%b#4GT@@ݡw@DZ_8=_%J!< G(} G G F@_"Pb#_ GCxbX"XEˡxE!+ * G BGcG"PZk0BC8b4Gc4GKpZk GG4GGFb# B @ G"XDa[@Zkb#@E _GDG P%b#"4GoT@GE?&0J 1" Hb#1DF C_ C?& 1"_&FB L&"G @&"4BBGG,(#b#U@($ X!F ,  GP%b#"4G8T@G8b#@( "G,TG#b#`U@$$?& 1" F D2QJBwBBw`\\BCkGTGM GGb#JT@DG "GG4Gb#! @RPbDK` @?&F K l&VcJbJ;vF? lBG'#?'7B9#B3$1 lVcK.` D 4GG ,G"#H F  ̢_&4GF LGG;@tG ;wJ&vKwGp G GF 5GG4G#b#mT@G4Gh$b#5T@bGc[@ZkD2QJBwBBhbGtGc` ,v"Hp D @ O@&G"H#b#G@GT@ I4GbGc[@Zk(GGP%b#4G|S@% `@&"G4GP%b#oS@˱GGb#2 @ C(]G M GlXE[@Zk@ݡ@DG(1!G0"P%b#4GEPS@@ݡ G@DDD@}`@DD=0=8<]@}GD0GQq cx]]}ݤ=]}ݥ#kG#~^ ^(~08@޴HPX>`GGGGG{#@¤Gb#xDh@GX &(s" GJ("J G F0F0J1"JSFFQF '?'9#_' Z#JF 8CC h$ &`G@ G #b#"H @ GGb#@ GG4Gp%b#VHR@G"XDa[@Zkb"4G_G=GGb#I @CGb#l@ӽGG] ](}08@ݤHPX=`p#kG #G~X^`^h~px޴>^~޵GGG0+b#$@$a@@ D GDb#0!&@%@ ;@CD@=4GGDG'b#DGeR@D@tGGTG9ŠG&b#D S@@ݠ HDxD G 0XDBFtFtGGD&%b#"GGTG@S@ӘGG'b#4G5R@@GtG'b#4G H= ,R@D&]_@&GCP} `JG0b#@2SBTB@H]@H=TG@=G+ Pb#1Gg_ C%_& R"&s"0 G12B3B  F4_̢FF xFP#G&'b#C"GtG/R@D-GGtG0"'b#1D G#R@4GE$GG_"b#=@GG4Gb#7@&  G "X#b#D4GGGX@G8#b#CG4G#X@Gx'b#CGGGG R@4GD zyG.tGBb Q.QJP@B nZkGCTG0$b#O@GD&'b#C"GtGQ@b#.F&@_"@#/4G.b#G@&G ?"n "X#b#D4GGGW@G C8#b#4GW@G'b#CGGGGGQ@no. / .v"Hv"Jp@Fp`FSF @"H"J0F0FF"H"J0 D0 F1D G&'b#"GGtGQ@ o .?$@_&aE !E  E . 2E &F 1E . otD4EsD nΡE0D ͢ G "'b#GGtGmQ@4GD}+VHHV!I0E0EE I0D 0 E$EG&'b#"GGtGUQ@ˡ EEE˱mbDE`DkxD Gb#4@Gb#D @9D=4GHb# @Gb#G4G_ C")T EG@ݡ4GGTGH= n&b#bH`DW`@`TGR@GHTG.b#_ CpbDHDxDbk@b# `EDc`H @¥"xD4Gn4G)DlG7 'b#P@P}GG4G'b#`J DE@P@(DG!G%b#G@tG E$R@(Gb#C0,@G'GGtG%b#Q@S"G4G'b#{P@Gb#G_D To"O4GG'b#@lP@ӫC `$?%G$A@O4G0b#@GTG/b##_C G/4"&b#TGQ@. pVIpBւI?$DD `&`cGp@`ÑI F@ F@FqF`Ϣ GGb#GH_@b# @ G4GHGD/b#VY@GGX]`]h}pxݤ=]}ݥ#k#G~^^~ (0޴8@HG(GGGx8Dp[@ZkGb#@Ӏ#à &1" vJ CG4G)b#4GBJr[FO@ "4G8DeG)b#="O@ "4GG@@)b# CGBJ@F@F@O@?$G! )b#&!@"0@ 4G4GO@?$! @@CG4G(b#@ #&0D #Gxh[@Zk("G0b#eC Cu`BiBBJF@Fs@B4GG&@ c$GhbHD`D`@`Ơ @ [@ZkGGL&)b#@"4GdO@G]]} (0ݤ8@HP#k#~^^~ (0޴8@H>P^X~`hp޵xGGGGGGxDG?%G FG8@G Ġb_B`j[@Zk#$ bG4GGGG_'Gj0@X D [@Zk8D$ C2B @ #İdO" #4GGP*b#aB N@İ|%k!B$+ A m`Aj_[GG@Zk#Gpb#! @cc cjG C'G bG+x DCC8`D2F4Gy_` vHD*!* !"J A@  JpmGXF[@Zkg$E8aD `GO"P*b#4GN@bG4GKb#g@9@(j@&"4GGA EDP*b#N@GD&P*b#M"4GN@BGj[@Zk bGGGGG(_Gb8Dk[@Zk6GG (A)!P*b#*"E4GnN@0b#0 @*G@GGG0#b#GmGG< @$`CGFE g aE`# A G '1@O"@GP*b#4GAN@G]]} (0ݤ8@H=P]X}`hpݥx#kG#~^^~ (0GG 0G"J GG*b#4GN@G"b#E@GG?"4G4GG@Ӹ $$@#  GG*b#4GN@D ?&  B vH0JDD R(@0F "CŢ@&s"s"F F &"HpD8DGG`'b#TGO@GGDhb#t@4GDcG]]} (0@#k#TG~^^~ (0޴8@H>P^X~`GG0G PG xGGBJ# G b#Do_CG#b#GTG_"C_&R"!&s"xD5 q%12B3B DĢGGvJb#@F8@bD vJFXFD D @eRrF@GGh(b#4GoM@M$pb#v H DX D _ @pb# @ 4G 4GG@$b#@ #Q@G C@$b#4GQ@XBCGjZk@xDba GkFxG%b#YvJF8FU$ +GR`Q4GqO@G4G%b#kO@HGD&D"gG&b#GuN@Ә GGgGpb#F @"bGTGpb#s@?$! G4D#b#4G GBS@GC#b#G4G`S@GC(b#GGGGHM@G_"pb#F S@!pb#@#G䠫@DxDDTG4 DGGb#@d"v`I! `E 8`E`$Gpb#|@bkdDI@G_"hb#_#GH&h(b#"4GEe hE`L@ _%J!GD CpDb#@@CG 4G1 GdNð "xb"k1" `),0H!'H'HA1@! GI.i"hB4GpbSJ2GJGJUZkD&G~"&b#GTG,!HDM@ Gd @Gb#@GeC%"g" E'e4D6DBE GgG' Dz bBkJ/`0 #8D @vJ'hxjE lE_GG4G'b#6HL@G @E G'GG4G'b#v!J L@G! KEG"Ga[@Zk@_"D$2F$G& "TGg 4GG`%b#5M@gCB@%&"?&!0@1"1@: !GG4Gb#@C ¤gD_&GD&&9R""&b#TG+D b +2FG M@4GkTG&aEt DG8D "ëw@`GG&b#GTGL@? (?"DDDmkxDGh@b#QGC#TG_CĠvHD @E 8@E@GG4Gb#Q@{GHb#@G_"F$pb#@!GTGpb#@&G _!#b# " D4GGGQ@GC4G#b#Q@GC(b#GGGGK@EOpb#!@tGG GGb#4GDe@ǰtG bU@@&k*D D @GG&b#GTGL@d hEdDDDxD"_"DF1F XD bs`FGGâb#"IJ9 $$$_GGb#_pb#@G àCpb#VHo@ B J6AI@EİD$"0D$D& #"GTG&b#"J Fx F G1L@+$ %"&Ak!@ aGU @[4G@ZkD@ ?&HDD xDG QE@?&xD1"4FGGb#Q @G]]} (0ݤ8@H=P]X}`p#k#~^^G;G0G!GG,b#H@C"G0B G]] #kG#~^^G;G0G!GG 'b#jH@C "G0B G]] #kG#~^^G;G0G!GG.b#JH@C("0BG]] #kG#~^^~ GGG{#_"CB<"#p F F ¢7Fp`D@"qD x@ `G]]} 0#k#~^^~ (GGGG{#_ "CpDA a!q@F`F ` G]]} (0#kG#TG~^^~ (0޴8@G@;GGGBb#Gu@#("GG4Gb#! @ G? X&b#GŠ4G%&P@GC8&b#GŰ4GCP@G@&*b#C$"GGGGI@G]]} (0ݤ8@P#k#4G~^^~ GGGG%b#K@@b0.sT0JF D&" G4G%b#K@ "D&"AGG(b#tGI@G]]} 0#k#~^^~ (0޴8@H>P^X~`hp޵xGGGGG G `GD"#vJv@JD0 D0`F3D 4E@`BF @!q@W @ FGGb#@1$ D#D:F (ò@@泵@`&4TA'BG8@FG@GGb#@ӵ@@F"DF0@ B  GGb#@&UEp@7@C@*EY Y@?&1"&1ESETF@dDDbG<`;QE D3EF5`D @D *E" F@FF`  E @E#&"_'35AZ#zB`!UA:@ &"4TABG,_``# UE@'{#;;AzC@G_D*E_&R"&2EUEUF@dp`G`GGb#@"8!IנB5@8\BCkG#D0D* d (Gd_"tGbF'`$ b@ G0"tGB`$ b@ GC`@J ?&1" QE@4@ @4B` 4BFXD98pFpGGGb#n@9@w C G_`G*q@`媗@A_ & 5E f@ ٢FF碨G8q@kp`GG GG@¦6g@pF(⦈DD E`  E DDF<@G"C@Cc A p`FaDâpD q`F# " @EAG G ! G@A@d$ $(ap`GF,p@Fq`G0!$!"rF(a G48 GG GHBC D4DXD`0@7CK&s"?$@3B! aB D$D"F $_" btG@@ 4GWG0B B@$ btG @ GC@@ 4GG.q@ à dwA #V!J@dVaJ`"F F$VJV!H0F0FFJ H0F0 DF `G G&F@@btG_}  KwAvJvBJpFp@FFsr`Ơk& TEl@` 4Ei GĢFgGGb#@ GG_#ġp GpE.GGGG@b#@G_`G_'D dD iEG _GT@CBGG?G=G;G9G7G5G3G1G/G-G+G)'GG b#@GGb#@Gcp`DpDdD`k9 p`Ep GyA `G GG GGGG4GG]]} (0ݤ8@H=P]X}`hpݥx#kG;4G  ! A P$@F@[0p DF2q;`F! ApFPFkGP&GSF@k0p D1Dk$;F1 FG?D!;F kG#F~^^~ (0޴8@HGG4GG`bFX4G c Šðb#(_GŰGG]]} (0ݤ8@HP#kGGGGG5_5GG_ӠBGk#4G~^^~ (GG)0G(F% _ {!G_#&G0D GGHb# @ #L?&G1"P)b#_&!1@R"2@ d&G0pBBGTGH@G]]} (0#k#4G~ ^(^0~8@GG>^GG%`G+b#pFFGPF@#?&p DGD D]6CJ@GGb#_}C_""6cHG  2F3B u }'=CJ8Gb#e_}C =b#d$Gu_}G dG ](]0}8@P#k#G~TG ^(^0~8@G~DCC.BCK< CC_DISTRIB]DCCALPHA.EXE;1g|G" ~ GCx b#C 0BD@,H0@.J0@]#@GDb#2V_J#&rDs@C}4GTG_CG ](]0}8@P#k#~ > @^H^P~X`hcG{G#[GGG"AZkBCb4GcraZk"?&b#! FC&_CG#b#G%TG F@Gb#,@ԢF FԲG`4GG Fb#C.@GGc@]GH]P}X`hp#kG#G~^^~ (0G;GG! $ÈGGTGb#'_GC$b#GTG6_CH"v HC DG8 D 1 GXBPbR@S` @G]]} (0@#kG#4G~^^~ (0޴8@HGGGb#GGGv_C &v J F%F@8 F DG!35@CFG`&4G(D3 @$DG GTGb#|_ӨCGGG&(b#"ԣDGGGGG,E@GG]]} (0ݤ8@HP#kG#G~TG^^~ (0޴8@G@;0[GG8{GyHZk BC(b!@0 @4GNZkCH"G 2b#4Gk@DG="@/ @-@d.$#.F#D"dJVJwfJ"F>"/ Df/K&#`K[zK`Gf?$. Df.2Ju4JStJuFf>.D/J0@zJXK@G?0 CD @$..$JUJw&J0@F>D0@GD&D."'b#GVJ>GGGE@PBXbG4G NZkG]]} (0ݤ8@P#kG;[!0211 B2k#~^^~ GG Gb#@Gb#_CG]]} 0#kG;[!0211 B2k#~^^GG b4G @CG]] #kG#~^^~ (GGGDG'DH(bGDF4GJy B B B @ _ 4G(b_X F b#_ " #Q`G21@BQG]]} (0#kG#~^^~ GG0G`{#v J F 1 Bw@ 8 FX FPHFP_Gx Fb# F @@RF _`b#|_G]]} 0#kG#G?"~^^~ (G{G# GFG&.b#"4GC@b#DU_G bGCc[@ZkG]]G} (0#kG;kG0 !Q @ @ 0 D!D 4GkGGk#~^^~ GG0G(D& D$ G#!F 0 0(F Gb#_#C_"4G2F#&&4BBFGFGG]]} 0#kG#_&~&^R"^s"~ (0޴8@H>PGGpG`0BBGY_`GT_ à4GC FGGb#vBKp@G8@G%@&4GD! s_GG)b#4GE@ G C4GJ8Eb#G+F n@G&*b#C"GGGGD@ $ E D _&R"G4GJ+b# tG %2F iC@ &$ E Ơ0@¤ GGFXJF JF KF LF9`G>_(' 4GKBBF @â"Fò G4GG 8Eb#4Gm@G&)b#CD"TGBD@ XD #"D#G4G+b##C@(Gg[@ZkGCb#H0D_¤8"GTGƠ)  _G&)b#-"GD@G]]} (0ݤ8@H=P`#k#~^^~ (G{G8# vJFXF3#4GG4G0b#.q"uSJTJF>_C# vJFxFA@ rFAPGA Ԣ8G? 4BAPGAGGtG#TG-b#XC@HbdG]]} (0#k#G~4G^^~ (G`{GXG#c /b#4 @ B@ D #c!!Hd$G]]} (0#k# "~4G^^~ G(; {GG!p0b#!5 @ A@ D 0"#G]]} 0#k#4G~^^~ G;G [{#!2B`aA_G"C`b#a_G]]} 0#kG#~^G;{#!?@0_G] #kGQprF6H D1 D3 @k4Gk&s"F`F@2 GkG4Gk#G~^^~ (GGGGGG(#$ &  @s"@p$c`F tGG.b#cGvaJ`B@0?$8D"p@"D CSFCG]]} (0#k#G~^^Gp;GG b#!!D c@4@C"@GDq [@ZkG4GpLb#@}@G]] #kG#G~4G^G^GG #k0$ &  Bs"@G]G #k&"14B3B G]TG #kG4G&G0G2 D_$ C@ 0 G@G _4CG]B4GaF #kG]G #kG]G #k#tG~^^G [B({@1,G1HGP @ ]Zk@G]G] #kG0#~@> `^h^p~x޴>^~cG@{Gc Š'H[GGG"|ZkBCb4Gc0\Zk"G4G:b#"@ }@"G4G"!B)!GG  b#a@@b#?@ bGk[@Zk GGTGpb#5 @U@@0D DG@@ c "F "+ 旁@"@&1s"D`&♔"D"Tb#@ӒGb#@ӎ8 CIJ@Hb#E @< GTGb#4G$@@kG[@Zk<)b#z `@xM@Hb#2 @< TGG4Gb#@@ GGb#4G @@k4G G[@Zk4G 0K@Hb# @< GTGb#4G?@@b# @#< #O N@IbQF@)?BDDð"CHb#@ӈb#@C#@ Ic @ `<<  Dâb# @@*@b# R @ Gk?$! !A[G@Zk 8E  @C)D GGGGb#4G G?@kG[@Zk* -E# 4GG "6b#4G D%^g@ G(=0 C8=* * k[@ZkGGTGpb#GTG"@@* -E?GtG8/b# !,PL`@cBbC" 8`D*`k!`AX T,"T B1bR0F 0DsXբtB,lB B,1A`ŰGc`]h]p}xݤ=]}#k#&~"^^~ (0޴8@H>P^XG{G# r0D$e  D&)W"0D$  D &M"0D Gb#GGTG?@ӸL@b#!@Ӏb# @z0H@b#@(G& ["G b#= @ӰB4GbTG CZk¤Gf[@ZkfG D[@Zk4GG#GGb#G8)D GTGy?@ &" b# 1 @Ӱ4GBTGbBZk #G&C"G8b#GG>@Gb#GC_b#@GC#TGxb#_GC?$/b# 'GWb@DkfG4G[@Zk("PXDWG#"GG8)D @b#@Ӡ@G xb#G4GWA@CQ"G@b#@GGTGb#2_GC#TGb#B_ CG @`b#4GkA@C"G@b#@ G)0@* f[@ZkGfX D[@Zk"G #fX,F [@Zk*"0D*#GfX F [@ZkC0"GG XAE@@b#@GGG0>b#v@(&BG"G(J! IPB D@D HDD RGgGfG[@ZkC ME@GGGG D0b# @( D: GGb#4G>@S4G ,0@$,$HX-D *0!BGD.vJ4GDJ8NF@.UJF>8G.$#@b#J/K @.GqHPJD"F>Dd.4GSrJd> G ¦D GfG(V[@Zkb#8 D ) @ #G ACapFaGG"b#4G=@@b# @fG[@ZkG4G DGb#G=@@b# @`¤4GG4Gb#GƠ=@@b# @ G#@b# @ E*1@A E4T@b#@ӐGd[@ZkàGGGb#TG8D>@ p(H C )C(  @ G#b#jJ AA_EA?b#@#GG&#m"GTG8b#>@dG[@ZkP@b#b@GtGb#4GC=@Ӏb#! @0M@b#X@Ӑ"G BiJ![ @ZkàDDED<(DTG G4G GD?DG_F2D$h[@ZkDDDKD"X!D 1 Hb#H @hG[@ZkDDD6GGC8b#i"TG>@GG0>b#bu@*G8D,HP@, b#%1@PH0@J @¤Gb#Ơ4G @Gb# @ GGtGb#4GG<@B4G bMFZk _EGb# @iG4G[@ZkciGiD`[@Zk< bG< _Ø Cb#@Ӑ¤04GGf[@Zk#GGb#4G (E <@JGGP:b#4G!s@GGb#4GE<@ C( "@ %1@'@AfG[@ZkcGGb#iD&`_Gb#C4G\_`BGhb4G;FZk C@XG4G#b#'c@PEGGGb#G 0@A_(-fHI(I &E(=GGb#_G]]} (0ݤ8@H=P]X`#kP#~0^8^@~HPX޴`hp>x^~޵G{@G{#%'1@ >G@өD@ D ]"!( "D RSF@!D  b#=@Ӕ(P D  =4G 0C QAJ _F 0`F] 5¥b# ݠ8ΰ0¤ F $]( @D @GkG¤G BH"fJ1[D$@ZkXB`bP?A4GEZk CP"Gx(b#4Gb@@?A AN@b#@("A 4GfGG[ȱ ı@Zk XDE GDD(b#h R"AG.2rB"wUJVJ4GF> @ GGG D(b# @E] @D XD?D;XD7 D1@8 Dm` D8 D  D>4 1@Gc.G$"4G] !3F !8b#a @=+E]' % "@ b#?@@ӷ@GFGQ'1@G0@% D D %b#G9 @8b#2 @ PDı DGb# @(P G G?fG[@ZkGGG(b# @EmfG[@ZkEi?P"Gb#Y@ݠ4GGpb#&Ap@ CJEWH05@=@Cf"b#I@ =Gb#,@GGG(b# Ev @#ݠ X E&A p@CDW@I 8@E@ =Gb#G@GDGGH A(b# ,'GA*!aH@ HED x^~G {G#  0 @#P.0B$PJ Bq.qJ0 B$eŠ5@B\BCkb#@G4G @%z jTGtcĢ6QBIJ#.J6B֢0BIJX$bG ${@ G `b#4G<@&C$"`b#@4Gb#@b#@ӈb#$@$'   $B @ P G G@ b#@%7峻"b#0@T D9;@"&G @4WJSFFF ĢuB֢XC8KB֢IJ"eBY9#@`4Gy.0.JQ 0JF$G8@wCâ8Bz*Z6Bò @GX7b#G4Gnd@GC@>b#4Gkv@ D"4GG ;b#0B"a@= (=%%CeGB㰶`PGDGLPb#G_Gb#Go_Ġ% CƠA?@b!!H(@!$Gb# @ӈb#@b#@C.J6@6JD=B  D0W@æ5@$,9#H @8"ȰGa[@Zk¤GG8?b#u@G4G @7@=b# }o@GG4Gh=b#xp@Gb#TG4G_GGb#4G _0\@(b#@ C4G4Gb#R@ GGGb#4GAİ&!-` IMI E= +!1 @$_GG@b#V_ G8b#@GG@b#N_GGG`b#_G ˠGG,-&@mHI,Ib# -E,=!@ Kˠ*1@A K  E k G,- hI@ HahIMID E<= $$q.0 BDqJ%.)BJ0@BDq?4G4F峆x"0"8¤'1@CB&AG[@ZkG4GĠG AM` E? 8 ElX?b#ŰGF-!FI @ P A$ur@ DKA+aI Ak`G GF-tGB,FIbHP@ADTZkkGl C3G b#B J@_ 8E7'GGŰ#+% b#'@ӈG-tHJGI TEG=#èA "b#./9JX KBF _Š8DeD&#e"GTG`k 8 E%b#aI` +9@Hb# @8BGJ'1@㰪_AG8?b# DHEt@G0]8]@}HPXݤ`hp=x]}#k#~^^~ (0޴8G{G4G#c W Vb#@Rb#@GCAb#GGr@PD DGb#@9 @7 C D`b#@Gb#@@b#@#P G G?#@b#P D D @Gb#@CD T@F@t`FӢGF0b#@ ƠHDD x"hb#98 G 9 "_àG]]} (0ݤ8@#k#C~^G;!1 !. 4G5 qaJ`G] #kѢ8F Q/KXBP@B*@CP@.JF"@C5 G{#F"@ F@ӹ @G]G #kGG]G #k#G~4G^^~ (0G{GGb##c  G7@b#H@0"C _`@ G 0b#0 B N@Gd@G]]} (0@#kG#G~tG^^GG0,`{([0H0{P @7SZkGG(b#GTGp7@G]] #k#G~^GG{#@ DG]G #kGh9Gy#!@G]4G #kG#~^^~ (0޴8@H>PG {GۤC< %@ C_&pb#Dd_@@?G_G]]} (0ݤ8@H=P`#kGD D@"1?`BR_@Ge[@ZkeG@C [@Zk$ D0# D dG c DGb#G5 @aD _G8 DGb#G4GA6@ dG[@Zk eG[@ZkG ƠeXD[@Zk4GGG0"b#4G%6@4GG#C~G^^~ (GHGGtG$ P{# @ d `@&G#,CGPb##HP @@,@" H$T@ @0.`".$! #0JTJ!u3JF> ! .!@w0Hz8HVJF> /Y8K:G ?G]]} (0#kG;!k;Ck#$~G^GG qQFG1H {#G!J6@G] #kG#G~G^GG [h;GrA!s{#}6@G] #k#~@^H^P~X`hGGGGGG{#@GCTGb#3@GCxb#GGtG17@Gxb#G_p`B4GhbTGyZkG@]H]P}X`hp#kGp#4G~GX^`^h~pxG`G ({$ #>(4`D%[e ^0>% E8~@H>P^@ZkGH@0b#G4G4G4GG@=C= ](08ݦ@HP=d$$CD DŶ %GX]`]h}px#kG#~^^~ (G({G {## !6#HF 8D @4GBb~ZkG(G  J0@FC u GG( J0Fu  7J0F J_'زZ# ":G ` [TF [Gd 0¦ @֢!v H86@ 8G]]} (0#kG; 0BT@FA 1;V#J[0 F! J0FBk#~^^~ G;P;GG!1B1D tG , "rJA1H2D <Gb#@# GG4GPb#_G]]} 0#kG# ~0C^!AJ^p"~ (0޴8GG.JTJ> B#@D`@ Fu(FB",H.JB .J.Jx" B4G(b}ZkG !1 @ pKp, cF`s@".J .GJ `s@X#8/:K x/GxK`àD&?F @1".J B(bG4G}ZkDG`!1`@ GxBR"22Ge@x@G 91ACâF?Gy@FFca@Gd Cd "ð4G]]} (0ݤ8@#kG;``kG#G~^^~ (G;G! Gy4GAy# c @! @7 @ BB@BbGy#B@! @7 @?5 @G]]} (0#kG#TG~^^~ (0G(;G Ga`$xb#_CG "`!!v H D @G]C]} (0@#kp;;!Qq8)DFG :`  1tF3 !D1 J.GTF+Gkx; !.J5UB5J}B!."!JX-F .J!4@!0!@ `  G.J0U B0J}BSFx4GxFk24D 23FqtG`QSFGk4Gk0,G0HX-D x-D P@@.`.@JS `JSFC , HX-D ,"0H @0@k ( "   , H@@0@F0!F@,Gq"HX DQ.SJ22BR0ABPG0 B(; 1kQ.0 BpQJ(;1kG0#~H^P^X~`hp޴x>^~޵G`{G# (@7@ )D (,HG(b#I@4GhY@pGGxBb#;n@Ө$h _C  ".J6 @6J CBb#_ G`bG "Ġh h#CcI<@bh"p ¥ ݰGݠg8=04]8}cL ] }(D=GXb#T@C&&F  @ƢF GGƠ"4GNyG[@ZkGGxBb#m@`¤Ơ C`¥G("E.PJ>$ GDb#r`a_Hb#_(b#t@ĠhhB }ݦ 0=8<] =(4=@D} @nGL c$0ζzGH]P]X}`hpݤx=]}ݥ#kG#~^G;G! բ D; " !"!(@7 @ Gt#__`/ղG]`K #kGGGۦ{#""00P6(; pU5v@GkGGHG0 0 0@; 1P Q055 HD}#@ӐݦV:1@CVGk; 0 C[;C2kG ; 0 @[;C2kG#~^^GG{#]@"C8@b0C(B0"U3  8 # aGgG1"J `G`畔@FuG Ԣ0BԲG]] #k#G~^GH;{#p{!!  s"A3_G] #k#4G~TG^G[0; [24G({AuZkG] #k#~^^~ (G(;GG ;!1 QB1!F @BGHb4GyZk0b&G"b#4G#c ' 0@4G#G0_"0BTG8b$ F 2B$zZkCh"G4G$b#W@$0!H0 @@s`H@.R@JSF@>$G]]} (0#k#~^^~ (0GGG $ {#  D0.!0@r0HQ0J2F0>GGG@ 1@ 1@D$!.raHQ!J2F!>d0`BdG]]} (0@#kG# AJ~^^~ (0޴8@HGۤGG GG @GFD @?@GG&G0BG8b4G)zZkC("G4GP,b#W@  ,"C0 @ G.TGwJp#VJ3@F>zxJD'/Y8K:G'?A0GpG 1!BHD(0A.A@WJ>zgH'/0@rH0`BY'KG:G'?.G@BTJF>GQOZk%@&G]]} (0ݤ8@HP#kG#~^^ ~(08޴@HPGG{#0{(Š( A= A c p 8 EBQ_9' b!s!J8@F@!J@CTGrNF AGb#V_D&G"'TGĠb#D 1@`F~G "H"D1 @CdFq "DİGDFhǢ.GJPB2CG4Gb# _4G'G 1@(D( Ab#!f@G4G(@b#mg@#Gb# .! @r HQ J2F >GG_ 1@0@G! A"W @, GGb#_0@,HXDƠ0@$",4GD.G8FHRQJsHSFD>G4G.wJVJF> GE "Y:1@CYGGGb#_G]] }(08ݤ@HP`#kG#TG~^^~ (G0;GGG `^h~px޵GG 4GﻥG(ۦGgGG͡C ~{#o G~{G 'ޱ@p¥ D D 7`@GCGͰTG%@G b#G_CG&$D&fdFfGGGb#GTG_Co@? aD 4GCGfdFfG CGvJb#"@ Gpb#`%@4GC]`k?&1"bGG B(b#MoDKG`GtGtG_GE B@' "1""B'øBR"BBAF `@BAFF0@BG*GMb#*@"G Cb#4G3@+CG#D "0GGb#GC&O"G/@ӸGk<!MA@AjGb#@ӨC_%&-J!/4"$Db#*@D" G G)4G E Gb#4Gs3@ CGb#)@Gb#CGGGGG.@*Gb#)@CGG0b#!@G G GG b#4G D -@ E E _%J!G$ b#$@c @`D@Z"4G-@G n aE`G b# D @C EGOGG(b#4G DE@_GGGfGG4G(b#dD`_G}= ]gG] ](} 0!%8@ݤHPX=M`]h}pxݥ#kG#~^^~ (0GG`{# @PGXD 0b#V@eG4G[@Zk`b#@XD`" F G]]} (0@#k@#G~8^@^H~PX`޴hpx>^~޵G8;G({a!@tG¤(8D" 栫CH J@>`B*FG b#,R"-@G1 _&&&%2BSBl!@"&0B"B 0F GGG b#J2FC(@ `b#0D@G G8b#I %@GGG b#GGG-@ CGvI@b#@b#(@0G(t[ ( =(0=@Zk bG|_ (¥v!H (=0].C N G@b#Y@@?$! D8Db#(@JG@LC@b#B!@G衡W@` \@|CkGO$ h &GFG@6aJFhb#`41BWB@,"4G+@GG ? D `D(b#J@Ob# BE@@iGG4Gpb#dD`V_ H nAE劶@IeD 0@E*@ICEa@ n)&"?&'D!0@1"1@ BG/EGpb#GJG`tGtG_4GfJG0,@IFg 0GG b#C&O"P-@Ӊ H AE@G b#8D@PG"tgGi? H8`D`6AI@ D _"  (6J2F (PG"tP&&6BBGG?#FG"b#@LO @ GEG@EoC` YE?$@EG3DGxb#@:Pb P?_!@P? 0G/b# F @CDHB0Ѡ@G4G&b#J @DX@C8D`DO&"J!@)0D (b#@ #Ѡ@7`@`TG(b#@4G H P AE` H&?&_&Xb# 0BB&4"7(@GlG b#G4G1@ CGb#b'@GC` b#GGGGGw,@Gb#h"@4GGpb#Eg_(G b#G4G4+@ ! nb# DoDjD n h Ρȱ2!@ D Em4GGb#$@` ȥB&G"6I,I b#)tG ! 8 E II `$J,@ D ?!DƠ&<"G4G@b#D`s*@ ȡE ȱG8]@]H}PX`ݤhpx=]}ݥ#kG#G~^^~޴>^~GG0{@ӠbE@b# D_h¤?$Gd&b#:"4GD"*@&F f08=@H]P}aF`Gh0C[@Zk8bGV_cG`h8`D `[@ZkGtGb#4G)@ Bf@F} fj ](}PFGbFG_ @?$! P}pb#ED(1A@= 1@aDwAw@`01BC Cj4G9&@CCpb#4&@4GC }CH@=E(&f dCX$ P`=h}px`ƢIJ$HB GGGGPb#5$@Ӳd G&TGGtG b#GiD G_ G b#GGTGtG_ 4GGb#@SGPb#i@CGPb#e@C eDI #&" G0D@ G_@G_@F8c`GG GGGGxb#TGpF_C GFGI"SFI GG0b#F F @C`G0b#@C eD?G b#4GFG_fG\=&" )?&1" !!0@1@ x] f&"`BJ&uF0@F2BJSF F G(ݦ' #JF0F6JF Ʋ =\](:G `I  E@xHD4GG b#pD`#G$F _P= tGE !E% $E D 8@}?&(1" & `H 1D0D HD )Gx]& "\}BJ`F0@Ff2BJTF FG ?# #%F6H("FGHF[G6H F(1AD E  `P}?  vaHF ⃖aH D`D &G]]}ݤ=]}#k0Gz? [;F 1r4CG7CG4FwF ?B B8`F2G_F2 C 9C2k;Bk#G~^^~ GG({@0bXD G(D@#4Gb#L@XDG]]} 0#k#G~^^~ GG({@b8D G(D@#Gb#,@8DG]]} 0#k;4Gakp#G~0^8^@~HPX޴`hp>x^GG {N@b¤(XD/GfG([( Ȧ=G= (ݶ@Zk bG2@E@= =(]%% Ed4G"0BGGTGb#n"@Gb#@C XFE_G0]8]@}HPXݤ`hp=x]#k;0!!F0kGp#G~0^8^@~HPX޴`hp>x^GG {P@Әb¤`8DX1GfG([( Ȧ=G= (ݶ@Zk bG4@E@=b# =(]%% Ed @ G"0BGG4GHb# "@Ghb#k@C 8FE_G0]8]@}HPXݤ`hp=x]#k;0!!F0kG#G~0^8^@~HPX޴`hGG {a@`bxDIG"G( yG%[%E =ؠ= ](@Zk bGF@hE@Hb#== ](}00P p@ %!D 7B 4GGEG@0BG"4GG~DCC.BCK< CC_DISTRIB]DCCALPHA.EXE;1g-|Gb#!@G0b#@ӻ Š D xDG0]8]@}HPXݤ`hp#kG;0!!F0kGP#G~0^8^@~HPX޴`hp>x^~޵GG { $@(b8$(7  0"!D¤hBbjG, [,l =á= }(@Zk bG{@RAb#= =R (}) ) iȱF#@ ,b#!D$D $@0BG4GGGb#'!@.,_&R"GtG b# EFGF@4G_ , ,!D BFCELGb#@͡GG4Gb#E_G̱G8 #Gj*DE  [@ZkG&x b#w"4GV&@Ӑb# @áEG0]8]@}HPXݤ`hp=x]}ݥ#kP#G~0^8^@~HPX޴`hp>x^~޵GG {@b $$< " !DH¤0BbGjG, [lC =á} (@Zk bG@RA=b# =(}R ) ) iȱFXE"@  T_" i4GDG DaJ & /@ b#r"2F `%@b#\@BG4GGGb#_ @V̡&"Gpb#tG@/EG0D; NPF8G`G_3G_%!_&R"  @@ G_&s"&" @@ GGb#4G+@C4GGxb#@G b#@"ɡ E ! Cɵ L@Gb#@GGpb#4G E!_G̱ &Gq"@ b#4G֡Iq%@Xb#@EUG0]8]@}HPXݤ`hp=x]}ݥ#k10Bk1" kkG10B0 !Hk1" 0 !HkkGGGG0z?"{G1D G_GCG_FTG4@F @ GG_GCG_FTG4@F@0=GD1"PBFC3GkP#G~0^8^@~HPX޴`hp>x^~޵GG({@b $ = G B"DbjG, [,l =á= }(@Zk(bG@PA==b#C ]C(} ))I iG"ԱϢ"F 0@ϡGG4GHb#E\_GɱGB,"@_" 10D 2D@%D& DGsFPb#@/ ̥ E"E /!!HA?@ B G4Gǡb#M'@Gb#CG4G*@G&8 b#C`"GGGG'&@ ̡E ̱4G GHb#РD_ ɥ ̠G"0BGID0E.IGE Gxb#@àDqG0]8]@}HPXݤ`hp=x]}ݥ#k#B"~^^~ (G;G0{1[ 5Dr$tJHF@ ``pb#L@%bGB?"B1DCr45@tJc 5@JDæb#R@_@7H#6 H#G]]} (0#kG`#G~0^8^@~HPX޴`hp>x^~GG({@xb ¤@BDl󢤸8"hG G*[ j =i} (@Zk(bG@QAb#= ]1(}'GG g%@ G&B"GGG(b#:@5Gb#0@ G/G&B"GGG(b#*@Gb# @G G4Gb# !p dE`-_ A _ET! @"DD E` ?&/1"*CEF_G0]8]@}HPXݤ`hp=x]}#k#T?"~G^^GG0[1D RBB @ø"!"@@GXb#c@G]] #kG#T?"~G^^~ (GG0{x{#1D CTB@F@ @G""6J"@1C@FGxb#/@G]]} (0#kG`#G~0^8^@~HPX޴`hp>x^~GG({"@HbD xDi ¤P"BG#GhC J'F 2F*ʦ G(][ =Gݶ@Zk(bG@QfAb#=1 ](}'%P`AG g@ Xb#0 D 2@C G`Xb# 0 F &@CF?"`0BGGtGb#'@ 8`E@B`?"G8B"G %GtGb#@;k!j؇E xEG0]8]@}HPXݤ`hp=x]}#kG#T?"~G^&^~ (G{G00[1D #&s"BN6BvF`&N$ BbG@ZkG0?$b! _&jR"#BB!B2@ Nc GN BbG@ZkDGb#Q@G]]} (0#k#~^^G0G{#4 ;:@GT p0BF8b4b@Zk B(bZkb#U@G]] #kG#~^^~ (0GﻤGG$8{# @cT 8B`D$@bY@Zk(B$0bZkG]]} (0@#kGP#~0^8^@~HPX޴`hp>x^~޵G {h;GIGŠ}@ G^D5 D5`;Ga[@ZkbG_K@G"b#E@ Ť%D!G%4GB"%DG%o)E@GE4AJ`o5AJ DEoG`¤Gf[@Zkc# bA@V 8iE5` vJFXF. GPb#G_ӫU@5@@CaE0D T@!# 1< B@bRs"@8¦ `.֢J4JJTB+ 4G(B0b/"K7JJiZkb#q_cfG XaE`[@ZkGG0" b#4G!@e?$fGaE%8 Db[@Zk e aE e\Àb G b# k!F@GGb#"_# CGf+D [@Zk4GGG#C ݱ (b#u+@8EE 0BF@4G G "GG b#4G! @fGXD[@ZkGG0" b#4G @ɠbG_ xBM@?&DŠC*G_"C(0Db#tG1A=C$ G_Ӡ@tG D _CG _GGb#C_"_ GGG=b#ETG"@4GGb#DB_ G= =8 E % 7B$F EAFG e3 @"0 D!7!HtF3D %$c =$6A B$ }7ABz% E&_'Z#"G:GGG_"b#tGF7_5=?%)! E )@L  ED&"P=pb#ƠbQvH CvAJ0D0@FFFvJ@Bb# J AEL@@Jkb#` @Gb# E E @E;0Is@}K"KF @3F@1G1C@BtGbtGH AE@ j|Zk+}&("kk!%` ¥GGGGb#tG.Z_ΡG =&G{" } 0b#GGG!@G˰ 4GݡGF_` `GB_2 AEB@ E` E3GD&0b#+"EGGGG!@ !@%@$1#B%Bl ]D%@Ed`JM &"@@Q GG7BBT _`GGb@&"¦{ [DtF@FhF [`F8"G81C@BtGbtGD {ZkT?"b# G  EJ EH@ 5@ʘDb#@AA@@?#cBe@,`GGG*G]G0b#8!@{GġGGHb#A 'A@h@o&z"Zk8!iD 8 E`kaI֡I p`E pE mE`[GhB¤`&G!"JGFG}]@0b#!@ZG`& "GGGHN}L0b#J @H(ݡ}>fDcv`HvI0`D 0EmD4`%k!G E`F BE @l_f_" "d&" ) (E GGGE}0b# @GGtGb#GTG @ tGG4G@ b#@ GG4G@ b#@(}¥@%!`DD TGn?%)!N$D @J)IA%A ΠD ΰ(b#@gì@O/@\ACkG`G tGgm[@ZkM HE@8`DT`D-EGbG_Ә?"b#Ee@B!%8`DI@¥ N E$1)C *E CE  CDb#@.o*GT E 8`D ` %A/k!/C/Io!'C'Ho-Co N*CNoG`¤Gf[@Zk "GGb#) .E _Gb4GbCG{_c xB-L@ "GD Gb#,@GȱGhG&b#"GTG_ Ȥ CG b#+"DD4G@ EA  I DEIC͠D3@!H@E DDɰG G(@_&R"2F B'BqF0(P¦FEF (hKG0 GY?C8GK vK @`[0D6AI@DD$G ȴ0JVJ" DD@BD17AJ3FD opG`¦G vԡ[@ZkbG_#G_"tG_CG_Gb#CG_G&0b#"GGGGr@.GG4Gb# $E, F_oAÀBb#J@@Gb#GG_"tG_GD&0b#" GGGIEGL@G(b#U@o񢤬Ո@ bG0EB 'HD cE E#aH 'EEŴ %G'b#x@`4G4GHb@%!ͥDkD 4AGWAb#D`_Ӝ=GGPb# m_T@ m!_!lD jDD mGG GGxb#Z_¥0`b G4GPGX)b#P_!T@h"kGȠD) [ GD'@ZkG4G EGb#_¤0b# 0E/ICE@ n@G Cb#G4Gؼ_ =G`Gh[@ZkbG"_V@b# @ oD@ob#N@oG ¤G "G@$ Dȱ GEGb#G_ B ȱJ EEhEE dG&]" TG G'b#@bhGm BGGPb#ʡ8_ D@&\" G!@8b!c,H'HHC@c `4G(B0b- I%HHeZk E E ]!GG*TGb#@ 4GG`b# _CnG4GGv`H b#`DS`@5`D,`R@D&G"*TG Eb#@Өn hEn4GGb#(_ȱ.( nhΠDΰ񢤀 E EE qGTG*TGb#Z@ab@ʠ 8 f-fI&HHF@Ơ 4G(B0b- I%HHdZk E Gpb# E x`E`vIq @EG$* b#%!%A@D%D&Ek!" ETG@ӨΠDΰ_!E )I E0D%WH EDD  EE DvH `ED "4G_" !F G`bhus0¦[`F @Zk`¤G f[@ZkbG_=Gb#@LG GGG4GM! b#@`Gh[@ZkhbG ¤kš0D0A Eű `@$#h 4GG[@Zkb#@ Gb#G_bCG GkGb#_b# @ 0"G4G b#XEU@bG_b#@ M? Ǡ,1A 糃vHH` EDD 'G qv`J`F`B @Q&&@215B6B@BG?&b#a"a1"WFS@tG_ H g dE gD G IEDED G,5AgmG4GGb#E_ G4Gb#РD_ Gm?&G0C@b#!1"#TGG_C 4G@ ʠj ʡŰD*ejŰ ű%e -&GB" b#4G 4G@@_%J! bG& E b#.GAgwA?"4G@ *HAG7@A b#@&>"4G@GgG h[@ZkG@$D G}bo-AwAT@R`¥G*S@n[@ZkbG_xbb#C@o?`"G$ i[@ZkbG_0b#GGD_G @C EhGGG b#4G@o¥DC" GDGGb#X@04G G?!n G IE .  0`b¤ ! XEb#=h"D1/{@bGkcm[@ZkD XHE_G0]8]@}HPXݤ`hp=x]}ݥ#kG#G~^^~ (GGG0 G@b# @ `Gb# D#6!H @CF4GX"G1xb#0F PDF@_ ? dD G]]} (0#kG#G~4G^^~ (0GGG.b#YP@@b GD #0D Hd$D FF #@4CFcF F8¦CòGH(F C$ HBG:CG!!HFcF`C@ (FC #wGG(b#GTGX_C"#"F @D@P@FF AF6@F@FD- G<@ G<GAF#"@F G/@ G/ù@ #AFD "@FG"@ G"@#? "AGAFD "@FG@ GBF"@FG @ G â@F@ F òGÒAJGYFGb#"4G5@ GD GGG BF0@ BF0@_@b@@G]]} (0@#k#~^^~޴>^~޵G{G{# #C#v!H d @@M@&b"&x"GxD DD DSG GG4BBb# @Ø"L@x_&R"&7_s"x=Gb# @@G @b#O@Ӡ@?$b#D#@4GGb#'G! _ǠGGGƠ`pb# Ơtݰ@GGGb# @ӀGhG@4D[@ZkGGG8Db# @ӓZ'$ '@ pD_tb#dD0_ t=_&R"! !1'B2B asGGsBctݠƠtݰ(4GtݢGb#F_'GPb# p E G IE @CpD*Dp DqDFt= C 1@F@B"J C GG4GCb#0@Cn"Gb#/ @hG [@Zk #'E .àB?%x)!?&b J!1"'K@b#0)@Bx=SGG @p$x DGD4GGpb#@xpb#D@#G ="# Ci(08=@][@Zkb#=_ӈb#@ }CvH `+ #G+b#CH@b#@@?$ ! G"DH"DGD `KGc b#CQ4G`GF D@GCb#4GGtG)@k@$Hf"@&"#aF FFF[¦Gxb#> @ p" }" ChF@ GGPb#0@ GG0b#G4G@ CH&C8"GG.GP4GGb#4 E1 _.?$!  @?&pb@_&hEB1"R"1D "F G C`GPb#@GG0b#G4G@CCGGGG0 b#G@$@?  D +_&R"C2F b#" @s #0BJ7B:F,J ,C,G YE2@FG/!b#CGTG9@G4G0b#@G&pb#CC"tG@G05Aq @Ӡ AG0b# CG4GO@G0b#CG4G@G&0 b#C"GGGh@å& "G4G b# E E@@] !$ݡ MEDD G.v H D @?&AAI4G0@F6BID 0@E&0`F*7BI"3aJDGED pFȢGG4Gb#F~_Gb#y@CPb# pE G DL @C pEGEpDqEE 4GGb#p dE`]_ G!@] pAIvH0= 0@E0E NE-AI D E mE c@DL @"@G(} CVJ䢐J$0 Fi1W!JVBUFtF2FF #xFc[@ZkG2" b#4Gs@ 4G%6I7!E0E(I E@%k! Ec j4GG4G# G C GC G# b#H]XP=C`=h]|ݲ@Ӡ8" PC"TGH!$( 1$񂥄= G0F],G=G&b#"m@x?$"! +&"?&!@0@ D-)!+O.CI!OJ_@B#&bGGtG@xrZk)!&@H"p@CF 4GW H1Gx=GGb# @G(b#&GTG_CxE DEED&""G4G b#) @Ӏ"xG ài Eݰ[@ZkH"XEG_@ =0CH! $ G4GGb#8F`PDF@~_4GHPb#>_G@G @"GG b#C _ @@ CGb#vI@ 4G4`G b#G4GJ@.G& b#x"4G@& Cʠb#vIG@ӨC(GXB vJpF8F xFd`F `D3Gb#GGGtG_+xb#@(X4G"0DR"@$v!J ftF`(&"b#@G0b#GCG4G@GCb#G4G@GC0 b#GGGG@GX4G&"DZ$?&1"!0@1@$ JBJ!@ FJJ"G4Gb# %@h¥GD&P b#Cn"GGq@?$! DEG@FFh"0bGGC&sPb#P"@ġ$ äG"E b#D4G@ GH  =$vH|]GpD8Df35@B`b#@C|YG|ݠGGGb#tGD(GB_%G|=Gb#GtG:_G6h"b#G4G?@G&|}Pb#C."GG@5GG&|]"Pb#GGG@G G DGG|=GHb#tG_Gh"b#G4G?@G&|}CPb#."GGu@Gb#@CƠG4G|Db#E_|ݱ H4GJ& #GG@`$F $ b#0D D @G G|ݡGGb#4GDD_@¤GfXD[@ZkG@0"G4G b#ȡXEU@@ x$DGC0 b#GGGG@ `G b#G4G@G& b#N"4G9@Ӑ=HGx!6!I D 0 E)7!Ib#&E ð8!С@|VIC0E| 8E@Cm eE`D G 4Gb# $E _|ݠð G|4GGb# E_CbA @J$5@@@$@$D ? GE@%D!G"XEi[@Zkb_% àP񂤈k!LD  ð$GG]]}ݤ=]}ݥ #kG#~^^~ (0G ;GGAB0{#!$6 @Ә&G<"b#4G `D@Pb"GG$tG  b#&DA@G %&"d4G0DG__"b#@ $D 4GGGb#~@4Gb#)@ Gb#H$ @ D G]]} (0@#kp#? ~^^~ (0޴8@H>P^X~`hp޵xGGۤG"eE  $6J!D FZ?% b)!F&! A"k0@ 4G__"Gb#?@ GF8`DGDGGIFHb# G`GtG_ 'tGGHb#F@_"x_ &^"0b#s@Gb#GGGGG@HB8"@J! @@A D@E &J"J D f&G"6AJ@b#6aJ0@F0`FSF@4G@GGGHb#4G DE@_(BG?&b#0D@M1"TGJ!!*_C 4G   @`4 Tt Բ G &GB"@b#4G4G@  $DD FPBXb02BGoZkCb#1@C@ BE@ ?$! E & G"PFGGGPb#@fE@BD-!H] @&p""FfFTF7`BHBSFP@KGb# @"C"F 1Gb#@GGb#G4G@CH&C8"GG%G¥4GGΡb#)E&_$C¥"F!GGb#@GGb#G4Gv@C@&C"GGGGb#@P@ ͡E KX`D2 F3IFSN F `BG,IĢ N2BF4GGHb#F_$EGD&+"b#GGG@Gb#@C ġƱ_! 6H E0E/7ID EDE G7g F`E3 HF F PF-@, aE f`@ &aFG `5"b#GGG@ X`DG_ Hb#G4G Er_¥G"fGGnDdxb#CN @IG-` E+ePE `E`!D$ E?$E ' "E "E@?"EE @Gb#G4G@&CU"GPb#@ G X`D`4Gͱ&"b#@ X`DGHb#GE `4G E_ G& _! E G]]} (0ݤ8@H=P]X}`hpݥx#kG#G~^^G_R@DG @"AK(F$F@"GG{#4G_G]G] #k#~^^G ;G0G!GGb#@C("0BG]] #kG#?&~G^^~ GG01D "`b#@C?$! #G#CG`b#BFCZ_F  z@C_" 4 D #2F#GG]]} 0#kG#G~&^"GC BGõB&BDG&"'7B#B$FGFG#F)8FG"G'8#8 8FF&4B&G""B5FFF ?&4GGGqFH{#GGGGk@G]G #kGG]4G #k#4G~^^~ G@;GGG!/ 8;!F* ;b#F%!G _Ghb#G_8"!DhG4G b#@G4Gb# @ GD&C;" #G@ b#G@G]]} 0#k#G~^^~ (G@{G #$D= 8DG$  TGDGGHb#_@Ӡ @,Gb#P@T DBDY@" 0Q@B \BCkcc4JJ5vJæ6JJö FGD8KG]]} (0#kG#~^^~ (0G;Ga >`=# F6HvH6 @F8@F3@D@ 8D. !8B("HR( 0"@@B1  F@F% ArD@!?b#_HC@B`R @e`GGdGXb#GG|@G]]} (0@#kG#~^^GPG@RvAJ@ D 1v!J [GHD?&({#RD&1""@D4Gv@ ""0D "G]] #k#~^^~ G ;G8F 8D @bCb## @$#b# @G]]} 0#k#~^^~ (G{Gp{# #Cv!HG _@?$! 0BG4GDb#01@RwB%D CC @G&b#C "TGV@GG?$G! b# & @"@?&&1""D4G@GDG#b# @dGG4Gb#dD`_G]]} (0#k#~^^~ G{G{##c  (@cb#`@G]]} 0#kG#~^^~ (0޴8@H>PG; G(yXCD" G0D@EGBGcGGV@J3D0FFG C@Gv@K0D@_#D@"5F ?" yF 0D0D pF aGs@DZ]C@Gt@GGv`G! բ6J0צ֢C5bGբFBF 8" vFF8?"1D!F4G4GbG3BÇ`K5V:F_V6AK@0WZ @vۢv`G`VQG_@J50צ6!J֢ uU@F @U#QG?âF3BG8 D8`FrG_Gõ A.hG,`$A Aw#FGFg@ӡ @ G! ~@Ӡ @ YHF Yó (A `FFA (AGvGFw#M@ӡ @G d@Ӡ @ XHF X E`G G րJ֠J0F0FF0F4׀JFtG y á A  9GJ(F0F0JF GT @G @bGG`F dG$GG$#@"pF 9G F $G DĢ!G"GIJD_D FcbG`GDGAG #D G""F G4"F @ E !E¢@D'@ "E FFDGGw#GTGR_CD"DGDEcbD`G]]} (0ݤ8@H=P`#kG#~^^~ (0޴8@G{G{# # H F0 D! H0Dx v_CGu4GE~?# vJv@J "0`F@B0@FrFŢG9Z B6B B @`5B@~? B`&"?D5&D"2D`"F+ ¦6 G4 8?#9D_#F ZF@G`b#D@'GBFF P@d @R&6&AFS"""TF Gb& S"c ` GGb#GG@DG DfHb#G4GdD`_GG]]} (0ݤ8@P#k1 0"GG3@GG "@Gz"SFG8FT? :"AFT@Gp"@tFDFGkG7B 4GkB?@ TGkB Gk?$! ?&B1"1@ GkB Gk? !#HG1!JB1@ GkB GkB?  FkB C CAF FGk4Gk#G~^G0GG^$D  #kGGG{#TG_CGF] #k#G~^^~ (0޴8@HGGh{#@G 5@GD @B XbGC#p F8@F@1!J4GV J#C"b4FCGsGGG4G b#Y@GGCb#GGGGx @HA4EG]]} (0ݤ8@HP#kG#4G~^^~ (0G;GGGhb#GG+@Gb#CGGGGG @@b4GGb#D_GG]]} (0@#kG#~^G;0{#!@G] #k#G~B? ^G^G~ G0{GGxb# D $ F&" D @ D G]]} 0#k#&~d"^4G^~ GP{GGb# #$D @ D G]]} 0#kG#&~C^s"^ ~(08޴@HG ;G;G{#GG_Ӧ@&CGGs"b#_=4D4GD&D b:tDs`6`Gb#GGGtG_$& "Db#@ݠp"?$GD4 DݰѠGb#G4Gr@GCb#G4G@=C@ DDGGCb#GGGG @GGGb#_G]] }(08ݤ@HP#k#4G~^^~ G{GGb#c 8F0$D _G]G]} 0#kG#~^^~ (0GGPGGR $ b&0s"TG$F@  B@G_#&0D G4GG]]} (0@#kG#4G~^^~ G{GGb#c DZ_G]G]} 0#kG#4G~^^~ (G0;GGGb#!GC/_Ӥ@@"G8!pD#@[D0 D@ZkG]G]} (0#k#&~"^_&^~ G{G# 10D2DqbF`2DD&FGb#.JGFՔFFN_ G8"Gb#_xb#W_ &?"vHD0 D!!HC D@ b#@ âJVBTFò&"F G]]} 0#kG 0G FÑ6!JGR F?"@F `qFQF pbJ`0 apFak&"0F kG;! kG#8F~^^~ (G{G8#' 8D  #"6H0D #G@b#q_C4F# C7 B AF`"TF C " GD HF G]]} (0#kGG[G2 r= H;`$`F SB`F SB`F?&tFGSB _tF@R3aJ cJPF@8`F`Gk 0_'Z# 0:D Q&@R SB@1TG?Gk4GGk4GGkGGk;! Bw@ 5 BCF!v H DU @Gk#~^^~ (G;GG J0D8 F GU VJQDvAJ@Fx F HF @GD& $"b#TG{ @$"0D$GDD@F`B8`F1`PF&6AJ¦'"@?'9#֢_'Z#b# F7BB__8D $8⦘VKGGH&b#C}"GG_ @ӐbGC@@@D @G$_"2F$G]]G} (0#kGp#~0^8^@~HPX޴`hp>x^~G0;G(G GIGGD)! D GgCD '%D]} (= !F bGK`0@BK[@ZkCGG@Zk gbDaD g(=CI8b#!D CFC@ ǦF0G g]!'CCaD `C8b#%E@Ц0b#@Ӱb#_p"=GkG]GBb#!#1`@ " (=Ұ !G 0BAk@ Pb#_G4Gb#pdD`_Gb#@G0]8]@}HPXݤ`hp=x]}#k#?$~! ^?&^1"~TG (0޴8@GGGGGb#cD!B1@ C4G_D ] D⤑J6J+ epFe.JXF(b#_" _"!D %2F%*G(`g.@¦gJDF֢B %~DCC.BCK< CC_DISTRIB]DCCALPHA.EXE;1gl|6vJ0GPGF`b$?&{,H(b#D F_%0D%GGGb#TG_D5@⤐"!D0D+ 4Gb#@'G ""H %0D%3D1F@%F%_"vJF G $b 4GG; 䰀b#_Ә"%0D%GG ¤tGG' b# FtG_Ơ@GD&G#"DdHb#`GG` @b#_$ ?$.8D*! (`G @@#_D@GGGb#G4GtGϽ_$GD_D F&G"Hb#G@GGG- @Ӹb#I_G]]} (0ݤ8@P#k#~^^~ (0޴8@GGG{#_0D@G %Cb#vH_G0b#_ĠPGGGWfDG b#tGtG_p"b#a_ &="b#w@Gxb#GGGGG@4GG% @CF` Ð0GGXb#C&O"@ $ h"G6H!p*DD  [@ZkG&b#/"4G@ G`cCG8`D`b# @GG4Gb#D_G]]} (0ݤ8@P#kG#4G~^^~ (0GGG'b#3@C!5`@ G-Gb#$ dQvaJvJvAJ0F0@FPF C`_ C%b#vH_G4G8b#DA_G4G8b#D9_ed4GG]]} (0@#kG#~^^GG{#_ ""X AJF @FB FTGAG]] #kG#~^^~ (G;GG{#A_:@bF; JsJ2@0`GGTG`b#_D "'HG4G!b#  @"GD&b#C! Aa@"aGG8bDh@`P"&!PD@Bv@JTF`F8`F`BĢ&"FIJG]]} (0#kG#G~^^~ (0GGx{#q_G0b#_GGb#\_hb#@P`"GC!pX D [@ZkGGG b#4G@xb#Q_GG0b#_P"CØb#:_hb#@PGpGGG$tGb#_C"G@b#Dp1A_GC`#GGb#4G$D O_G4Gb#DF_b dG]]} (0@#k#4G~^^~ G`{GGb# D(_  ("DD #_"2F #G]]} 0#kG#~^^~ (0޴8@H>P^X~`hp޵xG[GXGGj(GGCCGE"pD8{#j_CxD G `G "*pD8b#[_GC* G"hpD8b#Q_GC(`GxBG"R"G1PB@b#G&R"@@?$(! DF&B @_&D j@&aF'D BuF`G&b#"4G@Әb#_  ?&1"(HF0D* Hb#D  _ _"ʰDvH D D)v!J J hvaJaF`vJ "D ?# _E JGF H@? _E jAKBGAGaGDbGF j@aG DG dGMG j&s" cBGE`IG8b#!_ ʤD3@P%#H¡ *!D` $D *$D EGG4G@ZkGb#D_GȠ@% D&GW"Db#E4G@.EG`b#G4GD_ nE ` G4Gb# E_Gʱʰ4GG]]} (0ݤ8@H=P]X}`hpݥx#kG#~^^ ~(08GGGG{#K_("&CGs"(b#W_`4G= GFb# 0$F ѿ_XbeGGGb#_Gh"Hb#  7_CGb#4GD`0$D 䳿_ eGpD eG]] }(08@#k#~^^~ (0޴8@H>PGCGGGGB_GGG8CGGG2h_'Z#?$3zB! aB H"4Gb#"HvAK@G @GCb#GGGG@ GTGAD _GGb#GGG_CEȠ DhG]]} (0ݤ8@H=P`#kG P q Q0[FRG@ vaJ_"` qJ"rG QSF QցJ?F q0F4ׁJ"uGF pqPqQ`01kG#G~^^ ~(GGGGGb#TG_CG4Gb#qFG @GGb#4G_G]] }(0#k#~^G; !J !'F A?& @RQF {vJ0Fs`APFF{#1_G] #k#~^^~ (0G;{G{# F ! #_ D b#D_G]]} (0@#k#4G~^^~ G;GH;G G!1 Gb#_G&b#U"GTGk@G]]} 0#k#G~^^~ GG pG6aJaJ`J "&G"b#tG1X@ " 0D @"c`CSFCG]]} 0#k#G~tG^^~ (0G`GGG%b#_?$! eG?"@ F aF dF3`B @GG?$]aD]D} (0G@#kG  F!F  k#~^^~ (0GGX{#@`bC#c GBG!_Zk!?GBGb4GLZkC"G4Gb#(@4GG]]} (0@#kG#4G~^^~ G{G0[8{#c 0D "KZkC4GH"GPb#(@ " 0BG]]@#} 0#kG#G~G^GG(ۦG U.s5J4BRUJ CSFU>0B4@GG 4G_HTGPtG9`ZkL5BD0D BU/4G0@.ZUK@J{H[GU?0B8CNvJ5,GA5H5<] #k0,PB0H.!1 @.JTJuJ0@F>0 B??F.PJ>kG0J C_J DAFSF `2AJ.h"BWJ.JxAJF>0 @1 B? D .GraJUJF>0 @?D.WJ>kG#G~^^~ (0޴8@G0 dG qGQ0.0`B.J CJV/"qJ0BZ@K"QGV? 00@GpH"H V/ZVKPGV?0B G !HPBVH!HPBV H?%`4"B/@B-`G@/` ,CKDHe`H@#D< D`,,,dH,H@#H@#gzHFH` D}@,0BFv,H`HCzH`Dv<0@ `,31`B,H@HcH0BD<0B4G F,dHGEHD<0Bf@8@D\ x@Dp@.tGavH0BPJGF>,zH0@GHDC`#G TG>@G ](0#k#G~^G{#@G] #kG#~^^~ (0޴8@GGGGGGG{#C@CGb#c@CGGGGb#_G]]} (0ݤ8@P#kG#~^^~ GGGG {# @CGGGGb#_G]]} 0#kG;" [ ۦ(00G12Gtu6kG#~^^~ (0޴8@G ;G@{#a@8C%"$ .PJJ9B@] B`FG GG ."(B4G0bPJJLFZkG$#" .PJJ9B@] B`FG GG G."(B4G0bPJJ2FZkGD<G%,0`@$%H0@%DA e" E.RSJGJ9HB]KBDFG GG .#(B4G0bPJJFZkGĠ"#,A0H'H9(@ ]+@@$DG DG ."(B4G0bPJJEZkGDGG]]} (0ݤ8@P#kG4G#~^^~ G{G{#c C1_G]G]} 0#kG#~^^~ G{G{#Tc C_G]G]} 0#kGGGۦGl"CE_GGk#~^^~ (0޴8GGC>G0C4GD@DG B#( Db#C@hb#G}@0K@b#@b#@ #0B#C"KG`Bv"Kp GXZ#Y:C G #H@b#"K @ #b#0v K_Cb#@cG@b#@G]]} (0ݤ8@#kG#4G~^^~ (G`G0GGh b#v J FQ$B@#v HF1QB B F@Fb"C b#a_C DA$@ G4G b#@GD@ b#4G@hb#@CG b#4Gw@G]]} (0#kG#$~ ^G ;G! 0?$!  B@0p F0p DHpDDG C`x#3@P G C`x#.@G] #kG#G~TG^^~ G([G0{GZkC(B 0bGTGTGZkC(B 0bGGTGZkCG] #D]} 0#k#~^^~ (0޴8@HG8ۤGGGG_&c" C.RSJGJ9HB]KBDFG GG .#(B4G0bPJJDZkG&$" .PJJ9B@] B`FG GG G."(B4G0bPJJxDZkGD#,0@#H0`@^ #.#JX%F 0`@c.cJXeF`0`@.JXF.GJM<#@@0`@G_&d# D/Z[KGK9HC]KCDG G .$ (B4G0bPJJ@DZkG"#,A0H'H9(@ ]+@@$DG GG G."(B4G0bPJJ&DZkGDy$,$H0@?GG]]} (0ݤ8@HP#k4G4G#~^^~ (0޴8GG!hG F F, ¤#!#D GHb#_0C@b#2@#0C@b# G ,@#8b# @J@b#%@#0F@b#6!K @&DH@b# @xD?D@$GHb#0 C$_¤D#!Kp G K@b#@$4G4G D@9CG#" "QCb#9CC@Ӻ @@F@b#@&G0C_ @"Hb#AC@@@%# Hנ@p\@CkG Bb#(4GZ @# 0D I@@bk_0 C 4G(¤b F]_ àH@b#@ #0E@b# 4 C @Ct0!Kb#_Cb#@Q@b# @ӘB #bjWZk0Hb#{_Cb#@Ӏ C[  bGTG_G@b#z@0O@b#w@#G V!K# b#_DCi@à0K@b#Dc@Ӹ C48b#7C2 @@/Gc8b#c 8@ M@b##L@ b#à0@0H0_Cb#?@0H@b#<@ 4GbTGE_Ġ&1@İ8 CO@b#-@0J@b#*@Ġc&1@İG]]} (0ݤ8@#kG[0,rR0HPBSF G0.!1 @.0JUJv2J0BF>0@BSF?@k;!!q"1D=@3B.@3@,.J0B5A.uJRAJUFA>0 @.J0B+A.tJRAJTFA>0 @.J0B!A.tJRAJTFA>0 @.J0BA.tJRAJTFA>0 @3@1D ,GH0B.sH0 @VJ1DF>7k#~^^~ G{G{#c 0t@c#Y_#0Y@b#D @_GGX/ZXKX?]]} 0#k#~^^~ G{G {#c 0t@PcT#5_PT#0U@b#D @P~_PGGX/ZXKX?]]} 0#kG  F!F  k#4G~^^G;GG@b#O_ G]] #k#~^^~ (0޴8@H>PGxGG$ % G"GDb#@1_FEB B2Fo @b#,@kT@eG `c@"("dD pD1`!F TGXb#@4GŰ $ SGDG@GG@b#_GDDG@b#_DD?B"XD4GRb#1"$@@4GGgGDD DD "xD"xD"b#@ĠDb#@GTDT@?@TF&"Xb#H@GDDDGDGb#@Әb#u@4GD%H8B@bTGH CzZkCB@  %" BR@ CF @BSF&"4D G @$Xb#'!5 @!D@@@@&e"3FqF @GXb#@h`% G'(D9 D B_FxLFrF2@ &"&4A"B&%"G x FH"pG!p,D [@Zk$$E!?D #0@x.D&DXb#B&*"@H$H&x F " FXb#@ G$ E?$DExD DG_`$`G@d Cd&a"Xb#FmBSF"@@(E H 0'D hBGR@B@p`FBVHG0D@FF0F5JGG&;"4G@CEzG@Gb#_Gx_`^) "E d4GTAaFFbF"XFdFIGWIyFDWI? EG;DBG0F  GDDGGG D!c`&"Xb#@@$GG@b# ?E x+E( R_DDG@b#GJ_GDG@b#DD@_GDDDGGG@b#4_D E&%"Xb#@GXb#@4GG]]} (0ݤ8@H=P`#k#~^^~ (G({G # D# "@1@ @!@#@CCr.0FSrJr> GG1b@DGGb#@)_DG#G]]} (0#k;~&; Q! B 2\J1"`HD@!B k!0BP.s0HRPJSFP> k#G~^^~ G{G{##c 0D#_Gb#_G]]} 0#kG#G~^^~ (G{ ;G{#!c F @U@ D_Ghb#_ 0JJ B!H=!@  G H@HD@ @@b#_GGhb#p_!@!!H=!@?GG]]} (0#kG  F!F  k#G~^^~ (0޴8@H>P^X~`GxGۤG GG_@GDh[@Zk"Gf4G)G @5@hb#  D@`2_ӫ@Ơ3`A@ fE"@HG4G!b# @&"z_ GBb#b¤GA@("G&b#p"i4G`b_Ġ&" BƠ*GdD&)" ¤` c&VaH `c& ⤩"VaH'`G@b#TGw_hG[@ZkG]]} (0ݤ8@H=P]X}`p#kG#4G~^^~ GG0{##@b "8DGG(bF@8DG)"b#4G _Gb#GC_Pb#@G]]} 0#kp#~@^H^P~X`h޴pxcGGGGCGG0@wB"8 DGb#_G XDG 0HHb#4GJT0@A 4 A 0vJFXF+xb#@'GG`b#4G_0 !Ġ4GBcGGG"qZk@BCHb4Gc^QZkG4G b#C72@ӶGG0b#>_ӱG%H04G"ǰh C!`0 @ @Р0@G@0b#GD'_Ӧ@3@G@&b#7"@4GE`t_Gc@]GH]P}X`hݤpx#kP#~(^0^8~@HP޴X`h>p^x~޵GG{#@HG4GG$(b# F&p"A_GCp `"h_"!0L BPxb#K@=@ xDR8D D@AG @=` Q@\@CkGE&?""QGG% =(b#4G _(¤Gf[@ZkF@GGb#G?"xD4G4GG_ tG%4GG8 D(b# _b#0@GGG(b#4G_à`b#Y@(¤Gf[@Zkb#@G(¤Gf[@ZkGb#G]_(b#_=Hb"G4G(b#àc cD`_Әb4Gð GHGG4G(b#_Ә¤4Gf4G(G$`[@ZkuGbG4G@oG(bGc[@ZkŠcGD[@ZkGG4G(b#4G_ŠGG`b#D_GGb#<_ŠGHcD[@ZkbG4G@`G5"(b#4Gq_8¤G4Gxb#X C1@bG4G@OG(bGc[@ZkŠG8D7G4Gpb#_cCG[@ZkGGb#4G_C1Gb#G4G_8¤CG"pƠG0b#ǰ1'_ G%4GG@b#)D _cG[@ZkG4G0 0 0 B'D-4 D0C`(GD&G"`b#GJGGGG-_FŠcGD[@ZkGD&(b#."4G_H¤xb#f D`@Gf"'0D'Gb0J@(⤘b#HBàc J!#j@ G*4G " T Dbѥ0B G*@ &K@j"c 1@ðDàTG#$ G`b#@S_xb#@ Gb4G0A @'1@$cðC E4`E4DCH&G"(b#4G_4GG(m[@ZksG("Gi̡![0A̱@ZkeaE 8aE`Lb&G="@Rb#CG @GD_!5GG4G Hb#_!,(Gg[@ZkgG E[@ZkGG4G(b#4GM_G`b#GG_!_GGb#V_ "W@G4Gb#Gɡ)!GnG jE @ _ΠGG0b#4GD_G &GX"(b#4GE#_ÌvIGb#CGTG_GGpb#(_Gg XE[@ZkG0"(b#4G _eGH&(b#8" x`E`4G_GHxb# GG4G@gG G[CG!@Zk" GG0@b# 0Br_4GXb#_Ә"4G,D! Geb#dF8aFxdF`@Ӥ G_%b#8)D 4G<@ӇG&G"(b#4GE_h"p"!GQ 05@@N 3D` 4G4G 21@B@N DQ4Gp51Bxb#@p 0 @ GD&(b#"4G_ GgG[@Zk Gb#F@4GG?"4G4GG\_ɡ ?GGF@.Gb#4G4GGO_4 )G$D0 #@G"BSFFF ҦABSFFFF RABPG_1? G4Gb# _Ө"tGG4Gb#[_  @b#C@CF G)0`@&@4G$EGg8@F@[@ZkGtG(b#4G/_b#xDan@_G&(b#G"4G!_GGPb E_GGC"(b#4G_ ؆E:CG&(b#G"4G_H¤C G   . !  / 4G pqF` F 0 0AŢ&"FGSC(b#4G_pxb#(1A@0AGg[@Zk0Gg8E[@ZkGtG(b#4G_lDGD&(b#8E`"4G_gG[@ZkPbGF_8E) ئE'GPbG=_ 8E EGlDG`D&(b#"4G_Ә 4G!GlD `GL&(b#!]"4G_4G@Gb#@ C_ GG0b#4G E%_b p,1A (1A`O*1@AOGGb#_xb#{@gG8D[@ZkGG)"(b#4GQ_Ә")!ݡɱ3GbG4G@-GXb#D_) GG`b#G̰_GGb#_bGHbcD(Bkj[@ZkG5"G(b#4G_HG4Gxb#!G@-@G(]0]8}@HPݤX`h=p]x}ݥ#kG#~^^G;G0G!GGhb#_C"0BG]] #kG#~8^@^H~PX`޴hGH;G{!W (U%PO L¤GCb#TG&F'" _GCb#TG_GC(b#CF4G_G@&b#C5"GGGG__@P "G4G&G@& @&@B7s" $6"R4GGQF3F(b#GT_GCDGhb#tG)__ CG8]@]H}PX`ݤhp#kG#~^^~ G;G{01B `b#0!6!H s@@b#@CG]]} 0#k#C~!!H^^~ (G ;Gq$!BcpFGc GsGb#6aJ`J@Gb#c@G]]} (0#k#~^^~ G8GG`GGGC @& #b#"GGGZ_ GG& c"0b#GG_#&G"b#TGv!H #._? DD#_"G2F#]]} 0#kG#~^Gx{#! Aa_G] #kG;[!0211 B2k;[!0211 B2k;k#G~^^G8;G{#!5)@@_ӡU@4@C DG]G] #kG#~^^~ (0޴8@HG@GG8$0 @ dD] eD,H4GGb#GF _GD@8b#4G_`¤@Ƥ@D8D"GhDp[@ZkG5"hb#4Gc_xG4Gb#X C+@E@b#@`¤CƤCD8%8D0 @%0eD H8GGEdb#XAF @0`Bd_Gb#G_ 1@0"G4Ghb#XD,_ӈdD4Gb4G 0@*` @Hb"àD¤Ơ!5@ N @@&d"Ghb#4G_F@b#:@`¤CcGh"ƤXaDaCD `[@Zk bG4G@8b 1@b#'!1 @'t_d` G" "G]]} (0ݤ8@HP#kG#G~^^~ (GpGG$!D8!Dp [@Zk"GDa[@ZkG4Gb#4G_Gb#G_G`b#G4G _GG0"b#4GXD_G]G]} (0#k#4G~^^~ (0G0;GGb#܏_P"CGa[@ZkGGb#4G_CG(b#G4G_p"C`b(B! hc ¦d6r0`B`.GGGGb#GGGGGh_+GGG Xb#_Ӡ @ GD&b#J"GGGGGU_dG hDd 0D 11 B@0GbGsXb#d{_ G]]} (0@#kG#~^^~ (0޴8@H>PGPG G $G'UBF0"Ga[@Zk&Gg"0b#4GD 4G_xD4Db#"_ 0"b#R_iG[@Zkb#_"()X%Dx DpbFxPF s `NtF`x¦4G0Bb#Q_4GP@BE)xERE 8E 2E iDG`&0b#@"_ x(1AG]]} (0ݤ8@H=P`#k# "~8^@^HcG0[#CGC>C8{4G>޶vZk(=0b# @BbG4GYZkcG8]@]HP#kG`#G~G ^8`F(^0~8@H޴PX`>h^p~x޵G{GۤGx{#G -@Ӽ`xb#@_È4GB)\@b/rZkBbG4GzsZkxB Cb[@4G-lZk C$@B*,G4G H JZkB0@bvZk C" G`b#@BGGKJZkBbGGTGnZkC , 0@A H B"1#ACb# @8b "Cb# @2b CCb# @}xb#)`'@&0 C$Ab#| @b#@b C#Ab#s @b#@8b C(Ab#j @b C(Ab#d @ i&Ao"`b#G @4G&A,iG b#4`@`< @ ,i4G"`h" !1BDDXDR@i¦DXDD֢D8" DbD9DID{DDDb# @ C_;BH" bCGGtGmZk0@GBh" bCGGtGmZkGB bCGGtGmZkB " bPCCGtGmZk( @A ÈB""bPCCGtGmZk@A) 0@@. G =" b#4GG@J&HGS%@Gb#@."G b#4GGJ0@HGE%@#`Gb#p@4Gb#l@$D."0@PJJGb#`@."0@PJJGG&b#2"GTG9_FG&b#2"GTG0_=Gb#D@ӀG&G2"gGb#TG _-G "  = ("C H@¦4GG GG& b#̩_Ӱ ,%. H r%HQ%J2F%>g.."JwHVJF>gBGDE&HZkGb#C0@ @b#@ C_lG iG`CE` b#@ C_`GGb#@ Ihb#@G0@0_@b#<@ӧ@TGxb#)@Bhb# 4G@Gb#Gɉ_G b#G_Gb#G_Gb#G;_GXb#GM_Gb#GL@GXb#Gk$@Kb#P @b# @b# @Ӹb# @GGb#_b#W@Gb#GLD_ӸB4GbksZk b#@b#@b#s@ C_4Gb#-@Ghb#@$ G?%%)!g_%$Ǡ hDJ! D4DDG ](]0}8@HݤPX`=h]p}xݥ#k@#G~8^@^H~PX`޴hpx>^~޵GG;4G¤"GPGat P@ G[@ZkGGHb# D_)& C!E GGhb#@Gb#G4GX_"G"I)!0"@A .Q.TJQJ1"uPJF>.V/J6#{9JZYK[GV?4G BbPAsZkC b# B @B4G b sZkC0b# B @0] 4GG Gb#G 0@AȈ_ .q HGP JF >G8b#d_  G @A-b#R@ A_b#@CGb# @@B1P@HbGGtGkZkB. CCGFZkGG~DCC.BCK< CC_DISTRIB]DCCALPHA.EXE;1g|tb#~@C A@B1L@HbGGtGkZkx@B1Y@HbGGtGkZkpE4GGb#2 @hGGXb#4G_"(@C)!G)Gb#S@p @BHbG GTGjZk@B TGHbDGtGTGjZkCB GFZk /@BGGFZkBbp@4GrZkC C b#p@BAbGGtGkZk I!H B@@ C1W@EZk B)@A@EZkBb0@4GbrZk(C "b#C M@G'HBG@bAtGkZk-HI=*,GpIA*H0D*<.. 0@A.J n..nJVJwjJ0AF>/ 0@AK0A j/g K[jKgGj?, 0@AH-@??*,A*H*_GGb#_GG b#J@Pb#TG@Hb#@",4G⥰I)!HgϡEEEƠ. nAG lAm&fA 01@b#$}(_ B (C0b# @ ɡJ!G!b#CFTG_G C 4Gb#$_0 C(0b# @GH b#@B 4Gb4qZkB4G b.qZk(4GBb(qZk¥ 4G$g!8`44GΠ0g g G$ @Gb#S@`B04GhbXoZkB4G0p!bqZk.4GBb FpZk AB4G AbpZk4GBbpZkG8]@]H}PX`ݤhpx=]}ݥ#k#~^^G0;G0G!GGb#"_C "! 0BG]] #k#4G~^^~ (0G(G G0{TG$ '@G6$HGD4Gd%PB XbxkZk4G8bH@d%4G @`dG]]} (0@#k#~^^~ G {GoC#C{#4 @ @ "b#C7BQ@@8bK@b#C@b0I@b#C@@bW@b#C@b0U@b#C@xbY@b#1i@@(bS@b#C@bU@b#C@0bb#C@bM@b#Cw@z@b0Q@b#Cs@Hb0O@b#Cl@b0S@b#Ce@Pb0K@Cb#^@0M@Gb#Z@G]]} 0#kG#?B~^^~ (0GG8GG CE"{#@ӈBbP@4G8pZkC"xb#& @ B"GGEZk%,vHGA%HG6D%<]]} (0@#k#~8^"@^GH~TGPG8[G[8R"}EZkGb#CGH_bGG4GHb# _8"C=TG#B=Cb#@0B4G8b&kZk BG(b4GqlZkGGb#@Ӹb# @CtGb# @G8]@]H}P`#kG;;  ! P @1"0JQ "kG#XF~^^~ (0޴8@H>P^X~`GGG0ۤG A dD ,q`H0@A H1D <eD6@/&8; P.1@@JH@@H "0,"@B4GHbP0HJ nZkƠ%8 !.! A!J'HA0@!!H GE4G@BHbr.R"PrJJmZk"4GŠ_! @ ¤dDe C1B0`B3B 41BCC.VJ>E+B jAjA9EM ]AA@f@iG ` B%K@(bTG3zZk4@70Z@Pb#: @3G  A B (b @AG*.TG*JQ*J*>H.%HJ @zZk4@1Z@G"xb#@%P! GP %CX!%C B(bTGzZk4@0Z@Pb# @ ,ajIG@ HD <G6$JGFEGh.G BTG%hJ(b`yZk4@0Z@Pb# @CXaD`?!%( AG]]} (0ݤ8@H=P]X}`p#k#F~^^~ (GG GG_,"0`@b#PHJ1JUB$B1D$D_dDG]]} (0#k#~^^~ GG0,G0H G,"0`@b#PHJ_,HG]]} 0#kG#4G~^^~ G;GGGX b#! H@0G"p@BG  2%0bGx./J"yJXKG?Su/,uK: qJ@HD<b#BR@@"C"G B@bsG]]} 0#kP#&~s"0^8^@~HPX޴`hp>x^~޵G0ۤpJXG(&DCGբDGFC8F@8"B9 ' xBG$ z#" Z#pCC CPC@G`@EF`@EB@E>@@@E8? @@@E1@Hb+ C =D @' Dg`H ¦Dp⦔֢Ơ_'zD ! E, Tg [C`GGG8b#2_xTGb# , ¤0D _ b#_O@b#_ b# _hb# @TGb#_G ¤b#_ G,hb#01 @ R" b@DCx"! 0"DQ...QJ.VJwPJ1"F>J-U JQ/(9,y#QK8K`;JA;HF DF9<(? b`¦Lӡ:A8WBCXCDB@A4GD2F0B@D&/b#&K( X!G( F9J@D.JXFF@DF/FK@XAG@D@D&.&J X!F } C?FD@@f.fJ`XaF`w_p@ B,0@/@!1@&@GGb#< @C,á@ '@ G BGGb#1 @C D@b#X_d A G A B A)A,o@@33B&@@Gb#_/Gb#G_"!Cb#:_өA, Gb#_ϠGb#G _TGb#_'1@Gb#_'1@L@b#!_(ݤ,iHGH0HD<-, pHA H0D-< =L 0@BL `JFA0BB 8@E FK8D G' !,ǡHA_ % mD-I ֣Ib# A_-Ib#I_4Gb#_b#_G D@@b#_bG!b#C TG_Cb#_B bk E`E 4b#_ b#_(b#_M@b#_G0b#v@ l,G`@0Db#8_LD@b#@_ ,b#_@,b#{_TGb#_ lhb# 4G`Y @G,',DZG0]8]@}HPXݤ`hp=x]}ݥ#kG#~^^GG{#X@G8b#'_8B&@b"4GNZkG]] #kG#~^^~ (G(;GGGx{# _ 0"GGGb#TG_8bG@G]]} (0#k#G~G^G{#_G] #k#G~^^GG {#_ B&(b"4G>NZkG]] #k#~^^G;G{#! AB@TGhb#_G]] #k#G~tG^ ^(~08@G[GGZk.G BG% JP@q/ `K(bFWP BGdZkS%׀@cCtG1,Bb1Hu%@aF`FGdZk H} `@4G.CC4GTJ> }(b#_#$H@C.J$"B c.RStJgJRrBR@F @_ E4G." B4G(bPJJiZk.#"%0`@PJC.!@JA!@0BCJ0@%_4GGG] ](}08@P#kGH;8{!s"0311 B3kG .JF 0 @,HD0 @.JF!.G!J ;Q1@BQk0 @.J F0 @!.!J $F?G0 @P.RPJP>;1kG#G~^^~ (0GGGb#G_CG4GXb# _BGb4GjZkC`"b#@GGGb#G0@_.qHPJF>GGb#D~_G]]G} (0@#k#~^^~ (0޴8@H>PGp{G{#c O@P(GeG[@ZkGp4Gt#DBFbG t#jZk  @HB1 HPbTGCt#jZkCb#"@pG$ He&DC HB [@Zk4GGGb#v_CG xb#4G=@SpG# HC H @eXF[@ZkGGG(b#4G_,G8HF" &.Q2J'J9(B`]+B$F G G G ."HB4GPbPJJ&iZk G0@@&,&H?p#b#C1 JC1!JQB-_C "G4Gxb#C@ pà'H0@Cpð'HA 5"$4G!Dh?G(b#K_dØB4G biZk¤G]]} (0ݤ8@H=P`#k;!Ck#~^^~ (GGGG h{GX{#llc !_D@b#*_Gb#'_F@b#$_G4Gb#_Cb#_h"4GlG]]} (0#kGGG0,0Hx%D䡵%@ 0.P" ]2JU/B }Zk@GGk4GGk#G~TG^^~ G0[G8{mcZkC` B(bGGTGaZk4G BG(bGTGaZk PbG@&`b#"c4G`_4GGG]]} 0#kGGGG{#_Ӡ@5,5H%DCGk#~^^~ (0޴8@H>P^X~`hp޵xGG({c h# @ 1@4G0¤XB`biZk8 G(S.!"J 0@vGB G G." GJtB?|ZkC֢.J- " *,A0H'H9(@ ]+@@$DG GG ."B4GbPJJhZkG 0@A A*,*H?P&ơ1 JC1!JAA GBE . |Zk>.Gb#v@ G8PFA*@I C*AI AA_(¥d "` PiA +! C 1h¦H" KCkfMTp K0wJ$c(D f$DF@`B"2'G4G` $ F $b#% V@` 6Gx¥` GE k b#_k kl $XB6 I0 Eð0E %1@ E" G@&b#!H"4G _Gb#F_ G]]} (0ݤ8@H=P]X}`hpݥx#kGp#~^^~ (0޴8@H>P^X~`hp޵xG;GGaG.G`.J"xJWJGF>!T/. TKqJPJF>axb#_Ӡ¤C" _'Z#:w@K! $&00 FP ǢDBвJ! ";wK:GHbzGGC *1G)0 F FK@  j0`BjG (B̢F0b0FBF 0*G0  TGaZkC8B 1F@0@zZkG&b#`"GTG_, GH .-"G4Gxb#PJJ2JDB@o_G&b#C"TG_ 0A , HGb#_ C/0GG_ b#_ϡ4GG0b#EG_CG4G0b#_8BCGzZk GG@&b#J"GGtG_GGb#4G_#(@&" G@&b#"GTG^_G¥4G GΡ b# _D&"G4GXb#_G@賤C4G¥GG h¥KJ#,#H G.g" G.RSJGJ9HB]KBDF G G G .#xB4GbPJJ6fZk G0@ A','H?P&1 JC1!JAA G8BE-AzZk-GXb#@ Pơ A'HC'HAA G b#h" @pGG0b#4G_ƠDBG D GD{Zk* C,P@BG  bGGTG_ZkC$,TGpH CA H0D$<GM4GBbr.rJAfZkCb#@,aIB"G@H@D<M AR"Q|ZkB0BGSzZk0@pb#@ , GPb#_BGb4GfZk , HAɰ ?E G. PJ>)$@$BuDJ.TJF>ʢ( B 8b  ¥ G4Gb#r_ GBGb4GIfZk(1AG]]} (0ݤ8@H=P]X}`hpݥx#k#4G~^^~ (G{G[{c !fZkG4G "B! b _fZkCb#"L@cd`@G]]} (0#k;_";G! 1"1FD !kG;Gkp;kGp;4G! 4Gk!?@0Ck#~^^~ (0޴8G{GX Gb# @CGb#@ ? @$"%.0@DFJHD?D?GG]]} (0ݤ8@#kG# ~^^~ (G{BG#c D;dpBr1@  BdB Q@ 4pB4QB @4F#4$BC3@C# dB0B2G!$@3dB@3QjB @F"G4BB1r0Bs"3dB`B`21@0BG c4G8bGJZk 0 !$DC`@0@`.S`J`>4 B4G(b@jZkC"TG`DGb#4G!F_"4GBG$.Q$J$>rGG]]} (0#k#~^^~ GGGp{# @GPb#]_G]]} 0#k#TG~^^~ (GH[GkCP{GyZk0C G384G0"xBp("b3eZkChb#b @ӼdTG( "Pi@`"`c CdD4GahBP.0""RQJP>F.vtJ"0"UJF>F/XK?d9G]]} (0#kG#~^^~ (0޴8GGPGhh  0@0. 0B@ JH2DxD .JF@B0@G%D" bTG  `F.#PPJJ05B0JCB PB0JGp@0@_GGb#_,& 0@@HHb#%01BB@'BEFDG_G]]} (0ݤ8@#kGGۦG[6"xZkGk#~^^~ (0޴8@GGGG#".PJJ9B] B FG GG G,#" B4G(bPHJHcZkG%$" .PJJ9B@] B`FG GG G." B4G(bPJJ.cZkGD<G#,0@%#H0`@B  C.c"RSJGJ9HB]KBDFG GG G.# B4G(bPJJ cZkGŠ"$,A0H'H9(@ ]+@@$DG DG ." B4G(bPJJbZkGDGG]]} (0ݤ8@P#kG4Gx[4Gp{22 RQF S.xJ0@BWJF>k#4G~^^~ (0޴8@H>PGGGGGG 4G "1qD `Р0`@0 `@!0B,"'0`@IHqD'I EGGGGb#_"CG!aD0D+E GPb#)@? a@GX!E" 1 GJB0@_"s@ǰG]G]} (0ݤ8@H=P`#kG#0"~^^~ (G{G0,{#0H $F C|_Ӑ"CB#!F 2Gp.pJXaF`2GG⦘8FX0Bע#7z p/9Q C,pKDHq#HD<8P.wPJ0B@F `,p#0,HA;HcH#D0<G""GFQ4G0@CQG]]} (0#kG;G!!  BAQ.sJ0 BRQJSFQ>k#G~G"^TGG {_G] #kG#4G~^^~ (0޴8G`{[G{Gc {]Zk  FB C11 BPF ` 0`B.JGG(BG0bdfZkGDX!Dx$D $&H8B4G@bHaZk D4GGG]]G} (0ݤ8@#k#tG~^^G [B({@1,G1HGP @5uZk@G]G] #kGP#G~GH^P^X~`hp޴x>^~GX;G ({%0ۤ0B11 B!% P[Gb#R@h@@"Gi[@ZkTG8 D D;6BC`! @0 C_(pb#kK_ aAlA?#G "ipA *jA[ @A C)EGwI@Zk A+pA`AC1F("w H(xb#2@(]0=8]@=  Gk"Gb#4G[_b#}@8b#F@}=h0@ ](HGH]P]X}`hpݤx=]}#kG#~^^~޴>^~G;GG! P;G 18>7P " 7@(\@CkG"Gq[@ZkGb#G/_GԮD =C0G B@&G"b#4Gr`_( "("!1b (suGeG[@ZkGG4Gb#8 D_XD]"$)vJF F8 F! @B`8@F@vJ6J¦F4G֢G@G4G:5CtFzK4G97K;wKG;GFC D& "$"GTGb#_eG[@ZkXDG =GHGb4G$s G0 F1!JTb#6 J$`)_ӔGGb#4GG_ӎ0"&G1I@b#c"!TG _(Gb#@Ӂ0&GO@b#c"TG_(Gn"4G(h B4G(b23bÈGb#L"4GH_Cb#@I$4GG!D pG[@ZkD GD TG xDDP@BGGGb#4G $_(XD Gb#4G4G_GCb#@$ D Gb#G4G _Cb#@ }]G=GXb#@ĠXDDG4Gb#0@@XDG¤GG4Gb#_GgG[@ZkGG4Gb#8 D _Ә4GGb#0@j@XDD4GG4G)0b# p.P"t2JSrJtFp>v_CGl"GTG$b#_GDGTGb#J& $""_G?"FgG[@ZkXDH@¤4G"$ 1!@0D$G Gb#,_ӗGb#GK_Ӓ?$&Ơ! G0Db#D"D4Gp_䳀4GP"ǰi0¤X$ )$d Ihx}t@p=G[H=P=X}`]@ZkG3G@hb#G4G4GGG_ӠC $$D3 @GGPb#C Du_C+G)@嘮b#4Gv_xBGb4G_Zk C G@"4GGb#_G G b#G 0`Au_ .q HTGP JF >G&b#"G_(B0bG4G_ZkGG@b#Ds_@H}hp=P]x]X}`=dD $ )Ii GGu[@Zkb#@8 G(ݤ0G8}G]]ôc}ݤ=]}#k#4G~^^~ (0޴8@H>P^X~`hG8GѠGP[GGX{G'G|_ZkC`"G4Gb#g_("0B@1 B`!BGGG " B!B0B GGQ B0B_@`@ 0 GWc@ 4GGF%Ģ b#F CG7,7H8D' I f c_Gb#CCK"GGGG3_Ӡ⤀B4GbTGYZkG)?b#%@Chb Gp"k `) Ch@GG]]} (0ݤ8@H=P]X}`hp#kG#~^^G;G0G!GGb#_C"0BG]] #kG#4G~4G^^G;GGb#!(D _Ӡb#"@  !1 @ G]] #k; F2 BTG!"Cp#@2F Ft F ;A?@!!HSB!BB!C! 4FG6BY.YJ9..9JWJx5J0 CF>0BY.YJ0 C_5.tUJQ5J4F5>0B.JF5,A5H5<kG;{!0311 B3k#~^^~ GX{G0"B GBGb#_C0"B? B4G(b^ZkGG]]} 0#kG#G~^^~ (0޴8G GGdG[@Zk]"GTGb# 8)D 5 _G4Gb#G4Gӎ_ð#G"vJFXF& qtF`Q@F @GW"8b#TGGV_C4G 4GG " TGb#p_dG[@ZkGGGb#4G-_G]G]} (0ݤ8@#kp;4G! k  Gk@$Dk#4G~^^~ (GGGqb#_C_G`@b#GTG_ cGG]]} (0#k4G`#~@^H^P~X`h޴px>^cGG~@0CGGGGGuGs GG{#@`DG8?"GFb#GGGG_DG&0b#"4G_p"  DCIF G8BGcG"OZk@BCHb4GcCYoZkAGGGGb#_GGGGb#_3*`X`D x`D.`ƠG? GD) GGG#tGGGGb#_fG!GGhD`GGb#_tGGGGb#_fGGhD `D4GGGGb#_IcG@]H]P}X`hݤpx=]#kG#G~^^~ (0޴8@H>PG{Gc[@ZkH( GGHb#r_C%<Gb#4G8 s_pB@xb4G\ZkC"G4Gb#_ C_G Gb#G0Ar_ .q H4GP JF >GXb#@_CGFBGTGpZkB0@ B"=rZk`BhbGG\ZkC ȰGG8b#1p_cGXD[@ZkGG]]} (0ݤ8@H=P`#kG#4G~^^GGG8xb#f@4GXGGX b# D05 @G]] #kG#~@^H^P~XG8;G({0!CQBG1Y X@FUTFQ3GGԢ6GԢDOz6aK`@@ڢF6Ky`F0QB7B2 .G:GGwF2pF-4?6KY@: D?F@GGGtD`4 1D 6Jp`; D?4GG@]H]P}X`#kGCGTGb# _P CGG0Cxb# ,?F HD@&c"c #}_GG#~^^~޴GGG_GGG_GGG_Ӳ @G@GGG(F@" DGG@!TGb# &"_DG b#DCG4G0_XBCGG1oZkG@b#CtGGG_G]]}ݤ#k#"~^^~ (0޴8@H>P^X~`hG8{0Gh#0 @#ŠGGxb#4G_C GGGb#4G_ ? @.& 0@GJDHDD?@ G(b#GŰ4G_G@b#CGTG1_ø!@@ !E?y$AB!A Ű28s'AG4GC8s[@Zkx D á%A" (GŰ1"QG" b @Gg.k#`.JxJWJF>'K/.[K9 qAKPJF>f"F.0@)q$ALSJIA=GVA"Eb֢!{yB)aG& EG b#G4G_? @G1@G4Gxb#D E,1 BG _¤(BG&CD AfF!,@GGXpZk C6qBI)A 6A.#0@LJIA? @A@Űk"0.B.&@@0JTJu3J!F>GP/t(JGZPKP?Gh/.hKWJxkKb#F>  h.ShJtFh> @ Gh-wHKhI wEh=#8EXC,8K@C.tGB.JbJPBF-mZkxb 4G,&@P"& C `G!b#T"4G _ GL ' 0 A gl"GH¤GGb#Ơa_L 8IE@G G, D& Ele"àGTG`k8D,@b#aI`_pB"4GXb#J) @)(A7 A @Š4Gb#V@Šb#@b(1Ak`k @G]]} (0ݤ8@H=P]X}`hp#kG#~^^~ (0GGGGGGb#4G/_C GGGPb#4G_ ? a@C"$#.0`@aDE2JHD?D?ؤD0B4G2GD0btG4Gs"G0"tGv@P"yG]]} (0@#k#~^^GH;GP;P{#1!1D @P"tGG]] #kG#~^^~ (0޴8G@GGGGPb#4G_C GGGb#4G3_ ? a@C"$#.0`@aDE2JHD?D?إD1GGPb#4G_C GGGb#4G_ ? a@c"$C.0`@qDFSJHD?D?Dp"G$Gb_"Gr@b#GsGTG<_pGФ `@p"G E@G1"%q@7@0QpGtuG]]} (0ݤ8@#kG;G[1k#~^^~ (0GpGGGGGb#4GG_C GGGb#4G_ ? a@C"$#.0`@aDE2JHD?D?D4GG"P0à"Gs@¦vG]]} (0@#k#~^^~ (0GGGGGGb#4G_C GGGb#4Gm_ ? a@C"$#.0`@aDE2JHD?D?DG"0Gb_"4Gr@s"uG]]} (0@#k#~^^~ (0GGGGGGb#4G_C GGGb#4G)_ ? a@C"$#.0`@aDE2JHD?D?D"tGG1"qQ:اD0GGGb#4G_C GGGb#4G_ ? a@".0`@tDEJHDD?DG4G"P0"4GGs@Բ" G"TGGw@X#8b{G]]} (0@#kG#4G~^^~ (G ;(GG0."  b#C0J?DF2FF $FG0J0FJG_G(b#CGGtG_bG]]} (0#k#~^^~ (0GGGGGGb#4G_C GGG@b#4G_ ? a@C"$#.0`@aDE2JHD?D?D "GG1"qQ8D.GGGb#4G_C GGG@b#4GW_ ? a@".0`@tDEJHDD?D G4G"P0 "Gs@" "GGv@7"@BzG]]} (0@#kG#~^^~ (0GGGGGG b#4G_C GGG`b#4G _ ? a@C"$#.0`@aDE2JHD?D?D@"4GTG1"qQD@G4G"ղGاD@"G@b_#4GGz@;{#`dG]]} (0@#kG#~^^~ (0G0GGGGG@b#4GK_C GGGb#4G_ ? a@C"$#.0`@aDE2JHD?D?xD`"GG`_"Gr@tGG8¦TG֢Gb#w_`䳀eG]]} (0@#k#G~^^~ (0޴8@H>P^XG(GG$ ;fp8"4@4G 0"i0BGGb#4G_C GGGb#4GG_ ? a@#,"0`@J0H`DGI@EKE?PA"GGhb#4Gq6_GCb#GTGp_G8AEX% hB@@Apb4BGD  iZkL0BG xDEG @Bb#Gİj_jG? a@"qG]]} (0ݤ8@H=P]X`#k#~^^~ (0GPGGGGG`b#4Gk_C GGGb#4G_ ? a@C"$#.0`@aDE2JHD?D?DTG4G"P0À"TGtGs@Բ"wG]]} (0@#kG#~^^~ (0GpGGGGGb#4G%_C GGGb#4G_ ? a@C"$#.0`@aDE2JHD?D?xD"TG1"QGDbG4Gs"G"Gv@""yG]]} (0@#k#~^^ ~(08޴@HGGۤGG GGGb#4G_C GGGb#4G 8_g@#.C"&0`@G2JaDHD?DD=b?DFs3 XF'@%` FCGpb#@CG8F"G4GPb#'HH!J$@ q_G&hb#C"TGG_0@'HH'H Gg"hb#G`TG7_g@8D¤G&Ơ"hb#GTG`(_4GDGDŰ`G]] }(08ݤ@HP#k#~^^~ (0޴8@HGGGGGb#4GI_C GGGb#4G_ ? a@C"$#.0`@aDE2JHD?D?XD¤BY"bTG&RG @b#sG_GGb#4G_C GGGb#4G_ ? a@"#,0`@`DG0HHDD?&DbGQFG `b#sL_ӻDDGGb#4G_C GGGb#4GY_ ? a@#"$.0`@aDGJHD?D?XD&"G&b#X"qGTG_GGGb#4G_C GGGb#4G1_ ? a@ ,0`@eDGHHDD?XDGGb#4G_C GGGb#4G_ ? a@c"$C.0`@qDGSJHD?D?D2"1 $XD8B Hrt0`BrGGGb#4G_C."0`@GGJuDH4GDDx?Gb#_t? a@ GGb#TGph"_e@ƠG"@"DDD"4G4G1"qQ G"4GtGt@"ղxG]]} (0ݤ8@HP#k#~^^~ (0GGGGGGb#4G_C GGG0b#4G_ ? a@C"$#.0`@aDE2JHD?D?D"G4G1"qQD¦GG""Gw@0BzG]]} (0~DCC.BCK< CC_DISTRIB]DCCALPHA.EXE;1g%u|@#k#~^^~ (0GGGGGGb#4G_C GGGPb#4G;_ ? a@C"$#.0`@aDE2JHD?D?D0TG4G"P00"4Gs@P¦vG]]} (0@#k#~^^~ (0G GGGGG0b#4G_C GGGpb#4G_ ? a@C"$#.0`@aDE2JHD?D?DPBTG2GDPb4G4Gs"GP"TGv@p"yG]]} (0@#kp#~^^~ (0޴8@H>P^X~`hp޵xG;G@GGTG ; DFTG $ H{#$D$H@iG[@Zk H`Bb#HJ!A B!+q$@|@iG[@Zk$ GDF$DaE   F ,Ib#Ii@iGG[@Zk GGA!IE'HP@35@3aJ-qBA $@`B"`-QA_Gc`$%IG6H$D\ kA6Ib#  F`~@ GAAb#w@G%Hb#6H-I AnAGm@EôSAG b#G4GE_CGb#@ED FXD2FA FTG- D`D9XDD5FGb# @iG4G[@Zk DxE G E ,Ib#I@iG[@Zk GA(IIH A(qA7ATGTE,Ib#I@iG[@Zk@ GÔ"Gb#@ EAD娕AdլAD GըAD EGE,IJDIb#@iG[@Zk@dEEEEE G  GE EG G"G Db#Z@,Ib#I E@iG[@Zk GGXDĠ!Dİ`DġI E` PE@+C`b#@) `(E'1@b#@G]]} (0ݤ8@H=P]X}`hpݥx#kG#~^^ ~(08޴@G{G"chaGY bGGb#4G_C GGGb#4G T_@.$ 0@FJDHݴDDD=b?DXFs0 XF%@#` FCGb#@CG8FGݤ`b#4G&HH!J$@ +_G&xb#C"TGd_ݤ@b#&HH@G xb#j"GTGV_@G[G@Zk H@b#H@cG[@Zkxp¤TGG4GƠb#r_Ӡb#@GG b#d_G]] }(08ݤ@P#k;01BkG#~^^~ (0޴8GX;G!! &B%Fu@@KG.BHm &BB\@CkGG4G(b#]_:8"4GG(b#!U_2 bGp(F¤Gc.tCJ" ScJCtFc>0b{0K0Bd !?DFU/ZPK[GU?!'HPb#'H@G0@& .rJQ J2F >Ga.SaJa>( G]]} (0ݤ8@#k !A4@!PA5@!¦A6@!@A7@!A8@G!BB Z:Bû%B! `$Fp'BD?C4 ò9(B_q7BCG#~^^ ~(08޴@HPG GG>GGG0b#4G_C GGGpb#4G_ ? a@#".0`@`DEJHDD?0@0JG=BAG_1@(b1!JpGGCsAb# @4G`t_Gb#CGTG9_P4GF@GG0b#4Gy_C GGGpb#4G!_ h@#"$.0`@aDEJHD?D!@!!H0@=!@ y@?"q@qp!C h"SBQ."0@BUJSBJ2#DG/0@BXKKDH#2ZBAR"Gr/RrKGJ2AJCPGGG0b#4G1_C GGGpb#4G_ ? a@#,"0`@E0H`DHDD?@Q@35@13aJ1q$B"B@`B`1Q#B&H"@@4GF"v@GGG(p4GGb#xn_GCb#GTG_x4GP(1`@ǰ4G@DD@("pGG!TGb# p&"_P4GG-`HHIE=]G] }(08ݤ@HP`#k0.0B,0J;H0 @1"A.@@01BAJ0 @2GJGJRQBR2qDB@kG#~^^~ (0G`{G 4c C@C_b#TGG_GGb#Gb_!@p @C1FCWJB@@_ bG]]} (0@#kG#~^^~ G{G{# # c  _G]GC]} 0#kB GkF[ ;R!2DCkG8;tG1"PB PBkGp#~^^ ~(08޴@HP>X^`~hpx޵GPG(G GG !=(! 4G 4G!_b#_-C"b#!(@7 @C( _GC@TG@.s1HHXb#RQJSF@>0 B_TG@b#@.WJ> "8,Y/GA8HYK9#pXK0D8<,Y.q/"YJeTJ[tKeGq?lG8BbZk5HGAA10A4GBBGG1dZk"4Ga[@ZkG `G=Gġ4GE%5GGEb#HP.s0JbRPJ(SFP>'Ol_͡b#Oc.A"7AB  4GE_4GXb#_4GgġenA8`DkD`'%tG GP8 D P.GPb#RPJP>eG=StBSB_Mݡb E-I!ݡ"ǰȱ =G]] }$(08ݤ@HP=X]`}hpxݥ#k;! 0.P"0B@2JHkP#~0^8^@~HPX޴`hp>x^~޵G0G4GGGG@b#4G)_C GGGb#4G_ ? @.'"$0@HJDIE? E?A"1"QA1!F?_"@XE`K`0bG!@¥TG"8FI@( GĠ b#e_$ b#Ţ E H-0@BH0B= _8"GH"! 1@ q[h!@Zk=(}-= ]İg0 -MIG0]8]G@}HPXݤ`hp=x]}ݥ#k#4G~^^~ G(;GGa7`C [@Zk b#8"0!D G@G]]} 0#k;!! 0  Bq.tJ0 BSqJtFq>AkG;; Fk#&~"^4G^~ Gp{GGb##4Gc  s_CG]]} 0#kG#~^^~ (0G@GG$ &DM D خD @G4Gb#pdF`_ @7@ 4Gb#_4Gpb#_G@D@@@D@`D բ61BղG(w[@ZkDc bDXD D xD 8D@D41B@(¦Gv[@ZkG]]} (0@#k#~^^GG{#q_Cb#@G]] #k#~^^~ (0G8GG;$ 1 D; D(F[0FRC_FD@Fb#%!'H'HP_C/# b#PAKJI_#,C"EJ@0bTG#H_G:D(B #.Q2J'JDZk#,#H'D H@(BTG0b%HHDZkdG4G[@Zk,HGd"#,0`@4G[P0HJ@Zk,H#,c #H0G]]} (0@#k#~^^~ (0޴8G8;GG0;!1 QB10F HBGPb4GJZkXdD  kDGd4G[@ZkdG4G[@ZkD ¤G(4GfC[@Zk,% 0@e"@HHD.JE.0@RSJGJCF@.J G f$@D@Y [4G.PJJ@ZkGGb#4Ga@_C`fG4G[G@Zkfe ,0@4G[PHJ@Zke,eHG]]} (0ݤ8@#k#TG~^^Gp;h[G!RG @8b#D_Ӑ"4GG]] #kTX X Op0Ox :0 : : :pOx0O :,O,0O02PO: :0??0O?OEhFpGPOJ :PQ :TO T0O `03x:ChQpRW<@  P`@0`+ 2`24`567>??? B0BBBCD@DDD E FpFFFFGHHJJK@LMOPPPQ@R`R0T V WY@:pQp#@.P.../p0X @DECC$SHR@LIBRTL@LIBOTS@SYS$PUBLIC_VECTORS" DCBLKDEC C V5.5-003 represType ( $((allocBlkStkElt( xH xallocDescrIdElt x x allocSemanElt x8 txh baseNstLvl  cmpId1       8X curIdName8  DH enterBlockH:      d 8 enterSymTab $ $ $  p8 enterSymTabHC8 ) 2X xenterSymTabHC1 7 7 7 7 7 G G G G I D I , X exitBlock \ b \ b g g j o oY sZ t] t] tZ   w z w y y y y    | |                                mg     &   P`       (0  freeBlkStkElt0  ( T (X freeDescrIdEltX  ( | (  freeSemanElt  (  ( ( getLitString       PpgetNxtStrLitCharp   o PinitBlkg         $ p initGetStrLit1 " & " ! $  `!`initGetNxtIdInCurBlk / / 00@0H initSymTabH 5 5 5 xPnxtId < < =0@ptrFreeIdSpace B B  searchSymTab( F F F F8 L`hsearchSymTabHCh8 Q K K K K K$  00stats0 U  U ^ f g c b ^  m v  .   @t / / / / / / `pstoreLabelName                   @ storeName                 00  hH storeStrChH8     p # DCDECLDEC C V5.5-003 represType ( (` isSameName h$ \hpprogpH       !$ t(decle ( ( ( 0 1 6 6 : : : :$ $H attribH? ? ? ? C C H(x (  typeQualif(A N N S T X VT Xdecl1 \ f d i m                   " !( t t t u  x w  w x z {  $                                      %     % % * & + - - / / 0 3 3 9 = C H K L S T T T V ` b h \ < H$ k p t z               o>                        =      T<                       3H(4 nativeType(4              /      `4 56PdefStrun6=     " H6 66enterEnumTagName6} ' ' ' ' . 4 6 6 7 ; = @ $7 88pX8declIdX8 C C K K P N K K S U U X Y ] _ ^ _n 8                d e f e h h h l h r s z z                    (     {M  =% % $   P8 W8 W8 W8 W8 W8 W8 W8 W8 HC@ Cdecl3Cd         8C C hEEdefFuncE     % ' ) , 0 7 < < < A A B E H H N N N N N R V V ` ` ` ` ` ` f f g g f j k U T m m m r r x                b      !   LF E E E E E E E E E Op P  initOrSizFldP             F       0XP P P P RR initR                          P    ) , 1LS R R R R R  WXWX nbBitsXWU 5 5 : > ? @ B E$W XX declObjX L  L  O L N S P S R P Z [ \ \ ] ] a a e' f( j m n m m m m t v | | | |                                                          <HY X X X X X d e  allocDeclElte )8e |eepallocTagListElte ,e ef allocTypeEltf .x8f tfxfallocTypeEltICfT 0 5 6 7 6 6 6 6 6f g0g allocTypeEltID0g8 ? D E F E G \g gg checkPrivVisiblegK K K K K O O Q U,h g hh@ checkWrngHdrFilehJ Y Y Y [ [ [ ^ ^i iih  compatTypei i i n u v x } }                  ܁                                                       tJ         Li i i i i i Ds s@  accumulateQals    tt arrQalt  $t4t(8t chkEndAccumQal8t   tPt  compatTypeRt:   " ! &4t t uHu( sameQalHu * *\u xu8uh  computeSizeu2 1 1 1 6 8 u Pvpv  createDLEltpvc = = I K U X V Z v ov whinitCreateTagNamew  createTagNamewG e e h h m m m x w xxdeclTypexB t t t z |  x y8y(defineIdyU         (z zz  errAlrdDefIdz0    4,{ {@ |  errMsngStati |R        0d| }(~H freeDeclElt(~ ( L~(P~ freeDeclListP~   x~ ~h~freeTagListElt~ ( ~(~h freeTypeChain~ ~ P0 freeTypeElt0 `  0 freeTypes0=      X getINDEXTYPEtypeF    4   < Ё8initDeclЁ b ρ ؁( isRepreType"   $H( makeGeneric(?       P  manageFctDPrags      " ( + , . . * )P 8 = : Q Q Q4X   ,P` procExtent`f V V X [ ] [ [ c i _   _ _ X procIndex? p p p p r s s  (H procMemberH. w w w wx x procMember19 ~ ~ ~     (H@ procMember2H  \ xHP rowUp4     ԉ܉  sizeOfTypeD 4      T  @  cleverSkipTok /     D tstPtd  !                ԋ   H`" DCDIRDEC C V5.5-003   isSameName  h< th manageDir   $  $ ( . . / . . 34 <. n ^ a Y  e f g ; C C G N R S S u t | | ~     D     0`otherDir0     /                                    C  4  4  4  ? ? A @ 4 4              P   ! " $ &8x / / / / / / / / Ȟ h expandMac J J O L O L S S S W S S S S ^ _ _ l g g g g t t t x |   ~                  )  , 4                              ;     PX      88 getTokFromMac8            ! " ! " .* h j m k s v { {                             > > > > W E W X X Y \ G H G E E L L L L1 L b b beD 7 7 7 7 7 7 7 7  ذ checkConcذ{             "( װ װ װ װ aloneInNoParMac=      (checkCondStkAndDeleteMacrosO        (ܳ  PxcheckDirx   شxcheckSColAtEndMac1 $ $ & ' ~DCC.BCK< CC_DISTRIB]DCCALPHA.EXE;1g| ( (Xxh checkSpeFcth^ + + A B A8 D D G V  g  @createMacroHeaderh [ [ [ [ ` ` j j n n$ | curMacDFName v  embdMacro { ĸȸerrMacȸ1 ~ ~ ~ ~  `( errMacCall(   H lX errMacDef (  H evalIfExpH               (| xX` exitMacro             $Ȼ   exitParam 8       tXx8freeMacx2     8 freeMacSto8                              ,t 7 7 |p frstConcFrame  0 frstConcOpndV    !  % % +$  XisMacParI / / / 1 1 1 1 1 <X macActiveX = : : : M N S L A H C Y Y Y Wx manageJmpTok a ^ a 4h8` nxtChFromMac8) m j n snxtCharOrMacTok v v                           i         P<   8 peepNxtMacTokU            popCondStk B       0 x`@ popMacStk3      procCDefined   (00` procDefined0   X0` pushMacStk`}            |  8@ restoQuoState8   P |X!skipRestOfLinePhase4+     PP storeFileNameE          H( storeMacChar(6 " " " % $(\  storeMacChunk - - - - - 4  ?  @ ? D D  I M IE J M M Q Q R4X  storeTok W W \ Y Y _ _ _ a a e f gn r u w \ \    \( \(40  0(PvisibleFromMac(2   ,  \ pallocMacStkElt x Txp0 freeMacStkEltp ( (XallocCondStkElt x xpfreeCondStkElt ( 4(" DCEXPDEC C V5.5-003@@ isSameName@  h\ h represType ( (0%boolExp_ `  `  c  k  m  m  m  r  r   x@/ correctExprN u   u   u    u  u   u   u                                                !   (    H( commaExprH   $p 'asgnExpr        !             (                         !  '  '  '  )  )  )  6  S  R  ]  ]  `  b r i  k  m  x  v  x  v  v  v  x PP    H(condExpr                                                   P       D ,       80/ computeCond2       (term0      ((term1(    L  -computeShortCircuit   )term2n                 $  #    8  `  / computeIor  ,  8 @P)term3@q /  /  2  2  2  3  3  3  9  9  2  8 ? ph/ computeXor C   )term4g F  F  M  J  J  J  J  Q  U  I 0  8h/ computeAndh `   )term5 e  e  g  r  h   p  j  h   n  k  j  j  j  p  p  p  w  y  y  y  y  y  {  |  z  h  h H   X)term6X   %   /                       [           / 0L W W W & sConvToType   0 % uConvToType    4HP8X& computeCmpXC        t W W  *term7  "   !                                          " #Ld   (. computeShi(U    $  $  '  (  - $T ' <8`p*term8` 5  5   B  8  :  8   ?  ;  :  :  :  :  :  A  A J A  A  O  R  R  8 D _ _ h- computeAdd" X  X  Z  D`- computeSub`C a  a  c  c  i  g $ _ 8*term98 p  p   |  y  v  u  x  u  u  u  u  u  u  { N {  {  {  ~     s D 7 DP. computeMuln              (. computeDiv#    D`. computeMod`  (  +term10                           (  j j             (                     !  !  6 @ A ? ? ? F H   (( , ,* ^ ^ Z Z Z           ~0 ~                                              ! " ! "  # " "  ( ) ) * ) ) ) ) ) ) * ) , - , 6 ; 7 : :  : ; ; < ; < > D F F U S S U U S Uz U Xv Yw [ [ ^ /0 a g e e m m p p 1H ~               q q w u u v w u x y z {                           m m?                    Ph                                                      P''& finalizeCast'I       $' t((' manageNumCst(                                      ! ! # #  + 3$( ( ( + +, primQualif+ 8 8  < K >  < >  @ @ D D  T T W Y Y ] ] ` ` d  r h f f i i x ? < > @ A E I I I M R Q S S S V U X Y U Z ` _ _ c b c b f g g g g g r r t w ~                                                                                                       " # # ( ) ) ( ( 3 2 4 3 4 2 3kP , + + + + + + + + + + + + + + + + + + + + @XA`& resulIncOpA5     $DA LB`pB # specialCaseOppB                              8                               J          #  "PB oB oB oB oB oB JhJx$advInTypeChainJ& - / 5J HKXKallocNotInitVarEltXK 8xxK KxK$arrToPtrKC : : : B I K K K LL! authzdTypeLf O O O U S \ ] ] ] _ YLMMHM8'checkIncldFilesMm b b b d d d d d e d d d g$N NOp" checkInfoLossOL l l ~ ~  $4O O 4PPXP0 checkInitXP{            (P WP Q`Q8$checkNumCstNamedQ*    Q HR`R# checkPureBool`R!   R RR$checkSideEffectRZ         S 8ThXTcleanExprThingsXT   |T ThT commonTypeT         -           ( .Z 9 9 : : < < # M8U T T T @ZxZ  compatNumTypexZ S S X U U X Z \ [ [ [ [ [ [ [? ` ` i j k,Z \\computeCstType\A y u u y |  ~  ] \]ph]pcomputeLstTypeh]L          (t]]]]]]^^^- computeSigAdd^  D^L^8P^!copyTypeEltNoOwnP^3     h^ O^^^x^X$ errCompoOf^+    4_ _@`p!errExp`<      (P` ``P"errOvfl` ` `8aerrOvfl1a;      ggxg-initExpg C hh% insertBoolhD F F F H H I J       (8u v(0vmanageUsedForIncOp0v?  $ " ! ! ! !Lv vv0  modifPtdValv] ) ) + / 0 1 0 2 3 3$v  x`0x`- procSameType0xT 9 9 = A A B B B F$\x yyP% relOpTrtmty+ J J J L  z hzz"resulExpz T T T T T c d g h j j j j ly q q q s t u }  L{ ~h~& resulUnOp~b          $$ ~ ,`P" sizeOfTypeIPb          8 Ё$ transfOpndЁR          px typeToS2NoQualx1       valueNotUsed&    , % verifCstOvflM        $؃  ,P% warnCstBoolP(     ̄#warnNotPureBool*     P! warnOrErr                 p" DCEXTDEC C V5.5-003p/ represType ( (!initAddLvl0InclFName6addLvl0InclFName9 , 0 2 6 7(І `6 allocChunkG ? ? ? D F F H H ,@/ bufLongToS@Q K K K K Q T U Yh (2 bufNameToS( ` a tPx6 charToHexSxE j j p n p p p w 5 decoratedName x x                  A 0  8 ,H      `6err0   , 8@P86err1P9 Y Y Y W W | O H5errId   6errId1  0 88P5errId2P  p P5errId3  , 0x5errIlgDP0'   : \ / |h@5errPanic    `5errUslDP'   / $  Dh`4 errWFName`               ( Ȕ4errWN    8`Px4errWNSSP   xȕX4errWNTȕ   884errWNTT $4 Txx3errWSx(     @4errWSS   Ԗ ܖ8X3errWSSSS7 " " " & & &$ \p3errWSTTp * * 83errWSTTS /0  P3errWTP 4  O h 3initExtA E G ) E F ) )   H2 isBodyHdrFileC M M O Q R R0 S4 HH2longToSH X X ]l X/longToS1 ` ` fě X2nameToS i i ( p1putList M q v q s w x4 v,X  \hp2putSeman7         $ t 0 putQualif3      0H82skipPathHT   ~DCC.BCK< CC_DISTRIB]DCCALPHA.EXE;1gp.       | ԟ1 strJokerEq4   0 ( `0typeToS                       " $ '( * 4 ^,آ    T0putIdent C A A h/ putString H 1typeToS1 X$ x1typeToS2 [ " DCFMTDEC C V5.5-003 7 represType  I ($ D(H08 initFlwgSpeH' ]  ]  ]  `  p `7 folwngSpe c  c  h   q    j  n  o  q  p  q  n   x    +                   $   2   8 14       Ա`7errSpecE               0  P7 storeSpecTxt0          Ltxx`7recordx.    "  $  гp7convNb. '  '  '  /   ȴ# DCINSTDEC C V5.5-003`8 represType ( (X> enterFctBody                        @h (Ph`<blockh?     !  !  #  "   : blockDecl  *  *  1  1  3  1  1  1  1  1   1   <  > N F  G  F  G  G  G  G , G  I (d PXx8=stmtx L  N  P  P  V  V  `  `  `  s  u I0 \   l  }  }  }                                                                              !  !  !      $  0  C >  <  E  H  H  K  K  O  R  X  [  a  g  h  g  w 8 w  |  {  |  { PȺ w w w x x x x x w w x w w (< allocCaseElt x( dxinitCheckIndent9 checkIndent                ,   $P;checkNotInitVarP.     t '09checkNotInitVarAndSuppress9       `8errInit5      `x9errInit1x  H< freeCaseElt ( (8freeNotInitVarElt (  (p8initInst M   :isLabel !   < th= manageLoop             b              $ p; prntzBoolExp5       $  & ( ; processLabel )  )  )  +  2  4  3  3  =  ?  ?  ? (   0>subStmt D  L  D  D  L  J  L  O  P  R  V  V  V  Y d a  _  ^  a  _  ^  ^  ]  ]  ]  ]  ] 4 $# DCMAINDEC C V5.5-003ITRANSFER$BREAK$GOImain                 -        7                         C "  ) * 2 2D 8 = A E D @ @ D A E G D @ K K q t Q x V \  o  -    e d d dLp           $pD processCUnitp o o } o  o ~ } u                                               Y       L o p o p o lH KallocInclStkElt x x0>changeStreamTo0,    $h (Achecks6      hC copyDirPrefix8 # # # + + 8 FdispUsg[ 3 3 3 3 3 9 ; : <  G initEmitC) M M N M M 8?emitC S S S X Z [ [ \ \$ \ ` c c f_ i l 4 n n n n{ q t<d    L emitCstWdthCh/       0P?emitSP   | MendPrgF1     (initErrLerr                                                                  %] ! ! $ $ % % 9P        h`HCerrExit` G K| _ h?fatalErr M M P  8XXBfileErrX U Ut |8`? flushAndExit Z Z X(CfmtdMsg ` ` (X@F foundOption@ k k k n p p t u r r | |@      q(x ? ? ?  @ hMfreeInclStkElt@  0 h 0p C getNxtArgx     ( 0 G getNxtFName0 /    `    8G initAdjFiles |            4\        initAllinitMain8L insideInclude8  DH8@intrnErrH   t C isDccOption  \h`pB isHeaderFilep4     8C isSrcFName8  H h8pxMmanageEndIncludep   ' !  $ $ . .  ? B C C G F A I J K C F D : 6 :E S U U Y Y ^L o o o o o o 4L manageInclude b b b b b g k i i j i k l k m p p p q q r t t v y x     P                   Y        L          XF mngOptListTokXI           FmngOptMsgLimit #     P8XFmngOptStopAfterMsgX"    |@0F mngOptVerbose2      @@K nxtChFromTxt*    , tJ nxtChunkOfTxt  (  ) + - - - 4 B  K1 N N N P      !!CopenSourceFile! [! !X"xBopenSourceFile1" ` ` ` ` c d c f f f j k k l j$8" $#HH#@ prmtrzMsgH#O t t } }    ~(# $$C resetArgPtr$"   $ %8%`KsameLowerCaseName%(   0 X%  '@X'0K saveTokCharX'  'H'L searchNxtNL'l         0' 0)`)Ksplice`)                $) _) _) *x*E storeDMacTxt*  +@+>sysErr+   8+ @+@X+HFwaitAndAnalAnswerX+4     + `,$J__main8 # DCPRAGDEC C V5.5-003,M isSameName, h, ,h,`SdpragMet, w w w w y y | y y }    9     D8- , .H initWarnMngt0/R manageDPrag0/                                   " " " " ' ' ' ' ' ' / . 0, 4( 8 A4|/ // // // // // // 8 8PaddTCB8 J  J J J  P J  M$ V V Y Y o o8 X v v y xDD9 8 8 8 ;xX;O allocTCBlkX; xx; ;x;O checkEndDP;3     ; (<p@<OdpName@<Y       d  ?< (=0=N freeTCBlk0= ( T=(X=NfreeTCBX=)    |= W= W= =>Q getTypeIdent>                 8> = h??NinitPrag? & ? ??P intPromotion?  ?? ?pNisFNameVisible?5     ? (@P@0QmanageTCP@           $   @@ BBQ procPrivToBs           8C B B B hDD8O skipToEndDPD" % % %D DxENsearchTCE . . 3 3 3 5 = G G O S WK Z ^ ` 65 B A& i i   >  @  @  C  G  F  F  F  E  C  G  E = L ( P  ^  ^  r q q psptT getEscSeqCharpt e  e  l  p  p        D     (t ot ot ot ot ot hx xWhCodFctx    xXx0Y initKeyWordsx8      (y yypYinitRecy!   y y z`zUisAlfaz$    $zHzhzXpzX manageConcpz                                           <z oz oz oz ~X~W nxtChFromConcX~  |~("~XpeepNxtNonBlChFromTxt~    ' / 5 3 2 0 2  0 5 5 5 8 7 7 7 : ; : < < @ ? ' * D@~ ~ ~ ~ Ȁ`TputCh G G G4 |X putTokChar O Ё@؁SrestoNormState؁ T  U semanErrNbB W W W W W Y Y ( HphWskipTokhe ^ ^ k k `  l m n$ g ܃VstoreTokSource v 0HinitStoreTokTxtHU storeTokTxtHm       (    $| G ԅSstoreTokTxtReprV        (,   `U syntErrNb"    8p% DCRECDIRDEC C V5.5-003% DCTXTTOKDEC C V5.5-0032[ex  248tP\l 8X00D:& H\  P@p\p0,p PkV @8]@@0H@P$` PR#_pp/((0@P`p0@Pp @P`` 0@PphP0pP0``( 0@ p(0P  7`@8 %`8  ,xp@x& |R`m>PP0 00` ,MP(@h`@`0& H?XS (0PT(p19*  @99*@ ,Pp *[DCC_DISTRIB]DCCARTICLE.ASCII;2+,.Z/( 4IZX- 0123KPWO[56I /7T89G(HJ  1Disciplined C (version 2.1h)Yves L. NoyelleQcole Suprieure d'lectricit, Plateau de Moulon, 91192 Gif/Yvette Cedex, FranceE-Mail: Yves.Noyelle@supelec.frAbstractSome proposals to render the C language a truly high level language are presented, as well as a program verifying that a given C program conforms to those proposals. IntroductionWProgramming is, as every practitioner knows, a delicate art, where the main problem is not so much to obtain a "working" program (which is mandatory, of course), but to have designed it in such a way that it is not fragile, i.e. it can be modified/updated/debugged without breaking down. This means, for example, no (manual) duplication of code or "parallel" data (because, should a modification occur, the odds are high that the duplicate(s) will not be modified), or, more generally, that the programmer has dumped in the program the constraints set when he wrote it, so that they become apparent.cIn order to attain these goals, programmers need tools. These tools should be as easy as possible to use, while not hampering creativity. "Easy to use" means that the tool is explainable (so its use is systematic), natural (it does not disturb common sense), and recognizes that human nature is fallible (so it protects "gently" the user against himself).Among the tools that allow a programmer to express his ideas are of course the programming languages, and the compilers that go along, with their warning and error mechanisms.kOne programming language much used these days is the (ANSI) C language, probably for the following reasons:#- it naturally supports modularity,- being very close to the architecture of most current computers, it can express a wide range of applications; in fact, it is often called "the portable assembly language",o- it offers many representations for the integer type, which permits the best possible use of a given hardware,]- it offers a powerful macro mechanism, which can be used to prevent manual code duplication,d- the 'include' facility also works in the same direction, and allows some encapsulation of modules,- the block concept makes it possible to minimize the scope of identifiers (which is always desirable, to prevent overflowing the reader's mind),- it comes with a large set of predefined functions, allowing the user to easily implement exceptions, dynamic memory allocation, and so on; moreover, many system interfaces, such as X-Window's, are meant to be used via C,- it is quite portable, along with its r < CC_DISTRIB]DCCALPHA.EXE;1gGp.CvCj7bKIxihΆ99$Ip?0i,3mXS "#/ou/أ%%MD.vqWgY-]3w,)B%a9I=xF jC%P3ǚePuGY˧ߎ0͈}x=+o9cԃD>CW-٤[JETȵ-儔O/5E{[__:J6mtUÂJE)P^?Ht^'P`WrаjO " YB䶄뾟XuzOƘ>T[Gwds[NϘ(!~nw:0[ Z18b;ʣ(cb4&UL_3"SU pHskn[Բ.dzNsZ2%s!NJEbrR `S9NDUה4padnL3iyJYW|/@>0:%rJu~&Q*G<\S[O#\w 9?רh 5o{Zx`eT JOϙuk7c8]]c3=r,xB?*k3(ݒyog_j$ m㣊eVֻEc~%)ҷ:PQ3XY*t0{c5#'5d&@z6I?(b1|M.'O @6Q~ktxlMjԝ??mUҀ - g%N=W1jn(9WeܧtoJ+UYIлy!';j1Ptt@[S\@[\toI}.'jXMՔѪ+D{/=g@ "ܢDNRL8Wn25Ɔ$w^ɃͺpCSo)ڻ?y.CuZv7䉣՝K2%<~Bل{?9Xq>eA{Ӯ_R"">s-D_C:}{&Ѓtt61}"~Kkafvn1tp(LA`7ծ6>Qu|:Ƌt6L%QDlLw|s DǏj |Z\4OӖ`Fّ).qY B޽0ԖŦ${Z CE),8<aP~ig7pdou(ʵpxƛJ𪒴aAܒ鹘`妞#OFL kRTg%4,˧3A}#*y]R}0zB~P>0j p;bAx򓗿!K4HU:/u[Jݨ(ZЦ{Z t@͌̄̆K1Y|3eD,!:I[J҉W.Hs+ )vؖZoM))Bv%">8p c~ٞIn‘I3I[?FPwUn"g-ͳRdjqIyj !%;&v"GlCϛAsrTiҚ~7UܔRZ:>L!48a8PߊAߴgӺgPꎰOK^Z0f2{A~jdkmQHd\!Iѡr\twQ6׌e;>.Z"lHiȡЮe1^t!i">!5ZsZ=,:ʋq;=5U7MZy! CJew.'URr9E/hN-fuGL?)3wtaa8èF8;Mv1LSɁǾ5n%qx:Gdܑ0brAS[ۓ Ă^;kܐ>IgAL wbŜ|2;.>Go`0y U920vO@9Q3g ~%Tdfgyj _9vOvmPr_ftgQ#ElsR#& ̖6>3{ 4CK!5xLSd.BN}X՞w:n" tZ6x=vE7,̡(X%$S6=hbRBN9w-AZKoXo9Ȫ@kpF)R/L5Aw]Uzm8W%ec8|fB6,|_tiėT uil4l>~ X"]m,ь2o3 a|q @zdşėQW5&ڊˠg9fϒq3_d8;n$s!nG=#Q'4wVAψuޢ& LR6L{!aZ` PR*FP X*$W-k1o++E /J1ߢxwagPD8ǚm1ޛ֧*>;aǾV9x@}p7.k4cD3:U]dnF츰D>5ƣA$NKeȷf莋la [q|*t?'LãLQz}uR PR/ 8 ܃\i{D^p?2$yJ (geU*m_bnYiP#D2gqzthh %n;(?#BjPlkp;C.9yu}@v Pʱr\p^[0c.NtX`~s NIk*nBFJmOȢ =9)%6gtc(F؞qXaFZܽ)\Sq7Y[&N ,oOdxNh.B>6cb5-=# *F5ǖd!е:w:ݷ!-Cj#{s$KG0/і(mL%t)kپRP4 *@b Q7JU.'6MVMGpkSK@ĺ`xb\\4;0 P豪f?J~n.magy/᧺I bRn)]W}-1KtUNmRsn"gJc H7Wohe].r& V.O"H> b$F񛞔g0L4cD_͂y`1U$w/"enmdme4 ZV9pfWO5sd.޼͏Kf#`:=JBuKiߌ/t *|ō+0=(x7K_(ZM~4i[ze5VM y:eCZ 6ع=Jj"_NP38K$SAkщt:JgEP{"ux y'|qFd7~%|fm:Co#{Rѯ;덂fwtU- $R#_\G~v6UGh  bDC5'zPӇEwm?WxyYv9,_fЁ [Eb./\}{M^o9 ɣ_+ݠP@7AScGgi'DN#~VD/3=3Ү0e➜B~_ZҚ4we,rJwb&U7e~H"Po>RY;r/%i5L o oxyd5$@ܬkfk )]|ztLQ }vm:οHwy#mm%nxvZΜ: gCRH K.8c-hC٢ BH%␾i9 TU53sEA]" Q#] Q5=p[/s%#a] $?>iZ@)L|z!r>r(m\R~m%Cnӌd'ǙzVUmC9u\?{ֵH$`:5s/Gg%-*R<7 HX{ 0HKCrt-Kx,r;r>_Nsj8uuYvCuimُ/~B$2ޮ3ƉNXݑc~5c臇ys * `Z IN 8T"􈝠LQ1$64l#MR@JI_i2h#gr5IS)_*~-هic\- |q4/F ۚ/zmcXNC|=k8{6@Y{tr[k|N^ߕnD$<9St r"d{8 JdHg*;=>&B),w<\&#_X!o}:z:a`jYۚ~wEw  ȅv&B+sznqgʦYIcā\:+a- #l@"m8հ߄4tV/ɲjH؏+hSp@`y؆"Fd01[6u E:;˽Roy9~O6˥/ YΗ=mδ*!Ti)jlQ=NGW A¯Qw"~kc{ea`Rjf@Sp u[c];2үa-uļ-;F9N%aya:S7Jz׀ q PZ}?k&Yk&<&iw{3%wl]z:zƍ3STc. p²]aRP?ɋ82!k J)phbYiW{/6 aGp&w?{o#ԄNJ@LW2l;jΑAK>ߵ8'tTO<'__ /* o`z Pv$K(9B<.}hpt2Ў{l `p%{.߇%Xᩃk23 Z5CGN3~kplWюgʾ~rou6αՄcre/aNF,#ыJM$J=bw*43WEMmhܳ}~HLaTjc!bnj6}v= LorHn{NH{|ȘB.FyJ~臓 LZvUv,ٖ.{Rs뵐<VHu< | z 8~[R']hE;~OU `-M{fztI, y -XqGx%ɗp<8Jt9CpEihRFY8rA CdМFuoҊ93E)] yqP9W:P|JAcتP}[R4tD0BC{B\kFƺhlf {ʺO1kr>~;l E>Z6GNeJyn uta;Yл9wFg'[!Ȏcfmft+e=Y61FƲ  4Ju/P$>?⷗jcv$_x2iC)DŽc{4AH/ܵ8ĻhVې9i-8Q?0zΡ8XS@A'O ='{ ?6*yI/H;! S[ɮK"y6"'RGs, 8u}}BVdT*Nu.>4aP@izWnR#lF-"mm%d Pm3AaLR0V `er*bѕr}BLaX1^}5]h|LAykw߻ʹ2Or ef< ~YxB12[ӆjBS%C{8l#/Wd΀鸵1N 2T[z,$q}F鶒߯ߏý#h)$7@ s&:)C?8-\)> m~MUHTZpjq]D_+;H Tީ$3Ю/հ_A1: -qu?tnf8>nfr 78{ sAmސe%]wL Qq5r Ǯ1B;t͊7 hLruC0 Ϳc9K0!, <օ|o֮uH# fEA-ds_Z 1Jn_w< Vw>(kB'[AﲪK 0N_td pkhҴ E yY7c \ϭ,!y5_YX[$%_Mo<|6>bo773Q6n߼d6.ywL1)5T`S2Jp !o ݝCApdwŽ ۶ $|sD߸^ ȮL;P'Өn88F7*C'R0F\-V.-|Lb ,:6H{E)d{"khR¡"&=ۈ^`\cn*{5E)Gq" E"t=2ٽS|T+ GXh|Yy̛W\t97? `1"ük2"EX{$x_$XYnÚf7Qk̶Rn*ek8Ԃ &2-j?$H,Г“n۟.MxFą:$Wgd!O\mc( n@cwHi~>45gfw"nt,+3k/ÐM4bPGHjMQ@~zoq<+T\-@:!^FVT>uSKGvv-tUZT PUN#F&3ԩ=mC0uXlf*#4\ +ʔ ]|E𔞑dw_ζ+u}gTm@lɫ #t)P͝ /|hd%&02"PB'ņ_]aW߉-CCB"SiBx)1WjRw To]aqOM Kc苣Ίt21;R$.R+iw LOUfrtHٱ0MkfIJ0\[R`2"{ơwCzn^gDpY2]G< t.![}#D*Ϝs7o8JEKѼD:s:Btw^6| X31j*mTe~d"#\3c1q{ rjv.Gʾ SI^hAZ9p?%)܁4d8Z0>,Lt,; ozjm9kKRyAf6o_b :; ڡ$B-S*-%S,{$ȋ@5(xA|?9sN%`mINnjuFQxZ-Plg?̎W<-)j9bɟsM5_Oz@+!ZM=jZ(垢p{G^9Yc ? W):' Yaw%̆f cj$rNשG ՏQFȝ$Bϝ,XdocnlL6$Iy^fm`HOgDl( k4H4ҹ1 hm87Oo}q{31=Q=zs>no"ZFGft)$x,給,5>T/P^7|28d|tĄQ;W1tnLj|H~tm `(AQ:U6='ռ/C;[Qp/P,N 'ֈMb4 ^ Sʼnr"ГjX=RT 9YS2H>M3MN Cbz3ksi妙6%D9ϑ 3s p[p&)֥up[ 'qH<\cYa6rԆd/A~]59u΄eL:=$ؤm_㈜N-Sk4d8(C H _zSVGymh(yF"5s&^ ӢN2 6XjRDgGwy:l?bDZ'k{Ѻ ݷ?Gs칐ay#1 .~KBa*J.ܢa.!iN˖ù H{~HqZ ۪J 2_ʊq^/ Λ+|<8:(/V4~g;WU~ʶ şiaPiY|ʾ_Un'쳯jEk: |&mm5mx-4 9nbSöi<`Ѽj}xۮ~PH6VȓjiIȠ?:euL/:Ĕޔ>vWx!bn_XnKned6R vtf;|LbE7tr=`XDfO,|:fq"0) ,]01gelY}]>3%nC`*Uuߤ$l{lBP `mmld|3w xk&;Y)w>E]3r#E# R BV I 4c9~1_zr"18ILtZzBm皲=)-fqwP+c/;iBgxvtlcߎ߸&w2gs. 5+b[hj}66F{L\kUmڱZ?Z rB&/@n>F3=[h l@(R3òp3$6LuEk  .f:ҡ1AfbBOr 5;Eq8ܱ_naT nP؍C)oFg'85 /Ao1Kn6V ?UxKoyÛu|͌i7΢ILkznrlqM凮56p؎4J Hvf$1n) -G ]hkb(#f%^R@q4Jb( OBm_4_3Ll h贗nQ1i~aFb fVՕa;&vͨ)q|)G.d~Z7k-1 f`#Bwɿz"˂c,)*V{TKQ$RH=`ܩ SQЍk.unͳt9𘨡 @:O+ ;E<,›,ڶ@uD+'}?K-a/,a6PBߪZW"gnD ~7]{-s8S hg$jwdAm5@K7|Go,e:Kc 0n۵)_s$N^˩CK z:6Osp jE+V׶w3ohM4M {뀘90 #"JZMbcg`vo) }%NƞnxZo--e.,T;yc0QxVg:j vC i)wN^1NCQشYfa3ܱZMT`+=d&&Ynhpreq#%SZ)bLQMS Fw[e-w(@H iN5 ™}TЮ)HoHۑ)x*$)^ɺFlA\$]E%(Ys טXS3X(C}Y9)8m<MNkܛYsz"٠oO3j,}ȍ2Ϳ \oÑztUJ`}|q^w4p2H~"2~i :-$OIWG"&)I~-8RRKŻ +*i(yZkw>ӝxM{ղ1`\8Սvϝ73MO|`AP~jT+wXA9塵)y] /b5RlʧGke5O'36k"2PBuq䓽y7Jge5/MyuMKϮ,.Ug 4M0QJVOt`k4Q*n$L{CtvmM- 3FOMqYZ|(u/X&|u۽?fIc_ WXCl84$WUmigMp*Eltu8F~J`ljL^I ܕ)YK'px ֌fEP|ϽtPn!{'ΩŨ.Ĕfņ*Aī$1Č  p R#zL"6u[$8.K7A3ᷓ( !)>f$Jz+&UT 1=r%D~nnT>B4{?rTn/;C#z././AJݷڕ1Ctg#2p'f8:Vԏ >bl.eoJ!=g[(jb[syYNDaE$xbmǃBxc\wʏbZ SЩC%~A?ެ˻  - QF͂5uހF\5RHԘ3P$}w%\?.Z(_)b-9'i S2Wt-H4qL Z=B󘇍XkjS^(xFezO'o8>MW}-;380m mDY\ .j yOTGDT=V->Cyo1p}C]:`SUVWmP͔؈NuDbsz<#V(:Ć%nl| Ųp2R|㛸: *$M!2Է }ZKT'w3X )&CёI&}/ם}w .Jh-#0j;sD$M/h˙D'Ѝ?5 (г, VGpTqE+4v}1zM;MM5:w^b*mcknK ?ё#d3l=`nwTo*Eayfs 2b݀L:~XFb3xG1BӠc+JHeq'/}\h"<Evkzb/AxvPFձAD51~mYtM22,qD!ruуͥ7"Фm6#Hyݩ`ڼ܏L7p3oLצ< 0g$0A=}ߕ?S FcK?o!ŋc/\l~6-n*\KA W$16)<sMCђ@4^եb2BSMiJy(YVܔlViKʆ@|'v8qfZcpOߕ}lSIRIyqi.AWknkqIƾWn}g 61Y7ϮO MC2X厫63R'iD1qN*f۫JOiL"'ӴS܅mC;/EH he?Ev*AڭS*[sS9C,QygAu?m4h'ja»NF*>*y3AG0B&8ҴmZ_m Jf/{Z ,S@dVvs@DaI5(H۠rmd°1yuWrS=RBf>O<#"َ(CSrV28CcBfP Q##QB˟%Ot00Ht$,ߦ'@ /8AG/]<'۪ʵ"L:oCYYυ#BsmsB1|\Hn)NTرCD0 xV8=OP"m F@Zi(Idcoy^M+ąڹvmvKׯk#:_%){8&r=K)*$ǹKVoMKZ Eq51d"*LD~\&)VsVKm)g$.ӧ!fI#r4Z3,6B|IUbR eֶ_{_<9C(&G "ሧ Xi1P9_Ot& (=R 0}1.j qlLG)y;6S`r׸aUK4b䌬kI6YK<>v2''!տ0B/1]{ K 5h<5C{ynCeSfj71~D(I϶H=?]t' #s˓l][(nlqGD+2#L 4}p%HW[WKԧctwQ4l9ICTRz悥pΗ8n͖뺮QyڸQKC*:ŶX%cܴ˚w--__Z&)Ût5;E  O)XTavzfK х+*_a^,SK̖*X8~Ʒ{ !mq9t /5F]?':x[Y+L|i]n6PNaKa8vP#jI8~-bExW/y!poM Lid O@i<6 @+ LI .BDwt%Ơ ^ؽi9NR>9ṕsWAb0z< e,r ۍ7*puL(p)"ј({W @y7eZ mmQNte|W+(wɤE:%IhWq`/娉G;(`KS-u'~:?j1ZEbJD5-t|.G^!C%Kf)Ff5ȁNb ~Ѝ#W~H_b 2>7 O6U#[Y4<5 թ9[F돂@Tȑ 4phtXvdL:gRb!VXE .lxⴴoM7)MG)&h.kå04!iu2`%lH FVkl3G#XK/Ls?ݯ'uBoeRv@t8(;ǂE" &e2 ^!5F(+]).5PxR( Gkvi 8~8!A@)Xo@ 7.iH,qB rd::S3:Cq4x#=T3Le UNmrye`mA־,[s0|Wu+x9fgRR;RO*nAYlgQɥ%[!QNwm3ldmlifzXpF+xS|oGڑʡx2eR3I$f`Vסऻ{?&jH0Hwn<䧽ebFbvp>'^_[E+ }[y{HejX Q2hf~Hܕ IMLbe(BtzE,\25}uu=A) $t_U.(!$b;Vw/ :w)5#pf!(AmQ0~C8D+X`-BوcR=G$`",(O!^Aoڋq:`&/rIFnnxFx-UЂ_*L1D/QOџII' @D|X vglk3H@f9x1\8oq0iKB[ΈD X4Kt˽]2o2_xލ+eM]FR!zMFTKS Y7n+aВdF<Ϭ\;92tkv0QԱLDOpےv/]]M0\'i eF2?2%&0nU])*yWAoZV5-LZK&y2WQVT8=&"fFR~A;ciupz^ֹ׭fz&G]%[(ϓV NdIZ>vd;;Ar&veD<%$hs{f50^;;m=kh\(OAr";$ Uk'T vg-Radӄ$jDIv&7)뼎H63K70!:{^(qZR5 h8OU'6fM|PϾ 3'O9Ǣ#w:pׯct+TBr;܍cOJ f㴌 eS-G}^Ze |`_0FlA>>0⬂bXp{ ZR z_~hcfJz/wּG%sPr2PvJjm25GruoV_@)y줄{ht|U)y Hn-_kvM2i29L ftd$]tv~O_OÎ:vkANbv詛%k"ЀLTC=h(in~,Ϗ,O>ͷ%6XC8-;&mpJ3MqP6pCrE! 8[xQfB:D+a?`j"R¶>k݄g&U3)f<&n, X&5NutM>ntK /Cm`|gtn|TE2AOMz5چ #xދ eVM]n*~a_xA캍,z>ppelTӼg-ٿ\c9#dI';9*fVS %B.jXOSt~9PsqO+{UJ ΰ$r).-ۥp t,<8eevKZWۆt2(r&+tMFbߖV3e+;Rw_8{ &xl%";Hr]^h5DП w#d ihhZXrJI]퀏u; 8 |~m Z6G(XtikpaW~RF=q3f|f"D`$_@;~K:lb@om'rM)s*lp$Myhծ2HUkBvw4x^ ü6O,&L{O5p!&T2] 8P_6Y^HME8`lb~o+mL7#!I _]#*ͲJ1Tj}ž74[z^;4 tL%62:wM  #v %ֵ Htp K?J0r􂺅h4q7H{\1=g41-R)>:Hӫ61`.-EhA,m =_{hO]ai>Jp]ǥAG~~jWzyFpإцրwJHh,wj!$}>tIXM^b2g;^\`:7.Cට'| n2dz2Й^a?\ymaU4JjOu%3_*QU[i펴va;Lv$Lsg0ɮ ̬p'zهC }r,h`TX^((yxB$3OvQWƒ3q+L/ ɁEbay<+û'֓W}(~g{$*tiP&`:* ssyue~4!/?O&-^F O MU6p δZyoQ8 {A`C1B"<6.cEZFvAD)j/X\Ipkl\M^QSm\. FɎ1_sC#"v]$ xqݯ\QdnjOP5_SM`m*",F?#V*$@2dՕ0?j0(6Nԓ o98s87۞BM,=IS,X+ W+n5]E@?WDQ2}>^ 1d]= " j@|ܗ*V<ު/^ī:bԶ=d4{4%2#}=&j|vȗɐl co)$VV}"8q^ZN@aG9#*{ t)|z:s^qA$] =G CEFkNœج{Ւ+Bt,(2d%:P@H)S c":G(YhwCZi9a/y س'y*²Zq+̯ h f"*zWsTDx(X1k2q)t*6L17]u>ʬL_{B/^Ǖi[]?Q.!zX0usz[%]Sl&L hrgA[A5;~%rεKG3FyCf ̢}0xM8@-2@7Z O+y2 7PbL@L,{]J;t訞 ;sNyvK_@:8g!-t7CyKns:7S$-8Ҕ6+qTNvCE'"yf㠢q8+^{78HSEk'&[ג e,oz&7rӇB \I*l#p>*zڮ T|&|UV]q^a i5N6ev"eq|@:|bJdI٢_w{)k,jɃٙow%~ࠝ\P'C2o;@TC!E4j%V}cħd"x^Xa kL9?JY6Y89N;Y4[|.q` hͅ8|znZMZ80t] ԵNSTx=cy 4{mEO[Gd뗁 \ژ-bڐͣYKRF3.:NPY} 9q4;/!ȀAJ(߬ 2JQ,C۟e06&NNRlH ߯,%`'O KhpE+t#;>9r2&})kN-YRJ6/RMZ!ftڤb' 2j #whK$KrA|(yRD -4b5(M M?3OV/H;"( U0F^eZTKWgJ 7g>Vԍz&o R5p\^ Pk (I԰z{`bvLhPGLLn< _}ǷQEuMT\*:OR-!d)Zx]TET˸6DlEns` M@H9c-0(g}J֏?5a"P/I]LЊ Ǔ :ˈofu!ղ"/<wWArW5QriOm:{p[Zx"X@f\"bA&;}6"f%'x S۪^ؐ72ʏ+|SLM S.RWg@pD |>s8UO*Cv8EQJȏ= !NMG@nl 9ɒhLãNٙ[r_go]4F$|>pĒ}?AfJEW`x1c2+HpYjTHd'm#{nP #. @y(I\ (rOdlӛvI離y~isaRk|2Nj)]zC]&JK OFՁ|? ϡsUs,dQLߓ.~w}spM.,>˳x<&eO?$l'Cm2鉏dN}NR$HS/d$1u6' ]bu WCtR̅G i}-_A'm`A/=>BVD9P?7&~"5Pn>RLf;zT[yzO0C#?`jGT7Ao9Q24xiE@՝E ao$ -R(]E(S$tU':o~ɫJF?<ĒIw^)n. 'vFB$i?`ءqnU+^48M ],!ߖw^<:=fVuQN2J5-c" W eL|ț C%A]Q'R@^[[>])z=19`irD9“ vKĀ)HVVv8}h=WBz8+f74Eؾc2[+qKk!ÞU'qtX.nI =J^,g<$$vLh# ' #TUy:FY؞5M!h7QJ"cR$kpѻW7+L1 3kW6ћ:8cIUݤ_EԥP5SגF1Ea*5-'_'0Йi3 uw??SLd@wz-lϧkM54[0ws鏑e G6urſ"⋋_.1eKH<',greH,{Ŀy4955<|uIgX{@ԶƻzÂ)'cH_Wr4dKiXE0f8 9=Ft߂OAڎ(ʇl*O>fQհ \  fa9-TlԩC[\F r pNpa$:lԘ)HRE`7YÛ݁ / D@;Nu5X`t}#JseI]qdawb=0ŕDž 59w-Vqm_ b֭*M9Tf`ԨD7+{Pڽv |u!im rVtȩ@[,Q`+"˅E3뷣|a|ؗ"۴ JD@nV$).+&p,ٍJPmxQFՔAN PLmsPOMeS-Qe[ y] ey%wTc!zGgЩ\!I&w}~`^.~:?P@hb\7\8D$dBA(Xt(2CbKG`L~\e:MIme-%ܦR0ƨ!W6 3s% `?ᜇ#qFc}ͮ:BOk"ӒTijfυ;, boK}xs@JM#b܋e9֨aѠڳKzmrOzd|eʃb(f5аؔAH'cH˥R7j^m_Q \Qpuoi1L_Bn\ɜJn)#q^vǐ aK~mjM`qZQ4 a"L4_k{sZ[i@JĢ̇*pfս*7$H?o4e5,w8㢅UkL,hڙsaڅ(FP#l_g2ԿҰ6! ھ{ :X)UQ{m˨odSa<-L=J.~nyX1S}Zg5#b;n-̑ uIEdQ*lA97 >^NgLAȲox"}$ic_&2%hu8k,ȻUE=z+{hS7j2$Wrm&?s) 5X~l!M3ųB;:[S]7( ID2FٿoȂQy8LwjMG)}X~K?uW&>'"ɽ23}Vͽ8BDxZEFAWa'XqRV=c(^c}  OUXȷbw/ݭ阣h,`gH%r͋%Q\$zQb+>6`<:=@84;fyw[zf/4BU%o;bakk֖Ԡy~7s +5AL:b+;qET)޴ %"l:Uȯ+%fD6* WS ~DCC.BCK [DCC_DISTRIB]DCCARTICLE.ASCII;2IZ8&un time support; besides, the conditional compilation mechanism permits easy adaptation of programs to local conditions.But the usual C compiler (or its fellow companion 'lint') lacks most of the devices that allow a program not to be too brittle (for example, to check that an array is of the same size as an enum used to name its elements); besides it is much too tolerant, even allowing things to work "by miracle" [MOD 91]. This is a pure disaster, because it gives programmers reasons to use obscure tricks, with the sole justification that "it works"! (on the local compiler, of course...). C also is very tolerant, permitting programmers to fall into various well-concealed traps, such as: "if (a = b)..." (instead of "if (a == b)..."), "a[i,j]" (instead of "a[i][j]"), "if (array1 == array2) ..." (alas, it won't compare arrays !), or ... (long list).But, on the positive side, this tolerance, well harnessed, can be turned into a great advantage; in other words, it is easy for C to be constrained into a disciplined language, with clean concepts, offering much syntatic and static semantic guidance to the programmer, and inciting him to dump in the code, rather naturally, the constraints he chose to obey while writing it, all of which without loosing any efficiency. The purpose of this paper is to propose such a "harness".hThis harness is mainly designed to allow strong typing (especially between compilation units), well defined types, name equivalence for all types, reasonable automatic conversion rules, easy to use arrays (even dynamically allocated ones), limited use of casts, enhanced portability, and removal of most traps... It has been implemented as a C checker program.The following gets into greater detail; it assumes a good knowledge of C, but, beware, may come as a shock to seasoned C programmers. Areas where C can be disciplinedTypingC offers a wealth of primitive types, plus very good means to create new types. But it lacks the boolean type, and more generally allows a complete mixture of all scalar types (including characters and pointers!), with little concern for information loss. Also, the type equivalence mechanism for arithmetic types is structural equivalence, which does not make it possible to enforce the distinction between "information" type and "representation" type (see later, "parallel types").1To remedy this, Disciplined C sets the following:- 'char' (without signedness specifier) is a specific character type, whose constants are the character constants of C; this type is a closed type, not an arithmetic type, which means that the (in)famous idiom:! int c; /* notice the 'int' ! */'while (( c = getchar() ) != EOF) {...} is to be replaced by: char c;+while (c = getc(stdin), !feof(stdin)) {...}3 A 'char' constant must contain just one character,- integral types are: (un)signed char, ((un)signed) short, ((un)signed) int, ((un)signed) long; combinations of 'signed' and 'unsigned' varieties that could lead to information loss or "unexpected" results ([K&R 88] p. 198) are pointed out. Besides, an attempt to compare differences of 'unsigned' via relational operators is flagged, because the underlying C compiler will generate an unsigned branch in such a case, fact which may not be obvious to all programmers. Consider a graphic application where point coordinates are represented as unsigned; then xPoint2 - xPoint1 is still an unsigned (from the underlying C compiler point of view), which means that xPoint2 - xPoint1 > -1 will always be false ! It is strongly recommended to '#define' a "byte/ubyte" synonym for 'signed/unsigned char',- floating types: no change,- a boolean type is introduced, that is to be the type of the (first) argument(s) of 'if', 'while', '?:', '||', '&&' or '!' operators, and the type of the second argument of a 'for' operator. It has to be defined by the following: typedef unsigned int bool;m Relational and equality operators, as well as '||', '&&' and '!', yield a result of type 'bool'. '&', '|', '^' operators yield a result that can be used generally as 'bool', but , since its value is not guaranteed to be in the [0, 1] interval, a check is performed to warn in case of possible strange result (e.g.: if ((feof (stdin) & fclose(stdin)) == TRUE) ). The constants 'TRUE' and 'FALSE' (which may carry any other name suitable to the programmer, such as VRAI and FAUX) are defined via constant boolean expressions, for example: # define TRUE (0==0)# define FALSE (0!=0)P Besides eliminating bad programming practices, such as (excerpt from 'strcpy'): while (*s++ = *t++);0 (instead of while ((*s++ = *t++) != '\0'); )K a side effect of the introduction of this type is that the standard error:2 if (y = 0)... (instead of if (y == 0)...)> is flagged by a "Boolean expected" warning (warning also for:X if (setOfBits & mask == Msk1)... , instead of if ((setOfBits & mask) == Msk1)... )w Explicit comparison to zero is less cryptic, and entails no loss of efficiency, the compiler testing against 0 anyway,- 'enum' types are closed, i. e. they are not mixable between them, nor with arithmetic types (in fact, the 'char' type seen previously is considered as an enum type). However, some amount of mixing is allowed: a (signed) int can be added to or subtracted from an enum, yielding an enum of the same kind. This is because the notion of distance between two enum or char is often useful (for example, '9' - '0'), so sub-tracting two enum (of the same kind) is allowed, and yields an 'int'. Enum constants can be initialized by signed 'int'. The constants of a given enum must have differing values, except if the /*~SameValue*/ d-pragma is used ("d-pragmas" will be described later).  The only operations allowed on enums, besides comparison, assignment and addition/subtraction of distance, are '&', '|', '^', '~', '>>', '<<'; so enums can be used as sets of bits, but not (in the absence of a /*~TypeCombination*/ d-pragma telling the contrary) as arithmetic quantities,- a major innovation of Disciplined C is the notion of "parallel type", that allows a distinction between information type and representation type. The following: typedef int Tindex, Tval;typedef Tindex Trow, Tcol; creates four distinct types, but which all accept the same operations and the same constants as the "representation" type ('int' here). Tindex, Tval, Trow and Tcol are examples of "information" types, because they convey an idea of the semantics of the corresponding objects. For example, they may be put to use in a checkers playing program: Tval will name 'int's that represent values of checkers, Trow and Tcol, 'int's that represent row and column indexes, Tindex, generic type for indexes.- Tindex, Tval, Trow and Tcol are called parallel types; in fact, a type T is said to be parallel to a type xxx iff it is defined by a "typedef xxx T", with xxx parsing to a naked 'baseType' (no qualifier nor modifier; see grammar in Appendix A). In other words, T must be a strict synonym of baseType. This "parallel" relation is transitive but antisymme-trical. Other typedefs do not introduce parallel types; they just name qualified/modified variations of the baseType. The representation type of a parallel type is the possibly qualified or modified nativeType associated, using traditional C rules, to its type identifier.I Cascaded synonymous typedefs create a hierarchy of parallel types, hierarchy used to set a compatibility rule, and to find the result type of an operator. Let us define that a type T1 is "higher" than a parallel type T2 if T1 is T2 or any ancestor of T2 (including the representation type), that is, T1 has been used in the chain of typedefs needed to define T2 from its representation type. For example, Tindex is higher than Trow, but not than Tval, and Tval is not higher than Tindex or Trow. If a parallel type meets a non parallel type compatible with its representation type, the wider representation type is the higher type (unsigned varieties are considered wider than their signed counterpart; numeric constants are supposed to have the narrowest representation type possible, in the same variety if they are signed or U-suffixed). Then the compatibility rule is the following: an operator (except shift operators, whose operands are deconnected) can only combine operands such that the type of one operand is higher than all other operand types; for operators other than relational and equality operators, the result type is this higher type. For assignments, the higher type has to be the type of the left operand. For functions, see below ('Casts') the /*~ResultType*/ d-pragma. Since these rules do not facilitate mixing of types, the /*~TypeCombination*/ d-pragma tells the allowed combinations of types (e.g. Tohm * Tamp -> Tvolt). Besides, there is a notion of 'coefficient', for multiplication, division, modulo, whereby if the coefficient is of representation type, then the result type is the type of the other operand. Also, a constant of representation type meeting a parallel type behaves as if it was of that type.G The special rules that apply to enums also apply to their descendants. The /*~RootType*/ d-pragma isolates the so qualified type from its ancestors (renders invisible the subtree headed by that type); also, the constants of a such "root" type are compatible with all its (visible) descendants.' Let us consider the following example:% typedef int Ti1, Tri1 /*~RootType*/;'typedef Tri1 Trri2 /*~RootType*/, Tri2;'Ti1 i1; Tri1 ri1; Tri2 ri2; Trri2 rri2;i1 = 0; /* OK */ri1 = 0; /* Wrong */ri1 = (Tri1)0; /* OK */ri2 = 0; /* Wrong */&ri2 += (Tri1)1; /* OK (generic cst) */ri2 = ri1; /* Wrong */ri1 = ri2; /* OK */rri2 = (Tri1)0; /* Wrong */rri2 = (Trri2)0; /* OK */ri1 = (Trri2)0; /* Wrong */ri1 = (Tri2)0; /* OK */ (the created hierarchy is: )l To ease up things, 'int' constants can be added/ subtracted uncasted to/from (numeric) root type constants. As can be seen, the /*~RootType*/ d-pragma allows a (leaf) type to be closed (not to accept constants of any of its ascendants), In short, the parallel type facility enables name equivalence instead of structural equivalence for any type in C, and so fosters programmers to give differing names to the types of their different object classes.ArrayssArrays are a common data structure, easily understood by most programmers because of their mathematical background.But in C, arrays, especially dynamically defined arrays (by way of 'malloc'), are very difficult to use without coming across the notion of pointers, an awful prospect for many naive users. So, with the help of a set of macros (predefined in a header file called "dynarray.h"), Disciplined C makes it possible to use any array (static or dynamic) without ever having to use pointers (cf. Appendix B).bOn the other hand, the array concept being natural, a pointer can always be used as an array name.There is no automatic conversion from an array to a pointer to its first element (except for string literals, and for function parameter passing: simulation of call "by reference"), and one has to explicitly use the construct "&array[i]" to get a pointer on the ith element. One consequence is that the construction if (array1 == array2) ... is not accepted, so programmers will not believe that arrays can be compared.Another feature of Disciplined C is that, at each use of an array, the type of the index expression (any integral, enum or bool type) is checked against the type of the bound; this last type can be specified via the /*~IndexType */ d-pragma (which overrides the type of the bound-giving expression, if present). This d-pragma may also be used for pointers, to cater to the case where they are used as dynamic array names.xThe value of a constant index expression is checked to be positive and less than the bound (except if indexing pointer).CastsTo encourage programmers to choose the right types from the outset, and to enhance program portability with respect to, for example, alignment problems, the use of casts is severely monitored:- any arithmetic/enum/bool type can be cast to any other arithmetic/enum/bool type, but an overflow check is performed on constant expressions,- pointers: they can only be cast to other pointers; a non 'void *' pointer cannot be cast to a pointer on higher alignment-requiring type, or to a pointer on type whose internal layout is machine dependent; only the constant 0 may be cast to a pointer. Conversion from a 'void *' pointer (except NULL) to any other pointer has to be documented either by a cast or by using the /*~VoidToOther*/ d-pragma, this for example to prevent the following construct:( void *pv; struct{...} *pst; float *pfl; ... ; pst= pv = pfl; ...A from going unnoticed. A d-pragma, /*~ResultType*/, eases the situation for generic "modifier" functions, such as 'memcpy' or 'realloc', by specifying that the result type of a given call to such a function is the type of the current actual parameter corresponding to the /*~ResultType*/ qualified formal parameter, e.g.:( void *realloc(void *p /*~ResultType*/, " size_t n); /* declaration */% realloc(ptr, exp) /* type of this ( 'realloc' call = type of 'ptr' */,} The type of the /*~ResultType*/ formal parameter must be the same that (or a descendant of) the return type of the function.Y For generic "creator" functions, such as 'malloc', see below the /*~Generic*/ d-pragma,7- arrays: they can't be cast to anything (meaningless),|- parallel types: they may be cast freely into each other (but the /*~CastTo*/ d-pragma is rather to be used in that case).Casts not conforming to these rules, or to a lower qualified pointer type, elicit a warning, which can be avoided by using the /*~OddCast*/ or the /*~PortableQM*/ d-pragma.Since the number of casts in a program can be put to use in a qualimetry tool, the needless use of them (or of /*~OddCast*/, /*~PortableQM*/ d-pragmas) is also flagged. Functions!Non-void functions should normally return named types (problem-related names), and so make use of the parallel types facility. Yet some functions are 'utilities' fu"nctions, that is there is no meaningful name for their returned type (e.g. 'strcmp'). The /*~Utility*/ d-pragma signals this.^Also, the parallel type mechanism uses inheritance, and sometimes subtyping is needed. So the /*~Generic*/ d-pragma tells that the result of a such qualified function is compatible with any visible (cf /*~RootType*/) descendant of its return type. For a 'void *' returning function, this d-pragma tells that its result is compatible with any pointer.1Functions formal pointer parameters that could be qualified 'const' are signaled. Besides, the /*~MayModify*/ d-pragma tells that, although its formal parameters are marked const, a function may modify its environment through them, either via casted parameter or through pointer embedded in struct/unions.The /*~ResultPtr*/ d-pragma tells that a returned pointer is the same as the so-qualified parameter, this to be able to propagate the 'const' checking (e.g. in 'strchr').The /*~SizeOfMemBlk*/ d-pragma is intended to be used with memory allocating functions, such as 'malloc', to allow verification that the argument of the possible sizeof used is of the same type as the receiving pointer pointed type. Others d-pragmas related to functions are /*~ResultType*/ (cf 'Casts'), /*~PseudoVoid*/ and /*~NeverReturns*/ (see later, 'Miscelleanous'); function parameters may also be marked /*~NotUsed*/ as well as /*~Utility*/ (do not accept an actual parameter whose type is a parallel type).As an extension, several formal parameters can be qual%ified by /*~ResultType*/; then the type of one of the corresponding actual parameters must be higher than all other corresponding actual parameters' types; that type is the result type of the function call.Compilation unitszOne of the plagues of C is the lack of type-checking between formal and actual parameters for external functions, or more generally, between definition and uses of external objets (we will, for the following discussion, call "global" a block-level-0 object/function visible in only one compilation unit, and "external" an object/function visible from several compilation units).Another problem is that the encapsulation of C modules is usually very bad, because one of the tenets of encapsulation is not respected: "anything that is not explicitly made visible must be hidden". In C, the rule is: "anything (at block level 0) not explicitly hidden is visible"; this is because the 'static' keyword has to be explicitly used, instead of being the default option, and so is "often" (the word is weak) forgotten.=Something also confusing to many programmers is the difference between declarations and definitions, and the uniqueness of definitions. This is because, for C, some declarations are also definitions ("tentative definitions"); also, a number of compilers/linkers allow several definitions for the same external object.DDisciplined C solves these problems in the following way: any object/function/type identifier has to be declared (just once) before use; any object/function defined at block 8(level 0 as not 'static' has to be declared in a header file; there must be one "header" file for each "body" file defining external objects/functions.A header file is constrained to contain only (besides type and macro definitions) external declarations, which must make use of the 'extern' keyword. A definition must not make use of this keyword.%This provides the following benefits:E- programmers are warned if they have forgotten the 'static' keyword,- for really external objects/functions, since they must be declared in (common) header file(s), type checking between compilation units is secured,- an external object definition (and possible initialization) is easier to find: it can only be in the corresponding "body" file),D- the difference between declaration and definition is made clearer.[To cater for module composition, the restriction that there be only one declaration for an external object/function is relaxed; but, in a given header file, only one declaration for a given object/ function is allowed; the possible constraints (qualifiers, array size etc) have to keep constant or increasing in order of inclusion of header files.Finally, the scope of any global object/type/tag can be terminated before the end of the compilation unit by use of the /*~Undef(Tag) */ d-pragma.Inclusion of header files=Header files are often included at the wrong level. They, most of the time, should be included at least at the body file level (and at the beginning of it), so that all used services are easy to spot. If they are not included at that level (and one of the functions/objects they declare is used), a warning is issued.ZTo cater to "composed" header files (header files offering services including other service(s)), the /*~Com-posingHdr*/ d-pragma is supplied. For example, if one wants to provide a service, giving all services of plus some others such as Bessel and Jacobi functions, one will write the following header file:##include /*~ComposingHdr*/extern double bessel( ... );extern double jacobi( ... );and then no warning will be incurred in a body file including only , and yet using 'sin' (or any other function/object). Encapsulation<To still improve encapsulation, structures/unions/enums declared in header files may be qualified by the /*~PrivateTo */ d-pragma, which renders their member's names invisible, except from macros/ functions defined in the indicated files. So a type may be exported without its components being disclosed. D-PragmasAs seen previously, Disciplined C often needs advice or information, to be conveyed by pragmas. But it cannot use the pragma facility of C, for two reasons:v- there might be an ambiguity with an already existing local pragma, or a compiler might warn about an unknown pragma,Q- more significantly, C pragmas can only be at the beginning of a (logical) line.For those reasons, it was decided to define "d-pragmas", and to make them look as comments, hoping that the '/*~' prefix does not happen too often in existing programs. MiscelleanousoMany other improvements of C have been incorporated in Disciplined C (and are verified by the checker program):- 'if', 'else', loop operators: if they are followed by several statements on the same (physical) line, it is asked whether all these statements are part of the 'if'/'else' arm, or loop body,- as an option, line indentation is checked against current block level; this makes it possible to detect early missing left/right braces, or bad 'if'/loop bodies,t- declarations have to be separated from statements by white line(s), except if the first statement is empty (";;"),- only 'void' type expressions can be used as statements (or as first argument of the comma operator, or first and third arguments of the 'for' operator), the only exceptions being the following:G expression whose top operator is an assignment or increment operator, functions marked as /*~PseudoVoid*/ (only functions whose main effect is a side effect, such as 'printf' or 'strcpy', should be so marked). This way, probable errors such as "fct;" (instead of "fct();"), or "a[i,j]" (instead of "a[i][j]") are located. Also, it encourages programmers to test the value returned by I/O functions ('scanf', 'fputc', etc), so as to detect I/O errors,@- a non-void function must terminate in all cases either via a 'return exp', whose type is (a descendant of) the type of the function, or via a call to a function marked as /*~NeverReturns*/ (such as 'exit' or 'abort'); to that end, a simple control flow analysis is performed, which also detects unreachable statements,- since Disciplined C is only aimed at ANSI C with "new-style" functions, a function with no parameter can be declared/defined as f( ) (no 'void' keyword), and still be considered only as a parameterless function,- if a parameter name is given in a function prototype, the same name must be used for the corresponding parameter in the function definition, this to ensure that the meaning of the prototype is/stays the same as the implementation,- a function name is not a pointer on that function, and pointers on functions are to be dereferenced before use (for the sake of regularity),;- switches: the 'switch' statement must control a block; a missing break is flagged, unless a /*~NoBreak*/ d-pragma has been used; a 'default' case (which must come at the end of the switch) is expected, unless a /*~NoDefault*/ d-pragma has been used or, if the switch expression is of enum type, all enum constants of that type have been used as case values; the /*~FullEnum*/ d-pragma can be used to get a warning if not all (distinct-valued) constants of a given enum are used as cases values, and a default case (to catch, for example, spurious values) has been used,- in an effort to clarify the distinction between type attribute ('extern'... 'register') and type qualifier ('const', 'volatile'), the qualifier must lexically come after the attribute,j- 'const'/'volatile' qualifiers are strictly obeyed (and literal strings considered as const char [ ] !),w- there is a warning if objects modified within the reach of a setjmp()/ longjmp() pair are not qualified 'volatile',- pointers on local objects cannot be returned or assigned to global/external variables, unless the /*~LocalAdr*/ d-pragma is used (this check is not perfectly foolproof, however, because of the possibility of pointers on pointers),e- except inside array and enum initialization, numeric constants (barring -1, 0, 1) must be named ('#define'd); this forces much semantic to flow from the programmer's mind to the program! There is a special case for array bound expressions, where unnamed constants cause warning only if (subsequently) a non constant expression is used to index the array.L Since this constraint sometimes proves clumsy, the following alleviates it:< parenthesized unnamed constants can be used inside macros, if a (numeric) parallel type is qualified by the /*~LiteralCst*/ d-pragma, use of unnamed constants inside expressions of this type does not elicit warnings,<- underflows/overflows in constant expressions are detected,m- in the 'scanf'/'printf' family, argument types are checked against (constant) format string specifications,E- unclosed comments are flagged (detection of '/*' inside a comment),- labels and tags must obey the rule of other identifiers, that is disappear outside the defining block or structure/union; but, to stay compatible with C, the same label cannot be defined in different blocks of the same function body,m- backward branches, which may cause unstructured loops, must be documented via the /*~BackBranch*/ d-pragma,- unless the /*~DynInit*/ d-pragma is used, non-static structure/array initializations are flagged (because they slow down function entry and waste memory),J- external identifiers are checked for non ambiguity for the local linker,<- tests for an unsigned quantity to be negative are flagged,- constant boolean expressions (used elsewhere than in an assignment, and outside macros) are flagged, because they probably signal a coding error,- parenthesization problems with macro bodies are detected (for example Diff(a,b+c)*d, with Diff(x,y) defined as "x-y" and not "((x)-(y))" ),D- side effects via macro parameters used more than once are flagged,Y- unless qualified by the /*~NotUsed*/ d-pragma, unused identifiers/objects are signaled,*- uninitialized local objects are flagged,i- unused variable values are signalled (an only modified object, e.g. i++ , is not considered as used),%- an attempt to detect potentially dangerous side effects has been unsuccessful; for, if it is easy to detect "a[i++] = i", it is harder to detect "a[i++] = *(&i)", and much harder to detect "a = f() + g()", where each (external) function f and g depends on side effects of the other function.Compile-time checking toolA d-pragma, /*~zif ""*/ is provided, that causes emission of if is true. It is the main tool (besides "information" types and the fact that integer constants must be named) that allows a programmer to indicate his constraints (for example, that a quantity should not exceed a certain value, or that a structure member should be placed at such a position). must be a constant expression, but can contain 'sizeof' operators, enum constants, casts, and also the following functions:- _ _member(): only to be used during structure/union initialization; answers true if currently initializing the member whose name is , or at end of the structure/union (empty ),- _ _extent(): answers the "extent" of the enumType, i.e. the distance between its greatest enum constant and its smallest one (type: 'int'),- _ _index( ): only to be used inside array initialization; answers the index value of the current array element being initialized (type = type of the bound),- _ _sametype(x, y): 'x'/'y' may be types or expressions; answers true if both (expression) types are the same. The type equivalence used is the same as for parameter passing (x: formal parameter, y: actual parameter). This function can for example be used to type macro parameters.mThe 'defined' function is also accepted. Of course, undefined identifiers are flagged (not replaced by 0L!).This d-pragma permits a program to be much less fragile, by allowing one to build into it mechanisms to check at compile-time that related data structures are kept coherent through modifications; for example, it is easy to check that the length of parallel arrays are the same, or that the length of an array is the same as the extent (+1) of an enum used to name its elements, or that a structure member/array element is initialized with the right value.*Some words about the Disciplined C checker"dcc", the C-checker, performs full syntactic and some static semantic analysis of a C program, one compilation unit at a time. It is itself written in Disciplined C, is approximately 15000 lines long, uses a recursive descent method, and is about ten times faster that the 'gcc' C compiler (on a DECstation 5000 running ULTRIX); so error detection is quite swift, and only a small time cost is added to regular compilation if the program is correct.Unless the '-zcc' option has been used, control is automatically transfered to the local compiler if no error is detected (the philosophy of dcc, as of any C compiler, is to issue errors only when the standard is violated).*The '+zsy' option permits one to have, at each block exit, the content of the symbol table for those identifiers local to the block; their kind, type (fully decoded) and size (for objects) are given, this last information so that programmers have an idea of the amount of memory their program uses.JNumerous other options are available, for example to limit dcc's scrutiny.All error/warning messages can be adapted at will, being gathered in one single source file. In addition to a message, one is given: the number of the source line where the error/warning has been detected, the name of the corresponding file, the preceding and current source line text, and a caret showing the precise position of the error/warning in the source line. An option causes the printing in clear of the last processed tokens (sometimes very handy !).|Three levels of warnings, corresponding to benign (mostly readibility), serious, quasi-certain error, are implemented; a screening mechanism (desactivated by some options, e.g. '-zcc') prevents a warning from showing up if its level is lower that the last message level. In the same vein, unless option '+zae' is used, messages are not repeated if they pertain to the same cause. There is a way to adjust local system header files (without modifying them), mainly in order to change some library functions return types (such as 'getc' or 'isalpha'), to define NULL as (void *)0, or to mark functions as /*~PseudoVoid*/ or /*~NeverReturns*/.A symbol, '_ _dcc', is defined by the checker; it can be used to turn off its scrutiny in selected areas of source code (besides the /*~NoWarn*/ and /*~Warn*/ d-pragmas).This program, developed on a VAX/VMS machine, has been ported in less than a day on a HP715/UNIX, a DECstation 5000/ULTRIX and an ALPHA 3000/OSF1.[It is available via anonymous ftp at 'ftp.supelec.fr', in the sub-directory 'pub/lang/dcc'. ConclusionThe ambition of Disciplined C is to be a really high-level programming language, with all the confidence and ease of use the term "high-level" should convey.The first idea behind it is that programmers ought to be given a tool permitting to render the semantics and constraints of their programs more apparent, while not hampering or restraining their creativity, nor inducing any run-time loss of efficiency.Another idea is that a tool should serve its user, instead of randomly disseminating traps in his way; so everything that seems "strange" is flagged. But there are ways (via d-pragmas) to tell that a generally erroneous situation is perfectly valid in this specific case.2A third idea is that a tool should exhibit clear ~DCC.BCK [DCC_DISTRIB]DCCARTICLE.ASCII;2IZ D concepts, so that the user can easily master it; the last idea is that error messages should be indicative enough to put programmers back on the right track, and the less numerous possible (don't detect twice the same error; try to avoid induced errors...).Those ideas have been in the mind of the author for a long time [NOY 88], but it took him about ten years to realize that, instead of regularly complaining about C weaknesses and pitfalls, it would be better (and possible) to write a program that reports most of the problems, and so, last but not least, facilitate the teaching of C with due regard to good programming practices and conceptual purity.}The C standard library is another place where some improvements could be brought: for example, the string handling function 'strcpy' could return a pointer on the ending NUL character, and give an easy way to prevent buffer overflow; or there could exist a function telling whether a pointer points on a 'free'able area. But this is unfortunately out of the reach of Disciplined C..I am much indebted to my colleagues of our computer science department, with whom discussions were often illuminating (and animated !). Special thanks to C. Bocage, F. Boulanger, D. Marcadet and F. Mullet for their advice and patience. Also to W. Briscoe (freelance, UK), for numerous comments/advices. References([K&R 88] B.W. Kernighan and D.M. Ritchie The C Programming Language( Prentice Hall, Englewood Cliffs, N.J.,  1988[MOD 91] R.P. Mody) C In Education and Software Engineering  SIGCSE Bulletin, Vol 23 n 3, September 1991, pp 45-56[NOY 88] Y.L. Noyelle' La Saga du LSE (et de ses cousins LSD/ LSG/LST). Colloque sur l'histoire de l'Informatique en $ France, Vol 2, May 1988, pp 301-310 APPENDIX ADisciplined C grammar (LL(2) )prog ::= decl+decl ::= attrib? decl1eattrib ::= extern | static | auto | register | typedef -- auto/register allowed only inside function.tdecl1 ::= decl2 decl3 -- 'modifier' (called by 'decl2') must declare an identifier; exceptions: 'attrib' typedef, Z and bit-field (if no identifier => padding), or 'strun'/'enum' with both 'tag' and G 'member's/'enumElt's (in such a case, 'modifier' must be empty).@decl2 ::= qualif? baseType qualif? modifier -- only one qualif.]qualif ::= [ const | volatile ]+ -- one of each at most; volatile incompatible with register.PbaseType ::= nativeType? | -- may only be omitted in case of (field) padding." ident -- "type" identifier.`nativeType ::= vIoid | -- only if function or pointer declaration; then 'qualif' must be empty. float | [ long ]? double |I [ unsigned | signed ]? [ char | short [ int ]? | int | long [ int ]? ] | strun | enumkstrun ::= [ struct | union ] tag? [ { member+ } ]? -- error if no 'tag' nor 'member's, or if one of them exist, but the following 'modifier'(s) do not each one define an identifier; if no identifier definition, error if 'attrib' or 'qualif' non empty. Exception: / a 'strun' with a tag only is legal.6member ::= decl1 -- 'member' must not be a function.ienum ::= enum tag? [ { enumElt [ , enumElt ]* } ]? -- error if no 'tag' nor 'enumElt's; see also 'strun'. tag ::= identenumElt ::= ident [ = cstExp ]?&modifier ::= pointer* modif1 arrayFct*0pointer ::= * qualif? -- pointer declaration.modif1 ::= ( modifier ) |a ident? -- error if 'ident' omitted and {'attrib' = typedef or 'baseType' 'enum', 'strun'}.1arrayFct ::= [ cstExp? ] | -- array declaration.f ( parList? ) -- function declaration; 'attrib' auto/register; return type not array nor function.uparList ::= attrib? declPar [ , attrib? declPar ]* [ , ... ]? -- only legal 'attrib' = register. If parameter type = X void, parameter must not be named, nor 'attrib'uted, and must be alone; other-[ wise, parameter names must all be different. If 'parList' called by a 'modifier' N followed by 'block', then each 'declPar' must declare an identifier.1declPar ::= deLcl2 -- function type not allowed.pdecl3 ::= initOrSizFld? [ , modifier initOrSizFld? ]* ; | -- no 'initOrSizFld' if 'attrib' = typedef , or if no U identifier declared, or if function declared, or if called via 'member'.g block -- 'modifier' (called by the 'decl1' that called this 'decl3') must have declared a function; : 'attrib' = extern or static only.initOrSizFld ::= = init |2 : cstExp -- allowed only if called via 'member'.jinit ::= condExp | -- 'condExp' allowed only if 'qualif' = auto/register, and 'init' not called by itself. cstExp | { init [ , init ]* [ , ]? }Kblock ::= { decl* stmt* } -- no function definition allowed among 'decl's.stmt ::= label : stmt |a block | ifStmt | switchStmt | returnStmt | whileLoop | doLoop | forLoop | break ; | continue ; |' goto label ; | sideEffects ; | empty ;label ::= ident-ifStmt ::= if ( boolExp ) stmt [ else stmt ]?ZswitchStmt ::= switch ( exp ) { decl* [ [ case cstExp : ]+ stmt+ ]+ [ default : stmt+ ]? } returnStmt ::= return [ exp ]? ;$whileLoop ::= while ( boolExp ) stmt&doLoop ::= do stmt while ( boolExp ) ;?forLoop ::= for ( sideEffects? ; boolExp? ; sideEffects? ) stmt,sideEffects ::= [ sideEffect , ]* sideEffectmsideEffect ::= asgnExp -- warning if top operator of 'asgnExp' is not one of 'incDec', 'asgnOp', call to a A function returning void, or cast to void.'boolExp ::= exp -- of boolean type.7cstExp ::= condExp -- computable at compilation time.!exp ::= [ sideEffect , ]* asgnExpasgnExp ::= condExp | condExp asgnOp asgnExp@asgnOp ::= = | |= | ^= | &= | <<= | >>= | += | -= | *= | /= | %=&condExp ::= term0 [ ? exp : condExp ]?term0 ::= term1 [ || term1 ]*term1 ::= term2 [ && term2 ]*term2 ::= term3 [ | term3 ]*term3 ::= term4 [ ^ term4 ]*term4 ::= term5 [ & term5 ]*"term5 ::= term6 [ equalOp term6 ]*equalOp ::= == | !="term6 ::= term7 [ orderOp term7 ]*orderOp ::= > | >= | <= | <"term7 ::= term8 [ shiftOp term8 ]*shiftOp ::= >> | << term8 ::= term9 [ addOp term9 ]*addOp ::= + | -"term9 ::= term10 [ mulOp term10 ]*mulOp ::= * | / | %term10 ::= unaryOp term10 | prim incDec* |B sizeof ( declPar ) -- 'declPar' must not declare any identifier.:unaryOp ::= ~ | ! | * | & | addOp | sizeof | cast | incDecfcast ::= ( declPar ) -- 'declPar' must not declare any identifier, and the result type may not be 0 struct/union/function.incDec ::= ++ | --prim ::= prim1 primQualif*prim1 ::= ( exp ) | cst | ident9primQualif ::= ( argList ) | [ exp ] | . ident | -> ident'argList ::= [ asgnExp [ , asgnExp ]* ]?cst ::= ' character ' | " string " [ " string " ]* | sgndNb | nbsgndNb ::= [ + | - ] nb$Restrictions with respect to ANSI C:#- no old-style function definition,*- imposed order for 'attrib' and 'qualif',- no default 'int' baseType,`- a switch must control a block; 'default' must come as last case; 'case', 'default' not labels,/- no unparenthesized assignment in initializer,t- braces in initializer only to indicate initialization of a compound object (array/struct/union); if so, mandatory,;- enum, char: types by themselves (not considered as int),D- automatic arithmetic conversions only from narrower to wider type,^- identifiers may never be declared more than once in the same scope (except in header files),T- macros (#define) cannot be declared more than once (if not '#undef'ed beforehand),H- labels local to blocks (but cannot be duplicated in a given function),M- a function or array is different from a pointer on the same function/array,3- left operand of indexation must be array/pointer,o- void * only universal receiver for pointers (cast or d-pragma needed the other way around, except for NULL). APPENDIX BL/**************************************************************************/L/* Sum of two matrix of arbitrary size (without use of pointer) */L/**************************************************************************/#include #include "dynarray.h"/* 'bool' type definition */typedef unsigned int bool;#define FALSE (0 != 0)#define TRUE (0 == 0))/* type definition for matrix elements */typedef float Num;./* type definition for variable-size matrix */typedef DynArray2(Num) DynArr;%typedef DynArray2(const Num) CDynArr; /* Models (function profiles) */)static void print(CDynArr), read(DynArr);$static DynArr add(CDynArr, CDynArr); int main(){ bool ok; unsigned int i, j;K DynArr mat1 = NULL, mat2 = NULL, resMat; /* matrix declarations (resMat ( allocated by 'add' function). */ do { for (;;) {, printf("\nEnter matrix dimensions: ");W if (scanf("%u%u",&i,&j) == 2) break; /* exit loop if numbers read are correct */= while (getchar() != '\n') {}} /* flush input buffer */S AllocDynArray2(mat1, i, j, &ok); /* allocate space for matrix 'mat1', freeing # possible previous one. */: if (! ok) printf("\n memory overflow for 1st matrix"); else {& printf("\nmat1=\n"); read(mat1);& AllocDynArray2(mat2, i, j, &ok);< if (! ok) printf("\n memory overflow for 2nd matrix"); else {( printf("\nmat2=\n"); read(mat2);0 resMat = add(mat1, mat2); print(resMat);@ FreeDynArray2(resMat);}} /* free result matrix space */ } while (i != 0); return 0;}static void read(DynArr x){ unsigned int i, j, l1, l2;? LimDynArray2(x, &l1, &l2); /* get dimensions of matrix 'x' */U for (i = 0; i < l1; i++) {for (j = 0; j < l2; j++) {(void)scanf("%g", &x[i][j]);}}}static void print(CDynArr x){ unsigned int i, j, l1, l2; printf("\n"); LimDynArray2(x, &l1, &l2);^ for (i = 0; i < l1; i++) {for (j = 0; j < l2; j++) {printf("%g ", x[i][j]);} printf("\n");}}'static DynArr add(CDynArr x, CDynArr y)8{ unsigned int i, j, l1, l2; bool ok; DynArr z = NULL; LimDynArray2(x, &l1, &l2);I AllocDynArray2(z, l1, l2, &ok); /* allocate space for result matrix */; if (! ok) printf("\n memory overflow for result matrix");Z else for (i = 0; i < l1; i++) {for (j = 0; j < l2; j++) {z[i][j] = x[i][j] + y[i][j];}} return z;}*[DCC_DISTRIB]DCCARTICLE.PS;2+,:./( 4|- 0123KPWO56`Y/7gT89G(HJ6%!PS-Adobe-3.0%%Title: (DisciplinedC)3%%Creator: (Microsoft Word: LaserWriter 8 F1-8.3.4)0%%CreationDate: (16:51 vendredi 6 novembre 1998) %%For: (YN) %%Pages: 10P%%DocumentFonts: Times-Bold Times-Roman Symbol Times-Italic Courier Courier-BoldV%%DocumentNeededFonts: Times-Bold Times-Roman Symbol Times-Italic Courier Courier-Bold%%DocumentSuppliedFonts:%%DocumentData: Clean7Bit%%PageOrder: Ascend%%Orientation: Portrait(%%DocumentMedia: Default 595 842 0 () ()!%ADO_ImageableArea: 29 31 567 812 %%EndComments'userdict begin/dscInfo 5 dict dup begin/Title(DisciplinedC)def3/Creator(Microsoft Word: LaserWriter 8 F1-8.3.4)def0/CreationDate(16:51 vendredi 6 novembre 1998)def /For(YN)def /Pages 10 def end def endh/md 204 dict def md begin/currentpacking where {pop /sc_oldpacking currentpacking def true setpacking}if%%BeginFile: adobe_psp_basicQ%%Copyright: Copyright 1990-1993 Adobe Systems Incorporated. All Rights Reserved./bd{bind def}bind def/xdf{exch def}bd/xs{exch store}bd/ld{load def}bd /Z{0 def}bd/T/true/F/false /:L/lineto/lw/setlinewidth /:M/moveto /rl/rlineto /rm/rmoveto /:C/curveto /:T/translate /:K/closepath /:mf/makefont /gS/gsave /gR/grestore /np/newpath 14{ld}repeat/$m matrix def /av 83 def /por true def/normland false def/psb-nosave{}bd/pse-nosave{}bd/us Z/psb{/us save store}bd/pse{us restore}bd/level2/languagelevel where{pop languagelevel 2 ge}{false}ifelsedef/featurecleanup{stopped cleartomark countdictstack exch sub dup 0 gt{ {end}repeat}{pop}ifelse}bd /noload Z /startnoload{{/noload save store}if}bd /endnoload{{noload restore}if}bdlevel2 startnoload/setjob{ statusdict/jobname 3 -1 roll put}bd /setcopies{userdict/#copies 3 -1 roll put}bd'level2 endnoload level2 not startnoload/setjob{61 dict begin/JobName xdf currentdict end setuserparams}bd /setcopies{81 dict begin/NumCopies xdf currentdict end setpagedevice}bdlevel2 not endnoload/pm Z/mT Z/sD Z/realshowpage Z/initializepage{/pm save store mT concat}bd/endp{pm restore showpage}def/$c/DeviceRGB def/rectclip where{pop/rC/rectclip ld}{/rC{ np 4 2 roll:M 1 index 0 rl 0 exch rlneg 0 rl:Kclip np}bd}ifelse/rectfill where{pop/rF/rectfill ld}{/rF{gSnp4 2 roll:M 1 index 0 rl 0 exch rlneg 0 rlfillgR}bd}ifelse/rectstroke where{pop/rS/rectstroke ld}{/rS{gSnp4 2 roll:M 1 index 0 rl 0 exch rlneg 0 rl:KstrokegR}bd}ifelse %%EndFile(%%BeginFile: adobe_psp_colorspace_level1Q%%Copyright: Copyright 1991-1993 Adobe Systems Incorporated. All Rights Reserved. /G/setgray ld/:F1/setgray ld/:F/setrgbcolor ld/:F4/setcmykcolor where{pop/setcmykcolor ld}{{3{dup 3 -1 roll adddup 1 gt{pop 1}if 1 exch sub4 1 roll}repeatpop setrgbcolor}bd}ifelse/:Fx{ counttomark{0{G}0{:F}{:F4}}exch getexecpop}bd/:rg{/DeviceRGB :ss}bd/:sc{$cs :ss}bd/:dc{/$cs xdf}bd /:sgl{}def/:dr{}bd /:fCRD{pop}bd /:ckcs{}bd/:ss{/$c xdf}bd/$cs Z %%EndFile'%%BeginFile: adobe_psp_uniform_graphicsQ%%Copyright: Copyright 1990-1993 Adobe Systems Incorporated. All Rights Reserved./@a{$np :M 0 rl :L 0 exch rl 0 rl :L fill}bd/@b{+np :M 0 rl 0 exch rl :L 0 rl 0 exch rl fill}bd /arct where{pop}{/arct{arcto pop pop pop pop}bd}ifelse/x1 Z/x2 Z/y1 Z/y2 Z/rad Z/@q{/rad xs/y2 xs/x2 xs/y1 xs/x1 xsnpx2 x1 add 2 div y1 :Mx2 y1 x2 y2 rad arctx2 y2 x1 y2 rad arctx1 y2 x1 y1 rad arctx1 y1 x2 y1 rad arctfill}bd/@s{/rad xs/y2 xs/x2 xs/y1 xs/x1 xsnpx2 x1 add 2 div y1 :Mx2 y1 x2 y2 rad arctx2 y2 x1 y2 rad arctx1 y2 x1 y1 rad arctx1 y1 x2 y1 rad arct:Kstroke}bd/@i{np 0 360 arc fill}bd/@j{gSnp:Tscale0 0 .5 0 360 arcfillgR}bd/@e{np 0 360 arc:Kstroke}bd/@f{np$m currentmatrixpop:Tscale0 0 .5 0 360 arc:K $m setmatrixstroke}bd/@k{gSnp:T0 0 :M 0 0 5 2 rollarc fillgR}bd/@l{gSnp:T0 0 :Mscale0 0 .5 5 -2 roll arcfillgR}bd/@m{nparcstroke}bd/@n{np$m currentmatrixpop:Tscale0 0 .5 5 -2 roll arc $m setmatrixstroke}bd %%EndFile!%%BeginFile: adobe_psp_basic_textQ%%Copyright: Copyright 1990-1993 Adobe Systems Incorporated. All Rights Reserved. /S/show ld/A{0.0 exch ashow}bd/R{0.0 exch 32 exch widthshow}bd/W{0.0 3 1 roll widthshow}bd/J{#0.0 32 4 2 roll 0.0 exch awidthshow}bd/V{ 0.0 4 1 roll 0.0 exch awidthshow}bd/fcflg true def/fc{fcflg{vmstatus exch sub 50000 lt{G(%%[ Warning: Running out of memory ]%%\r)print flush/fcflg false store}if pop}if}bd/$f[1 0 0 -1 0 0]def/:ff{$f :mf}bd0/MacEncoding StandardEncoding 256 array copy defMacEncoding 39/quotesingle putMacEncoding 96/grave putB/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis/Udieresis/aacuteA/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute/egraveH/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde/oacuteH/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex/udieresis@/dagger/degree/cent/sterling/section/bullet/paragraph/germandblsA/registered/copyright/trademark/acute/dieresis/notequal/AE/OslashG/infinity/plusminus/lessequal/greaterequal/yen/mu/partialdiff/summation=/product/pi/integral/ordfeminine/ordmasculine/Omega/ae/oslashR/questiondown/exclamdown/logicalnot/radical/florin/approxequal/Delta/guillemotleft9/guillemotright/ellipsis/space/Agrave/Atilde/Otilde/OE/oeM/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide/lozengeI/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright/fi/flA/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousandT/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex/Idieresis/IgraveT/Oacute/Ocircumflex/apple/Ograve/Uacute/Ucircumflex/Ugrave/dotlessi/circumflex/tilde>/macron/breve/dotaccent/ring/cedilla/hungarumlaut/ogonek/caron*MacEncoding 128 128 getinterval astore poplevel2 startnoload /copyfontdict{findfont dup length dictbegin{"1 index/FID ne{def}{pop pop}ifelse}forall}bd'level2 endnoload level2 not startnoload /copyfontdict{findfont dup length dictcopybegin}bdlevel2 not endnoloadmd/fontname known not{/fontname/customfont def}if /Encoding Z/:mre{ copyfontdict/Encoding MacEncoding deffontname currentdictenddefinefont :ff def}bd/:bsr{ copyfontdict%/Encoding Encoding 256 array copy def Encoding dup}bd/pd{put dup}bd/:esr{pop popfontname currentdictenddefinefont :ff def}bd/scf{ scalefont def}bd/scf-non{$m scale :mf setfont}bd/ps Z /fz{/ps xs}bd/sf/setfont ld/cF/currentfont ld/mbf{/makeblendedfont where{popmakeblendedfont/ABlend exch definefont}{pop}ifelsedef}def %%EndFile%%%BeginFile: adobe_psp_derived_stylesQ%%Copyright: Copyright 1990-1993 Adobe Systems Incorporated. All Rights Reserved./wiversion(23.0)eq{{gS 0 0 0 0 rC stringwidth gR}bind}{/stringwidth load}ifelsedef /$o 1. def /gl{$o G}bd /ms{:M S}bd/condensedmtx[.82 0 0 1 0 0]def/:mc{condensedmtx :mf def}bd/extendedmtx[1.18 0 0 1 0 0]def/:me{extendedmtx :mf def}bd /basefont Z /basefonto Z/dxa Z/dxb Z/dxc Z/dxd Z/dsdx2 Z /bfproc Z/:fbase{dup/FontType get 0 eq{dup length dict beginEdup{1 index/FID ne 2 index/UniqueID ne and{def}{pop pop}ifelse}forall;/FDepVector exch/FDepVector get[exch/:fbase load forall]def}/bfproc load ifelse&/customfont currentdict end definefont}bd/:mo{/bfproc{dup dup length 2 add dictbegin{:1 index/FID ne 2 index/UniqueID ne and{def}{pop pop}ifelse}forall/PaintType 2 def2/StrokeWidth .012 0 FontMatrix idtransform pop def/customfont currentdictend definefont 8 dict begin/basefonto xdf /basefont xdf/FontType 3 def/FontMatrix[1 0 0 1 0 0]def/FontBBox[0 0 1 1]def/Encoding StandardEncoding def /BuildChar{ exch beginbasefont setfont( )dup 0 4 -1 roll putdup wi setcharwidth0 0 :MgSgldup showgRbasefonto setfontshowend}def }store :fbase}bd/:mso{/bfproc{ 7 dict begin /basefont xdf/FontType 3 def/FontMatrix[1 0 0 1 0 0]def/FontBBox[0 0 1 1]def/Encoding StandardEncoding def /BuildChar{ exch beginsD begin/dxa 1 ps div defbasefont setfont( )dup 0 4 -1 roll putdup wi 1 index 0 ne{exch dxa add exch}if setcharwidth dup 0 0 ms dup dxa 0 msdup dxa dxa ms dup 0 dxa msgldxa 2. div dup msendend}def }store :fbase}bd/:ms{/bfproc{dup dup length 2 add dictbegin{:1 index/FID ne 2 index/UniqueID ne and{def}{pop pop}ifelse}forall/PaintType 2 def2/StrokeWidth .012 0 FontMatrix idtransform pop def/customfont currentdictend definefont 8 dict begin/basefonto xdf /basefont xdf/FontType 3 def/FontMatrix[1 0 0 1 0 0]def/FontBBox[0 0 1 1]def/Encoding StandardEncoding def /BuildChar{ exch beginsD begin /dxb .05 defbasefont setfont( )dup 0 4 -1 roll putdup wi exch dup 0 ne{dxb add}ifexch setcharwidthdup dxb .01 add 0 ms0 dxb :TgSgl dup 0 0 msgRbasefonto setfont0 0 msendend}def }store :fbase}bd/:mss{/bfproc{ 7 dict begin /basefont xdf/FontType 3 def/FontMatrix[1 0 0 1 0 0]def/FontBBox[0 0 1 1]def/Encoding StandardEncoding def /BuildChar{ exch beginsD begin/dxc 1 ps div def/dsdx2 .05 dxc 2 div add defbasefont setfont( )dup 0 4 -1 roll putdup wi exch dup 0 ne{ dsdx2 add}ifexch setcharwidthdup dsdx2 .01 add 0 ms0 .05 dxc 2 div sub :T dup 0 0 ms dup dxc 0 msdup dxc dxc ms dup 0 dxc msgldxc 2 div dup msendend}def }store :fbase}bd/:msb{/bfproc{ 7 dict begin /basefont xdf/FontType 3 def/FontMatrix[1 0 0 1 0 0]def/FontBBox[0 0 1 1]def/Encoding StandardEncoding def /BuildChar{ exch beginsD begin /dxd .03 defbasefont setfont( )dup 0 4 -1 roll putdup wi 1 index 0 ne{exch dxd add exch}if setcharwidth dup 0 0 ms dup dxd 0 msdup dxd dxd ms0 dxd msendend}def }store :fbase}bd!/italicmtx[1 0 -.212557 1 0 0]def/:mi{italicmtx :mf def}bd/:v{[exch dup/FontMatrix get exchdup/FontInfo known{ /FontInfo getdup/UnderlinePosition known{dup/UnderlinePosition get 2 index 03 1 roll transformexch pop}{.1}ifelse3 1 rolldup/UnderlineThickness known{/UnderlineThickness getexch 0 3 1 roll transformexch popabs}{ pop pop .067}ifelse}{pop pop .1 .067}ifelse]}bd/$t Z/$p Z/$s Z/:p{ aload pop2 index mul/$t xs1 index mul/$p xs.012 mul/$s xs}bd/:m{gS0 $p rm$t lw 0 rl strokegR}bd/:n{gS0 $p rm$t lw0 rlgSglstrokegR strokepath$s lw/setstrokeadjust where{pop?currentstrokeadjust true setstrokeadjust stroke setstrokeadjust}{stroke}ifelsegR}bd/:o{gS0 $p rm$t 2 div dup rm$t lwdup 0 rlstrokegR:n}bd %%EndFile:/currentpacking where {pop sc_oldpacking setpacking}if end %%EndProlog %%BeginSetupmd begincountdictstack[{!%%BeginFeature: *ManualFeed False.1 dict dup /ManualFeed false put setpagedevice %%EndFeature}featurecleanupcountdictstack[{!%%BeginFeature: *PageSize A4SmallN 2 dict dup /PageSize [595 842] put dup /ImagingBBox null put setpagedevice %%EndFeature}featurecleanup (YN)setjob/mT[1 0 0 -1 29 812]def/sD 16 dict defj300 level2{1 dict dup/WaitTimeout 4 -1 roll put setuserparams}{statusdict/waittimeout 3 -1 roll put}ifelse%%IncludeFont: Times-Bold%%IncludeFont: Times-Roman%%IncludeFont: Symbol%%IncludeFont: Times-Italic%%IncludeFont: Courier%%IncludeFont: Courier-Bold/f0_1/Times-Bold:mre/f0_14 f0_1 14 scf/f0_10 f0_1 10 scf/f1_1/Times-Roman:mre/f1_12 f1_1 12 scf/f1_10 f1_1 10 scf/f1_9 f1_1 9 scf/f1_8 f1_1 8 scf /f2_1/Symbol:bsr 240/apple pd:esr/f2_10 f2_1 10 scf/f2_9 f2_1 9 scf/f3_1/Times-Italic:mre/f3_12 f3_1 12 scf/f3_10 f3_1 10 scf /f4_1 f2_1:mi/f4_10 f4_1 10 scf /f5_1 f1_1:v def /f6_1 f2_1:v def /f7_1/Courier:mre/f7_10 f7_1 10 scf/f7_9 f7_1 9 scf/f8_1/Courier-Bold:mre/f8_9 f8_1 9 scf,/Courier findfont[10 0 0 -10 0 0]:mf setfont %%EndSetup %%Page: 1 1%%BeginPageSetupinitializepage(YN; page: 1 of 10)setjob%%EndPageSetupgS 0 0 538 781 rC 188 60 :Mf0_14 sf+4.274 .427(Disciplined C \(version 2.1h\))J 244 84 :Mf1_12 sf-.069(Yves L. Noyelle)A 86 108 :Mf3_12 sfe-.101(\203cole Sup\216rieure d'\203lectricit\216, Plateau de Moulon, 91192 Gif/Yvette Cedex, France)A 203 120 :Mf1_12 sf'-.099(E-Mail: Yves.Noyelle@supelec.fr)A 31 160 :Mf0_10 sf.543(Abstract)A 31 175 :Mf1_10 sf@.994 .099(Some proposals to render the C language a truly high)J 31 185 :M?2.037 .204(level language are presented, as well as a program)J 31 195 :M?1.668 .167(verifying that a given C program conforms to those)J 31 205 :M.02(proposals.)A 31 235 :Mf0_10 sf.506(Introduction)A 31 250 :Mf1_10 sfB.37 .037(Programming is, as every practitioner knows, a delicate)J 31 260 :MB.536 .054(art, where the main problem is not so much to obtain a)J 31 270 :MD.116 .012("working" program \(which is mandatory, of course\), but)J 31 280 :ME.764 .076(to have designed it in such a way that it is not fragile,)J 31 290 :M=3.162 .316(i.e. it can be modified/updated/debugged without)J 31 300 :MA.822 .082(breaking down. This means, for example, no \(manual\))J 31 310 :MF.229 .023(duplication of code or "parallel" data \(because, should a)J 31 320 :M;3.948 .395(modification occur, the odds are high that the)J 31 330 :ME.93 .093(duplicate\(s\) will not be modified\), or, more generally,)J 31 340 :M>1.464 .146(that the programmer has dumped in the program the)J 31 350 :MB1.124 .112(constraints set when he wrote it, so that they become)J 31 360 :M-.115(apparent.)A 31 375 :MC.695 .069(In order to attain these goals, programmers need tools.)J 31 385 :MC.621 .062(These tools should be as easy as possible to use, while)J 31 395 :MB.733 .073(not hampering creativity. "Easy to use" means that the)J 31 405 :MJ.665 .067(tool is explainable \(so its use is systematic\), natural \(it)J 31 415 :M@1.33 .133(does not disturb common sense\), and recognizes that)J 31 425 :MF.399 .04(human nature is fallible \(so it protects "gently" the user)J 31 435 :M.138 .014(against himself\).)J 31 450 :MB.164 .016(Among the tools that allow a programmer to express his)J 31 460 :MA.304 .03(ideas are of course the programming languages, and the)J 31 470 :MB1.147 .115(compilers that go along, with their warning and error)J 31 480 :M.007(mechanisms.)A 31 495 :M@.116 .012(One programming language much used these days is the)J 31 505 :MD.016 .002(\(ANSI\) C language, probably for the following reasons:)J 31 520 :M(-)S 40 520 :M-.184 .018(it naturally supports modularity,)J 31 535 :M(-)S 40 535 :MA1.085 .108(being very close to the architecture of most current)J 40 545 :M>-.02(computers, it can express a wide range of applications;)A 40 555 :M?2.312 .231(in fact, it is often called "the portable assembly)J 40 565 :M-.075(language",)A 31 580 :M(-)S 40 580 :M@1.45 .145(it offers many representations for the integer type,)J 40 590 :M;2.733 .273(which permits the best possible use of a given)J 40 600 :M-.336(hardware,)A 31 615 :M(-)S 40 615 :M>.607 .061(it offers a powerful macro mechanism, which can be)J 40 625 :M0-.061(used to prevent manual code duplication,)A 31 640 :M(-)S 40 640 :MD.394 .039(the 'include' facility also works in the same direction,)J 40 650 :M1-.021(and allows some encapsulation of modules,)A 31 665 :M(-)S 40 665 :M?.833 .083(the block concept makes it possible to minimize the)J 40 675 :MA1.693 .169(scope of identifiers \(which is always desirable, to)J 40 685 :M0-.082(prevent overflowing the reader's mind\),)A 31 700 :M(-)S 40 700 :M?1.768 .177(it comes with a large set of predefined functions,)J 40 710 :M>1.852 .185(allowing the user to easily implement exceptions,)J 40 720 :M<1.547 .155(dynamic memory allocation, and so on; moreover,)J 40 730 :M<1.851 .185(many system interfaces, such as X-Window's, are)J 40 740 :M#.158 .016(meant to be used via C,)J 278 160 :M(-)S 287 160 :MC1.028 .103(it is quite portable, along with its run time support;)J 287 170 :M;3.006 .301(besides, the conditional compilation mechanism)J 287 180 :M93.912 .391(permits easy adaptation of programs to local)J 287 190 :M-.016(conditions.)A 278 205 :MG.218 .022(But the usual C compiler \(or its fellow companion 'lint'\))J 278 215 :MC.21 .021(lacks most of the devices that allow a program not to be)J 278 225 :MG.492 .049(too brittle \(for example, to check that an array is of the)J 278 235 :M>2.159 .216(same size as an enum used to name its elements\);)J 278 245 :MC.601 .06(besides it is much too tolerant, even allowing things to)J 278 255 :M@.968 .097(work "by miracle" [MOD 91]. This is a pure disaster,)J 278 265 :M@1.309 .131(because it gives programmers reasons to use obscure)J 278 275 :MI.262 .026(tricks, with the sole justification that "it works"! \(on the)J 278 285 :M+.217 .022(local compiler, of course...\).)J 278 300 :MB.798 .08(C also is very tolerant, permitting programmers to fall)J 278 310 :M91.04 .104(into various well-concealed traps, such as: ")Jf7_9 sf.902 .09(if \(a =)J 278 320 :M .236(b\)...)Af1_10 sf.541 .054(" \(instead of ")Jf7_9 sf.787 .079(if \(a == b\)...")Jf1_10 sf.211 .021(\), ")Jf7_9 sf .236(a[i,j])Af1_10 sf(")S 278 330 :M.355 .035(\(instead of ")Jf7_9 sf.129(a[i][j])Af1_10 sf.139 .014("\), ")Jf7_9 sf#.541 .054(if \(array1 == array2\))J 278 340 :M .526(...)Af7_10 sf.974 .097(" )Jf1_10 sfA1.176 .118(\(alas, it won't compare arrays !\), or ... \(long)J 278 350 :M .19(list\).)A 278 365 :MF.354 .035(But, on the positive side, this tolerance, well harnessed,)J 278 375 :MC-.002(can be turned into a great advantage; in other words, it is)A 278 385 :ME.181 .018(easy for C to be constrained into a disciplined language,)J 278 395 :MB.983 .098(with clean concepts, offering much syntatic and static)J 278 405 :MA.443 .044(semantic guidance to the programmer, and inciting him)J 278 415 :ME.428 .043(to dump in the code, rather naturally, the constraints he)J 278 425 :MA1.564 .156(chose to obey while writing it, all of which without)J 278 435 :M@.8 .08(loosing any efficiency. The purpose of this paper is to)J 278 445 :M!-.023(propose such a "harness".)A 278 460 :MB.655 .065(This harness is mainly designed to allow strong typing)J 278 470 :MC1.747 .175(\(especially between compilation units\), well defined)J 278 480 :M>2.869 .287(types, name equivalence for all types, reasonable)J 278 490 :MB1.551 .155(automatic conversion rules, easy to use arrays \(even)J 278 500 :M?2.79 .279(dynamically allocated ones\), limited use of casts,)J 278 510 :ME.275 .028(enhanced portability, and removal of most traps... It has)J 278 520 :M0-.051(been implemented as a C checker program.)A 278 535 :ME.161 .016(The following gets into greater detail; it assumes a good)J 278 545 :M>.75 .075(knowledge of C, but, beware, may come as a shock to)J 278 555 :M-.071(seasoned C programmers.)A 278 580 :Mf0_10 sf,2.604 .26(Areas where C can be disciplined)J 278 595 :Mf1_10 sf 10 f5_1 :p29 :m .023(Typing)A 278 610 :MA1.447 .145(C offers a wealth of primitive types, plus very good)J 278 620 :M@1.617 .162(means to create new types. But it lacks the boolean)J 278 630 :MA.642 .064(type, and more generally allows a complete mixture of)J 278 640 :M~DCC.BCK: [DCC_DISTRIB]DCCARTICLE.PS;2|p)H1.55 .155(all scalar types \(including characters and pointers\312!\),)J 278 650 :MD.853 .085(with little concern for information loss. Also, the type)J 278 660 :MD.086 .009(equivalence mechanism for arithmetic types is structural)J 278 670 :MC.259 .026(equivalence, which does not make it possible to enforce)J 278 680 :M;4.182 .418(the distinction between "information" type and)J 278 690 :M>-.038("representation" type \(see later, "parallel types"\).)A 278 705 :M=.154 .015(To remedy this, Disciplined C sets the following:)J 278 720 :M(-)S 287 720 :M1.921 .192('char' \()J 128.005 :m)3.065 .306(without signedness specifier)J1.565 .156(\) is a specific)J 287 730 :M>2.116 .212(character type, whose constants are the character)J 287 740 :M?1.863 .186(constants of C; this type is a closed type, not an)Jendp %%Page: 2 2%%BeginPageSetupinitializepage(YN; page: 2 of 10)setjob%%EndPageSetup -29 -30 :TgS 29 30 538 781 rC 294 804 :Mf1_10 sf(2)S69 74 :M?2.027 .203(arithmetic type, which means that the \(in\)famous)J69 84 :M-.023(idiom:)A69 99 :Mf7_9 sf -.367(int)Af8_9 sf -.367( )Af7_9 sf$-.381(c; /* notice the 'int' ! */)A 69 109 :M5-.409(while \(\( c = getchar\(\) \) != EOF\) {...})A 69 124 :Mf1_10 sf-.026(is to be replaced by:)A 69 139 :Mf7_9 sf -.256(char)Af8_9 sf -.256( )Af7_9 sf -.512(c;)A 69 149 :M9-.408(while \(c = getc\(stdin\), !feof\(stdin\)\) {...})A 69 164 :Mf1_10 sf>.022 .002(A 'char' constant must contain just one character,)J 60 179 :M(-)S 69 179 :MJ.173 .017(integral types are: \(un\)signed char, \(\(un\)signed\) short,)J 69 189 :MI1.074 .107(\(\(un\)signed\) int, \(\(un\)signed\) long; combinations of)J 69 199 :MA1.747 .175('signed' and 'unsigned' varieties that could lead to)J 69 209 :MB.038 .004(information loss or "unexpected" results \([K&R 88] p.)J 69 219 :MA.531 .053(198\) are pointed out. Besides, an attempt to compare)J 69 229 :MB1.493 .149(differences of 'unsigned' via relational operators is)J 69 239 :M<2.412 .241(flagged, because the underlying C compiler will)J 69 249 :M>-.015(generate an unsigned branch in such a case, fact which)A 69 259 :M;.998 .1(may not be obvious to all programmers. Consider a)J 69 269 :M;2.897 .29(graphic application where point coordinates are)J 69 279 :M&-.063(represented as unsigned; then )Af7_9 sf-.084(xPoint2 - xPoint1)Af1_10 sf -.071( is)A 69 289 :M?1.647 .165(still an unsigned \(from the underlying C compiler)J 69 299 :M/2.785 .279(point of view\), which means that )Jf7_9 sf5.213 .521(xPoint2 -)J 69 309 :M1.254 .125(xPoint1 > -1)Jf1_10 sf2.744 .074( will always be false ! It is strongly)J 69 319 :M>.17 .017(recommended to '#define' a "byte/ubyte" synonym for)J 69 329 :M-.082('signed/unsigned char',)A 60 344 :M(-)S 69 344 :M&.127 .013(floating types: no change,)J 60 359 :M(-)S 69 359 :MC.526 .053(a boolean type is introduced, that is to be the type of)J 69 369 :MM.832 .083(the \(first\) argument\(s\) of 'if', 'while', '?:', '||', '&&' or)J 69 379 :MC.238 .024('!' operators, and the type of the second argument of a)J 69 389 :M>-.001('for' operator. It has to be defined by the following:)A 69 404 :Mf7_9 sf"-.415(typedef unsigned int bool;)A 69 419 :Mf1_10 sfC.55 .055(Relational and equality operators, as well as '||', '&&')J 69 429 :MC2.473 .247(and '!', yield a result of type 'bool'. '&', '|', '^')J 69 439 :MB.664 .066(operators yield a result that can be used generally as)J 69 449 :MD.691 .069('bool', but , since its value is not guaranteed to be in)J 69 459 :MA.894 .089(the [0, 1] interval, a check is performed to warn in)J 69 469 :M51.503 .15(case of possible strange result \(e.g.: )Jf7_9 sf3.026 .303(if \(\(feof)J 69 479 :M/-.361(\(stdin\) & fclose\(stdin\)\) == TRUE\))Af1_10 sf -.279( \).)A 69 494 :M>.333 .033(The constants 'TRUE' and 'FALSE' \(which may carry)J 69 504 :M>.907 .091(any other name suitable to the programmer, such as)J 69 514 :M=1.008 .101(VRAI and FAUX\) are defined via constant boolean)J 69 524 :M!-.019(expressions, for example:)A 69 539 :Mf7_9 sf-.419(# define TRUE \(0==0\))A 69 549 :M-.419(# define FALSE \(0!=0\))A 69 564 :Mf1_10 sf?.363 .036(Besides eliminating bad programming practices, such)J 69 574 :M%-.044(as \(excerpt from 'strcpy'\):)A 69 589 :Mf7_9 sf-.399(while \()A0 1 rm -.399(*)A0 -1 rm-.399(s++ = )A0 1 rm -.399(*)A0 -1 rm-.498(t++\);)A 69 599 :Mf1_10 sf-.186(\(instead of )Af7_9 sf-.287(while \(\()A0 1 rm -.287(*)A0 -1 rm-.287(s++ = )A0 1 rm -.287(*)A0 -1 rm-.287(t++\) != '\\0'\);)Af1_9 sf -.279( \))A 69 614 :Mf1_10 sfF.234 .023(a side effect of the introduction of this type is that the)J 69 624 :M-.255(standard error:)A 69 639 :Mf7_9 sf-.189(if \(y = 0\)...)Af1_10 sf-.112( \(instead of )Af7_9 sf-.189(if \(y == 0\)...)Af1_10 sf<29>S 69 654 :M@.295 .029(is flagged by a "Boolean expected" warning \(warning)J 69 664 :M (also for:)S 69 679 :Mf7_9 sf--.239(if \(setOfBits & mask == Msk1\)... , )Af1_10 sf-.193(instead of)A 95 689 :M -.156( )Af7_9 sf/-.337(if \(\(setOfBits & mask\) == Msk1\)... )Af1_9 sf<29>S 69 704 :Mf1_10 sfD.166 .017(Explicit comparison to zero is less cryptic, and entails)J 69 714 :MB1.054 .105(no loss of efficiency, the compiler testing against 0)J 69 724 :M-.099(anyway,)A 60 739 :M(-)S 69 739 :M?1.55 .155('enum' types are closed, i. e. they are not mixable)J 69 749 :MB.655 .065(between them, nor with arithmetic types \(in fact, the)J 69 759 :M@.766 .077('char' type seen previously is considered as an enum)J 69 769 :M@.193 .019(type\). However, some amount of mixing is allowed: a)J 316 74 :MA1.361 .136(\(signed\) int can be added to or subtracted from an)J 316 84 :M:1.5 .15(enum, yielding an enum of the same kind. This is)J 316 94 :M=.67 .067(because the notion of distance between two enum or)J 316 104 :ME1.329 .133(char is often useful \(for example, '9' - '0'\), so sub-)J 316 114 :MB.494 .049(tracting two enum \(of the same kind\) is allowed, and)J 316 124 :M.292 .029(yields an 'int'.)J 316 139 :MA.398 .04(Enum constants can be initialized by signed 'int'. The)J 316 149 :M@.17 .017(constants of a given enum must have differing values,)J 316 159 :M.584 .058(except if the /)J0 2 rm.24(*)A0 -2 rm0 -2 rm.26(~)A0 2 rm.246(SameValue)A0 2 rm.24(*)A0 -2 rm$.711 .071(/ d-pragma is used \("d-)J 316 169 :M+-.086(pragmas" will be described later\).)A 316 184 :M:2.724 .272(The only operations allowed on enums, besides)J 316 194 :M?1.248 .125(comparison, assignment and addition/subtraction of)J 316 204 :MG1.106 .111(distance, are '&', '|', '^', '~', '>>', '<<'; so enums can)J 316 214 :MC1.067 .107(be used as sets of bits, but not \(in the absence of a)J 316 224 :M(/)S0 2 rm(*)S0 -2 rm0 -2 rm(~)S0 2 rm.035(TypeCombination)A0 2 rm(*)S0 -2 rm-.126 .013(/ d-pragma telling the contrary\))J 316 234 :M -.01(as arithmetic quantities,)A 307 249 :M(-)S 316 249 :M@.787 .079(a major innovation of Disciplined C is the notion of)J 316 259 :M?2.209 .221("parallel type", that allows a distinction between)J 316 269 :M93.696 .37(information type and representation type. The)J 316 279 :M.038(following:)A 316 294 :Mf7_9 sf#-.414(typedef int Tindex, Tval;)A 316 304 :M$-.413(typedef Tindex Trow, Tcol;)A 316 319 :Mf1_10 sf1.153 .115(creates four )J 10 f5_1 :p 31.709 :m.283(distinct)A-1.046 .105( types, but which all accept the)J 316 329 :M:2.925 .293(same operations and the same constants as the)J 316 339 :MD.634 .063("representation" type \('int' here\). Tindex, Tval, Trow)J 316 349 :M=-.023(and Tcol are examples of "information" types, because)A 316 359 :M83.713 .371(they convey an idea of the semantics of the)J 316 369 :M?.464 .046(corresponding objects. For example, they may be put)J 316 379 :M@.356 .036(to use in a checkers playing program: Tval will name)J 316 389 :MA.004 0('int's that represent values of checkers, Trow and Tcol,)J 316 399 :MA.571 .057('int's that represent row and column indexes, Tindex,)J 316 409 :M!-.077(generic type for indexes.)A 316 424 :MA.15 .015(Tindex, Tval, Trow and Tcol are called parallel types;)J 316 434 :M,.274 .027(in fact, a type T is said to be )J 30.847 :m.109(parallel)A.287 .029( to a type xxx iff)J 316 444 :MC.129 .013(it is defined by a "typedef xxx T", with xxx parsing to)J 316 454 :M@1.662 .166(a naked 'baseType' \(no qualifier nor modifier; see)J 316 464 :M@.094 .009(grammar in Appendix A\). In other words, T must be a)J 316 474 :M'.125 .013(strict synonym of baseType.)J 316 489 :MB1.133 .113(This "parallel" relation is transitive but antisymme-)J 316 499 :MC.518 .052(trical. Other typedefs do not introduce parallel types;)J 316 509 :M?1.39 .139(they just name qualified/modified variations of the)J 316 519 :M-.102(baseType.)A 316 534 :M2.038 .204(The )J88.42 :m 4.162 .416(representation type)J'1.745 .175( of a parallel type is the)J 316 544 :MA.356 .036(possibly qualified or modified nativeType associated,)J 316 554 :M>.214 .021(using traditional C rules, to its type identifier.)J 316 569 :M=.54 .054(Cascaded synonymous typedefs create a hierarchy of)J 316 579 :MB1.163 .116(parallel types, hierarchy used to set a compatibility)J 316 589 :MD.406 .041(rule, and to find the result type of an operator. Let us)J 316 599 :MB.721 .072(define that a type T1 is "higher" than a parallel type)J 316 609 :M@.973 .097(T2 if T1 is T2 or any ancestor of T2 \(including the)J 316 619 :MB.701 .07(representation type\), that is, T1 has been used in the)J 316 629 :M;2.646 .265(chain of typedefs needed to define T2 from its)J 316 639 :M?1.454 .145(representation type. For example, Tindex is higher)J 316 649 :M?.68 .068(than Trow, but not than Tval, and Tval is not higher)J 316 659 :M?.928 .093(than Tindex or Trow. If a parallel type meets a non)J 316 669 :MA.69 .069(parallel type compatible with its representation type,)J 316 679 :M=2.566 .257(the wider representation type is the higher type)J 316 689 :MA1.444 .144(\(unsigned varieties are considered wider than their)J 316 699 :MA.126 .013(signed counterpart; numeric constants are supposed to)J 316 709 :MB.07 .007(have the narrowest representation type possible, in the)J 316 719 :M8-.063(same variety if they are signed or U-suffixed\).)A 316 734 :M=2.469 .247(Then the compatibility rule is the following: an)J 316 744 :MA.806 .081(operator \(except shift operators, whose operands are)J 316 754 :M<-.01(deconnected\) can only combine operands such that the)A 316 764 :M?.79 .079(type of one operand is higher than all other operand)J 316 774 :MC.451 .045(types; for operators other than relational and equality)Jendp %%Page: 3 3%%BeginPageSetupinitializepage(YN; page: 3 of 10)setjob%%EndPageSetup -29 -30 :TgS 29 30 538 781 rC 294 804 :Mf1_10 sf(3)S69 74 :M?2.03 .203(operators, the result type is this higher type. For)J69 84 :M?.4 .04(assignments, the higher type has to be the type of the)J69 94 :MC1.449 .145(left operand. For functions, see below \('Casts'\) the)J 69 104 :M(/)S0 2 rm -.062(*)A0 -2 rm0 -2 rm -.067(~)A0 2 rm-.057(ResultType)A0 2 rm -.062(*)A0 -2 rm-.057(/ d-pragma.)A 69 119 :MD.212 .021(Since these rules do not facilitate mixing of types, the)J 69 129 :M.212(/)A0 2 rm.381(*)A0 -2 rm0 -2 rm.412(~)A0 2 rm.369(TypeCombination)A0 2 rm.381(*)A0 -2 rm)1.268 .127(/ d-pragma tells the allowed)J 69 139 :M..651 .065(combinations of types \(e.g. Tohm )J0 2 rm.246 .025(* )J0 -2 rm.749 .075(Tamp -> Tvolt\).)J 69 149 :M<3.54 .354(Besides, there is a notion of 'coefficient', for)J 69 159 :M=2.718 .272(multiplication, division, modulo, whereby if the)J 69 169 :M@1.2 .12(coefficient is of representation type, then the result)J 69 179 :MC.308 .031(type is the type of the other operand. Also, a constant)J 69 189 :MB.185 .018(of representation type meeting a parallel type behaves)J 69 199 :M&.285 .029(as if it was of that type.)J 69 214 :M@1.111 .111(The special rules that apply to enums also apply to)J 69 224 :M-.155(their descendants.)A 69 239 :M.099 .01(The /)J0 2 rm(*)S0 -2 rm0 -2 rm(~)S0 2 rm.036(RootType)A0 2 rm(*)S0 -2 rm0.118 .012(/ d-pragma isolates the so qualified)J 69 249 :MC.726 .073(type from its ancestors \(renders invisible the subtree)J 69 259 :M@1.41 .141(headed by that type\); also, the constants of a such)J 69 269 :M?2.699 .27("root" type are compatible with all its \(visible\))J 69 279 :M-.255(descendants.)A 69 294 :M.-.009(Let us consider the following example:)A 69 309 :Mf7_9 sf+-.41(typedef int Ti1, Tri1 /*~RootType*/;)A 69 319 :M/-.409(typedef Tri1 Trri2 /*~RootType*/, Tri2;)A 69 329 :M/-.409(Ti1 i1; Tri1 ri1; Tri2 ri2; Trri2 rri2;)A 69 349 :M-.465(i1 = 0;)A 165 349 :M-.456(/* OK */)A 69 359 :M-.456(ri1 = 0;)A 165 359 :M-.439(/* Wrong */)A 69 369 :M-.429(ri1 = \(Tri1\)0;)A 165 369 :M-.456(/* OK */)A 69 379 :M-.456(ri2 = 0;)A 165 379 :M-.439(/* Wrong */)A 69 389 :M-.427(ri2 += \(Tri1\)1;)A 165 389 :M -.418(/* OK \(generic cst\) */)A 69 399 :M-.443(ri2 = ri1;)A 165 399 :M-.439(/* Wrong */)A 69 409 :M-.443(ri1 = ri2;)A 165 409 :M-.456(/* OK */)A 69 419 :M-.427(rri2 = \(Tri1\)0;)A 165 419 :M-.439(/* Wrong */)A 69 429 :M-.425(rri2 = \(Trri2\)0;)A 165 429 :M-.456(/* OK */)A 69 439 :M-.427(ri1 = \(Trri2\)0;)A 165 439 :M-.439(/* Wrong */)A 69 449 :M-.429(ri1 = \(Tri2\)0;)A 165 449 :M-.456(/* OK */)A 69 479 :Mf1_10 sf'-.023(\(the created hierarchy is\312:)A142 487 12 12 rC 143 496 :M(int)SgRgS 112 502 15 12 rC 113 511 :Mf1_10 sf(Ti1)SgRgS 171 502 64 12 rC 172 511 :Mf1_10 sf-.013(Tri1 \(root type\))AgRgS 202 518 19 12 rC 203 527 :Mf1_10 sf -.071(Tri2)AgRgS 128 518 67 12 rC 129 527 :Mf1_10 sf-.032(Trri2 \(root type\))AgRgS 111 486 125 45 rC-1 -1 122 503 1 1 146 499 @b!152 500 -1 1 178 502 1 152 499 @a!183 515 -1 1 209 517 1 183 514 @a-1 -1 153 518 1 1 177 514 @bgRgS 29 30 538 781 rC 69 545 :Mf1_10 sf<29>S 69 560 :M=2.473 .247(To ease up things, 'int' constants can be added/)J 69 570 :M>2.781 .278(subtracted uncasted to/from \(numeric\) root type)J 69 580 :M.032(constants.)A 69 595 :M!.068 .007(As can be seen, the /)J0 2 rm(*)S0 -2 rm0 -2 rm(~)S0 2 rm.03(RootType)A0 2 rm(*)S0 -2 rm.097 .01(/ d-pragma allows a)J 69 605 :MG.128 .013(\(leaf\) type to be closed \(not to accept constants of any)J 69 615 :M-.051(of its ascendants\),)A 69 630 :M>2.569 .257(In short, the parallel type facility enables name)J 69 640 :MA.625 .063(equivalence instead of structural equivalence for any)J 69 650 :M:2.867 .287(type in C, and so fosters programmers to give)J 69 660 :MB.818 .082(differing names to the types of their different object)J 69 670 :M-.037(classes.)A 60 685 :M 10 f5_1 :p26 :m -.24(Arrays)A 60 700 :M@-.068(Arrays are a common data structure, easily understood by)A 60 710 :M;3.115 .311(most programmers because of their mathematical)J 60 720 :M-.17(background.)A 60 735 :MC.594 .059(But in C, arrays, especially dynamically defined arrays)J 60 745 :MF1.091 .109(\(by way of 'malloc'\), are very difficult to use without)J 60 755 :MC.383 .038(coming across the notion of pointers, an awful prospect)J 60 765 :M@1.779 .178(for many naive users. So, with the help of a set of)J 60 775 :MG.117 .012(macros \(predefined in a header file called "dynarray.h"\),)J 60 785 :ME.507 .051(Disciplined C makes it possible to use any array \(static)J 307 74 :MC1.452 .145(or dynamic\) without ever having to use pointers \(cf.)J 307 84 :M-.13(Appendix B\).)A 307 99 :MB1.185 .118(On the other hand, the array concept being natural, a)J 307 109 :M4-.051(pointer can always be used as an array name.)A 307 124 :M=1.4 .14(There is no automatic conversion from an array to a)J 307 134 :MJ.214 .021(pointer to its first element \(except for string literals, and)J 307 144 :MC1.034 .103(for function parameter passing: simulation of call "by)J 307 154 :ME.739 .074(reference"\), and one has to explicitly use the construct)J 307 164 :M.542("&array)A0 -1 rm.39([)A0 1 rm.326(i)A0 -1 rm.39(])A0 1 rm.478(")Af2_10 sf .266 .027( )Jf1_10 sf&1.279 .128(to get a pointer on the i)Jf1_8 sf0 -2 rm .365(th)A0 2 rmf1_10 sf0 -3 rm .266 .027( )J0 3 rm2.975 .298(element. One)J 307 174 :M3.309 .031(consequence is that the construction )Jf7_9 sf.486 .049(if \(array1 ==)J 307 184 :M(array2\) ...)Sf1_10 sf5.01 .001( is not accepted, so programmers will not)J 307 194 :M,-.086(believe that arrays can be compared.)A 307 209 :MD.583 .058(Another feature of Disciplined C is that, at each use of)J 307 219 :MF.429 .043(an array, the type of the index expression \(any integral,)J 307 229 :MC1.014 .101(enum or bool type\) is checked against the type of the)J 307 239 :M;3.987 .399(bound; this last type can be specified via the)J 307 249 :M.078(/)A0 2 rm.141(*)A0 -2 rm0 -2 rm.153(~)A0 2 rm.807 .081(IndexType )J0 2 rm.141(*)A0 -2 rm,.517 .052(/ d-pragma \(which overrides the)J 307 259 :MF.234 .023(type of the bound-giving expression, if present\). This d-)J 307 269 :MB1.142 .114(pragma may also be used for pointers, to cater to the)J 307 279 :M6-.1(case where they are used as dynamic array names.)A 307 294 :MB.631 .063(The value of a constant index expression is checked to)J 307 304 :MD.626 .063(be positive and less than the bound \(except if indexing)J 307 314 :M-.019(pointer\).)A 307 329 :M22 :m .084(Casts)A 307 344 :M?1.366 .137(To encourage programmers to choose the right types)J 307 354 :MD.051 .005(from the outset, and to enhance program portability with)J 307 364 :MC.508 .051(respect to, for example, alignment problems, the use of)J 307 374 :M$-.029(casts is severely monitored:)A 307 389 :M(-)S 316 389 :M=1.853 .185(any arithmetic/enum/bool type can be cast to any)J 316 399 :M=2.149 .215(other arithmetic/enum/bool type, but an overflow)J 316 409 :M3-.038(check is performed on constant expressions,)A 307 424 :M(-)S 316 424 :M@1.34 .134(pointers: they can only be cast to other pointers; a)J 316 434 :M1.415 .142(non 'void )J0 2 rm.536(*)A0 -2 rm51.373 .137(' pointer cannot be cast to a pointer on)J 316 444 :M@1.367 .137(higher alignment-requiring type, or to a pointer on)J 316 454 :M8(type whose internal layout is machine dependent; only)S 316 464 :M?.973 .097(the constant 0 may be cast to a pointer. Conversion)J 316 474 :M.861 .086(from a 'void )J0 2 rm.363(*)A0 -2 rm31.126 .113(' pointer \(except NULL\) to any other)J 316 484 :M?.946 .095(pointer has to be documented either by a cast or by)J 316 494 :M2.134 .213(using the /)J0 2 rm.794(*)A0 -2 rm0 -2 rm.859(~)A0 2 rm.778(VoidToOther)A0 2 rm.794(*)A0 -2 rm.441(/)A0 2 rm .361 .036( )J0 -2 rm3.086 .309(d-pragma, this for)J 316 504 :M7.037 .004(example to prevent the following construct:)J 316 519 :Mf7_9 sf -.399(void )A0 1 rm -.399(*)A0 -1 rm-.399(pv; struct{...} )A0 1 rm -.399(*)A0 -1 rm-.399(pst; float )A0 1 rm -.399(*)A0 -1 rm -.532(pfl;)A 316 529 :M!-.415( ... ; pst= pv = pfl; ...)A 316 544 :Mf1_10 sf..304 .03(from going unnoticed. A d-pragma, /)J0 2 rm.088(*)A0 -2 rm0 -2 rm.095(~)A0 2 rm.081(ResultType)A0 2 rm.088(*)A0 -2 rm .093(/,)A 316 554 :MA1.06 .106(eases the situation for generic "modifier" functions,)J 316 564 :MA.971 .097(such as 'memcpy' or 'realloc', by specifying that the)J 316 574 :MB1.167 .117(result type of a given call to such a function is the)J 316 584 :M@.46 .046(type of the current actual parameter corresponding to)J 316 594 :M -.027(the /)A0 2 rm(*)S0 -2 rm0 -2 rm(~)S0 2 rm-.036(ResultType)A0 2 rm(*)S0 -2 rm+-.031(/ qualified formal parameter, e.g.:)A 316 609 :Mf7_9 sf -.399(void )A0 1 rm -.399(*)A0 -1 rm-.399(realloc\(void )A0 1 rm -.399(*)A0 -1 rm -.399(p /)A0 1 rm -.399(*)A0 -1 rm-.399(~ResultType)A0 1 rm -.399(*)A0 -1 rm -.797(/,)A 377 619 :M-.399( size_t n\); /)A0 1 rm -.399(*)A0 -1 rm-.399( declaration )A0 1 rm -.399(*)A0 -1 rm(/)S 316 634 :M-.399(realloc\(ptr, exp\) /)A0 1 rm -.399(*)A0 -1 rm-.432( type of this)A 342 644 :M+-.399( 'realloc' call = type of 'ptr' )A0 1 rm -.399(*)A0 -1 rm -.797(/,)A 316 659 :Mf1_10 sf.919 .092(The type of the /)J0 2 rm.396(*)A0 -2 rm0 -2 rm.429(~)A0 2 rm.365(ResultType)A0 2 rm.396(*)A0 -2 rm1.594 .159(/ formal parameter)J 316 669 :MC.533 .053(must be the same that \(or a descendant of\) the return)J 316 679 :M!.183 .018(type of the function.)J 316 694 :MB.719 .072(For generic "creator" functions, such as 'malloc', see)J 316 704 :M(below the /)S0 2 rm(*)S0 -2 rm0 -2 rm(~)S0 2 rm (Generic)S0 2 rm(*)S0 -2 rm(/ d-pragma\312,)S 307 719 :M(-)S 316 719 :MC.023 .002(arrays: they can't be cast to anything \(meaningless\),)J 307 734 :M(-)S 316 734 :MC.312 .031(parallel types: they may be cast freely into each other)J 316 744 :M.18 .018(\(but the /)J0 2 rm.075(*)A0 -2 rm0 -2 rm.081(~)A0 2 rm .072(CastTo)A0 2 rm.075(*)A0 -2 rm/.177 .018(/ d-pragma is rather to be used in)J 316 754 :M-.053(that case\).)Aendp %%Page: 4 4%%BeginPageSetupinitializepage(YN; page: 4 of 10)setjob%%EndPageSetup -29 -30 :TgS 29 30 538 781 rC 294 804 :Mf1_10 sf(4)S60 79 :M?2.147 .215(Casts not conforming to these rules, or to a lower)J60 89 :MB1.201 .12(qualified pointer type, elicit a warning, which can be)J60 99 :M#5.113 .511(avoided by using the /)J0 2 rm 1.795(*)A0 -2 rm0 -2 rm 1.941(~)A0 2 rm1.794(OddCast)A0 2 rm 1.795(*)A0 -2 rm3.765 .377(/ or the)J 60 109 :M(/)S0 2 rm -.075(*)A0 -2 rm0 -2 rm -.081(~)A0 2 rm-.074(PortableQM)A0 2 rm -.075(*)A0 -2 rm-.069(/ d-pragma.)A 60 124 :MA1.044 .104(Since the number of casts in a program can be put to)J 60 134 :MF.293 .029(use in a qualimetry tool, the needless use of them \(or of)J 60 144 :M.266(/)A0 2 rm.479(*)A0 -2 rm0 -2 rm.518(~)A0 2 rm.479(OddCast)A0 2 rm.479(*)A0 -2 rm.722 .072(/, /)J0 2 rm.479(*)A0 -2 rm0 -2 rm.518(~)A0 2 rm.474(PortableQM)A0 2 rm.479(*)A0 -2 rm"1.536 .154(/ d-pragmas\) is also)J 60 154 :M-.212(flagged.)A 60 169 :M 10 f5_1 :p40 :m.07(Functions)A 60 184 :MA.184 .018(Non-void functions should normally return named types)J 60 194 :MB-.007(\(problem-related names\), and so make use of the parallel)A 60 204 :M?3.809 .381(types facility. Yet some functions are 'utilities')J 60 214 :MD.641 .064(functions, that is there is no meaningful name for their)J 60 224 :M2.439 .044(returned type \(e.g. 'strcmp'\). The /)J0 2 rm.139(*)A0 -2 rm0 -2 rm.15(~)A0 2 rm.104(Utility)A0 2 rm.139(*)A0 -2 rm.637 .064(/ d-pragma)J 60 234 :M.809 .081(signals this.)J 60 249 :MB.37 .037(Also, the parallel type mechanism uses inheritance, and)J 60 259 :M3.446 .045(sometimes subtyping is needed. So the /)J0 2 rm.138(*)A0 -2 rm0 -2 rm.149(~)A0 2 rm.125(Generic)A0 2 rm.138(*)A0 -2 rm.289 .029(/ d-)J 60 269 :MD.58 .058(pragma tells that the result of a such qualified function)J 60 279 :M21.923 .192(is compatible with any visible \(cf /)J0 2 rm.665(*)A0 -2 rm0 -2 rm.719(~)A0 2 rm.665(RootType)A0 2 rm.665(*)A0 -2 rm .812(/\))A 60 289 :M71.102 .11(descendant of its return type. For a 'void )J0 2 rm.414(*)A0 -2 rm1.696 .17(' returning)J 60 299 :MF.29 .029(function, this d-pragma tells that its result is compatible)J 60 309 :M.267 .027(with any pointer.)J 60 324 :M>2.507 .251(Functions formal pointer parameters that could be)J 60 334 :M86.495 .65(qualified 'const' are signaled. Besides, the)J 60 344 :M.396(/)A0 2 rm.712(*)A0 -2 rm0 -2 rm.77(~)A0 2 rm:2.811 .281(MayModify*/ d-pragma tells that, although its)J 60 354 :M?1.531 .153(formal parameters are marked const, a function may)J 60 364 :MB.574 .057(modify its environment through them, either via casted)J 60 374 :M?-.051(parameter or through pointer embedded in struct/unions.)A 60 389 :M(The /)S0 2 rm(*)S0 -2 rm0 -2 rm(~)S0 2 rm:-.005(ResultPtr*/ d-pragma tells that a returned pointer)A 60 399 :MF.222 .022(is the same as the so-qualified parameter, this to be able)J 60 409 :MC.127 .013(to propagate the 'const' checking \(e.g. in 'strchr'\).)J 60 424 :M1.021 .102(The /)J0 2 rm.368(*)A0 -2 rm0 -2 rm.398(~)A0 2 rm61.472 .147(SizeOfMemBlk*/ d-pragma is intended to be)J 60 434 :M:3.503 .35(used with memory allocating functions, such as)J 60 444 :MC.896 .09('malloc', to allow verification that the argument of the)J 60 454 :ME.276 .028(possible sizeof used is of the same type as the receiving)J 60 464 :M(pointer pointed type.)S 60 479 :M66.806 .681(Others d-pragmas related to functions are)J 60 489 :M.32(/)A0 2 rm.576(*)A0 -2 rm0 -2 rm.623(~)A0 2 rm.531(ResultType)A0 2 rm.576(*)A0 -2 rm 1.355 .135(/ \(cf 'Casts'\), /)J0 2 rm.576(*)A0 -2 rm0 -2 rm.623(~)A0 2 rm.564(PseudoVoid)A0 2 rm.576(*)A0 -2 rm1.624 .162(/ and)J 60 499 :M(/)S0 2 rm(*)S0 -2 rm0 -2 rm(~)S0 2 rm.018(NeverReturns)A0 2 rm(*)S0 -2 rm7.065 .007(/ \(see later, 'Miscelleanous'\); function)J 60 509 :M'-.046(parameters may also be marked /)A0 2 rm -.054(*)A0 -2 rm0 -2 rm -.058(~)A0 2 rm-.055(NotUsed)A0 2 rm -.054(*)A0 -2 rm-.042(/ as well as)A 60 519 :M.155(/)A0 2 rm.278(*)A0 -2 rm0 -2 rm.301(~)A0 2 rm.208(Utility)A0 2 rm.278(*)A0 -2 rm.452 .045(/ \(do )J 13.489 :m .237(not)A-.928 .093( accept an actual parameter whose)J 60 529 :M%.102 .01(type is a parallel type\).)J 60 544 :M=2.203 .22(As an extension, several formal parameters can be)J 60 554 :M1.021 .102(qualified by /)J0 2 rm.325(*)A0 -2 rm0 -2 rm.352(~)A0 2 rm.3(ResultType)A0 2 rm.325(*)A0 -2 rm&.753 .075(/; then the type of one of)J 60 564 :MC.057 .006(the corresponding actual parameters must be higher than)J 60 574 :MB1.403 .14(all other corresponding actual parameters' types; that)J 60 584 :M9.215 .022(type is the result type of the function call.)J 60 599 :M74 :m.79 .079(Compilation units)J 60 614 :MA1.242 .124(One of the plagues of C is the lack of type-checking)J 60 624 :M>2.409 .241(between formal and actual parameters for external)J 60 634 :MA1.539 .154(functions, or more generally, between definition and)J 60 644 :MA2.275 .228(uses of external objets \(we will, for the following)J 60 654 :ME.422 .042(discussion, call "global" a block-level-0 object/function)J 60 664 :MC.767 .077(visible in only one compilation unit, and "external" an)J 60 674 :ME.145 .014(object/function visible from several compilation units\).)J 60 689 :MB.238 .024(Another problem is that the encapsulation of C modules)J 60 699 :M>2.606 .261(is usually very bad, because one of the tenets of)J 60 709 :MB1.724 .172(encapsulation is not respected: "anything that is not)J 60 719 :MC.727 .073(explicitly made visible must be hidden". In C, the rule)J 60 729 :MG.755 .076(is: "anything \(at block level 0\) not explicitly hidden is)J 60 739 :ME1.088 .109(visible"; this is because the 'static' keyword has to be)J 60 749 :ME.519 .052(explicitly used, instead of being the default option, and)J 60 759 :M5-.002(so is "often" \(the word is weak\) a forgotten.)A 307 79 :M>.704 .07(Something also confusing to many programmers is the)J 307 89 :MC.304 .03(difference between declarations and definitions, and the)J 307 99 :MC.631 .063(uniqueness of definitions. This is because, for C, some)J 307 109 :MI.03 .003(declarations are also definitions \("tentative definitions"\);)J 307 119 :M>2.791 .279(also, a number of compilers/linkers allow several)J 307 129 :M0-.02(definitions for the same external object.)A 307 144 :MA1.248 .125(Disciplined C solves these problems in the following)J 307 154 :M?2.789 .279(way: any object/function/type identifier has to be)J 307 164 :MC1.941 .194(declared \(just once\) before use; any object/function)J 307 174 :MG.324 .032(defined at block level 0 as not 'static' has to be declared)J 307 184 :MF.188 .019(in a header file; there must be one "header" file for each)J 307 194 :M8-.039("body" file defining external objects/functions.)A 307 209 :MC-.007(A header file is constrained to contain only \(besides type)A 307 219 :MA-.007(and macro definitions\) external declarations, which must)A 307 229 :MC.318 .032(make use of the 'extern' keyword. A definition must not)J 307 239 :M -.01(make use of this keyword.)A 307 254 :M1.035 .003(This provides the following benefits:)J 307 269 :M(-)S 316 269 :M>1.229 .123(programmers are warned if they have forgotten the)J 316 279 :M-.043('static' keyword,)A 307 294 :M(-)S 316 294 :MA.74 .074(for really external objects/functions, since they must)J 316 304 :ME.119 .012(be declared in \(common\) header file\(s\), type checking)J 316 314 :M--.006(between compilation units is secured,)A 307 329 :M(-)S 316 329 :M95.436 .544(an external object definition \(and possible)J 316 339 :MF1.022 .102(initialization\) is easier to find: it can only be in the)J 316 349 :M$-.097(corresponding "body" file\),)A 307 364 :M(-)S 316 364 :MA1.131 .113(the difference between declaration and definition is)J 316 374 :M-.237(made clearer.)A 307 389 :MB1.445 .145(To cater for module composition, the restriction that)J 307 399 :M94.399 .44(there be only one declaration for an external)J 307 409 :ME1.142 .114(object/function is relaxed; but, in a given header file,)J 307 419 :M@1.897 .19(only one declaration for a given object/ function is)J 307 429 :MF.827 .083(allowed; the possible constraints \(qualifiers, array size)J 307 439 :MB1.705 .171(etc\) have to keep constant or increasing in order of)J 307 449 :M"-.034(inclusion of header files.)A 307 464 :MB.797 .08(Finally, the scope of any global object/type/tag can be)J 307 474 :MD.163 .016(terminated before the end of the compilation unit by use)J 307 484 :M-.053(of the /)A0 2 rm -.075(*)A0 -2 rm0 -2 rm -.081(~)A0 2 rm!-.065(Undef\(Tag\) )A0 2 rm -.075(*)A0 -2 rm-.069(/ d-pragma.)A 307 499 :M 95.001 :m!-.079(Inclusion of header files)A 307 514 :ME.088 .009(Header files are often included at the wrong level. They,)J 307 524 :ME~DCC.BCK: [DCC_DISTRIB]DCCARTICLE.PS;2||g.224 .022(most of the time, should be included at least at the body)J 307 534 :MH1.062 .106(file level \(and at the beginning of it\), so that all used)J 307 544 :MG.291 .029(services are easy to spot. If they are not included at that)J 307 554 :ME1.027 .103(level \(and one of the functions/objects they declare is)J 307 564 :M#-.02(used\), a warning is issued.)A 307 579 :MC-.057(To cater to "composed" header files \(header files offering)A 307 589 :M;2.779 .278(services including other service\(s\)\), the /)J0 2 rm.794(*)A0 -2 rm0 -2 rm.859(~)A0 2 rm 1.206(Com-)A 307 599 :M.157(posingHdr)A0 2 rm.167(*)A0 -2 rm7.514 .051(/ d-pragma is supplied. For example, if one)J 307 609 :MA1.282 .128(wants to provide a service, giving all)J 307 619 :M@.972 .097(services of plus some others such as Bessel)J 307 629 :M?2.367 .237(and Jacobi functions, one will write the following)J 307 639 :M*.264 .026( header file\312:)J 307 654 :Mf7_9 sf*-.41(#include /*~ComposingHdr*/)A 307 669 :M&-.413(extern double bessel\( ... \);)A 307 679 :M&-.413(extern double jacobi\( ... \);)A 307 694 :Mf1_10 sf@1.582 .158(and then no warning will be incurred in a body file)J 307 704 :MB1.202 .12(including only , and yet using 'sin' \(or)J 307 714 :M1.212 .021(any other function/object\).)J 307 729 :M56 :m-.054(Encapsulation)A 307 744 :MC.307 .031(To still improve encapsulation, structures/unions/enums)J 307 754 :M=2.921 .292(declared in header files may be qualified by the)J 307 764 :M.25(/)A0 2 rm.45(*)A0 -2 rm0 -2 rm.486(~)A0 2 rm#1.823 .182(PrivateTo )J0 2 rm.45(*)A0 -2 rm&1.747 .175(/ d-pragma, which renders)J 307 774 :M@1.415 .141(their member's names invisible, except from macros/)Jendp %%Page: 5 5%%BeginPageSetupinitializepage(YN; page: 5 of 10)setjob%%EndPageSetup -29 -30 :TgS 29 30 538 781 rC 294 804 :Mf1_10 sf(5)S60 74 :MB-.007(functions defined in the indicated files. So a type may be)A60 84 :M8-.016(exported without its components being disclosed.)A 307 74 :Mf0_10 sf.586(D-Pragmas)A 307 89 :Mf1_10 sfC.217 .022(As seen previously, Disciplined C often needs advice or)J 307 99 :MA.661 .066(information, to be conveyed by pragmas. But it cannot)J 307 109 :M9.099 .01(use the pragma facility of C, for two reasons:)J 307 124 :M(-)S 316 124 :M@.531 .053(there might be an ambiguity with an already existing)J 316 134 :M;1.81 .181(local pragma, or a compiler might warn about an)J 316 144 :M-.014(unknown pragma,)A 307 159 :M(-)S 316 159 :M=1.882 .188(more significantly, C pragmas can only be at the)J 316 169 :M,.127 .013(beginning of a \(logical\) line.)J 307 184 :MD.126 .013(For those reasons, it was decided to define "d-pragmas",)J 307 194 :M?1.146 .115(and to make them look as comments, hoping that the)J 307 204 :M .398('/)A0 2 rm.869(*)A0 -2 rm0 -2 rm.939(~)A0 2 rm;2.479 .248(' prefix does not happen too often in existing)J 307 214 :M-.033(programs.)A 307 239 :Mf0_10 sf.835(Miscelleanous)A 307 254 :Mf1_10 sf?.428 .043(Many other improvements of C have been incorporated)J 307 264 :M?2.507 .251(in Disciplined C \(and are verified by the checker)J 307 274 :M-.122(program\):)A 307 289 :M(-)S 316 289 :MB1.919 .192('if', 'else', loop operators: if they are followed by)J 316 299 :MD1.138 .114(several statements on the same \(physical\) line, it is)J 316 309 :M>1.705 .17(asked whether all these statements are part of the)J 316 319 :M).25 .025('if'/'else' arm, or loop body,)J 307 334 :M(-)S 316 334 :M>2.284 .228(as an option, line indentation is checked against)J 316 344 :MB1.158 .116(current block level; this makes it possible to detect)J 316 354 :MD.06 .006(early missing left/right braces, or bad 'if'/loop bodies,)J 307 369 :M(-)S 316 369 :M@.555 .055(declarations have to be separated from statements by)J 316 379 :MD1.307 .131(white line\(s\), except if the first statement is empty)J 316 389 :M.021(\(";;"\),)A 307 404 :M(-)S 316 404 :MB.211 .021(only 'void' type expressions can be used as statements)J 316 414 :MB.805 .081(\(or as first argument of the comma operator, or first)J 316 424 :MB1.381 .138(and third arguments of the 'for' operator\), the only)J 316 434 :M+.108 .011(exceptions being the following:)J 319 449 :MS 328 449 :M<.396 .04(expression whose top operator is an assignment or)J 328 459 :M-.072(increment operator,)A 319 474 :MS 328 474 :M"2.814 .281(functions marked as /)J0 2 rm.836(*)A0 -2 rm0 -2 rm.905(~)A0 2 rm.818(PseudoVoid)A0 2 rm.836(*)A0 -2 rm2.759 .276(/ \(only)J 328 484 :M=-.022(functions whose main effect is a side effect, such as)A 328 494 :M8.051 .005('printf' or 'strcpy', should be so marked\).)J 316 509 :M/.448 .045(This way, probable errors such as ")Jf7_9 sf .163(fct;)Af1_10 sf.463 .046(" \(instead of)J 316 519 :M.121(")Af7_9 sf.16(fct\(\);)Af1_10 sf.289 .029("\), or ")Jf7_9 sf .16(a[i,j])Af1_10 sf.367 .037(" \(instead of ")Jf7_9 sf .16(a[i][j])Af1_10 sf.437 .044("\) are)J 316 529 :M@.829 .083(located. Also, it encourages programmers to test the)J 316 539 :MF.828 .083(value returned by I/O functions \('scanf', 'fputc', etc\),)J 316 549 :M#-.019(so as to detect I/O errors,)A 307 564 :M(-)S 316 564 :MA.399 .04(a non-void function must terminate in all cases either)J 316 574 :ME.418 .042(via a 'return exp', whose type is \(a descendant of\) the)J 316 584 :MC.12 .012(type of the function, or via a call to a function marked)J 316 594 :M.147 .015(as /)J0 2 rm.076(*)A0 -2 rm0 -2 rm.082(~)A0 2 rm.07(NeverReturns)A0 2 rm.076(*)A0 -2 rm4.184 .018(/ \(such as 'exit' or 'abort'\); to that)J 316 604 :M>1.932 .193(end, a simple control flow analysis is performed,)J 316 614 :M2-.056(which also detects unreachable statements,)A 307 629 :M(-)S 316 629 :M=1.337 .134(since Disciplined C is only aimed at ANSI C with)J 316 639 :M?.978 .098("new-style" functions, a function with no parameter)J 316 649 :ME-.093(can be declared/defined as f\( \) \(no 'void' keyword\), and)A 316 659 :M<-.03(still be considered only as a parameterless function,)A 307 674 :M(-)S 316 674 :MA.569 .057(if a parameter name is given in a function prototype,)J 316 684 :M<1.205 .12(the same name must be used for the corresponding)J 316 694 :MA1.448 .145(parameter in the function definition, this to ensure)J 316 704 :MB.312 .031(that the meaning of the prototype is/stays the same as)J 316 714 :M.364 .036(the implementation,)J 307 729 :M(-)S 316 729 :M?.4 .04(a function name is not a pointer on that function, and)J 316 739 :M?-.024(pointers on functions are to be dereferenced before use)A 316 749 :M'-.035(\(for the sake of regularity\),)A 307 764 :M(-)S 316 764 :MB.476 .048(switches: the 'switch' statement must control a block;)J 316 774 :M1.402 .04(a missing break is flagged, unless a /)J0 2 rm.148(*)A0 -2 rm0 -2 rm.16(~)A0 2 rm.153(NoBreak)A0 2 rm.148(*)A0 -2 rm.31 .031(/ d-)Jendp %%Page: 6 6%%BeginPageSetupinitializepage(YN; page: 6 of 10)setjob%%EndPageSetup -29 -30 :TgS 29 30 538 781 rC 294 804 :Mf1_10 sf(6)S69 74 :M@1.124 .112(pragma has been used; a 'default' case \(which must)J69 84 :MA.885 .089(come at the end of the switch\) is expected, unless a)J69 94 :M.271(/)A0 2 rm.487(*)A0 -2 rm0 -2 rm.527(~)A0 2 rm.457(NoDefault)A0 2 rm.487(*)A0 -2 rm01.294 .129(/ d-pragma has been used or, if the)J 69 104 :MA.211 .021(switch expression is of enum type, all enum constants)J 69 114 :M<2.412 .241(of that type have been used as case values; the)J 69 124 :M(/)S0 2 rm(*)S0 -2 rm0 -2 rm(~)S0 2 rm (FullEnum)S0 2 rm(*)S0 -2 rm/-.002(/ d-pragma can be used to get a warning)A 69 134 :MD.649 .065(if not all \(distinct-valued\) constants of a given enum)J 69 144 :MD.419 .042(are used as cases values, and a default case \(to catch,)J 69 154 :M5-.019(for example, spurious values\) has been used,)A 60 169 :M(-)S 69 169 :MA1.508 .151(in an effort to clarify the distinction between type)J 69 179 :MD2.975 .298(attribute \('extern'... 'register'\) and type qualifier)J 69 189 :MF.995 .099(\('const', 'volatile'\), the qualifier must lexically come)J 69 199 :M-.018(after the attribute,)A 60 214 :M(-)S 69 214 :MD1.947 .195('const'/'volatile' qualifiers are strictly obeyed \(and)J 69 224 :M'-.026(literal strings considered as )A 10 f5_1 :p 20.959 :m -.029(const)A-.025( char [ ] !\),)A 60 239 :M(-)S 69 239 :MC.118 .012(there is a warning if objects modified within the reach)J 69 249 :MH2.591 .259(of a setjmp\(\312\)/ longjmp\(\312\) pair are not qualified)J 69 259 :M.091('volatile',)A 60 274 :M(-)S 69 274 :M<2.828 .283(pointers on local objects cannot be returned or)J 69 284 :M>2.807 .281(assigned to global/external variables, unless the)J 69 294 :M.241(/)A0 2 rm.433(*)A0 -2 rm0 -2 rm.469(~)A0 2 rm.415(LocalAdr)A0 2 rm.433(*)A0 -2 rm31.178 .118(/ d-pragma is used \(this check is not)J 69 304 :M94.366 .437(perfectly foolproof, however, because of the)J 69 314 :M2.362 .036(possibility of pointers on pointers\),)J 60 329 :M(-)S 69 329 :M?.904 .09(except inside array and enum initialization, numeric)J 69 339 :MD-.029(constants \(barring -1, 0, 1\) must be named \('#define'd\);)A 69 349 :M74.155 .415(this forces much semantic to flow from the)J 69 359 :M<2.695 .27(programmer's mind to the program\312! There is a)J 69 369 :M<2.573 .257(special case for array bound expressions, where)J 69 379 :M25.998 .6(unnamed constants cause warning only if)J 69 389 :MB1.111 .111(\(subsequently\) a non constant expression is used to)J 69 399 :M-.098(index the array.)A 69 414 :M?1.274 .127(Since this constraint sometimes proves clumsy, the)J 69 424 :M$.239 .024(following alleviates it:)J 72 439 :MS 81 439 :M:-.069(parenthesized unnamed constants can be used inside)A 81 449 :M-.062(macros,)A 72 464 :MS 81 464 :M?1.923 .192(if a \(numeric\) parallel type is qualified by the)J 81 474 :M.587(/)A0 2 rm 1.056(*)A0 -2 rm0 -2 rm 1.142(~)A0 2 rm.845(LiteralCst)A0 2 rm 1.056(*)A0 -2 rm'3.637 .364(/ d-pragma, use of unnamed)J 81 484 :M>.811 .081(constants inside expressions of this type does not)J 81 494 :M.143 .014(elicit warnings,)J 60 509 :M(-)S 69 509 :M=2.334 .233(underflows/overflows in constant expressions are)J 69 519 :M-.351(detected,)A 60 534 :M(-)S 69 534 :M?2.757 .276(in the 'scanf'/'printf' family, argument types are)J 69 544 :MB-.045(checked against \(constant\) format string specifications,)A 60 559 :M(-)S 69 559 :M7-.035(unclosed comments are flagged \(detection of '/)A0 2 rm(*)S0 -2 rm-.035(' inside)A 69 569 :M(a comment\),)S 60 584 :M(-)S 69 584 :MD.212 .021(labels and tags must obey the rule of other identifiers,)J 69 594 :M<3.065 .307(that is disappear outside the defining block or)J 69 604 :MA1.193 .119(structure/union; but, to stay compatible with C, the)J 69 614 :MC.042 .004(same label cannot be defined in different blocks of the)J 69 624 :M-.02(same function body,)A 60 639 :M(-)S 69 639 :M<1.539 .154(backward branches, which may cause unstructured)J 69 649 :M/.448 .045(loops, must be documented via the /)J0 2 rm.148(*)A0 -2 rm0 -2 rm.16(~)A0 2 rm.146(BackBranch)A0 2 rm.148(*)A0 -2 rm(/)S 69 659 :M-.226(d-pragma,)A 60 674 :M(-)S 69 674 :M.569 .057(unless the /)J0 2 rm.202(*)A0 -2 rm0 -2 rm.219(~)A0 2 rm .18(DynInit)A0 2 rm.202(*)A0 -2 rm*.693 .069(/ d-pragma is used, non-static)J 69 684 :MB-.028(structure/array initializations are flagged \(because they)A 69 694 :M4-.032(slow down function entry and waste memory\),)A 60 709 :M(-)S 69 709 :MB.321 .032(external identifiers are checked for non ambiguity for)J 69 719 :M.146 .015(the local linker,)J 60 734 :M(-)S 69 734 :M>2.106 .211(tests for an unsigned quantity to be negative are)J 69 744 :M-.212(flagged,)A 307 79 :M(-)S 316 79 :MA.428 .043(constant boolean expressions \(used elsewhere than in)J 316 89 :M<2.44 .244(an assignment, and outside macros\) are flagged,)J 316 99 :M4-.043(because they probably signal a coding error,)A 307 114 :M(-)S 316 114 :M;2.26 .226(parenthesization problems with macro bodies are)J 316 124 :M#3.34 .334(detected \(for example )Jf7_9 sf1.046(Diff\(a,b+c\))A0 1 rm 1.046(*)A0 -1 rm 1.046(d)Af1_10 sf2.941 .294(, with)J 316 134 :Mf7_9 sf-.221(Diff\(x,y\))Af1_10 sf-.153( defined as ")Af7_9 sf -.221(x-y)Af1_10 sf-.16(" and not ")Af7_9 sf-.221(\(\(x\)-\(y\)\))Af1_10 sf -.169(" \),)A 307 149 :M(-)S 316 149 :M=-.015(side effects via macro parameters used more than once)A 316 159 :M-.199(are flagged,)A 307 174 :M(-)S 316 174 :M&1.941 .194(unless qualified by the /)J0 2 rm.66(*)A0 -2 rm0 -2 rm.714(~)A0 2 rm.671(NotUsed)A0 2 rm.66(*)A0 -2 rm3.043 .304(/ d-pragma,)J 316 184 :M0-.089(unused identifiers/objects are signaled,)A 307 199 :M(-)S 316 199 :M0-.062(uninitialized local objects are flagged,)A 307 214 :M(-)S 316 214 :M@-.056(unused variable values are signalled \(an only modified)A 316 224 :M-.015(object, e.g. )Af7_9 sf -.023(i++)Af7_10 sf -.026( ,)Af1_10 sf%-.017( is not considered as used\),)A 307 239 :M(-)S 316 239 :MC.227 .023(an attempt to detect potentially dangerous side effects)J 316 249 :M@1.966 .197(has been unsuccessful; for, if it is easy to detect)J 316 259 :M.451(")Af7_9 sf1.987 .199(a[i++] = i)Jf1_10 sf(1.207 .121(", it is harder to detect ")Jf7_9 sf2.805 .281(a[i++] =)J 316 270 :M -.127(*)A0 -1 rm-.127(\(&i\))A0 1 rmf1_10 sf0 -1 rm&-.094(", and much harder to detect ")A0 1 rmf7_9 sf0 -1 rm-.127(a = f\(\) + g\(\))A0 1 rmf1_10 sf0 -1 rm -.155(",)A0 1 rm 316 279 :M?-.02(where each \(external\) function f and g depends on side)A 316 289 :M&-.019(effects of the other function.)A 307 314 :Mf0_10 sf'4.849 .485(Compile-time checking tool)J 307 329 :Mf1_10 sf1.868 .187(A d-pragma, /)J0 2 rm.552(*)A0 -2 rm0 -2 rm.597(~)A0 2 rm .388(zif)A0 -3 rm .251 .025( )J0 3 rm$3.622 .362( "")J0 2 rm.552(*)A0 -2 rm.307(/)A0 2 rm .251 .025( )J0 -2 rm .736(is)A 307 339 :M<2.85 .285(provided, that causes emission of if)J 307 349 :M=3.478 .348( is true. It is the main tool \(besides)J 307 359 :MC.921 .092("information" types and the fact that integer constants)J 307 369 :M@-.008(must be named\) that allows a programmer to indicate his)A 307 379 :MB1.915 .192(constraints \(for example, that a quantity should not)J 307 389 :MA-.022(exceed a certain value, or that a structure member should)A 307 399 :M@1.615 .161(be placed at such a position\). must be a)J 307 409 :MD.883 .088(constant expression, but can contain 'sizeof' operators,)J 307 419 :MC.16 .016(enum constants, casts, and also the following functions:)J 307 434 :M(-)S 316 434 :M2.273 .227(_ )J -100 -100 :M 2.5 .25( )J 325 434 :M:1.057 .106(_member\(\): only to be used during)J 316 444 :ME.161 .016(structure/union initialization; answers true if currently)J 316 454 :M92.608 .261(initializing the member whose name is , or at end of the structure/union \(empty)J 316 474 :M(\),)S 307 489 :M(-)S 316 489 :M1.364 .136(_ )J -100 -100 :M 1.5 .15( )J 324 489 :M>.725 .072(_extent\(\): answers the "extent" of the)J 316 499 :MA.162 .016(enumType, i.e. the distance between its greatest enum)J 316 509 :M:.221 .022(constant and its smallest one \(type: 'int'\),)J 307 524 :M(-)S 316 524 :M.454 .045(_ )J -100 -100 :M .5 .05( )J 323 524 :ME.245 .025(_index\( \): only to be used inside array initialization;)J 316 534 :M@.662 .066(answers the index value of the current array element)J 316 544 :M7-.011(being initialized \(type = type of the bound\),)A 307 559 :M(-)S 316 559 :M.454 .045(_ )J -100 -100 :M .5 .05( )J 323 559 :MC.271 .027(_sametype\(x, y\): 'x'/'y' may be types or expressions;)J 316 569 :MC.635 .063(answers true if both \(expression\) types are the same.)J 316 579 :M>-.051(The type equivalence used is the same as for parameter)A 316 589 :MB1.394 .139(passing \(x: formal parameter, y: actual parameter\).)J 316 599 :M?.518 .052(This function can for example be used to type macro)J 316 609 :M-.136(parameters.)A 307 624 :M@2.305 .231(The 'defined' function is also accepted. Of course,)J 307 634 :MF-.088(undefined identifiers are flagged \(not replaced by 0L\312!\).)A 307 649 :M<2.237 .224(This d-pragma permits a program to be much less)J 307 659 :MC.682 .068(fragile, by allowing one to build into it mechanisms to)J 307 669 :MC-.069(check at compile-time that related data structures are kept)A 307 679 :MB.66 .066(coherent through modifications; for example, it is easy)J 307 689 :ME.545 .055(to check that the length of parallel arrays are the same,)J 307 699 :MD.786 .079(or that the length of an array is the same as the extent)J 307 709 :MC1.193 .119(\(+1\) of an enum used to name its elements, or that a)J 307 719 :MB1.12 .112(structure member/array element is initialized with the)J 307 729 :M.219 .022(right value.)Jendp %%Page: 7 7%%BeginPageSetupinitializepage(YN; page: 7 of 10)setjob%%EndPageSetup -29 -30 :TgS 29 30 538 781 rC 294 804 :Mf1_10 sf(7)S60 74 :Mf0_10 sf73.019 .302(Some words about the Disciplined C checker)J60 89 :Mf1_10 sfB.659 .066("dcc", the C-checker, performs full syntactic and some)J60 99 :M84.46 .446(static semantic analysis of a C program, one)J 60 109 :M@2.885 .288(compilation unit at a time. It is itself written in)J 60 119 :MB.685 .069(Disciplined C, is approximately 15000 lines long, uses)J 60 129 :ME.106 .011(a recursive descent method, and is about ten times faster)J 60 139 :M=2.831 .283(that the 'gcc' C compiler \(on a DECstation 5000)J 60 149 :MD.342 .034(running ULTRIX\); so error detection is quite swift, and)J 60 159 :ME.239 .024(only a small time cost is added to regular compilation if)J 60 169 :M-.023(the program is correct.)A 60 184 :M?2.616 .262(Unless the '-zcc' option has been used, control is)J 60 194 :MF.154 .015(automatically transfered to the local compiler if no error)J 60 204 :ME.098 .01(is detected \(the philosophy of dcc, as of any C compiler,)J 60 214 :M@-.009(is to issue errors only when the standard is violated\).)A 60 229 :MA1.383 .138(The '+zsy' option permits one to have, at each block)J 60 239 :MG.178 .018(exit, the content of the symbol table for those identifiers)J 60 249 :MF.756 .076(local to the block; their kind, type \(fully decoded\) and)J 60 259 :MH.404 .04(size \(for objects\) are given, this last information so that)J 60 269 :M<1.302 .13(programmers have an idea of the amount of memory)J 60 279 :M.023 .002(their program uses.)J 60 294 :MA1.137 .114(Numerous other options are available, for example to)J 60 304 :M!.208 .021(limit dcc's scrutiny.)J 60 319 :M@-.007(All error/warning messages can be adapted at will, being)A 60 329 :MA2.038 .204(gathered in one single source file. In addition to a)J 60 339 :M@1.25 .125(message, one is given: the number of the source line)J 60 349 :MA.39 .039(where the error/warning has been detected, the name of)J 60 359 :MC.302 .03(the corresponding file, the preceding and current source)J 60 369 :MF.257 .026(line text, and a caret showing the precise position of the)J 60 379 :MA.93 .093(error/warning in the source line. An option causes the)J 60 389 :MF.153 .015(printing in clear of the last processed tokens \(sometimes)J 60 399 :M-.105(very handy !\).)A 60 414 :M>2.379 .238(Three levels of warnings, corresponding to benign)J 60 424 :MF1.966 .197(\(mostly readibility\), serious, quasi-certain error, are)J 60 434 :M@.848 .085(implemented; a screening mechanism \(desactivated by)J 60 444 :M@2.347 .235(some options, e.g. '-zcc'\) prevents a warning from)J 60 454 :MC1.224 .122(showing up if its level is lower that the last message)J 60 464 :MB1.48 .148(level. In the same vein, unless option '+zae' is used,)J 60 474 :MB1.146 .115(messages are not repeated if they pertain to the same)J 60 484 :M-.141(cause.)A 60 499 :M?2.209 .221(There is a way to adjust local system header files)J 60 509 :MB1.283 .128(\(without modifying them\), mainly in order to change)J 60 519 :MC1.39 .139(some library functions return types \(such as 'getc' or)J 60 529 :M+.952 .095('isalpha'\), to define NULL as )Jf7_9 sf1.307 .131(\(void )J0 1 rm.349(*)A0 -1 rm .349(\)0)Af1_10 sf.735 .073(, or to mark)J 60 539 :M-.031(functions as /)A0 2 rm(*)S0 -2 rm0 -2 rm(~)S0 2 rm-.039(PseudoVoid)A0 2 rm(*)S0 -2 rm-.025(/ or /)A0 2 rm(*)S0 -2 rm0 -2 rm(~)S0 2 rm-.037(NeverReturns)A0 2 rm(*)S0 -2 rm(/.)S 60 554 :M1.08 .108(A symbol, '_ )J -100 -100 :M 1.5 .15( )J 117 554 :M7.428 .043(_dcc', is defined by the checker; it can be)J 60 564 :MD.74 .074(used to turn off its scrutiny in selected areas of source)J 60 574 :M!2.027 .203(code \(besides the /)J0 2 rm.67(*)A0 -2 rm0 -2 rm.725(~)A0 2 rm .769(NoWarn)A0 2 rm.67(*)A0 -2 rm1.24 .124(/ and /)J0 2 rm.67(*)A0 -2 rm0 -2 rm.725(~)A0 2 rm .744(Warn)A0 2 rm.67(*)A0 -2 rm1.402 .14(/ d-)J 60 584 :M-.087(pragmas\).)A 60 599 :M<.34 .034(This program, developed on a VAX/VMS machine, has)J 60 609 :M>1.472 .147(been ported in less than a day on a HP715/UNIX, a)J 60 619 :M:.168 .017(DECstation 5000/ULTRIX and an ALPHA 3000/OSF1.)J 60 634 :MF1.093 .109(It is available via anonymous ftp at 'ftp.supelec.fr', in)J 60 644 :M)-.071(the sub-directory 'pub/lang/dcc'.)A 60 669 :Mf0_10 sf.913(Conclusion)A 60 684 :Mf1_10 sfB1.159 .116(The ambition of Disciplined C is to be a really high-)J 60 694 :M?-.023(level programming language, with all the confidence and)A 60 704 :M8-.014(ease of use the term "high-level" should convey.)A 60 719 :MD.384 .038(The first idea behind it is that programmers ought to be)J 60 729 :M@1.826 .183(given a tool permitting to render the semantics and)J 60 739 :MB.757 .076(constraints of their programs more apparent, while not)J 60 749 :MC.987 .099(hampering or restraining their creativity, nor inducing)J 60 759 :M(-.007(any run-time loss of efficiency.)A 307 79 :ME.397 .04(Another idea is that a tool should serve its user, instead)J 307 89 :M;3.487 .349(of randomly disseminating traps in his way; so)J 307 99 :ME.146 .015(everything that seems "strange" is flagged. But there are)J 307 109 :ME.655 .065(ways \(via d-pragmas\) to tell that a generally erroneous)J 307 119 :M?.071 .007(situation is perfectly valid in this specific case.)J 307 134 :ME.397 .04(A third idea is that a tool should exhibit clear concepts,)J 307 144 :MH.427 .043(so that the user can easily master it; the last idea is that)J 307 154 :M=2.27 .227(error messages should be indicative enough to put)J 307 164 :M>2.311 .231(programmers back on the right track, and the less)J 307 174 :MF.022 .002(numerous possible \(don't detect twice the same error; try)J 307 184 :M%-.066(to avoid induced errors...\).)A 307 199 :MA.866 .087(Those ideas have been in the mind of the author for a)J 307 209 :M.504 .05(long time )Jf2_10 sf.124([)Af1_10 sf.796 .08(NOY 88)Jf2_10 sf.124(])Af1_10 sf0.446 .045(, but it took him about ten years to)J 307 219 :MC1.118 .112(realize that, instead of regularly complaining about C)J 307 229 :MD-.017(weaknesses and pitfalls, it would be better \(and possible\))A 307 239 :MB1.085 .109(to write a program that reports most of the problems,)J 307 249 :ME1.281 .128(and so, last but not least, facilitate the teaching of C)J 307 259 :M>1.659 .166(with due regard to good programming practices and)J 307 269 :M-.011(conceptual purity.)A 307 284 :M?1.627 .163(The C standard library is another place where some)J 307 294 :MA.304 .03(improvements could be brought: for example, the string)J 307 304 :MC.71 .071(handling function 'strcpy' could return a pointer on the)J 307 314 :MA.305 .031(ending NUL character, and give an easy way to prevent)J 307 324 :MD.813 .081(buffer overflow; or there could exist a function telling)J 307 334 :MF.488 .049(whether a pointer points on a 'free'able area. But this is)J 307 344 :M<.006 .001(unfortunately out of the reach of Disciplined C.)J 307 359 :M?.724 .072(I am much indebted to my colleagues of our computer)J 307 369 :M@.613 .061(science department, with whom discussions were often)J 307 379 :MB2.046 .205(illuminating \(and animated !\). Special thanks to C.)J 307 389 :M@1.078 .108(Bocage, F. Boulanger, D. Marcadet and F. Mullet for)J 307 399 :MF.054 .005(their advice and patience. Also to W. Briscoe \(freelance,)J 307 409 :M,-.036(UK\), for numerous comments/advices.)A 307 449 :Mf0_10 sf.597(References)A 307 469 :Mf1_10 sf.104 .01([K&R 88])J 357 469 :M+.037 .004(B.W. Kernighan and D.M. Ritchie)J 357 479 :Mf3_10 sf"-.051(The C Programming Language)A 357 489 :Mf1_10 sf2.273 .027(Prentice Hall, Englewood Cliffs, N.J.,)J 357 499 :M(1988)S 307 519 :M-.069([MOD 91])A 357 519 :M.768 .077(R.P. Mody)J 357 529 :Mf3_10 sf/-.094(C In Education and Software Engineering)A 357 539 :Mf1_10 sf%.364 .036(SIGCSE Bulletin, Vol 23 n)JcFf2_10 sf .036Asf.364 .036( 3,)J 357 549 :M$.172 .017(September 1991, pp 45-56)J 307 569 :M-.116([NOY 88])A 357 569 :M.247 .025(Y.L. Noyelle)J 357 579 :Mf3_10 sf3.173 .017(La Saga du LSE \(et de ses cousins LSD/)J 357 589 :M.428(LSG/LST\))A 357 599 :Mf1_10 sf4-.037(Colloque sur l'histoire de l'Informatique en)A 357 609 :M/.281 .028(France, Vol 2, May 1988, pp 301-310)Jendp %%Page: 8 8%%BeginPageSetupinitializepage(YN; page: 8 of 10)setjob%%EndPageSetup -29 -30 :TgS 29 30 538 781 rC 294 804 :Mf1_10 sf(8)S 268 75 :M-.017(APPENDIX A)A 232 97 :M*-.03(Disciplined C grammar \(LL\(2\) \))A 60 121 :M (prog ::=)S 130 121 :M -.242(decl)A0 -3 rm(+)S0 3 rm 60 133 :M-.193(decl ::=)A 130 133 :M-.141(attrib? decl1)A 60 145 :M.107 .011(attrib ::=)J 130 145 :M 10 f5_1 :p 24.983 :m (extern)S( )S2 :m(|)S( )S 21.101 :m (static)S( )S2 :m(|)S( )S 17.217 :m(auto)S( )S2 :m(|)S( )S 29.926 :m-.006(register)A( )S2 :m(|)S( )S 29.931 :m-.009(typedef)A 290 145 :M6-.028(-- auto/register allowed only inside function.)A 60 157 :M-.169(decl1 ::=)A 130 157 :M-.281(decl2 decl3)A 180 157 :M]-.063(-- 'modifier' \(called by 'decl2'\) must declare an identifier; exceptions: 'attrib' )AcFf2_10 sf -.063Asf-.063( typedef,)A 190 169 :M\-.017(and bit-field \(if no identifier => padding\), or 'strun'/'enum' with both 'tag' and)A 190 181 :MM.16 .016('member's/'enumElt's \(in such a case, 'modifier' must be empty\).)J 60 193 :M-.169(decl2 ::=)A 130 193 :M)-.149(qualif? baseType qualif? modifier)A 280 193 :M-.011(-- only one qualif.)A 60 205 :M-.113(qualif ::=)A 130 205 :M3.38 :m.052([)A( )S 21.437 :m .066(const)A( )S2 :m(|)S( )S 30.461 :m.059(volatile)A( )S3.38 :m.052(])Af1_9 sf0 -3 rm(+)S0 3 rm 220 205 :Mf1_10 sfH.125 .013(-- one of each at most; volatile incompatible with register.)J 60 217 :M-.092(baseType ::=)A 130 217 :M-.074(nativeType? )A2 :m(|)S 220 217 :M<-.044(-- may only be omitted in case of \(field\) padding.)A 130 229 :M19 :m -.249(ident)A 220 229 :M-.059(-- "type" identifier.)A 60 241 :M-.052(nativeType ::=)A 130 241 :M 17.557 :m -.055(void)A( )S2 :m(|)S 180 241 :MS.07 .007(-- only if function or pointer declaration; then 'qualif' must be empty.)J 130 253 :M 18.438 :m .023(float)A( )S2 :m(|)S( )S3.328 :m([)S( )S17.89 :m .028(long)A( )S3.328 :m(])S(? )S 27.388 :m .029(double)A( )S2 :m(|)S 130 265 :M3.384 :m.056([)A( )S 36.716 :m.076(unsigned)A( )S2 :m(|)S( )S 26.547 :m .074(signed)A( )S3.384 :m.056(])A .098 .01(? )J3.384 :m.056([)A( )S 17.495 :m .073(char)A( )S2 :m(|)S( )S 20.333 :m .068(short)A( )S3.384 :m.056([)A( )S 10.735 :m .059(int)A( )S3.384 :m.056(])A .098 .01(? )J2 :m(|)S( )S 10.735 :m .059(int)A( )S2 :m(|)S( )S 18.079 :m .075(long)A( )S3.384 :m.056([)A( )S 10.735 :m .059(int)A( )S3.384 :m.056(])A .098 .01(? )J3.384 :m.056(])A( )S2 :m(|)S 130 277 :M.29 .029(strun )J2 :m(|)S 130 289 :M -.072(enum)A 60 301 :M.171 .017(strun ::=)J 130 301 :M3.328 :m([)S( )S 22.212 :m (struct)S( )S2 :m(|)S( )S 22.778 :m(union)S( )S3.328 :m(])S ( tag? )S3.328 :m([)S ( { member)Sf1_9 sf0 -3 rm(+)S0 3 rmf1_10 sf( } )S3.328 :m(])S(?)S 310 301 :MA.137 .014(-- error if no 'tag' nor 'member's, or if one of them)J 240 313 :MW-.016(exist, but the following 'modifier'\(s\) do not each one define an identifier; )A 240 325 :M\.057 .006(if no identifier definition, error if 'attrib' or 'qualif' non empty. Exception:)J 240 337 :M/.352 .035(a 'strun' with a tag only is legal.)J 60 349 :M-.051(member ::=)A 130 349 :M -.414(decl1)A 180 349 :M/.219 .022(-- 'member' must not be a function.)J 60 361 :M.051 .005(enum ::=)J 130 361 :M 22.419 :m .051(enum)A.076 .008( tag? )J3.328 :m([)S.103 .01( { enumElt )J3.328 :m([)S.097 .01( , enumElt )J3.328 :m(])S.056 .006(* } )J3.328 :m(])S(?)S 310 361 :MB.214 .021(-- error if no 'tag' nor 'enumElt's; see also 'strun'.)J 60 373 :M.054 .005(tag ::=)J 130 373 :M19 :m -.249(ident)A 60 385 :M.211 .021(enumElt ::=)J 130 385 :M19.74 :m -.051(ident)A( )S3.328 :m([)S-.051( = cstExp )A3.328 :m(])S(?)S 60 397 :M-.102(modifier ::=)A 130 397 :M!-.063(pointer* modif1 arrayFct*)A 60 409 :M(pointer ::=)S 130 411 :M -.179(*)A0 -2 rm-.155( qualif?)A0 2 rm 200 409 :M-.086(-- pointer declaration.)A 60 421 :M-.065(modif1 ::=)A 130 421 :M-.043(\( modifier \) )A2 :m(|)S 130 433 :M 18.822 :m -.235(ident)A(?)S 200 433 :MJ-.028(-- error if 'ident' omitted and {'attrib' = typedef or 'baseType' )AcFf2_10 sf -.028Asf-.028( 'enum', 'strun'}.)A 60 445 :M-.091(arrayFct ::=)A 130 445 :M.044 .004([ cstExp? ] )J2 :m(|)S 200 445 :M-.155(-- array declaration.)A 130 457 :M-.038(\( parList? \))A 200 457 :M*-.014(-- function declaration; 'attrib' )AcFf2_10 sf -.014Asf;-.014( auto/register; return type not array nor function.)A 60 469 :M(par~DCC.BCK: [DCC_DISTRIB]DCCARTICLE.PS;2|]List ::=)S 130 469 :M.07 .007(attrib? declPar )J3.328 :m([)S.048 .005( , attrib? declPar )J3.328 :m(])S(* )S3.328 :m([)S.02 .002( , ... )J3.328 :m(])S(?)S 310 469 :M>-.012(-- only legal 'attrib' = register. If parameter type =)A 220 481 :MV-.006(void, parameter must not be named, nor 'attrib'uted, and must be alone; other-)A 220 493 :MX-.026(wise, parameter names must all be different. If 'parList' called by a 'modifier')A 220 505 :MK-.05(followed by 'block', then each $'declPar' must declare an identifier.)A 60 517 :M-.168(declPar ::=)A 130 517 :M -.414(decl2)A 180 517 :M%-.004(-- function type not allowed.)A 60 529 :M-.169(decl3 ::=)A 130 529 :M.168 .017(initOrSizFld? )J3.328 :m([)S&.108 .011( , modifier initOrSizFld? )J3.328 :m(])S.038 .004(* ; )J2 :m(|)S 320 529 :MA.157 .016(-- no 'initOrSizFld' if 'attrib' = typedef , or if no)J 250 541 :MP-.092(identifier declared, or if function declared, or if called via 'member'.)A 130 553 :M -.054(block)A 180 553 :Mg-.065(-- 'modifier' \(called by the 'decl1' that called this 'decl3'\) must have declared a function;)A 410 565 :M-.179 .018('attrib' = extern or static only.)J 60 577 :M.124 .012(initOrSizFld ::=)J 130 577 :M.351 .035(= init )J2 :m(|)S 130 589 :M.298 .03(: cstExp)J 180 589 :M.-.03(-- allowed only if called via 'member'.)A 60 601 :M.57 .057(init ::=)J 130 601 :M-.124(condExp )A2 :m(|)S 180 601 :M_-.004(-- 'condExp' allowed only if 'qualif' = auto/register, and 'init' not called by itself.)A 130 613 :M.158 .016(cstExp )J2 :m(|)S 130 625 :M.345 .034({ init )J3.462 :m.134([)A.247 .025( , init )J3.462 :m.134(])A.251 .025(* )J3.462 :m.134([)A.131 .013( , )J3.462 :m.134(])A.394 .039(? })J 60 637 :M.048 .005(block ::=)J 130 637 :M-.07({ decl* stmt* })A 210 637 :M8-.029(-- no function definition allowed among 'decl's.)A 60 649 :M.635 .063(stmt ::=)J 130 649 :M.461 .046(label : stmt )J2 :m(|)S 130 661 :M.34 .034(block )J2 :m(|)S.235 .024( ifStmt )J2 :m(|)S.343 .034( switchStmt )J2 :m(|)S.328 .033( returnStmt )J2 :m(|)S.343 .034( whileLoop )J2 :m(|)S.284 .028( doLoop )J2 :m(|)S.286 .029( forLoop )J2 :m(|)S .05 .005( )J 22.693 :m .098(break)A.074 .007( ; )J2 :m(|)S .05 .005( )J 35.191 :m.095(continue)A.074 .007( ; )J2 :m(|)S 130 673 :M18.04 :m .065(goto)A.112 .011( label ; )J2 :m(|)S.179 .018( sideEffects ; )J2 :m(|)S( )S 25.363 :m .074(empty)A .07 .007( ;)J 60 685 :M-.016(label ::=)A 130 685 :M19 :m -.249(ident)A 60 697 :M.686 .069(ifStmt ::=)J 130 697 :M6.262 :m .078(if)A .264 .026( \( boolExp \) stmt )J3.413 :m.085([)A .058 .006( )J 15.942 :m .099(else)A.218 .022( stmt )J3.413 :m.085(])A(?)S 60 709 :M.568 .057(switchStmt ::=)J 130 709 :M26.21 :m .018(switch)A.033 .003( \( exp \) { decl* )J3.328 :m([)S( )S3.328 :m([)S( )S 17.275 :m .018(case)A.038 .004( cstExp : )J3.328 :m(])Sf1_9 sf0 -3 rm(+)S0 3 rmf1_10 sf.054 .005( stmt)Jf1_9 sf0 -3 rm(+)S0 3 rmf1_10 sf( )S3.328 :m(])Sf1_9 sf0 -3 rm(+)S0 3 rmf1_10 sf( )S3.328 :m([)S( )S 27.875 :m.016(default)A.038 .004( : stmt)Jf1_9 sf0 -3 rm(+)S0 3 rmf1_10 sf( )S3.328 :m(])S(? })S 60 721 :M.234 .023(returnStmt ::=)J 130 721 :M 23.802 :m-.012(return)A( )S3.328 :m([)S -.011( exp )A3.328 :m(])S(? ;)S 60 733 :M(whileLoop ::=)S 130 733 :M 22.713 :m .1(while)A.272 .027( \( boolExp \) stmt)J 60 745 :M-.089(doLoop ::=)A 130 745 :M 10.208 :m .104(do)A.178 .018( stmt )J 22.676 :m .092(while)A.209 .021( \( boolExp \) ;)J 60 757 :M-.046(forLoop ::=)A 130 757 :M11.53 :m -.042(for)A:-.042( \( sideEffects? ; boolExp? ; sideEffects? \) stmt)A 60 769 :M-.151(sideEffects ::=)A 130 769 :M3.226 :m -.101([)A-.11( sideEffect , )A3.226 :m -.101(])A-.133(* sideEffect)Aendp %%Page: 9 9%%BeginPageSetupinitializepage(YN; page: 9 of 10)setjob%%EndPageSetup -29 -30 :TgS 29 30 538 781 rC 294 804 :Mf1_10 sf(9)S60 76 :M-.171(sideEffect ::=)A 130 76 :M-.073(asgnExp)A 190 76 :M_.155 .016(-- warning if top operator of 'asgnExp' is not one of 'incDec', 'asgnOp', call to a)J 375 88 :M5.082 .008(function returning void, or cast to void.)J 60 100 :M.208 .021(boolExp ::=)J 130 100 :M -.219(exp)A 190 100 :M.03 .003(-- of boolean type.)J 60 112 :M.047 .005(cstExp ::=)J 130 112 :M-.258(condExp)A 190 112 :M-.197 .02(-- computable at compilation time.)J 60 124 :M-.022(exp ::=)A 130 124 :M 10 f5_1 :p3.328 :m([)S-.041( sideEffect , )A3.328 :m(])S-.059(* asgnExp)A 60 136 :M-.013(asgnExp ::=)A 130 136 :M-.124(condExp )A2 :m(|)S 130 148 :M-.073(condExp asgnOp asgnExp)A 60 160 :M-.027(asgnOp ::=)A 130 160 :M .1 .01(= )J2 :m(|)S.078 .008( |= )J2 :m(|)S.094 .009( ^= )J2 :m(|)S.113 .011( &= )J2 :m(|)S.13 .013( <<= )J2 :m(|)S.13 .013( >>= )J2 :m(|)S .1 .01( += )J2 :m(|)S.086 .009( -= )J2 :m(|)S( )S0 2 rm.074(*)A0 -2 rm .1 .01(= )J2 :m(|)S.083 .008( /= )J2 :m(|)S.203 .02( %=)J 60 172 :M-.124(condExp ::=)A 130 172 :M-.025(term0 )A3.328 :m([)S-.024( ? exp : condExp )A3.328 :m(])S(?)S 60 184 :M (term0 ::=)S 130 184 :M.156 .016(term1 )J3.328 :m([)S.084 .008( || term1 )J3.328 :m(])S(*)S 60 196 :M (term1 ::=)S 130 196 :M.22 .022(term2 )J3.328 :m([)S.158 .016( && term2 )J3.328 :m(])S(*)S 60 208 :M (term2 ::=)S 130 208 :M.161 .016(term3 )J3.328 :m([)S.084 .008( | term3 )J3.328 :m(])S(*)S 60 220 :M (term3 ::=)S 130 220 :M-.058(term4 )A3.328 :m([)S-.054( ^ term4 )A3.328 :m(])S(*)S 60 232 :M (term4 ::=)S 130 232 :M.195 .02(term5 )J3.328 :m([)S.12 .012( & term5 )J3.328 :m(])S(*)S 60 244 :M (term5 ::=)S 130 244 :M -.05(term6 )A3.328 :m([)S-.05( equalOp term6 )A3.328 :m(])S(*)S 60 256 :M-.157(equalOp ::=)A 130 256 :M -.21(== )A1.908 :m -.091(|)A -.262( !=)A 60 268 :M (term6 ::=)S 130 268 :M-.068(term7 )A3.275 :m -.053([)A-.068( orderOp term7 )A3.275 :m -.053(])A(*)S 60 280 :M-.201(orderOp ::=)A 130 280 :M.391 .039(> )J2.115 :m.115(|)A.391 .039( >= )J2.115 :m.115(|)A.391 .039( <= )J2.115 :m.115(|)A.427 .043( <)J 60 292 :M (term7 ::=)S 130 292 :M.116 .012(term8 )J3.328 :m([)S.097 .01( shiftOp term8 )J3.328 :m(])S(*)S 60 304 :M.156 .016(shiftOp ::=)J 130 304 :M.876 .088(>> )J2.165 :m.165(|)A.948 .095( <<)J 60 316 :M (term8 ::=)S 130 316 :M-.089(term9 )A3.259 :m -.069([)A-.091( addOp term9 )A3.259 :m -.069(])A(*)S 60 328 :M-.206(addOp ::=)A 130 328 :M.439 .044(+ )J2.129 :m.129(|)A.343 .034( -)J 60 340 :M (term9 ::=)S 130 340 :M.158 .016(term10 )J3.328 :m([)S.126 .013( mulOp term10 )J3.328 :m(])S(*)S 60 352 :M.293 .029(mulOp ::=)J 130 354 :M.315(*)A0 -2 rm .143 .014( )J0 2 rm0 -2 rm2.125 :m.126(|)A0 2 rm0 -2 rm.213 .021( / )J0 2 rm0 -2 rm2.125 :m.126(|)A0 2 rm0 -2 rm .62 .062( %)J0 2 rm 60 364 :M (term10 ::=)S 130 364 :M-.02(unaryOp term10 )A2 :m(|)S 130 376 :M-.015(prim incDec* )A2 :m(|)S 130 388 :M 23.167 :m-.117(sizeof)A-.118( \( declPar \))A 220 388 :M5-.066(-- 'declPar' must not declare any identifier.)A 60 400 :M-.068(unaryOp ::=)A 130 400 :M.044 .004(~ )J2 :m(|)S.024 .002( ! )J2 :m(|)S( )S0 2 rm(*)S0 -2 rm( )S2 :m(|)S.037 .004( & )J2 :m(|)S.078 .008( addOp )J2 :m(|)S( )S 24.032 :m .027(sizeof)A( )S2 :m(|)S.053 .005( cast )J2 :m(|)S.129 .013( incDec)J 60 412 :M-.034(cast ::=)A 130 412 :M-.164(\( declPar \))A 220 412 :MT-.026(-- 'declPar' must not declare any identifier, and the result type may not be)A 445 424 :M.03(struct/union/function.)A 60 436 :M-.112(incDec ::=)A 130 436 :M.453 .045(++ )J2.085 :m.085(|)A.326 .033( --)J 60 448 :M.247 .025(prim ::=)J 130 448 :M.073 .007(prim1 primQualif*)J 60 460 :M.233 .023(prim1 ::=)J 130 460 :M.085 .009(\( exp \) )J2 :m(|)S.073 .007( cst )J2 :m(|)S( )S 20.221 :m .057(ident)A 60 472 :M-.009(primQualif ::=)A 130 472 :M.174 .017(\( argList \) )J2 :m(|)S.109 .011( [ exp ] )J2 :m(|)S.056 .006( . )J20.34 :m .069(ident)A( )S2 :m(|)S .1 .01( -> )J20.34 :m .086(ident)A 60 484 :M(argList ::=)S 130 484 :M3.328 :m([)S.11 .011( asgnExp )J3.328 :m([)S.087 .009( , asgnExp )J3.328 :m(])S .05 .005(* )J3.328 :m(])S(?)S 60 496 :M.124 .012(cst ::=)J 130 496 :M -.031(' )A 36.093 :m-.059(character)A -.033( ' )A2 :m(|)S 130 508 :M .2 .02(" )J 23.603 :m .138(string)A.144 .014( " )J3.449 :m.121([)A.144 .014( " )J 23.603 :m .138(string)A.144 .014( " )J3.449 :m.121(])A.228 .023(* )J2 :m(|)S 130 520 :M-.082(sgndNb )A2 :m(|)S 130 532 :M10 :m(nb)S 60 544 :M-.089(sgndNb ::=)A 130 544 :M3.483 :m.156([)A.216 .022( + )J2.093 :m.094(|)A.169 .017( - )J3.483 :m.156(])A .106 .011( )J 10.468 :m .468(nb)A 60 580 :M0.246 .025(Restrictions with respect to ANSI C:)J 70 604 :M(-)S 78 604 :M)-.006(no old-style function definition,)A 70 616 :M(-)S 78 616 :M0-.069(imposed order for 'attrib' and 'qualif',)A 70 628 :M(-)S 78 628 :M"-.009(no default 'int' baseType,)A 70 640 :M(-)S 78 640 :Mj.117 .012(a switch must control a block; 'default' must come as last case; 'case', 'default' not labels,)J 70 652 :M(-)S 78 652 :M5-.012(no unparenthesized assignment in initializer,)A 70 664 :M(-)S 78 664 :M|-.001(braces in initializer only to indicate initialization of a compound object \(array/struct/union\); if so, mandatory,)A 70 676 :M(-)S 78 676 :MJ.157 .016(enum, char\312: types by themselves \(not considered as int\),)J 70 688 :M(-)S 78 688 :MI-.02(automatic arithmetic conversions only from narrower to wider type,)A 70 700 :M(-)S 78 700 :Mf-.072(identifiers may never be declared more than once in the same scope \(except in header files\),)A 70 712 :M(-)S 78 712 :M^-.129(macros \(#define\) cannot be declared more than once \(if not '#undef'ed beforehand\),)A 70 724 :M(-)S 78 724 :MT.024 .002(labels local to blocks \(but cannot be duplicated in a given function\),)J 70 736 :M(-)S 78 736 :MS-.024(a function or array is different from a pointer on the same function/array,)A 70 748 :M(-)S 78 748 :M9-.043(left operand of indexation must be array/pointer,)A 70 760 :M(-)S 78 760 :M -.064(void )A0 2 rm -.079(*)A0 -2 rmq-.065( only universal receiver for pointers \(cast or d-pragma needed the other way around, except for NULL\).)Aendp %%Page: 10 10%%BeginPageSetupinitializepage(YN; page: 10 of 10)setjob%%EndPageSetup -29 -30 :TgS 29 30 538 781 rC 292 804 :Mf1_10 sf(10)S 227 74 :Mf1_9 sf-.305(APPENDIX B)A60 94 :Mf7_9 sfT-.404(/**************************************************************************/)A 60 104 :MV-.404(/* Sum of two matrix of arbitrary size \(without use of pointer\) */)A 60 114 :MT-.404(/**************************************************************************/)A 60 124 :M-.422(#include )A 60 134 :M-.419(#include "dynarray.h")A 60 154 :M$-.413(/* 'bool' type definition */)A 60 164 :M"-.415(typedef unsigned int bool;)A 60 174 :M -.418(#define FALSE \(0 != 0\))A 60 184 :M -.418(#define TRUE \(0 == 0\))A 60 204 :M1-.409(/* type definition for matrix elements */)A 60 214 :M-.422(typedef float Num;)A 60 224 :M6-.408(/* type definition for variable-size matrix */)A 60 234 :M(-.412(typedef DynArray2\(Num\) DynArr;)A 60 244 :M.-.41(typedef DynArray2\(const Num\) CDynArr;)A 60 264 :M*-.412(/* Models \(function profiles\) */)A 60 274 :M5-.409(static void print\(CDynArr\), read\(DynArr\);)A 60 284 :M--.41(static DynArr add\(CDynArr, CDynArr\);)A 60 304 :M-.443(int main\(\))A 60 314 :M&-.412({ bool ok; unsigned int i, j;)A 60 324 :MS-.404( DynArr mat1 = NULL, mat2 = NULL, resMat; /* matrix declarations \(resMat)A 340 334 :M)-.412(allocated by 'add' function\). */)A 60 344 :M-.478( do {)A 60 354 :M-.429( for \(;;\) {)A 60 364 :M7-.408( printf\("\\nEnter matrix dimensions: "\);)A 60 374 :Mc-.403( if \(scanf\("%u%u",&i,&j\) == 2\) break; /* exit loop if numbers read are correct */)A 60 384 :MJ-.405( while \(getchar\(\) != '\\n'\) {}} /* flush input buffer */)A 60 394 :M\-.404( AllocDynArray2\(mat1, i, j, &ok\); /* allocate space for matrix 'mat1', freeing)A 410 404 :M!-.415(possible previous one. */)A 60 414 :MG-.406( if \(! ok\) printf\("\\n memory overflow for 1st matrix"\);)A 60 424 :M-.443( else {)A 60 434 :M4-.409( printf\("\\nmat1=\\n"\); read\(mat1\);)A 60 444 :M0-.409( AllocDynArray2\(mat2, i, j, &ok\);)A 60 454 :MI-.405( if \(! ok\) printf\("\\n memory overflow for 2nd matrix"\);)A 60 464 :M-.435( else {)A 60 474 :M6-.409( printf\("\\nmat2=\\n"\); read\(mat2\);)A 60 484 :M<-.407( resMat = add\(mat1, mat2\); print\(resMat\);)A 60 494 :MJ-.405( FreeDynArray2\(resMat\);}} /* free result matrix space */)A 60 504 :M-.421( } while \(i != 0\);)A 60 514 :M-.439( return 0;)A 60 524 :M(})S 60 544 :M$-.415(static void read\(DynArr x\))A 60 554 :M$-.413({ unsigned int i, j, l1, l2;)A 60 574 :MI-.405( LimDynArray2\(x, &l1, &l2\); /* get dimensions of matrix 'x' */)A 60 584 :Me-.403( for \(i = 0; i < l1; i++\) {for \(j = 0; j < l2; j++\) {\(void\)scanf\("%g", &x[i][j]\);}})A 60 594 :M(})S 60 614 :M&-.413(static void print\(CDynArr x\))A 60 624 :M$-.413({ unsigned int i, j, l1, l2;)A 60 644 :M-.427( printf\("\\n"\);)A 60 654 :M&-.413( LimDynArray2\(x, &l1, &l2\);)A 60 664 :Mo-.403( for \(i = 0; i < l1; i++\) {for \(j = 0; j < l2; j++\) {printf\("%g ", x[i][j]\);} printf\("\\n"\);})A 60 674 :M(})S 60 694 :M1-.409(static DynArr add\(CDynArr x, CDynArr y\))A 60 704 :M@-.406({ unsigned int i, j, l1, l2; bool ok; DynArr z = NULL;)A 60 724 :M&-.413( LimDynArray2\(x, &l1, &l2\);)A 60 734 :MS-.404( AllocDynArray2\(z, l1, l2, &ok\); /* allocate space for result matrix */)A 60 744 :MH-.406( if \(! ok\) printf\("\\n memory overflow for result matrix"\);)A 60 754 :Mf-.403( else for \(i = 0; i < l1; i++\) {for \(j = 0; j < l2; j++\) {z[i][j] = x[i][j] + y[i][j];}})A 60 764 :M-.439( return z;)A 60 774 :M(})Sendp %%Trailerend%%EOF*[DCC_DISTRIB]DCCVAX.EXE;1+, ./( 4- 0123 KPWO56@ K7S89G(HJ>0D`0205 Kmlh82DCV1.0 J KV11-39  !6 0 ?!! DECC$SHR_001Q! MTHRTL_001! LIBRTL_001$+CMA$TIS_SHR_001"*(*.*4*lY4Y*yYLZVZ x[ȑčVI[ӑČ/Eޑ, <9"%*-038<@DHPX`hnįѯ֯  (  $*9W1*QG@*N*(|X* c*!n*0Jx*I.*5'***!b**v*Ky**Ka*`j+ +sc+N/$+0+p?+iJsN+uX+kN b+jp+ y+=@+n+b+M++0+3++ ++$+ ,ql ,e(,r13,^:,<<"<,<3<@<H<S<Z<h<p<x<<<<<<<<<<<<<<<<<= == =XHP K@CC`DEEhF GHIJLMdNOxS4TT,?.?0?2?4?6?8??@?B?D?F?H?J?L?N?P?R?T?X?Z?[?\?]?`?c?d?e?f?h?l?P P@P E0E6EYE\EjExEEEEEEEF$F4F:FBFxFFFFFFFHHKOO8PtPPPP Q@QQQ>RRRRPSSTPTTTDUfUUVHVV W\W@XrXXYZDZhZZ[[&\\\\\\]@]p]]]]^<^^ __```Xaxaaa(b`bbbDccccHd`dde*e`eeeef-f^fff gRgtgghOhzhhPiiiijjjjjj(kpkkkk4llmmmn{S{{{(|N|}}\}}}}~~@~~~~ :PJt,BXx˃R΄Xh|ЇX؈(jЉ6gي4v`,@pȍ ؎(P̏4b(+Փy  N@Ȗ#ڗHqmؚ͙Xlқ>=T8X 8\pȟ)(Xr$8F`ru LԦP1FvBs0Vr}ЬȮP PPP@@@@@@ @@@@@@@@@@E@PHE@jBjDjFjIjLjPjTjXj[j^jajdjgjjjnjpjsjvjxj{j~jjjjj@% __dcc;  X,\,  P@E?"4'P@@0P4 ~ - (GNS/(TNS/(LNS// id(s); nb buckets used: ; max bucket filling: ; nbUnivEltChunks: p\Ь PРQQPPX\ЬPРQQPP ^=R\\SЬ PPS SPТ \ЬТ \Ь`Т P ^Tլݬ6PSSЬVSUUVPRW:Pд R !PPSР PSSSWWP<^]SݬݬGPRU9Pг R PPTР PT0TTUUP^VYЦ RТTլ1ˏUEjScRDѢ Tբ 9QЬUePQP$P~Uݢ?Pբ X1PRYbRRRWТ PPWpWRYcbcURSRcCibbSRYRi.PSSUУ PPUURЬT RXXP^ I RТnbWТBR9ЭԭЭW10EZV[gb [ѧ  qЧVf\\ 81ЧY10f1jf\\\\1Z/f\\1Eզ\\ 1+1#f\! ЏyPRPRRX1f\\Nզ\\  ЏuXT(PS PЏ|XSSRЏXRRTTQ{f\\ Џ{XPdf\\ ЏzXUMf\\ ЏtXT6f\\ ЏwXSf\\ ЏxRЏvXRRSSTTUUPPQQX!j RRRPYVXkf1f\\ jPYVݏ^k1Pf\\2f\\\\1f ЏcRЏcXRVRzF,f\\\\ݦPVݏmFf\\\\8զ3\\ !f ЏAR PЏAXRVR1f\7f\\1 1f\1f\\\\11xݦP12f1+ЦTV*TPР\ЬPPPRТU1f\ d wd@ˏ\\]TPQd  Џ'TSЏ)TS PR je  L\\\PRVSkd PxA\\7UTTPР\ЬPPP\ЬU1!9Pf\/*vjPRV~5PRVݏ3P~gggRЧ ViVVV\Ь f\]ЭW\ЬD\;ЭܭЭW4PWSЧWRТ Ц Sf\\W1iTn1RbVRQRPR RP QP{RPQPQVVRbURbTRQRPR RP QP{RPQPQTTnSccScSUУS:9ЭSSUe11RbURQRPR RP QP{RPQPQUUSУTPS8TSУT螣lRbTRQRPR RP QP{RPQPQTST@PЬPРQPQRRPP^S7Hզ< ~qԮ1L PЦf)P`1hPծR1IP~im<%P`<PP`<h$IP P`1 P  P[ݮ ݮ [_ ЫP`(RbW$P w 1H61<lZ#W\oVPYYKyP`RR~j[P`RRYY! YPYY `^(TnϞPX? <5~j.R~jX r~j1%X1ըWЫSTШRRRRRTT`RR %ЫSTШRТRТRRRTTXU1եRR r~jehhTT_ФdХe ͨScRR~ SgPͨͨeY~f PФThUh dRUUdХUdRԢU1G1 P`ͤPͤͤ |~k  61$k[Z~DjЮRh hh~i1PThR6hR< S#TRQRPR RP Q{RPQPxQTQI'TRQRPR RP QP{RPQPxQTh~hRݢCxPSѮST STSThRТhh1LTRQRPR RP Q{RPQPЮRQЮR@kiR[b;RVRТR GRТ~DCC.BCK  [DCC_DISTRIB]DCCVAX.EXE;1'| RyR bLERRSТ7 ePSԣSSRb[RyP`1Pծ S֨xSݨx^RPRRRSRR#3PTT <[Z_RRYТQ P5^PYYV(@f[fZVW@WnЮP^X[>uP`RRR1PTP  SPS PT&PTRRSR `STP`PЭyRRТj Q]PЭ̭ЭV(Uf< fVVWvU4PPr ±Pԧ[W[W[>gP`RPRR1nBP`RRR1eUUIS^R bRRSSTPRU>URRTTԭԭn1P?( P`0P00H<0~_:I'PjP`ԭԭn'KP`,,,1<`(խJЭXЭS<TBP$XTcRR~PS%P$$((x 1V1J|RbP t|l PdEt(`P`  1]Yp4+P`խ -|]<1Pt,SSNP`RR!P~iP`RRSS SPSShSVV <~iVV"#^( nPUVե%RR ݥe<&~`խRեEյ@e V R <~iURТ`tRkݾ`d(U"Pեյe<~_ЭRUUХVPPR5iii=iiiiiiiiii 1>P?PW1 P1V-7P\PzcXP1ˏ\R1e@1j1D1L1RVfRR 1,p1#1PWqP1V ˏfR1l1Pl1V8VS cRRTPT PУSTT1WR W1RRWqP11RzVS cRRTT PУSTTGըBVݏ@^/P\[墳P`1Ppt1Mü~P`P1#ը ݏ@YxeЭL塚RRWТ VPW WDWV(χfLfVVYЭĩ # ޼P`P խ <0<1Yn1=ֻP` P 1/ﭻ 1v~ϗ<~kP\SIϺRˏUbR8պPﴺaP\W PSWPWPqWERRZТ7 UPZZZ4ZV(#f<@fV@VYW W[/OЭSЭRPb@S PТRЏA@ PЏDSZ`v1ﳹSSRPRw*PR+P=,zSSRR?*PRNթЩRЩR й P`<2~VPխY ЭRYY1[խ[ ЭR[Э(^%Wݬ+FݬX1PԧЬSSVRRRR6RR6﮹%RզRR ЬS V Vχ ~UﭸhP`RPRR6Ϻݬ ݬ^(4n^(nC%PPVV +1RPЬXXP^ЬRТZ jRR Z^(PZЬRZ ~@UZ1Ԯݼs~{XЬRRRѮԮPծ  ѮݏDbYD f~Tм ~TZSУRТSSRТ (վ # RR@ݮ~ݮ.ծ1ЬRݢݮ PY1թ1oRR 1Bi1;Щ[[SУRТSSRТTiRRRR-iRRRR SϚSSYݏ>TkjY<~)TT RP~ݮTPRRK TݮP Џ SP< Sݮ gPRTYgPRYSTЫ TЪ ST1;S14SXWPc5d1RR~cd PcPYݏDhѤRP~ݣݤgPRRQФV ݣVgP Џ U< UVJfPRݣfPRcYURУVPRPR"PRPRPRPR1YݏhRRRRRRФTУSTS1ST& ի ժ Y< ~BRSRSRSRSR)Yݏ RRRRRѮ\YSݣXPKREѣ2SݏDQ$ݣzXP̳SݏDQ@iծ,[R1R#PR1PPZݮp"cPYv@:PЬRRRRRݮ~SЬRݢݮ PYXiЮ iiRRRR Uݮo"Zݫ1ЩSУ RѮ 1Pծ Ѿ  >ORsբˏSݢb<SТROբJТSУݢ>Pݢb<pSբТSգ U&"SRˏBcTP~PTT#pRRR_[ݏ~DFYԧ1ծЧV0nRRSТ` PE@PSSSV(if@1WqЬRgWᆬSSS$S`? DP SDP6P`Vόgπg11ծ$iժݏFY1iRR 1ծgWY[ϸPW1.ժ)u ЏDR PЏ9DR[R>ELФѮ[<~ EPѮ [~DRѩR11PѮ1}ծ1CW1ЬRݢ[PWgRRgY[P1WSݣ|HPKREѣᆪSݏDA$ݣFHPSݏD]AѧYRP~YݧHPRRQ Yݧ3P Џ SP< SYNTPRݧTPRWSRA@g1PЧR*PRWPRBժ [`0PѮѮYi@ [~VC@gnggRRRR ͢ ѮgЬRТj[ WR+ТTT%ЬSSУRR{PRTЬRѬ 0ɮ[RR.ɮ[RR$ɮ[RR`ɮ[RRZ1 PˏR ˏ[R1RR j[RR 1[RR Z1L ЬSУRТSSSRТЬRZ1 b]PRR  [ Z1 ЬSУRТSSSRТЬRZ1 b[Ѯ[Z1 PѮ ^[@UЬSRIЬSզ8|<8ЭRb@ RRRR<ЭRb@ RRRR@Ѯ1xPP=1 ?PЬSЬRѣ1zѬ 1qZ11iЬT1Xլ oЬRТUФSUSLЦ8`ЦU2PT^S_SSSPVݢTݏ/Vf c~ +ТRUR1c-WRТPРRRPРW1|TPPPR55m1P?PT1TV!SfSRﶋ]RSR11PV5VQ aRRRPR PСQRRKUGUVf︂P`Wϗf1P<WW\(P(l\X_P|ScRR~SP ~t զX ~զ$ e~$P`Xզ1ЦXS1PȦdRզdRRRRXУց1PScRR~SP ~զX ~P`ЦXRabТdТ$Т ТiТS߀RրDSX'Pզ]Rbal\PRg3܀<Ŗ(VVŐyP`PSSTŐRTR1PS\\  S\#!yŐv*vRУcTѭb\\~ݭRPTTu~tOPS(\S\vTTvե ФR"ݤldddRФTQvP`~sP$^nS.vY_uXt11թXP1Ѯp1Ѯo7գ2 1  "P1 գ1PԮx RˏR ˏ  1PunouУVУYyuPRR(R [u1ht8ft.uP`x~fPU cHUxZZU[UϘ\գ\k~>lT>PlRR~\$lRRRlTTRtbУxR RRTRRtTRtbTk,`tԣCtW|tP`ԣ,s 1UTUZoL1.oPPh %Uii]1|?PЬ\RԢԬnլ1!!1P PԬլ11^PHЬHSRRScR H1BPլ,լ,'kЬkk11Vw1ЬHnQ~fPWqkVЬ\UЬ.()printffprintfsprintfscanffscanfsscanf()[] ptrdiff_treturn^UKRPTPP[PTP\բ,ϚjbjT1d udpˏuPPPAݏ&[ˏdP d  ЏC`SCSBP ˏ?SP)TPݬSP9} TOQQPP ^PUJJTФnФWФЬSPSPPYP[Ф ZPXtPЬ ЬA OOWЬPXOVЬRISSPWRg%RѮPWV f ЦP WPWOݬN[XOЬRRdnV1MXR1ROYOb 1~DCC.BCK  [DCC_DISTRIB]DCCVAX.EXE;1|^hORVSPVRPSSX1P:O1լeޤ@ePޤ@QQePсOrQeOzPSNNRF>RRPSmOݏOdPePePeN` wbPXNX1լ Џ4RЏRRφ{PSNCM;ˏ?SP1XV%PRݬ&zPRNS%sPݬzPVSdVYլ SXMV~ YX ?M1fPP #MPPPPL%XMP`\L\(LP$^FV.MZϼLA1Ц$nLXKW1HC!MK!; M<~-K1ggRR@WHdC~YzPSRRRRS`gRR 'ЧRТRRRSL~WwvSRRRˏR~ bPKϙoKWJVJ5JR,bSբ Ѳ@\JSSbզ,ϟdfd(JKP`d(kKЭ\uJWSJdVˏQJRRAPIJ5-JR,bSբ Ѳ@>\JSSbզ,cfccHA;KRsJTRRY ZcP[IU14W1-ԦXPP "zmR""**21?Pe AI3JRRRRRYݏ, Y\[Y]PU1Vզ,#cfϊb WYI1 JHRRI11 g `gRR ftIWURPUWPRR@NIR1RWS P8SS1IRIݏO11]HJH BH=Hg,ϣT%g1H\%IH<(1PggRR@HˏgR<~5`1PˏeR1 eե1ˏeR ЏSSUɏS~-_1P<(@<(<(-USSTS PTT;GTRH X~)jPRR R=Ѣ4e g ω[PXRR ωGP<(FզKgGgRR@6ݏ4ztPSU6PRW8sPRGS7WenFS SWVFY T~\DFQFRRKGDG;FX3%GFGcPF\lAFJPQ G1E)ES cRRRRW EcBEECW?g:\61(E 5Fݏ vEnѦ$n ݏ<.RE^?XE9!R}ER9cE9E:#RPNER csE:jE1DШVD ݏ:dx(DխԨDEP`Re E$!QEP`RADRPDbEYDEP`RRR K~YEQE(C խԨVϟVˏRRSRSSTˏCRRSRSSU8CխЮDzCϮoUğcCϚoTVTUVVn(FDϡD(2C.D"C!DPC DCYρ<~ϙjP1CVBW[VWRWV'PRR$[VWP<~[1PV}IPVWsIPWVW1~f 1dVTФRТTTUWSУRТSSRѥ1\Y[f WRVWRV[RR~V;PS\ SZ  PSS\11VUUSУRТSSRТTT  UiTVRWUUSУRТSSRТTT  UiTWVW1W WӱZAP[ VAWVЭRD@ТR6`bRR %Э@Э@RRRR@RR@ЭSSScЭScVz@V V"n Cj@a@T X@1խЭ3@RR9@1Э@Э@RRRR@`6@@A?@ ?@??R?R ??ծ@??P<ˏUP_y@SPSPPUSSTSTW?QQRPQRTRQUS6?0?*U&$??P@? @?P^5?1lXP(>?V&@P`(?@K>Rb\1VX<~,f\EZ?1?21ψZP(Y>?X?P`ύ>1llVP()>Q?\~?P`]( ?r_?vJ=RbW1\V<~τeWϝYo>1(>+?=RbY2XZ<~DeY]Y/>21)#>9 ޯ5R>Rϝ[>9P`=W=P^ω=1lhXP(%=M>Vz>P`Y(>n[>rIP`/=1lVP(}<=\=P`ϱ(`==HHS7PRS6PQRQTQPRQTEPT>PSx7wPRSd6gPQRQTPRQTPTХhP@pPPTP 76P.6 ^0Vϟ6=1﹦XϐZP(57Y6\;7P`^(6L.7\ƈ6W+ˏgR!<~NWhW61Pz5SGˏcR= cգ4^5SˏcR ЏTPTSɏT~LPA5a95Y&5WMxR5R? 5PRWPRA6ݏ` 444S ShW45RR4@4=YZ<~)\Џ= 45=1v^.SмTÈZxX4W5RP5R D5R ˏUTP*4 P"4PRPP5ݬKR4P3P43PˏUTRPRRRxR43PP RPR433 4KˏUTRx3333P ^64/1P(Q3y4VW3\4P`(+4L+{44 \WPW\-/Vϵ 1;1PSWP(1)2V1>\ P1\?2P`(1L(2'2 \~ϨTPx0So.STTSTg PSSw0SR>P\8f1S/*STTSTg PSS;1SR\;V߯e<~W>P\;V+<~ϣW;Vψ<~όWЏ; /s0>1g0;1<^ЬUˏeRm0TT//T/P/S1STRQRPS SP QP{SPQPQTU;GRP/PJ0SSRRj$)/RRj/S/P /PPSRPRPPSUFR.P ^.S/ϳFPˏP)Q/PSR RP QP{RPQPQ.PS/.. /ϳFP^i. Y/@FˏP9QM/PB.RRRPRQPQ{RPPQQ.Pz/P{ .PQPP-P^k(Y-//d.Э-T.1jH.PP ________/ ?PP,18P,`44444x444444444444h 44` P?PPf1Pf1R?P-SG.P`y-GS v-1Pi-1PϿCx<~W,1B,ЭRubˏUbR;S1u,k, խ^,ݭ8DЭL,1ˏR1S1Џ/ $,,1,,1P^-P`,v PԭЩ+7-|~<~ZC+1@< ~:PT+RRRR<+~N+ c+RRSRSSխЭܤCˏA+ѭѭ>+ ,J, PԤ*T**RRRR* ****ЭS*RRc* ****RRRSRSS~*Эة1 +U+P`VU19*V1USУRТSSVTФRТTTȘ~ݭݭ@P,VUݏ1lUp1`1\թ,ϮC~VUP#))VUݏDXU1Pr)R)FRRX)Q)>) )1))m=)`)X)RRK:CuP6խˏRRP(խ(((թ1Q (1G.)HP(MRRlY) )$ԩ$)P`(H~LC((6(.((( (('ЭSSPSPPR RЭЭRR'FPP 1P(P`ϡ (R'R~'RRs'ϲN1PV'h'.(v94 P)ȏ@+'8'թ1 )'1P',թ'ݏ]>&&1-~'V1Pѭ( ѭ Џ\<lP| |S3'RRˏBc4'R~F|P44p& i&<]8<]88<&<Y^(ϡnPV1fRR1fRRn& ~f&ݏD%@fЦRТRբ ݦV%Ц%Ц %f1P*&~1Цp%j%S{ {S%RRˏBc0%R~ {P004% -%fRRRRaVϰ-XPfRզMRR ;fRЏD, PЏD,]%,d$@ffRRRR$fRR$6fRR$x$r$^$VO$M$7% k%$Pԩ$%P`ɏ@&$1 P$6%^%P`ݭݭς#1P>%P`o$RR 1`$I1 \$R bRR8I$1 uPPRR*R)R R1{ $RբU;$1b ty"pyS#RRˏBc(P#R~xP((1 Ԯnթ,=NPX#\@$P`Pԭխ!b#[#~X~ݏ`[%խXWݏ!`4խˏHRRDJ6[ RbRR X\1p&&3P`pYpB P` P  <0~Nȏ{YP`SЭGRR15N1-PlЩh ~ӶYP` $Pԩ$ԩj1 lP`IRR$=I<R bRRd"ˆPhЏ@m[1`=&$P```$5R,bSբ Ѳ@*SSbթ,1i81V d<0~Vϯ5R,bSբ Ѳ@)SSbթ,d1i0uhU\L]@]3S1cR*УR$bRR@ Џal P`1tPP`ϕ./1#P`u<~?h1FRID1ˏUbR0+1"1PjP` PPR1b 1RSУRТSSLSRТTТRZbKPDDS SHPSsP@PR RHHgHR f~ﵳЭYQP>ѭ  9K ,G $ ~PSݏD R)R\< n< R<ݏPkd@2 <~Щ4Zԩ4RR1V TPV1VT8TV(P88[1TV 4PVT(P441_~VTPݏ.kTbPSR]PKPVT(P*խ^~VTPݏ.k+T!PSTVݏkSVSV ХU-ծ(T!d@ PԮTVT TS  P`0P001/)  <0~RUխѾ|~/iծP ݏN0 FRR8ЮRЮUUSУRТSSSRТTT  UxTTVPR5Vfb ˏbR"S S?xV|PV V"x`RMb%խ  PЏD@G0խЏD@4PЏ?@%PЏD@ ZP`,P,ЭЭ ZiЭ41%ЩhԩծlRR ϭݮ~9n?Ѿ@ (P((ݮ϶1PnѾ f(ClP`L(PwP`LLlV+Vզ $Ц$$թ,ϯihRRRRV1nZ[ЦgZ1%ˏjRlZP91Pզ1<pR1-ˏ"RRG:RR1GvPJpRѦR Pݦd1P ZJP lݏ8H泥111ݦwP1f  Џ@ ЏB@RѦRPݦ0PZᄉPlPP pR@f l61P RR1Ц U[Uթ1U11XUﮞaXPݏ1PZ1UTTSVPTRRS=PTS-PTRRSPTSP SjS*ZPRUéPRlݏڡ ݏ}RRpScRУRb@  PvRRhRR[ ZrVUUSУRТSSPSRТTT  UrTdT[zSqRRRR[RbSTTUT`PTPR RUUSRRR[RRS~vS S!r_RRRfSRRRSRRVOF3nRxR'RR%t 譆xRRp ;P` <2~RSRSS@@Џ@1P1P ^SЬP@}] g1K)/Q aPPPPI %aBѬ$ ݏ<؝R10<~P[b  <_~R*ˏbP R~1PPPP v $q^YJX?Wh[[+ˏ[R1121#1W11ˏgR1ˏgR1'XWݏѬ1$ WOoXլ *SPϠS/sS<~%1P1![RR 1 2R/&|<_~Xf)PZRW1Ѭ1g 1xXWRPWX3^PRR$ѨR~ݧݨ^PRRݏ^m+WXPvQSRSR:% Fk_ ݏ Wmթ0AݏM*wPVզթ<!ݏBϚ<0(keTZRZRSSTPS[ PTTTR1PˏgRW~1BPը ШK =;S1ˏ-RRGDRR1QTJyPIsRR Re(PRWMPRݏ8H漢lup nP_ RqR 4R^'PRWPRCݏ@BP S@TtѬ17/լZRRZRRS Sqk[@HXݏDXSSTSY PTToTR< bX]cZgRRYTRRRRC1լoWkg[<" ˏ[R*g g@50ˏhR h"ըWﴫPXݏUePѬ RТ \b լS PլѼ@S Ь\SSPP ^S1\11-lPPPP lݬ ݏDlPPPP lPPPP~l]XPլ&Ѽ@A`PP  xP% RRRݬ ݏ}HVQ lPPPPQQSSP ^IVXЦW(RխRR ԦP`ЬP`xW7RխRR Bv OIGVm:P1/RRR 4  P1(Ь%ݬX`WP-ЭS SHQЬ|^UjRVR1VS1cPP 1լSTPЬTTaYP P11n#1bb[ JD15QСPРQQPРPPPPP1 1P1PpbP`PPrs όPHSS. jPլccPP(bOVJP)PPb8լ3]P`PP($բѲ@ PbݬXPR KԥVե,CFݥ,ݬ>P%-լ`ݥ,ݏ#D:Ue1e1ЬS1cRR 1SPРRТPPRТTeSSTRP TS?>PRRLc@d?TSݏ*PSPРRТPPRТSP^Rf %!P`RARPPAݬ/ЬSSϔT1STRTSG=PRR0ЬcPݏ=ϔ TݬP1fS/SRRRMSݏO8@d 7TP`RPRRݏ/ zPЬRb Ϝ  TL^ݬPTTS1RQPPQP2RQ Q>L|Q Q)LTfTcSSP ^QS1ϞP1cP1|oݣSTʏPZRЬRBPSݏDyR$.QaPPP ^%RP2\\"&I%\ l\\PPHPS`PEc5G\,lPլ Ѽ@X3PPlբ,b}SOP`\P\\ L~wPe\\"YIX\ l\\PPGPXu5w\,lPլ Ѽ@cPPlբ,Fbϭ\ S{9PeSύP\\S SIP PI^P1 PPIVP^q@{@r|^RJS?TSTˏ~(PUYPѬ;ULPT(SU>Sˏ~PUTˏ~PUТ P@TSݏRj{ˏPP$'ˏuPP ݏ=uf`PPPPO7.(7Ь'#'BS>98P%P* T@ P U!6UЬ P`U0$Pլ ݏWDsSUS SwFTUQ Q[FUЬVVPP^ԭЬݏ߭ݬWPF,2խ-R%3Q QEt[|~ϷOFݬPRQRQQ Q}ERP<^լ*ЬQСPРQQPРTЬTTSTU1`dRR ФRТTդytSԅݬP-ݬ 3sլARTR5ЬRТPРRRST,3PTT_RTRФUUP^ЬPРЬQСС% PQPЬQЬQPPЬPР Рa`a^լT-Pݬ2PRRPSRCSTTP^(=R\R\ P^5~DCC.BCK  [DCC_DISTRIB]DCCVAX.EXE;1'T|R*բ%5 mPݬݏUt^ЬQ-(СPݬݏt VЬPРP@^v2P9 P` 6Pˏ`P% ɏQPЬQQP QWArning (lvl. ERrorbool/signed char/.../unsigned long@0component of composite of (file already included ?) (e.g. ...*const...)empty" Compilation unit "@1": total number of lines processed = @2 @1 error(s) and @2 warning(s) reported. of file " Last tokens: left line may occur (through assignment to non 'const' pointer)No error or warning reported. or just beforePress to go onran out of memory..right ###### ===>Press after each message to go on, e => more informative message (see option '+zlt'), # => no more stopping (see also option '-zsam'). Option '+zae' causes every error to show. ===>The command 'dcc' alone (without argument) lists all options. subC programs checker, version 2.1h. Copyright 1995 Ecole Superieure d'Electrici- te, France. Usage: dcc {options} compilation_unit_name(s) options: -zac no missing 'const' qualifier check, -zbo no 'bool' type check, -zcc do not call compiler, -zctn do not check first letter of type name, -zcw call compiler only if no warning/error, -zfrt no unnamed function return type check, -zinc no '#include' position check, -zind no indentation check, -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 @3 characters, +zae report all errors (default is report merely first error of current statement/declaration), +zafn always display current file name in error/warning messages, +zepl warn on empty formal parameter list, +zlt/+zlt'x' list last tokens processed before error/warning ('x' = buffer length), +zmcc check all pointers for missing 'const' qualifier, +zmic more index type checking, +zmsg'x' 'x': maximum number of emitted messages, +zpnt check that function parameters are of named type, +zsy print each block's symbol table, +ztab'x' 'x': tab spacing (for indentation purposes; @2 is default), +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 @4 options are heeded). ***** WArning(s)/ERror(s) found in compilation unit "will occur@0 (through cast or non 'const' pointer field)@0Identifier "@1" already declared/defined line @4@5@6@7@8@9.Label already defined line @4@5@6@7@8.Type already qualified with same qualifier.Option "@1" already positioned.Tag "@1" already /*~Undef*/ined.Case value (@1) already used in same switch statement.Argument collection gets out of calling macro body (called macro "@1", calling macro "@2", call on line @4@5@6@7@8).Specification "@1" expects an array@0 (type of argument: "@2").Array of incomplete/void or function elements@0 (element type: "@2").Function cannot return array nor function@0 (return type: "@1").Arrow '->' expected.Function "@2": elements of array "@1"@0 (defined line @4@5@6@7@8)@0 should be qualified 'const'@3."@2" not large enough for maximum number of characters readeable by specification "@1".To convert array to pointer, use construct &array[0][0]..@0. (expression type: "@2"; cast type: "@3").Assignment of 'auto' address to remanent variable (if really needed, use /*~LocalAdr*/ d-pragma).A variadic function must have at least one parameter.Backwards branch (if really justified, use /*~BackBranch*/ d-pragma).Bad number of actual parameters@0 (function "@1", declared/defined line @4@5@6@7@8)@0.Bad attribute@0 (can be 'static', 'extern', 'typedef', 'register', 'auto', or empty).'main' should have no attribute.Bad syntax, or text too long, for '/def'|'/undef' compiler option ("@1").Illegal @3 d-pragma for parameter "@1"@0 (declared line @4@5@6@7@8)@0 of function "@2".Operator '@1': bad expression type@0 ("@2") for sink type "@3".Indentation inconsistent with current block/substatement level@0: indentation pitch (@3) x current level (@2) != current indentation (@1 spaces from beginning of line).Bad indentation from line @1 to previous line.Bad indentation from line @1 of file "@2" to previous line.Bad index/addend type for array/pointer "@1"@0 (declared/defined line @4@5@6@7@8); expected type: "@2", index/addend type: "@3". If necessary, use /*~IndexType */ d-pragma in declaration/definition to specify index type.Bad index type@0 ("@2")@0 for array/pointer "@1".Missing integral type; 'int' assumed.Header file "@2" should be included in compilation unit body@0 (because "@1" is provided by service "@2", and used services should be mentionned -at the beginning of- each compilation unit). If used by a header file, include it also in that header file. In case of composed header file, use /*~ComposingHdr*/ d-pragma.Bad type@0 ("@2")@0 for 'main' parameter "@1".Return type@0 "@3"@0 incompatible with function type@0 "@2".'main' return type must be 'int'.Value of '__dcc' symbol not string literal.Second statement included in loop or 'if'/'else' arm? (if so, use a block, else put second statement on next line).Bound of array "@1" should be a named constant@0 (via '#define' or enum); name may also be used in array overflow checking.Bound of array "@1"@0 (declared line @4@5@6@7@8)@0 should be of named type, or use /*~IndexType*/ d-pragma in declaration@0 (index type: "@3"; bound type: "@2").Boolean expected by operator '@1'@0 (type = "@2").Function with /*~ResultType*/ parameter(s) can't be @1; @1 ignored.Adjustment file cannot change type/kind of identifiers.Cannot initialize typedef.'case' expected.Non portable (check upper/lower case in header file name).@3 at end of declaration started line @4@5@6@7.Header file "@1" cannot be a /*~ComposingHdr*/ of itself (via file "@2").':' expected.',' expected.Attempt to compile a header file ("@1").Operator '##' must be followed by token; ';' token added.'const'/'volatile' mismatch in pointers for operator '@1'@0 (expected @4type "@2", expression @4type "@3").'const'/'volatile' mismatch in pointer/array parameters@0 (actual @1type "@3", formal @1type "@2").Left operand of which at least one member is 'const'@0 (@3struct/union "@1", declared/defined line @4@5@6@7@8); type = "@2".Operator '@1': @4operand converted to 'unsigned' (so possible sign lost)@0; left operand type: "@2", right operand type: "@3".Operator '@1': expression converted to 'unsigned' (so possible sign lost)@0; expression type: "@3", sink type: "@2".Concatenation buffer overflow (increment 'MaxConcatLvl' constant in file "configdc.th", and recompile dcc).Constant boolean @1expression; if really needed, use /*~NonConstExp*/ d-pragma (after a right parenthesis).Constant expression expected.Constant operand should be on right side, for easier understandability (operator '@1').Constant switch driving expression.Member name "@1" already used in same struct/union.Struct/union "@1" already defined@0 on line @4@5@6@7@8.dcc cannot process macro definitions while collecting arguments (collecting for macro "@1", called line @4@5@6@7@8).Declaration expected.'default' clause expected at end of switch statement (or use /*~NoDefault*/ d-pragma).Attempt to substract two incompatible pointers@0 (left: "@2"; right: "@3").Directive name expected.'.c' files should be compiled separately, not included..@0. (file "@1").Specification "@1" tries to write into 'const' variable@0 (variable type: "@2").D-pragma name expected./*~@1*/ d-pragma only authorized in header file; ignored.The 'while' corresponding to a 'do' should not be lined up with it (to avoid confusion with a while loop). Use '{','}' ?'#else' already seen.A function cannot be defined inside another function.Empty loop or 'if'/'else' arm; if really meant, replace ';' by empty block.Empty struct/union.'*/' expected (end of d-pragma).Excess characters at end of line discarded.Error directive encountered.'extern' declarations should be in header files.External variable/function "@1" declared@0 line @4@5@6@7@8,@0 but not defined.Extraneous '}' ignored.Extraneous ';' at end of macro "@1" ?@0 (defined line @4@5@6@7@8).In header files, only attributes expected are 'extern' and 'typedef'.A function cannot be initialized.Function declaration/definition illegal inside struct/union.In function definition, function name ("@1") may not achieve function type via type identifier.Open failure (non-existant or inaccessible "@1" file).Field not allowed outside of struct/union.Incorrect field size@0 (negative, zero, or larger than the width of an 'int').Equality generally ill-defined on floating quantities (operator '@1'); if guaranteed well defined here, use /*~ExactCmp*/ d-pragma.Format string exhausted.Qualifiers should be grouped together.Hazardous conversion@0 (expression type: "@2"; cast type: "@3")@0; if really meant, use /*~OddCast*/ d-pragma.Hazardous conversion to less qualified type@0 (expression type: "@2"; cast type: "@3")@0; if really meant, use /*~OddCast*/ d-pragma.Identifier expected.Identifier or ';' expected@2Ignored character(s) at end of option "@1".Invalid array size@0 (@1).Illegal attribute for identifier "@1".Only 'static' attribute (or none) legal for function definition ("@1").Invalid 'bool' type definition (should be 'unsigned int').Type@0 "@1"@0 can't be cast.Type@0 "@1"@0 is an illegal cast target.Type@0 "@1"@0 is an illegal cast target; use /*~CastTo*/ d-pragma.Illegal /*~CastTo*/ d-pragma@0 (types do not have same representation type)@0; ignored (use real cast)@0 (expression type: "@3"; target type: "@2").Illegal character: '@1' (perhaps non-printing).@0 Code: 0x@2.Illegal character: '$'; can be legalized in identifiers by using /*~DollarSign*/ d-pragma at beginning of compilation unit)./*~ComposingHdr*/ d-pragma illegal in 'body' file, or for including non header file; ignored.File "@1" should not be marked /*~ComposingHdr*/.Strange hierarchy of file inclusions.Operator '##' creates invalid token `@1`. @2 Replaced by a ';' token./*~DccCompliant*/ d-pragma should only be used in system header files.Invalid directive name.Ill used @1 d-pragma; ignored.Invalid escape sequence@0 (escape code: 0x@1).Unknown conversion character in specification "@1".Identifier "@1" does not name variable or function or enum constant.Illegal '#include' argument.Illegal in '#if' expression.Variable "@1": initialization not allowed (external declaration)./*~Init*/ d-pragma: nonsense use for variable "@1".Operator '@1': illegal left type@0 ("@2").Illegal octal digit@0 (code: 0x@1).Illegal operand for '@1'@0 ("@2").Specification "@1": invalid flag/length modifier.Specification "@1": bad 'precision' field.Operator '@1': illegal right type@0 ("@2").Specification "@1" invalid for type "@2".Illegal syntax.'%' operator not defined on floating type@0 (left: "@2", right: "@3").One of '+ - * / %' operators expected.Illegal type@0: "@1".Specification "@1": illegal type@0 ("@2")@0 for width/precision.Operator '@1': illegal operand types@0 (left: "@2"; right: "@3").Ill-parenthetized macro body or parameter ? (operator '@1').Declaration cannot be after statement./*~Undef{Tag}*/ d-pragma to be used only outside functions.File "@2" should be included after file "@3" (because redeclares variable/function "@1").Type of parameter #@1 incoherent with function return type; @4 d-pragma ignored@0 (parameter type: "@2"; return type: "@3")./*~NeverReturns*/ function "@1" does return ...Result type for '%' should be type of left operand.Specified result type@0 ("@1")@0 not coherent with C conversion rules@0 (operand types: "@2", "@3").Array "@1"@0 (declared line @4@5@6@7@8)@0: elements of incomplete/void or function type@0 ("@2").Macro "@1": incomplete parameter.Pointer "@1"@0 (declared/defined line @4@5@6@7@8)@0: pointed elements of incomplete/void or function type@0 ("@2").Function "@1": incomplete or function return type@0 ("@2").Operator '@3': incomplete type@0 ("@2")@0 for struct/union "@1"@0 (declared line @4@5@6@7@8).Identifier "@1": incomplete/void or function type@0 ("@2").Function "@1": attribute should be @2 (cf declaration line @4@5@6@7@8).Function "@1"@0 (declared/defined line @4@5@6@7@8)@0: incompatible actual/formal parameters@0 (type of actual parameter: "@2"; type of formal parameter: "@3").Operator '@1': incompatible operand types@0 (left: "@2"; right: "@3").@4Array "@1"@0 (declared/defined line @4@5@6@7@8)@0: index type@0 ("@2")@0 too small for bound value@0 (@3).Index value (@1) greater or equal to bound (@2).Call to function "@1" passed as parameter to macro using it several times@0: inefficient at best, multiple side effects at worst.; if normal, use /*~Init */ d-pragmaRead error (on file "@1").Non portable bit-field type (depending on platforms, plain 'int' is interpreted either as signed or unsigned)@0; type = "@1".Integral or bool type expected.Unsigned integer expected.'{' expected.Operators '#' and '##' only allowed inside macro definition; ignored.Length of character constant not equal to 1.To indicate header file, use 'h', not 'H'.'(' expected.Left parenthesis should be outside macro.Macro "@1" already defined line @4@5@6@7@8@9; new definition ignored.Macro name expected.Modifications @3 via formal parameter "@1"@0 (defined line @4@5@6@7@8)@0 of function "@2"@0; if normal, use /*~MayModify*/ d-pragma.A member cannot be initialized.Labels should be placed in front of statements.Bizarre values for pointer operands ?External variable "@1" already declared (on line @4@5@6@7@8) with more stringent or incompatible type@0 (declaration type: "@2"; current type: "@3")@0; current declaration ignored.More than one attribute.Missing 'break'? (if really meant, use /*~NoBreak*/ d-pragma).Operator '##' must be preceded by token; ignored., or missing 'const' qualifier in formal parameter to which address of "@1" is passedMissing '#endif'.Missing '==' ?Missing expression. (missing 'extern' or 'typedef' ?)Declaration of function "@1": missing attribute ('static' assumed).Missing function name.Missing parenthesis after function name ?Specification "@1" should indicate a width limit, to prevent overflow of receiving array.Specification "@1" should indicate a width limit, to prevent overflow of receiving array (if overflow guaranteed not possible, use /*~SizeOK*/ d-pragma).Missing 'if' (or forgotten '}' ?).Macro "@1": missing argument(s); replaced by empty one(s)@0 (macro defined line @4@5@6@7@8).Missing member name.Function "@1" should be marked /*~NeverReturns*/.Missing variable/function/type name.Variable/function "@1": missing 'static' attribute ?@0 (or, if really external, should be declared as 'extern' in a "@2.h" header file, which is to be included).Missing 'struct'/'union'/'enum' keyword ?'void' should be used to specify empty parameter list.Name "@1" already in use (defined on line @4@5@6@7@8); redefined (if that is really what was wanted, use /*~Masking*/ d-pragma).Negative index value.No attribute allowed.No compilation unit name given.There should be no variable/function definition in a header file@1.No preprocessor directive allowed inside d-pragma; ignored.There is no "higher" type among the /*~ResultType*/ actual parameters of this function call@0 (previous resultType: "@2", current actual parameter type: "@3").Object name ("@1") not allowed in type definition.First token of function (after opening brace) should be on new line, and not at beginning of it, to indicate chosen indentation count.Use of d-pragmas not coherent between function "@1" definition and declaration@0 (on line @4@5@6@7@8)@0; declaration wins.Operator not commutative.Meaningless cast.Non portable cast ?@0 (expression type: "@2"; cast type: "@3"); if really meant, use /*~PortableQM*/ d-pragma or, if in fact guaranteed always portable, /*~OddCast*/ d-pragma.Operator '@1': non portable assignment@0 (expression type: "@3"; sink type: "@2").Operator '@1': non portable right operand@0 ("@2")@0 for left operand@0 ("@3").Non portable type combination@0 (could yield "unsigned @1").Macro "@1" may not be undefined.Label "@1"@0 (defined line @4@5@6@7@8)@0 not visible from here.Operator '@1': no order relation between pointers on 'void' or function@0 (left type: "@2"; right type: "@3").No preceding '#if'.No qualifier allowed.No 'return' at end of function "@1".Body of which function ?Function '__index' used outside array initialization.Arrays can't be cast to integral type@0 (expression type: "@2"; cast type: "@3").Not ASCII character (may be invisible; code: 0x@1).No /*~TypeCombination*/ provided for "@1@2@3".Tag "@1" not defined.Function '__extent': identifier "@1" neither type naming an enum, nor enum tag.Operator '@1': bad expression type@0 ("@2"); expected type: "@3".Local variable "@1" not initialized@2.Local variable "@1" not initialized (at line @4@5@6@7@8)@2.Not inside loop.Not inside loop or switch.Not inside switch.Not inside switch, or after 'default'.Operator '@1': @2operand do not have an address.Array actual parameter do not have an address.Operator '#': operand must be a macro parameter; operator ignored.Operator '@2': (left) operand 'const'@0 (@3object "@1", declared/defined line @4@5@6@7@8).Not named struct/union initializer, or literal constants inside.Value of expression not used.Value of function "@1" not used (if its main effect is a side-effect, it can be marked /*~PseudoVoid*/).Function "@1": not same number of parameters in declaration@0 (line @4@5@6@7@8)@0 and definition.Variable/function "@1": definition type@0 ("@2")@0 does not match declaration type@0 ("@3") on line @4@5@6@7@8@0; definition type ignored.Function '__member' used outside struct/union initialization."@1" is not a type.Enum constant "@1" supposedly /*~NotUsed*/ ?!!Variable "@1" supposedly /*~NotUsed*/ ?!!Parameter "@1" supposedly /*~NotUsed*/ ?!!"@1" is not a (local) variable.Invisible character (code: 0x@1).Numeric constants (except 0, 1, -1) should be named@0 (via '#define' or enum constant). See also /*~LiteralCst*/ d-pragma.Numeric constants inside macros should also be named (or else parenthetize them).Declaration of function "@1": only attribute allowed inside block is 'extern'.Only attribute allowed is 'register'.Operator '@1': @2operand value may lie outside range {0, 1}, so use logical operators '&&', '||', '!', or compare to False.Operator '@1': overflow@0 (for type "@2").Overflow.Operator '@1': left truncation@0 (for type "@2").Macro "@1": parameter name "@2" already used.Formal parameters must be named.Macro "@1": parameter name expected.Function "@1": name of formal parameter "@2" does not match corresponding name in function declaration@0 (on line @4@5@6@7@8).Non /*~Generic*/ nor /*~ResultType*/ parameter should not be of representation type@0 (parameter type: "@2").Type of formal parameter "@1"@0 ("@3")@0 inconsistent with function declaration@0 ("@2") on line @4@5@6@7@8@0; ignored.Cast potentially non portable@0 (expression type: "@2"; cast type: "@3")@0; if really meant, use /*~PortableQM*/ d-pragma.Operator '@1': overflow (underflow ?) if unsigned expression too large@0 (expression type: "@3"; sink type: "@2").Previous cast useless@0 (from "@2" to "@3").Type "@2" is private: its constants/members are not visible from here@0 ("@3", defined line @4@5@6@7@8).Specification "@1" expects a pointer@0 (type of argument: "@2").Only pointer on function can be parameter (parameter "@1", type "@2").Function "@2": pointer "@1"@0 (defined line @4@5@6@7@8)@0 should point on 'const' element@3.Pointer should be cast to size_t (or unsigned long(long)); else use /*~OddCast*/ d-pragma@0 (pointer type: "@2"; cast type: "@3").'}' expected.',' or '}' expected.Cannot take address of register or bit-field.'register' attribute incompatible with 'volatile' qualifier.Functions should return information type (e.g. "Position")@0, except if /*~ResultType*/, /*~Generic*/ or /*~Utility*/ d-pragma used (return type is representation type "@1")./*~ResultPtr*/ parameter should have highest type among all /*~ResultType*/ parameters@0 (current parameter type: "@2", @1 type: "@3").Attempt to return pointer on 'auto' object.Missing ')'.',' or ')' expected.Missing ']'.Enum constant "@1" has same value (@2) that a previous one ("@3"); if really meant, use /*~SameValue*/ d-pragma.Parameter name "@1" used more than once in this function definition.';' expected.';' expected@2Statements should be separated from declarations by white line(s) (or use ";;").Switch statement should control a block.This declaration of function "@1" should, along with an 'extern' attribute, be in a header file included here.Unparenthetized boolean expression.Argument should be array, not pointer on array@0 (array parameters are passed by address, not by value).Side effect via macro parameter used more than once (operator '@1').Only '=' operator allowed.'sizeof' on char constant => sizeof('int') !'sizeof' operand is not evaluated.Initialization of compound automatic objects should be avoided@0 (it is slow and wastes memory). Object should be declared 'static'. If really not appropriate, use /*~DynInit*/ d-pragma.Static function "@1" declared@0 line @4@5@6@7@8,@0 but not defined.Header file should be included before this line.Statement expected.String constant expected.String "@1" too long.No new type may be defined here.Internal error:: @1.Tag "@1" not visible here.Tag names must be preceded by 'enum'/'struct'/'union' to be type names@0 ("@1").Label "@1" is target of at least a 'goto' that can't see it (on line @4@5@6@7@8)./*~TypeCombination*/ "@1@3@2" conflicts/is redundant with combination defined/deduced from line @4@5@6@7@8./*~TypeCombination*/ d-pragma can only be used outside function.Too many brace levels.Less parameters than required by specification(s) in format string.Too many initializers.Call of macro "@1": too many arguments@0 (call on line @4@5@6@7@8).Macro "@1": more than @2 parameters.Too many messages; terminated.Too many parameters for 'main'.Identifier too long (more than 31 characters).Operator '@1': incompatible operands; try permuting them@0 (left type: "@2"; right type: "@3").Type name expected; 'int' assumed.Type "@1" is not a parallel numeric type.Unclosed comment somewhere before ?Unclosed d-pragma ?Address not computable at link time.Missing tag or '{'.Function "@1" undeclared.Identifier "@1" undeclared.Function "@2": label "@1" undefined (used at least line @4@5@6@7@8).Operation '@3' attempted on pointer ("@1"@0, declared/defined line @4@5@6@7@8@0) to unsized type@0 ("@2").Operator '@1': illegal value (@2) for right operand@0 (type:"@3" => undefined result).Operator '@1': unsized type ("@2").Undefined struct/union.Tag "@1" undefined (declared line @4@5@6@7@8).Operator '@1': underflow.Identifier "@1" not visible from here (marked /*~Undef*/ined).Call of macro "@1" (on line @4@5@6@7@8): unfinished argument (for parameter #@2).Unclosed character constant.Unfinished comment.Missing '@1'.Unclosed string constant.Unknown d-pragma.Unknown identifier ("@1").Unknown macro ("@1").Operator '@1': member "@3" is not part of struct/union@0 "@2".Unknown option: "@1".Unreachable statement.Operator '@1': comparing expressions involving subtraction of 'unsigned' (difference never negative !); rather add to other operand or, if correct, use /*~CastTo */ d-pragma.Operator '@1': unsigned value cannot be negative.Unsuitable field type@0 ("@1").Enum constant "@1" not used (defined on line @4@5@6@7@8), or missing /*~NotUsed*/ d-pragma ?Function "@1" not used@0 (declared/defined line @4@5@6@7@8).Identifier "@1" not used (declared/defined line @4@5@6@7@8).Label "@1" not used (defined line @4@5@6@7@8).Macro parameter "@1" not used@0 (defined line @4@5@6@7@8); if appropriate, use /*~NotUsed*/ d-pragma.Function "@2": (final) value of formal parameter "@1" not used, or missing /*~NotUsed*/ d-pragma?@0 (parameter defined line @4@5@6@7@8).Struct/union/enum tag "@1" not used (defined line @4@5@6@7@8).Type identifier "@1" not used (defined line @4@5@6@7@8).(Final) value of variable "@1" not used@3 (variable defined line @4@5@6@7@8).Previous value of variable "@1" not used@3.Created type name @0("@1") @0should begin with uppercase letter (e.g. Voltage)./*~IndexType*/ d-pragma should be used in declaration of pointer "@1"@0 (on line @4@5@6@7@8); index/addend type: "@3", but "@2" expected by default. Use /*~TypeCombination*/ d-pragma ?Meaningless attribute@0 (because no object is defined; this statement is only a struct/union/enum declaration).Useless cast@0 (expression type: "@2"; cast type: "@3"); if really needed, use /*~OddCast*/ d-pragma.Useless /*~CastTo*/ d-pragma@0 (expression type: "@3"; target type: "@2").Useless @1 d-pragma.Useless qualifier for function@0 (type: "@1").Useless /*~Init*/ d-pragma for variable "@1".Useless /*~NoDefault*/ d-pragma@0 (switch tests all (distinct) enum constants; if that is how it should be, use /*~FullEnum*/ d-pragma to check it stays so).Variable "@1" useless (defined line @4@5@6@7@8).Useless/incoherent type specifier.Function "@1": declaration@0 (line @4@5@6@7@8)@0 variadic and definition not variadic, or vice-versa.A 'void' specifier without modifier must be alone.Type "void" illegal (parameter "@1").Warnings already disabled.Warnings already enabled.'while' expected.External variable/function "@1"@0 (declared at least in header file "@6", line @4)@0 defined in wrong compilation unit@0; should be defined in a compilation unit such that only one of the included header files declares it.Switch type not 'enum', or not all enum constants of type used as 'case' values.External variable/function "@1" declared in wrong header file@0 (declared in file "@6" (line @4), which is neither the header file corresponding to the current compilation unit ("@2"), nor a (non-header) file included in that file.Wrong number (bad sign/base/suffix combination).Wrong number (bad exponent).Bad use of /*~SameValue*/ d-pragma: enum constant "@1" (@2) does not have the value of any previous constant of the type.Wrong 'sizeof' argument?@0 (argument type: "@2"; should be: "@3").'zif' not false; message: "@1".01234567890123456789ABCDEF?; , , ~RT ~GN ~UT ~RP:;pAiDtYeTsuTeC:lbLpA/none/static/static/extern/auto/reg)) const volatile voidboolbyteunsigned byteshortunsigned shortintunsigned intlongunsigned longfloatdoublelong doubleenum PtrArray[Fct(VFct(struct union <<>RT signed char/~IT / 0*]:...)~NR~PV~GN=>{|...??}...... |^UV`UЬS]~SPR:SPRR/SPRRRTSTެSTceRݢcpPT+bRPR ݦTwЬebReTTP^TR6`\Ѭ,<~P ݢTwjeЬPPQQPP|Џʚ;UVЬSЬR֬-bSRRRRTSTQTPUR RP QP{RPQPQS VUЬR֬CϵbVUSPPTQUP R RP QP{RPQPQUլ"ЬP֬`R֬ЬQ֬ЬP֬`aR<(_R UTST PTPSPˏPQ PUPA*Tٞ PUPUPU0`e SSPP^^UЬXШTn1|Ш[ZRWФ QФYV&[T TTWTW1"W SWS[SˏSXYAi@X i XYTФSУTTSУYWXJWW SWS[SʏSS XW*PRPSPSPSc`PSPS*`RZrZ#RPSPSPSc`PSPS(`RVVZ)ZXPP)!/%Pﮐ?P[]P. P->W1V PVSSRSSnЮP^FV^ЬRecSRWSV( V|ԭWV ^ЬP РSPSPРRRݬݬ RS^ЬZЬRЬ YXRQТ QZWRPQVYUXTP РSPSPРRRTUVRSW;P^ЬPRР RЬWPQRVЬ UЬTQСSSQСRRTUVRSWP^ЬRRЬWТQPVЬ UЬTQСSSQСRRTUVRSWP|^ݬ~PV(ϕV|ԭݏDT^`Rݬ~T5|^ݬ~PV(9V|ԭݏD=T^OV((ПݬЬЬܞ,||ԭЬ S1ЬRRĭRЦLS&`1SЦ4Ц(R`1ST]~TkPR:T[PRR/TIPRRRWTW_U]~U%PS:UPSS/UPSSSRPURRWPЦS^ݬЬWPV(V|ԭWR^ݬPXЬYЬ WЬV(ωXWVԭYR^ЬnЬЬ Ԯ ݮ@n[PZЮY X[WZVYUXTSUPRTSPRVW^ݬЬ[PZЬ YX[WZVYUXTSUZPRTSPRVW]^ЬWЬV(ϞV|ԭWQ^ЬXЬWЬ V(nWV|XuQ<^(JЬЬ ЬЬEQ(^XVЬnЬЬ RЬTԮRSRRS` Ϟ TSiiRRS a iRn[ЮWЮ XRYЮZ(lWXYZ[mP^EWVЬ SRRSϛX nЬSiiRRSZϜ iRЬ[ЬXnYRZЬW(ϧXYZW[O^VVЬSRRSϔ SЬXSW(/W|X5O[[[E\?\[UP|^\RЬU]~UPS:UPSS/UPSSSTUTT9SSASZSPSS S STTTVP~ PVP6bPPAbPPZSSS bS STbTTU b~¯PUVU1UЬP֬`PP. V1PRܯ:PPAPZPPPP P PSSST P~ePT6bPPAbPPZPPP bP PQbQQS b~ePSTS1KVVP^%TRlݬ'lQQPP^TR„ݬ„QQP^DWSSXUլ1ެVfTT ЬPѠUBXXPfRRR ЬRТUUb  P϶ϳ ռݼ^ T&ЬR Ϧϐ S#8ɏT#PѢ(P~#$%( PТ(P֢(U`fPѢW1hBPP*9#PѢ(P~#$%( PТ(S֢(cnhPU1S0SS U1PST#PѢ(P~#$%( PТ(S֢(chPPP0PP PP TQP0PPQT#PѢ(P~#$%( PТ(P֢(`gPPP0PP TUUZZ ޢ [1h1TPP.1H#PѢ(P~#$%( PТ(S֢(cVgPhBPP*9#PѢ(P~#$%( PТ(S֢(cgPU1S0SS U1PST#PѢ(P~#$%( PТ(S֢(cfPPP0PP PP TQP0PPQT#PѢ(P~#$%( PТ(P֢(`vfPPP0PP TUUSS ޢ[1PݏϵUUTTh9#PѢ(P~#$%( PТ(S֢(UceP~Tl7#PѢ(P~#$%( Т(S֢(UceP>TL4 #PѢ(P~#$%( Т(S֢(UceP#PѢ(P~#$%( Т(S֢(cSSϙ&PU!h ϒPUPh wPUPբݏρ1oPhT TMPPUSTS~CXVҢPPfPP ݏF :1kPЬS1SWcUfhIPPcBP<^TeARR1VAI1լ=MA5|PRR*sR~PeRRXROAR1HbRR1;լ1S@IPRR: RSS1STDլ ~@U}@Tt@P`ΕPϮ-f^@PPR@I1լEI@=cPRR*1wR~P1fRR1VR1J@P?`PP5լ1/R?IcPQQ: QRR1TSU?`@R @R8?0? nPt? լ ݏ7@TRRP<^SH?I~PRR: RSSSn? n? ݏp6?n?5?R@R @ >1 >PP ^  J?PP"1 P" 4\\h $ ?PPX1d1 J;:; <~x ;1P(->5> ЏRP<RRB>P`ѭ#Ϝ<~pխ1}=>P`RRR_K~R: ~n:G>M>P`1 P&ϥ1 P~'>P`SV=IPRR: RSSSn13P=P`==P`RPRR ~+< H=< =P`RPRR<5~>3( PR=P`7ݮ7,CD7 b8P`xPxx <0~t7ݏ8HPXԮWԭZ%47P`$46JϨ3337RR%1R 1R61& [WV\6#6t6I PRR: Rtt1YPf6I YG 1ծ7 ݏkԮi7TVx6SMZ56SRTR Z%P6RRSTSR6Z6Z6Y ݏDkY6P`ծ*{<~,P5ЭpPVݾ(ݮ,,Ppp141XUDeSSTST2SW-Pу44fP5#lXSTSWХURWR5M5RRSТ?5PS4SSRXRXbWH4֮545P`lPllK~k4#1+h4I PRR: Rhh15ծ ݏGkԮD4%  PѢ P|~TRݏJD@bRԣe+C+~>P <^(TU(+K*!+  լդ +P`+ ݏg, P*S*IPRR: RSS>ϟm+P`R*IPQQ: QRRq*+1+*P+PK** Ѥ* *UԤլQ*}*D*RR 8R'3R#.R%)*!))ݏ@(Uu*dccsysincldir:x dccdir:DCCFILESstarter.dccadjFiles.dccDCCDFLTSacaeafnboccctncweplfrtincindltmccmicmsgnuinupnwpepntpordsamsytabtrucusgvevvewawr/incl=/def=/undef=define undef +/incl=/def=/undef=.c2nestLvlctrBlkStkEltctrCaseEltctrCondStkEltctrDeclElt=ctrDescrIdEltctrInclStkEltctrMacroBlkctrMacStkEltctrNotInitVarEltctrNameStoBlkctrSemanEltctrTypCombEltctrTypeEltctrTagListElt'/def=', '/undef=', '/incl='2\ 2\ 2 2 222*1)0" ***** ......\ ^ : ... INTERNAL PB: = crά^c|$UnPά^$UnԮ |X|RbŬ  `dЬ Ѭ M1 P"|RвRݢ{RPRRŀW{PS1cR1S{PP^{PTTWN{Rbn&&{ P~zPVVL3 |LԥTh$Cn#=--.-6RR#0PRϬ}#HݥXdx#!4#.##_#ݥhݥ<xP@Х ԥDŌPW1kxgxcx[HnXZWSTcRR+cRR-RRz SPTT1Wż!7>P1)!$(P1ߥlP1!P1ߥP1!P1ߥP1!ϭP1x!ϰϗP1f!ϞρP1lߥ ϏnP1Y="}XP8Ũ1ŨŐŨPPPMŐ+1P26 P21k 1!P1ŘPŨ ŨxŨK+12ϥP1|2ϏP1z!϶yP1dߥ4ϦfP1Q9 ϕPP1;+ σ:P1%ߥ8s'P1ߥ|eP*16!NP1>PŨ1Ũo1Ũ1Pߥ$ϸP1ϢP1ώPvskŔkPF*RńSP.*:Ϭ;P)Ϟ*PňŸ_ݏonY7PPR7PPR/YyoPo54PR1eo(ao$o n n=o)oRTUdSS+dSS-SSz T,PUU16R0P!ЮTR~,PR~ZPd1ϠR0P1ϓR0P1PRNRVWVTUdSS+dSS-SSz T,PUUfSS/WW11gR7PXRX[[RϹP* .XPZPZ;XPS X,PVPXSVR,P~$PWWD>BSլ PR1iծY ~4ЮR2wlP#PbԾ1&3(*(@<O  <5kigRR##PRϬNS.SkPRTGh~RwkPT0PH~R_kP ݏ@JTTTkM~﮷fkRb;+48kRbϜ3R1( YqRRSRPR~炙P"R7﷯ePlϟ"vScRP~cRYiRb]bb)1(RninhiϺRR MiS݃;ic*i^%R ~P ЏY¬hPJ1PPPςP111ե41ե81Z1ˏ?P # 1} v -'[ˏ?Pѭh1DЭhɥPLP1RbPP~bP ScP~cPcRbPP~bP#GRbPP~bP ~ϮRbPP~ϔbPŜRŜR PRbP ~TbPPVdYSSh hŤRRSLSTŤRTRhRPPTTSFSRѭ4ЭP֭``PP P  ~ѭhSSTѭ6PЭP֭``PP P  ~ϓѭ̞RbP ~xbPYTITŤѭ5ЭP֭`QQPP QPP Q ~/ѭhTTRYR/QQPP QPP  QP ~Rј ~VV_~VJRbPP~ϴbPRbP[֥P$֥L c6ԭЭХlŔԭ[?eRbP~@bPˏ?RRP0PP~")~*RbPP~bPեl1Шzdզte 1զtmXRPb \\UbТ\.\MRPSTFh~SRPT0PH~SQPM ݏ@TTTUU Т ТR1u RRpצt  ݏH@XRТSyRpצHS]YYP^-Y&R5bR(%RRTТ PT֩HTSЩXRЩXRɤЩXR ЩXRɠЩXRXЩXc jp ֩t   S.ݬPPT#T~PPݬݏ`МЬScR+PcRR c~6PݏScRЬT.T)PPRUFh~ROPU0PH~ROP) ݏ@ラUUUp1S|VOZ͢X aУR.ROPTUAPh~TjPU,PH~TjP ݏ@BUUUУWWլ 5V ݬhPVݣhVP7OPWVݏJ@瀞 УS1Sݬ5P[լ dթpݏ@ᅱE[ݬݏ@0.P'VPݏD~PԬ {լc ` թp1R 1UЬRbSYPzN8bPPAbPPZPPPP bP PSbSST b~MPTTURbPiSxRiRSReUcOݣݬMPݣݬP/գ;wУ RRP1yRϊ1oPPSxRiRSRݬP UPլ`UЩ`UݬfMPPXZթp#+ /ݬ MPZ :jUWXW~LPVH,RgP¢\P^PTegeQQTQQTT2ЬQQdPP PTТd¤3Q¤eQgegì¤PPTìeSSTSSTЬVV'PPTePVPPT`geT~VIPX P PP^ScP PʏPQPQQTSHQPQTQЬ|~=iPXVQQPaPiЬZZPP<^aRݬ2HPU1PNЬ<(~HPXHPTPS; T ~fTTnTU ~fPU߭PJ\ (f:P߭P,UݭݭݭT,#@ P511LP ~!sTPP`I|~zG5sR`WR+PS PSSwЬSզ)ˏR ЦRݦ#UT@ϺݏE}RU>U R,ݬ `P[0ݬݬ~DCC.BCK  [DCC_DISTRIB]DCCVAX.EXE;1l|[~}staticexterntypedefautoregisterconstvolatileenumstructunionvoidfloatdoublecharshortintlongunsignedsignedbreakcasecontinuedefaultdoelseforgotoifreturnsizeofswitchwhile #$%&'()*+, -./0123456789:;<=>?@ABCDEF !aGHIJKLMNOPQRSTUVWXYZ[\]^_`" ":,{([->.?})];~&^|&...!&&||*/*~*/nt'"\?vbrfax '"\?  +-<>=&|+-<>=!&|*/%^.  ntvbrfa^VX[ZWPЦSRR\)S) PSoPSRR\ S R\\\S&PSRTTSfR~7rP~xRTDϴ\\1wP\#;\\Sf1OSLLP`1CK"1)P\-RkGzSf1 STjR hbjRj#\UPRR\\1RP@\\#RPP$ j:UQ#\PPQUPR\\\S PSPR\KS@TS\\SPSS1j\00\\T\~*PT1ISSfTSYtdthTjTY0+0TP\QQSR#B;RRSQ\QUYdUZˏUSC{R(\dS\SdSS~Tݢ*PbRؚIR#Y ݏTrIբ ; S Т\PV=_I>PТR!{ݏeDt@8$9RR1R _11P^PЬP֬`RRP2Ѭ(PݬPP`RRP ѬۘRPP\ݬP P׬PRPP& 9)PRPP=Au P׬3f ^RLZDЬPPmpPP$SPS~UnPStKP ^PЬR֬bSSR5Ѭ+PݬPPRRbSSR ѬؘSRR\ݬP׬PSRR.1ЬP֬`RRP2Ѭ9(Pݬ~PP`RRP ѬۘRPP\ݬ-P P׬PRPP. 4ZP׬Ь%~s6P׬SR#BϠRR .G PЬH^PЬP֬`RRP2ѬA(PݬPP`RRP ѬۘRPP\ݬ5P P׬PRPP=7 ׬5!^PЬP֬`RRP2Ѭ(PݬPP`RRP Ѭ}ۘRPP\ݬP P׬PRPP=z7c׬gAO~ ^PЬR֬bSSR5Ѭ+PݬFPPRRbSSR ѬؘSRR\ݬP׬PSRR=<1PSRR>1ЬS֬cRRS5Ѭq+PݬPPSScRRS ѬFؘRSS\ݬbP׬PRSS=EA-(P׬.=׬<2 ^RЬP``PP$SS~jPSp ^PЬR֬bSSR5Ѭe+PݬPPRRbSSR Ѭ:ؘSRR\ݬVP׬PSRR=9<"1PSRR<1ЬS֬cRRS5Ѭ+PݬPPSScRRS ѬؘRSS\ݬP׬PRSS=A(P׬=|P׬~ P׬/^PЬP֬`RRP2ѬA(PݬPP`RRP ѬۘRPP\ݬ5P P׬PRPP# h P׬w#Ь~m<^SUWTeel213P 0ЬЬP֬`RRP2Ѭ%(PݬjPP`RRP ѬۘRPP\ݬP P׬PRPP ЬcR~"fP~l1nPRP@Ϝ1RPQP QPQPQP1<13PRPP#eЬc2Ec1P׬Ф eP1^PЬP֬`RRP2Ѭ(PݬVPP`RRP ѬۘRPP\ݬP P׬PRPP= AP׬;^PЬP֬`RRP2Ѭi(PݬPP`RRP ѬAۘRPP\ݬ]P P׬PRPP+>B&,RPP=%A P׬/%^TSЬP֬``P2Ѭ(PݬPP``P ѬtژPP\ݬP ׬PPP'1P  P}Ьd&U^PЬP֬`RRP2Ѭ(PݬPP`RRP ѬۘRPP\ݬP P׬PRPP=A P׬1^PЬP֬`RRP2Ѭ9(Pݬ~PP`RRP ѬۘRPP\ݬ-P P׬PRPP| :)PRPP=A P׬2 ^iVԮЬ [ ZTTRR.P TSѦ S~ЦP`R S~<&P`PTqTR#BWTSѦ S~ЦP`J>R S~P`PXWmeXRRx XRRXJZXSѦ S~ЦP`:R S~ycP`PXPZXRR1*XR#BAYYZ1lZXRRRY1RPY X~y[P~13PXRR.$%1[ 1 Z 1jPXRReXRRE1ծ1[ 1 ѿXSѦ S~ЦP`0пĿR S~oYP`PXXRR+XRR-CXSѦ S~ЦP`ݿ}qR S~P`PXXRRXR#BRR <~1 ZjP1Z[լ[L[TUxWSSPPW9SWTUSRRU%RUTTYUWWU  PYWXSѦ S~ЦP`R S~?)P`PX1PQ1XRRf XRRF @S%PXRRl XRRLSPSWS1SXTѦ T~ЦP`OR T~xP`1YWXRRL1RPPL VN?PPl[Pl 'SSSSSSSS=?PTwP^ˏ!RTRPTKP[  ȏW1SSS޼1PլS{SWRs" lﺼRRTR <~STXSѦ S~ЦP`R S~9#P`PX1R Rf RR `|^AU.V﫺TЬ`R\R1RP)R識 RPRP RᘭPP\RPRPP"1P  PReSPPPP@S9P/P%| υS P@SPA@TSdSSPP^iWЬS֬cRRP2Ѭ(Pݬ:PP`RRP Ѭ͸ۘRPP\ݬP P׬PRS0SS 1TVSPRP0PUU*:ЬgR~RP~=Y~xTPUPTPЬP֬`RRP.Ѭ1$PݬcPP`RRP Ѭ ߘRPP\ݬ)P P׬PRP0PP  VV1G׬1F USUS1PRSPSP1PPUSCT1SЬP֬`RRP2Ѭy(PݬPP`RRP ѬQۘRPP\ݬmP P׬PRPP@RP#@QQRPPP"QSxTPQPTT1T<T1L׬SRSPUP1RS~ЬgS~QP~WRS׬TﯵT"8ЬgݏCWTЬSSP ЬP֬`RЬP֬SЬP֬SQ`P#@PPQSRSPP|^UeVŀRVRSPf?RQSSP\#L\\PSQSTTfe\\V\\\Vŀ\V\z^e\լvԬ \ެQaPPR5PaQQ$P PPRPPA5#PPRRP ^uT"Vӳ[HXyUҲSУX|YnPW\\HeУW\7$,PfRУ\֣"lf"~Rfh\ dlh\hW PRУXQQRPT\\P\ZQ\RRWQrRXY(P`Y1BPZTk1УXRR k1k bhYЮ_SﲳHWtW9RR5﫳n綠ﯳR   Wk X k>=+=-=*=/=%===!=>>=<=<++--*/%<<>>@@&PH8(h @xh`P8  X 000j @DECC$SHRMTHRTLLIBRTL CMA$TIS_SHR DCBLK* baseNstLvl* curIdName* enterBlock* enterBlock1* enterBlock2 +d+ enterSymTab>+ enterSymTab3e+ enterSymTab4n+ enterSymTab5 +U{+ enterSymTabHC+enterSymTabHC6+enterSymTabHC7 +_+enterSymTabHC1,enterSymTabHC18,,enterSymTabHC19[,enterSymTabHC110?p,enterSymTabHC113y,enterSymTabHC114 +,enterSymTabHC111,enterSymTabHC112,enterSymTabHC115,enterSymTabHC116 +- exitBlock?- exitBlock37- exitBlock17- exitBlock18- exitBlock19F/ exitBlock20z/ exitBlock21/v0 exitBlock220 exitBlock230 exitBlock250 exitBlock26#0 exitBlock241 exitBlock271 exitBlock28#&x02 exitBlock29":2 exitBlock30"d2 exitBlock3122 exitBlock32 3 exitBlock333 exitBlock34M3 exitBlock353 exitBlock363freeDescrIdElt&4 getLitString 4getLitString3804getLitString40H4getLitString39 h4getLitString41*4getNxtStrLitChar4getNxtStrLitChar42Sk5initBlk5 initBlk435 initBlk44$5 initBlk4525 initBlk46;5 initBlk47 )5 initGetStrLit5initGetStrLit486initGetStrLit49b6initGetNxtIdInCurBlk 6nxtId$6ptrFreeIdSpace6 searchSymTab"7searchSymTabHC07searchSymTabHC50,` t7stats7stats517stats527stats54>7stats55?:8stats53 `8stats56}8stats578stats58MjB8stats598stats608stats619stats62 |9storeLabelName9storeLabelName63L: storeNamer: storeName64: storeName65TL; storeStrCh6 *N  n,k# 1$  I2g 3U- r6O >K8+  `9P DCDECL <prog <prog1 <prog25 =prog3 =decl ;=decl11 H=decl12Lb =decl4 =decl5 =decl8 =decl6 =decl9 >decl7~ b>decl10= >decl1>decl186>decl187>decl188KR2?decl113?decl114?decl115?decl116@decl117=@decl129C@decl130L@decl131 2g$Adecl118~Adecl119Adecl120Z*Bdecl121@Bdecl122Bdecl123Bdecl124Bdecl125LGqCdecl1269Ddecl127Ddecl128Ddecl132Ddecl133 Y@Edecl171PhEdecl134~Edecl135Edecl136Edecl137Fdecl1380Fdecl139ZFdecl140 }Gdecl141 LGdecl142gGdecl143Gdecl144Gdecl145Gdecl146Gdecl147Gdecl148.^Hdecl149Hdecl157Hdecl158G_DIdecl150IIdecl151WIdecl152Idecl153Idecl154Idecl156HJdecl155 XhJdecl159Jdecl160Jdecl16130Kdecl1626Kdecl163'HKdecl164Kdecl165)AALdecl166ALdecl167JLdecl168 /LLdecl169qLdecl170 ZMdecl172ZMdecl173\Mdecl174pMdecl175KR Ndecl176#Ndecl177+Ndecl178CNdecl179Ndecl180Ndecl181  Odecl182,\Odecl183Odecl184/Pdecl185DhxP nativeTypeP nativeType89P nativeType90P nativeType91RP nativeType92Q nativeType93Q nativeType94 5TQ nativeType95QdefStrunQ defStrun96Q defStrun97Q defStrun98 )>Q defStrun99Q defStrun100R defStrun101=FTRenterEnumTagNameoRenterEnumTagName102RenterEnumTagName103 ERenterEnumTagName104RenterEnumTagName105RenterEnumTagName106>H SenterEnumTagName107'SenterEnumTagName1080SenterEnumTagName109 ,B, SdeclIdS declId110S declId111S declId112S declId113KTT declId114 T declId115T declId116 -LT declId117*U declId118 8U declId119B|U declId120U declId121%:U declId122U declId123U declId145HIV declId124jV declId125V declId126 V declId127V declId128W declId143*W declId144JbW declId129 W declId130W declId131 X declId132%>N8X declId133 \X declId134dX declId135X declId136X declId137KY declId139Y declId1401Y declId138 Y declId141Z declId142/"GZ declId146Z declId147Z declId148 ,H[ declId149A\ declId154A\ declId155J\ declId156 ,C\ declId150\ declId151\ declId152\ declId153O[] declId157 ] declId158 >] declId159D] declId160  ] declId161p ]decl3 ^decl3162 D^decl3163^decl3164^decl3165* ^defFunc_ defFunc166O_ defFunc167_ defFunc193_ defFunc194"E` defFunc168M` defFunc169i` defFunc170m` defFunc182z` defFunc183"` defFunc171 a defFunc172K|a defFunc173a defFunc174a defFunc175Q\b defFunc1761b defFunc177b defFunc178)c defFunc184\c defFunc179c defFunc180c defFunc181 7oc defFunc185c defFunc1868d defFunc187`d defFunc188d defFunc189d defFunc190Jse defFunc191pe defFunc192R|e defFunc195 e defFunc197e defFunc196 f initOrSizFldDfinitOrSizFld198finitOrSizFld199ginitOrSizFld200,FginitOrSizFld201F ginitginit202hinit203hinit206,hinit207"\hinit204hinit205 hinit208hinit211#iinit212?n|iinit209iinit210 }tLjinit213'jinit214&jinit215jinit216jinit217 kinit218 2FSK 0knbBitsk nbBits219k nbBits220l nbBits221l nbBits222&l nbBits223 *SPldeclObjl declObj224l declObj225l declObj226l declObj227Em declObj228im declObj229mm declObj230{m declObj231$m declObj232m declObj233 Em declObj234'n declObj2358n declObj236)n declObj237eVo declObj238o declObj239o declObj240 o declObj241o declObj242o declObj256<o declObj243o declObj2441p declObj245=p declObj246Fp declObj247 +d q declObj248q declObj253!q declObj254 ,aq declObj249}q declObj250q declObj251q declObj2521Lgq declObj255Zr declObj257"r declObj258Tr declObj259Yr declObj260}r declObj261)gs declObj262s declObj263s declObj264s declObj265 s declObj266Ss declObj268\s declObj267N$t declObj269,t declObj270 It declObj271 ?}?t declObj272u declObj273u declObj274 $!u declObj275,u declObj276<xu declObj277u declObj278}v uallocTypeEltICuallocTypeEltIC279vallocTypeEltIC280 *\TvallocTypeEltIDYvallocTypeEltID281bvallocTypeEltID282 *GvcheckPrivVisiblevcheckPrivVisible283Aww compatType(w compatType284w compatType285w compatType286w compatType287WQx compatType288\x compatType289x compatType290y compatType291y compatType292@y compatType293Ny compatType294$fy compatType295y compatType296y compatType297$[@z compatType298z compatType299Iz compatType300z compatType319z compatType320Lc:{ compatType321P{ compatType322J` | compatType323-| compatType324@m| compatType301m| compatType307{| compatType308$| compatType309| compatType310$| compatType302} compatType303} compatType305*F} compatType306-} compatType304n8[~ compatType311~ compatType312)~ compatType313(j compatType314 compatType315(@ compatType316-mw compatType325 compatType326Lgr compatType327 compatType328Jd compatType317t compatType318X compatType329( compatType330-U compatType331,v݂ compatType3325 compatType333 compatType334$> compatType335L compatType336$a |  computeSizecomputeSize337computeSize338"$ createDLElt/createDLElt339rcreateDLElt340bcreateDLElt341createDLElt342ĄcreateDLElt343 / declType< declType344e declType345N declType346 defineIdu errAlrdDefId errMsngStatierrMsngStati347l freeDeclList0freeDeclList3480freeDeclList349<freeDeclList350FfreeDeclList3517Nl freeTypeChainxfreeTypeChain352 freeTypeEltfreeTypeElt353ԇfreeTypeElt354ԇfreeTypeElt355ԇfreeTypeElt356freeTypeElt357 8s, freeTypesH freeTypes358M freeTypes359S freeTypes360X freeTypes361` freeTypes362 !p freeTypes363v freeTypes364 freeTypes3654:b freeTypes366 freeTypes367 ĈgetINDEXTYPEtypegetINDEXTYPEtype368getINDEXTYPEtype369 e,initDecl5 initDecl370< isRepreTypeXisRepreType371>| makeGenericmakeGeneric372makeGeneric373?manageFctDPragsmanageFctDPrags3740manageFctDPrags3750manageFctDPrags380=manageFctDPrags381"hmanageFctDPrags376smanageFctDPrags377manageFctDPrags378>dmanageFctDPrags379manageFctDPrags382manageFctDPrags383"4manageFctDPrags3848manageFctDPrags385|manageFctDPrags386manageFctDPrags387ЋmanageFctDPrags3881 ~manageFctDPrags389manageFctDPrags390/Č procExtent8 procExtent391> procExtent392D procExtent393 T procExtent394d procExtent395!7A procIndex procIndex396<č procMember1܍procMember13975procMember1398$procMember1399$D procMember2`procMember2400fprocMember2401$A rowUprowUp402Q sizeOfTypeDYsizeOfTypeD4032 cleverSkipTokV tstPtd0 tstPtd4048 tstPtd405H tstPtd406\ tstPtd407q tstPtd408%:` tstPtd409 tstPtd410# <  B# jCJЖ <0J 8ZJ 6 $J8"2 l)L jQU 'T R~Z*U  \ .ba  ~eg!޾ i   ޹  ]Z ́* %  & .  DCDIR manageDirD manageDir1 T manageDir2k manageDir3| manageDir4* manageDir5 manageDir13,@ manageDir14,p manageDir15, manageDir6 manageDir7 manageDir8 +O manageDir9 manageDir11$ manageDir12i manageDir10[ manageDir16,4 manageDir17m manageDir18,< manageDir19, manageDir20 manageDir218Ж manageDir22 manageDir23 manageDir24.M} manageDir25 manageDir26otherDirL otherDir27L otherDir28N otherDir47, otherDir29 otherDir30 otherDir31NC otherDir48O otherDir49d otherDir50;`͙ otherDir32 otherDir33 otherDir34 O} otherDir35 otherDir36 otherDir37 otherDir38 otherDir39  otherDir40s( otherDir41B otherDir42Y otherDir44Y otherDir43"_ otherDir45$ otherDir46T otherDir66, otherDir67 otherDir68, otherDir51D otherDir52Y otherDir538 otherDir548 otherDir554 otherDir69, otherDir56 otherDir57# otherDir584 otherDir59YL otherDir70,x otherDir71 otherDir72, otherDir60 otherDir61 otherDir63;[ otherDir62| otherDir64 otherDir65!A  ء expandMac expandMac73 expandMac74 expandMac75Ǣ expandMac76 !& gaS;2| ^airLaI҅Jò$:$zpK3D={l$֏%}U 4 dg_r֍R=L)vtrs72f tPn`=i A5[}tm$.bud+A} s%7=•Tӷ|(YՆQ'̚4/te[q`ĥԽڥk>7]=3̠MPf;z*Xn bOK*Ya/=qV6<ե R&NPe͜-Nj:~6YyZlm4M_ܔxms55^ G8JOs˗I{Uf#նq/": m)t{3#=3ì4~OݥHa]F76 ?PO^A3.0"t&6xtQ[ztU;~I]Ova~D?R֎9q) %{r dG$'ݛe F>].q286fY~ԶyGmkLB of7^,#ΰp qN%AC᧕   k6&ǔiUz=s N[)i.K#JP,>T>hʍF9&ixrߺ~A Ќb3:9h1F1-wa"O׃Ԁ7!'/"P㩞W|-L qerVS㿝t"4:e]!b)$fjqDH`5uuV}Ii `C&y۠eRdkVڵz" Įe3l*Wb%c|C f^@᪭Q*#l# =:ig}6+*PZXQʖFDP)KL*ڋ"#mD4$([2_}$/sߒ-BBUF_.!u˵iwǟ6l/BW=L6mlOm`;>ڔ Bz85iiГlKy2*j+m8{,,}E }O,bcv?=BzῙŒ/2$ r/E`^G[3(6c85Bϓ^S3Zܘ@d9K2p3ri?.QfyvBC%}P?FQJ?^]Ef{PxBkH(axiK\I-]YO.8h#׳t qk\QV >OHI):x!I'0~b(~7gB A?hiοj|8aB_J-PۣTʋ𙇵17S[F+<7~<=R_ NkHMKU)2CiJ )s3b@nuv#GXg6NH谡[3ՁƴgP~VB(djB0{Ê֜n]B8=iCʾΣ+ <_vLGxp^a0/WFmSF`1HwfY<!`Jy(B`Ł6n4Z 2qf.^D뵿W/A椵9|E|m9}{m0K5zG)g4{(R,\-eTZ5.A0:9\'e9?*h'P Ł09jqt?}2^?(kC&D-% 5bѣP€\#qL%m׏º8hPlݥ x&4xͼL.l8;O$p1 #x:P&Wb;g"k'UC,~}@n 6(o:\?jΪ MU`R1p5_S4K];_Z)L0>L s*ۑKw..jܙBw ,8`sܠ"].iExp+4Z2 SRj۸ڤ-<5 i1p6"6C5沄M!jz+N:2/~$=HIFE0ވ2ڬ׫[i`NeǟOYYdo]s> c*j'\-*?-;TMjOPTE~wA#VL$dşEؖL<9`K$hsHB֧6 rڮ7]>Fp x[䜺A̩`*wIEugnNedde9`9x~оs㟀 zfH66F,wbСOs3ҕ3۩#TrdžY}\ݠ>@𬾦/[6+rfִj$BNe f9|8a/ OYmԿ} lƀS(rS^k|p9SJgaJh˺F9ĕUhx]"n[eӰG$hv*4A$`*"ϝ`:j6ŎVr^uQC&$IPөg@ $]Tv%JA,l# 0uR YWN%hdI$R&o \ܴg(fjhsd.\ wUyvKl~54$ҦдCGIr-٤5S5eY":=]ԓXDaʸ'.Z;Cϒ7olBJ7Rp6;aIl)\ Zn/x}b P~iSnTVnxbǨ/i|ADiPtL!ve͸yd71pI| L6B=ɻͽ 6˸Pvu.s`hOn¤`8 F^0N9_T#9eY9!"z)gvJn=A2,X<boJqAOG1wUq{|pk̵3JYdM6QW( :qUbaD0¨tK!k_?(R뉡avN{%N{Ty5tQ f1nm#~8VDߐry%䖮{CƲ*lRAcy:ҘxmEaq8~ 39&8bNlzR@RB)*Sz lˆY$z*xmPU$ŠPAaLdqsH/ͭ; Gwd/~ڥi&X&˵+ql< 󓁳dXVBXQO>[I\T!4~Fz !WTU2b/)jqK:@ߝάyZ1gªm:bܹ[C%8αv2[=۠ʴot~  a>[7{7Uzf)=\|ja$j6uru3(*UV2 0D|An/>\j*Wݯffsvt{<[VrM]f{ݼ9TM}Ę|OzT;\ F:SŰA$&`¨Z caW@nCƇE4Xo1d LA#pCy+rR^M!䂊t - R|k91 yKTU Uw @/cbFx}RiOމȈ݄&FUGd`ʹ-oY "M:nV4=chF$T u`{Ydƴ14O'ùM ܵONI?i70S4vl?Z݃`!r'7̔3H>)THuc:~~u(+PaYGoh; &l?輐6,ݩT*cU2P; XMՐb?K~#rXȀ|Pd_Ik~9 i}|aZ90Hk%e$/91Zx"d1+J3/Lݠ{A؆| }_(tBN PH`:鏒 _6t)^mz2ekp鱻 /v  yHr*&~Fc Mov`^2U|m>2ibBD'Q⍹ +mN줨 ˲!5S]CzG0{Nn ~5g.fn*P; n$-ʕ0nS,o29] ]< *"qMfuZtα׋tsES̔Px>u kڬ)Q \ݰTh/&#"re.,:V">;XcAOUR\Z4}ޚifh:[ў 7ƛdd3-Galn*!w1@)Sr>\.qez\ ZFcs0j;R?-40'v*JwDh+LV 'Z|%QVu-bdrR& |xxnd<[ -ʼn~ZXs ~ cޫJ.͖j[G $xP!f08D -$r eyԹ ʨ:˶bQO]2\z($0Kȹο#a&aοp8XXYği]ttn̦'B y0u 4o6 t ys p }q}bg}K\ǥᥛb'aŞ }O1řEA!1 3z}dapő uߡ>-K}-1Z HX6_,f__󉱍 H`N kvV>z*@Y=/s+*v y s9rTД!je_uС#Kަ(M0A ]e&)Ō[VUmX6)'.HeYn nvkw nc|% ؀M/ ӡ4>{5y5E'F|Gj#u90QO3;`W`ˊRHBӴvmxcCh`n j|\h8F vm.*^"ށ3nbkx%z b%@4g'ӝ+@YccU'qm\1#$g]ټ|EػN򽒢8'{31h Kю+٘&q_lWCF]g$7RCG*vxx48ހ ?X4-C[ Is pFr~]4?OOОAN3NFm;-ܮyQE[I!r kaU ;[kKgfVZK#Eb:ũ>uq{bdv+0o65IANvcy{@Ua ]cYpĸx,L^P ?:!G6W InbSRTbw"!lAǣt*K9o< f\KEs`LFݙ, U7m@exr Ы'HTKWHC)N/t>|SK5%I@6 g|G l&G3ԑ!-z9{N!zR' S1@_6/0[*>nP~Җ i>&An"y\MUpԀ"ҪկVR|*1*G~7 O$$$N C]w61?ZaD ʷF] =iTmհAԱ ,߫puPG= McƁ 2}2O;N\_c_XO zJccV's>IRpJ$&Lb2st-umkJl~_O0rTE*ݩdbiPZ DfpOcA<磘Jgs'n==8*`ۿ;Kpc( :Nn*=ڄd;;H)565[KRYY0oP,б8ͤ'z0&E4'V^ ()FW۶xZQ8uN4ü)FMBM# $/]KT'%%A `v:.j|+y=Jc h5Pp YF2؈V Ҥ/9  ܯ#$A_l3t;>8=2%T1|3KI5ؐ2PVԮlsuv \z/4dgQ^?Kq5p >79;OA%^-Wdӆamk|JNe&q0I- %8挶jY8r 2B$dfKt#ruo£Tقy}>t?J;N\&XYSc<0sȆ9HHq)jm_^7a$@Fj\=9x ;PWC=1WzMpj)py M>Q.Ԫ9}|^1Z/d,7]Var sUPrDTSp4! ZjN?il5xzp,4a8W2meho4B+ߢ#:C|95goŊV23ĭnTz֧gX|#mi̅jԼߦ\;#^+9mpF%ڡױ?Fx#.r}ށkzs'^^98t]~F$={㬅*}lc= ~EvWGes[=NB%1 -y#ԩt X$ M0řUhu7\V`I")eaO0#z>md\~Lt.uؔa=spLؤh>HFg!mF*>B읺6ͨO,gZ8/J$XgrbLی+  w KP/5ل*%+w8z"83ڕ]%lfN2q!GrӯɋrWMFX$HC5!ӳu+ 8 &owS4EjUYM460帙ƽɻm紕O1rX!6ؒ,Q^$!B"*pm@Լ#d.lP26UtE]ī+w"Joo,J&a'MDI]*VҾ`ΟdZ~5)tlF~Ć)5։w8fQH呤=?LS_IBrW3ƚ-N𮋭Nu:s!s$-!$4V+%t"4s/1?HS)Q\E$^_q zoozhcTN&) ':0 |i-" !hG۬oI^GXS ԯ=r3ixQ)DZ<)v85%e0˯qUug돃j5 r%/SN+b5s`yU[|2*ʅ<ˡ,1$kz DoiwO(^bso*+d5@~S3f(m*ۻ<#'C>x钓oL۸!v!P)N`-Z]Ꝣ3MۧXmSEMXh[0@y*"u.nsO\5RVh!6eUÊl*urJ@v0YVKUmPe1eydP2%92) {k 祳Y͜i>V@ H%!ά-+\Lp/*y*K<˦6F̟߲xƺݳ_(ҙtYɮTAT<qV_9@C_5e Z1iU4S&QwycX(Whh6s9O RTW~@s"sMvoݏ{ ڇ:ƶO,u:.l21}ējP-EAwN g.&Lg*6Y ]vF%{}Nޮ>mD͜ձP̸'N*!%+.ﯮ]1T OGB})K:2z/kX"W2[D'}b/(6|a/*Z̽xYXʁg1ױ)ġ'qv`71+["!'f+ \+;7`~Z]& ϊ[q"׹BYV- 4x+o ,P]jkT=Pd& ^ طkIމ|66EV~,\jTuWN?oM5/ɴAu|Sa-knĬ=B+, &+ -kw&%ϱl~z3YfRt_P:XwP6Ƅb LV0 &D]:[n@ՖAJ0<Ƨ]sIJ]b Dյe{_׌ln[#r'ba?Ö Tw1$v_F84)'}Ib ¼_LۛUpB0\@7 dHiE֠2h"dDÐ|+jO- $k4GQbvI%x=^gLPܓ캍7gJ *#PqdĶ#c]7&u%Dy%5nˮɝk."ɡ ?O:όiqV,TB1a;/-)REͿ/)Ps]vp@ڼ]ԑ3+sVX|rz Wa~~vѐoJb+ټR1kGc}&kބEr|=kX`ԲCȎ(H˵$o-`<_Bvl0}sK4[Ŧ)mfدS,ϕTy2Mh 3%@WB mx 5A;< 20( }7[_79,*oز n2p2<r-#O"& ZxI?|"3w!5Ύ/Os w*^)9@N^U/@ ;yfQ:3lJ^蹧 J0$gQrVfܟ4>пt̞_Y Ml " V,?}!%$ N$a3id"ֽ3bg.@ )b5'G E[Esf1. \LX*͠2ءC4yNڄzUq|-$k"աb2FMcDu/tQAy+0TƗKyPʭzkƮgCӫIU?oʪaNPA80tc0OnIת*)SK\C ;LA,M0̤',5чf\8w }z(b=&l ^gu'{_Z{n`O\pүP.{:bCcԫ *R=:5<2>Kv> ۤ40<*dQ\kk" `Rr'7 \ׄ^T lZ/k.: xw 33c=0]$v)\#:W{fυ۬'2̀#Bb ǩs /R}H'K|ryK`,tIpu`""EK_ $ƕ`6jkd#4JDӠ6XlY QnB)QdpL3\׵z6h ap=)}(V.ޘ8DԃyLgԵ`Jg4Ž} S$C@=cH'd>`2\rݽf,|Q@۩(g3tjg/W6$AZ31kWj0?Iq j~DՐx y[rC0z?\ f.oM`#rcH*E~t{g;f^^(jvd^ޜex'eu5ָ AߡkD<5H5sXh.L@I f (=U2C<g| NkdQ*0MnySi{\yAvd&0Sj9G^1G7v Qf!D|:5@A=,Jsi.HQ?8!d ǜi2&(,3^99S{HȖڈdQX~tJ <:cKBb,>K?9\CvaK)Q0e؈i.SX,<$(pΉ K5iE'< V3w”H0s7!/H)\ɭM@_HMeO+ QҲtoLpkx.5X{(؟hMƗB  $U;IrL]R.,!q\`kNŏ38&Mh̥l T؞q \5{XC"á@]+>qؗSfV^և +d,n!|ؓ$iHcBIuPCPI.+T0܆;:E4~& }$/ rHLO1!h G(&GkoԿ=zGl/]өSRΓlTb PsdcW|Xٞp~5?yY p(.Z8]ذfaAe;^*_G} lz\Golzbbz6ZPt \@e"s×KDP9KL~fr7`MUCSޗX4R<Cט‡>s9gU'#6[n@."t^Cl>Ư4Q@zFR]H\nDnVࡓB%H21.Qb}PҀ{'WIQk)], s B`G0:qK32\]25Ƭ[,|0~F:Ѱ8 Fvȧ+wg8$Xn7G1" bٖP@9Zś[ógEW}#|W9nE(;@fV$'`#~$cBacHpg'A*+咹+p/t6AIY m>Krc(*>/2+0f2E:Lze^JRȈaClKq^y؎c6|2!e %JQ?p$ ܀+|wo X8yjB.T(!rgUG "j=`$n1\ט^ OR'͵he`#&7-ǐz'}yՓ!/ %81r./j\BkQȦri^:Wl;D;'()mwa.EѠ YnO$m[q6>K} %ri%_Ұ3 %{ϸ:kHHv=c&t*aXNYyl0PuA)#iɠYut|@隑%*ݦhL4{Emw,GWm7, f 20q%- w/2M̾RƇL I>"=Z9L(eqobgVz  ~$3=¦hKXJڨbCǸB=^n%X:UufB">[wyc8֥̬hjʗ0y*l$0]yVJ?e}L}MrJM0nA{k 2Жvv%CV0=q^D )Ӂfs2OrEXwgcSf1 J|qJ\P\S%_:زepb0e*?[9B $NPj OgX@<1IƟx< l5c%4q=2u?B^P3hY4%L#;`NA'.'FtŒcl{^Sa뇯8!%B`q@mdXtI:>^WߎT+lEaӧ$2#d 㾓q ýB,&}Ju$0'0|0xD>)LLmKҸpP@z4Q~`n^`ORBq Sp軱$PX)2 yVäH?rΤӒ\+3CW!g Ⴋڻy05˲|L,R*L[w 2`:xc&<2ES| /x$nೇ>[-''x4wc[ Q;ml\S䒘p*)PW5xg . (2{Ԥ$"Nc:XT~=A+QeGh˅E0/Byw'FԧHv N뿀X%$R1jĹ@&9#PҴZ߁ vuc*yPkלtэ)VLIb6]џIb~"{RQ﫽E"pEJsA#!. ݃f(ȦmZOh!7K};k%"mxj'JG,8j |v^rQB,OgL!~@Dz`t^>Z^r\A_M5jQ]\6·_rH\lf" J촒0D0;{Z3:Nia6L^D X65.,,r vUl$\x&0;<.{@a1'\!:老e0n r듸4p& 4$>+MC B'^*>c͏2!1nE|He|WN8H?-]W7OkzO6vAۑg?N+BNp^X q)FJOЀ'CէM<`i(i WtfkO.r!JrI.-(cQcלRVdJ:Qb38yc%_;`0Ök荶 lC7cϽS|XT$^}[d b^[}@'wt3_ptJ>0車i/e NHJj~D?&3 ;ɣ4+L]9Qc- o)bZn P6R4toKn;s û_PgQk}9) yؓy0m;OЀʈrPkZ_!'Wa&BG)&/\}ΥB֛MD'tW5G$.ʾU$e:&[9KER\,#B HAKq1_]Pum~Nm؄8B,x>-V>>&z4dVe2^w!,$㛟"Ua2YN=tR˟|^CQcJ&p&esGn=['MDd(Fj(dfI]^E´,hx#V&WIA7ԞQ}\k׾@&?ivuxJ=z<#3G?TM8w`DQy)xZBUlˬsbj~7<xl+O% NGyUOd9TӸN {8Z:yS HBAbXel(J8.2A}!&=S0fkt}h3:Pil-AvL'btuA㑉R mޖ-u5_Q9 \IC#\a`S{JWa@-x isړu}!XЪ%fNf͕a2SkN'aG!T/= " ~_+vZBDb ޫXcvĒ0SARqljoJQNb!`tHS]1p7!O׆DWŠ\{0'햿l s2oBI9psL2 h.^6G%^M] v:`\nhƽI#9'Q(Ҙƾҫ}{>xtJ]p5ňJ uL`V!FHF.>U$$j;k 7 yBIZT{+ڇȂsƶ~wNPGb+r]t4D­m 6,O,td Xām; w+Vƃď,ǚ66C}#[;-4ARSi8hp58I@ӟܗ+9өhZK_{ P)'QNc 96ҥvŘ*H$ b"nCt*/2Mލ襝PJ:6 T&i32)SeDSl^'{82k.ضcXT0D 59T*ZYkhاcdK9Z$VB!CC'!sA'6+V6*f񌞠Su{jh39 F3#fyi 0&E$'Jd~̜p۳Lb:BUX?h޹#s!N<2~!S+om1ZT]z!h|*3V@aZ6  b ÚK&GS2@Tz|טּ,l܎}\2;TUDwi.w n4f3j._}O"DPJv^e:la躭F9l-rdepA{Aj/}I$~پ: :5 1,k ڪ@Dy-!e{zq&JY!P%N%' | TQ/E^HGK-{z"2iw3j⯟ 6|BVfB]DKi\c7+X`ǤJOJunQ@nƈ[r]SUybiDk!r)C1SFoz_@(է$8xW2R/<J9gn{Vlj6AR{NYAzJTklKj72u|f@bnY(Bk{`齪u ͑VH )"nY)j(ISz4N1;Bv0 g VEX 䥽N 0(O4?'°Ui]?*6Zb "#ͦčkLȾfd6Q˴}Ң}*5V8"ihƗ$x/gIjDsP;iB&:7NU.hDw՝tE$T²^nP s$8m㻆0XA \t4mL[kYCxN>X֞mh5xP"t!fYD@nOҕ jC+T PhY 4`R:䑰g^q;X>bo *Z͸tq3>K_-s[K~ϻmЇBj1D_#wZ~aUk̸͕, >ݏ*+^o bQS?'1TF xU{ࡸ* s]W~^䄸SGx֎~gs̵ m:ΌR9_pIYmߜ+ 쬞, ޹eE+gis8Daƒ}CՃ [gsZTE& 6qExM?nQcq0Y{.8UQ]xF_i*{=hS [\vq5zy\cK|]P0jZ{rPn%;ʡp>.DTl<w:|D5a3 yc%wA|{un?W, Md,oG'. 8!9Ujw~oqAՕj4b-\[84ή<Ư/?Γ!v$G)B\UnWZ֖Z̠ e< Y;hUAuܸ$jdH;[hAOmZSpNǩu7 ܣ^ Ѐ'(nAL{g4p[m^5l^SN jI*Nb3WiClY6'Vy숷ڲFS i4YD4+GcU$]I @o;E- D}N Mz;0n>'ӑg)DߩG[r+\Dƫc ]z.R&djx*Qg`s)],7V{4XqxLd[p<ԈV^2BJh`>2[i"̍Y} $P)<40Gג^}vog 8\F=ׁ!+i4i}/Oiݡ/QNwVjaG=sf?ޚ[Ng g[0-mz݊@ [0`]X=gy6M=G$ Y~ҎNLacT. ˪ד!'(.TsEzk!P^r*?x4_1ͧ{z~轆*ECF1cg.D*7>1`MҊYimlyZ)]ṙPSsu\NJ9aNw'NP=B(-&I^5(tk]wr&wT{p?$F ^ A.O_7g$갚 ((v8cƪcxqU~,r5e]Bx5Ȣi-e *)) v n,+$!I3:ֆ$yPzf΋R荛~9$;.i5PzδSpu2MD-j` v:jltu<(B? GV_6 v=9xhEF)+JmJEEqox"\&=G7xX6:ec |= 7s$yesK>O5V)`H*vI zRԱe 1 ϧUFmd +2DK$_/ 3m i?FRk8yO xB"_5TWTF d  '$Z7eq/],-:d JoB>tn"j8_CJZvʈ\Z ./3р꺥օ_߄ DMtaM>ܰoQx=oX/+g b}?6W0F,EkDYnZz=Źy34>Y9`@OI{(絓x*IN1Tn,( #m _zM ' ׼@ 4:+m,D=azZYtNÿ 5_{OcTX_*Y]Nq[1y.YU" +yk[ca NNMjQV4lΤF zCHj+#)#gS_CU!L ڨ \ _)%"oі.5 ~-A8_zz{4pQX.T8cC*@IextǪ},6(3,):}gjtn=,ޙ'۱UҺ{זAL\N+׊NB Dg"`YfCNn2b&nϗ &i7X7/ILMк`qߍkQ/c\YVdQ\~ y#ZWK"BOw[ $_! ,oxZiS>(!|dnsvD[ui;T:@O22(:(zk$V$ 7y Y7[6(kq4AԶ[u# ʯ47M$:uY좺L_Rwbz/y5|&gc~M|mO8U-TxReׅ+Զ,U=^(߳q~֫b/R,J3LJ%YE=yFvR?{(ݒVj~@u0E({h.2'}o*1۹y?t7a[dzGӺ$ϾRaڷk76R؀;ݑÀIǝ( S8QC4&CJu+;Ghyl%gDpdU~70ް8/RK :8,Do8#ohQ K4y <'$ЇL>SN) 3EvqvvþbAs2[A zй;MP*&d7.=g~)r[:k5*_uj&͵0ήQN_-jҀ=/ѨدJ~A m3KRޞl~M䊮zF!4{ޝ,UF.'L! 1no"[hxfy})GH /3ӈ˟-0fJkMuRژKՊ,FOZs 1\z S+iB*.̻fπyޘ>-Be43'oJ#7bˆZ;<`&uHUDK{?_5hp(]vuh"#-yr.S LExsQD28XYCGcגWQuRq$ zd2|v/}0';tBOk.PF.M /H聹hGQ(έޱx@istD!)H ѣJ"l|q!BWȂkCx(+Z^PR3޷{'% J~bйc*MFõ6fYXvyx={ px;65ܻԂNO) /oV_4p"n`̡ޥ[s b_17YBL6^)A=+o+2!Cc^ufRw>+eaSIrRAb1ŏ=KZ-󺤼ܿ؄bo0X[ YiN쾚i$4WpoٗX%G&joL_cg_ {Uo'{4 .ɴ\wi*Wai!7%{T.eQbOre9d֭^ `X5o5:4 -&s~F͗۬AWF3bbXPq2D2EТ1cJN0L֡(D8szvs)eܡkXSniRڲiiTVn 1f$p?ԞCCxZY}=|\7, HYh\|BpNX(;@.8&Ɣ WYK&JIUξsh}&NDۓ%]5ң &J3 a=Ͱ x%pKp抚<2Ǥ!IZKfDe% $I! b$a{0Ol| ^PR!uwFM:yJcՖܒ"!0+V|vVz:ǜwrU#b(zCf; v9vwQ Vc9dvuL`VGڑGflrr):ؖCR~g4g1ޠ~]pl'[R=_ꏄWoJۦ Y#od ZCPP@REY9)yvalid in this specific case.2A third idea is that a tool should exhibit clear~DCC.BCK  [DCC_DISTRIB]DCCVAX.EXE;1U|V expandMac88% expandMac89< expandMac90;_ expandMac77 expandMac78 expandMac79 expandMac80 expandMac81 expandMac82  expandMac83 expandMac84 ץ expandMac85U expandMac86. expandMac87$G expandMac91 expandMac92( expandMac93 8 expandMac94l expandMac95( getTokFromMacgetTokFromMac96PgetTokFromMac97kgetTokFromMac98getTokFromMac99'getTokFromMac132/*getTokFromMac1009getTokFromMac101 )cgetTokFromMac102 getTokFromMac1035getTokFromMac104PgetTokFromMac105getTokFromMac106#ͪgetTokFromMac107ժgetTokFromMac108)>getTokFromMac109ϫgetTokFromMac110getTokFromMac111getTokFromMac112j\getTokFromMac113qgetTokFromMac114getTokFromMac115getTokFromMac120getTokFromMac121getTokFromMac1226Q`getTokFromMac116getTokFromMac117$getTokFromMac118+7RȭgetTokFromMac119VgetTokFromMac123getTokFromMac124getTokFromMac125getTokFromMac126;_migetTokFromMac127}getTokFromMac128getTokFromMac129getTokFromMac1302\getTokFromMac131M.T checkConc checkConc133į checkConc134į checkConc135ʯ checkConc136̯ checkConc137 ׯ checkConc138ׯ checkConc139ܯ checkConc140 checkConc1412MYcv\ checkConc142/ checkConc143 checkConc144Ұ checkConc1456V@aloneInNoParMacaloneInNoParMac146aloneInNoParMac147aloneInNoParMac1486QhaloneInNoParMac149aloneInNoParMac150aloneInNoParMac1516Q`|aloneInNoParMac152aloneInNoParMac153aloneInNoParMac154aloneInNoParMac155aloneInNoParMac156aloneInNoParMac157aloneInNoParMac1586Q]g~" checkCondStkAndDeleteMacros%$checkCondStkAndDeleteMacros159%0checkCondStkAndDeleteMacros160%OcheckCondStkAndDeleteMacros161<J%ncheckCondStkAndDeleteMacros162%|checkCondStkAndDeleteMacros163%checkCondStkAndDeleteMacros164%checkCondStkAndDeleteMacros165%checkCondStkAndDeleteMacros1667ANhسcheckSColAtEndMaccheckSColAtEndMac167checkSColAtEndMac168checkSColAtEndMac169checkSColAtEndMac170checkSColAtEndMac171checkSColAtEndMac172checkSColAtEndMac1736Q]g~ checkSpeFctcheckSpeFct174checkSpeFct1795ܴcheckSpeFct175checkSpeFct176checkSpeFct177checkSpeFct1788\ curMacDFName, embdMacro LerrMac,x errMacCall, errMacDef errMacDef180̶ errMacDef181!=( exitMacro@ exitMacro182M exitMacro183 exitMacro184 freeMacStoP freeMacSto185\ freeMacSto186f freeMacSto187K freeMacSto188 freeMacSto189  freeMacSto190B?P frstConcFrame$t frstConcOpndfrstConcOpnd191frstConcOpnd193frstConcOpnd194ȹfrstConcOpnd195׹frstConcOpnd196׹frstConcOpnd197ܹfrstConcOpnd198frstConcOpnd1996Q]gXfrstConcOpnd192qfrstConcOpnd200wfrstConcOpnd201xfrstConcOpnd202 frstConcOpnd203frstConcOpnd204frstConcOpnd205frstConcOpnd2066Q]gy macActive: macActive207X macActive208x macActive209 macActive210>p macActive211 macActive212 macActive213 macActive214$0 macActive215 nxtChFromMac(nxtChFromMac216-nxtChFromMac217tnxtChFromMac218 XvnxtCharOrMacToknxtCharOrMacTok219!nxtCharOrMacTok220nxtCharOrMacTok221nxtCharOrMacTok222nxtCharOrMacTok2236Q_{nxtCharOrMacTok224nxtCharOrMacTok225nxtCharOrMacTok226nxtCharOrMacTok227 +GnxtCharOrMacTok228nxtCharOrMacTok229/I$ popMacStk; popMacStk230\ popMacStk231` procCDefined( procDefined(Կ pushMacStk pushMacStk234 pushMacStk235 + pushMacStk232, pushMacStk233x restoQuoStaterestoQuoState236" storeFileNamestoreFileName237storeFileName238storeFileName239storeFileName240(<4 storeMacCharGstoreMacChar241<p storeMacChunkstoreMacChunk242storeMacChunk243storeMacChunk244 :storeMacChunk245PstoreTok storeTok246 storeTok252Z- storeTok247n storeTok248) storeTok249 storeTok250# storeTok251YVvisibleFromMacg g PE |H s ȹ  *7"A ȳ8 l x  @ q# $   (ػB  r3 ɾ k DCEXPboolExpboolExp42boolExp1@boolExp2dboolExp3Im correctExprN_ correctExprN5d correctExprN6x correctExprN7$E correctExprN8 correctExprN9correctExprN10;correctExprN11XcorrectExprN12 correctExprN13correctExprN14,LcorrectExprN15icorrectExprN16qcorrectExprN17correctExprN18ScorrectExprN19correctExprN20correctExprN212correctExprN22I{X commaExprp commaExpr23IasgnExpr asgnExpr24 asgnExpr25 asgnExpr26H asgnExpr27j asgnExpr28'w asgnExpr46 asgnExpr47Py asgnExpr48 asgnExpr49P asgnExpr294 asgnExpr30= asgnExpr31E asgnExpr323A asgnExpr33 asgnExpr34 asgnExpr36 asgnExpr35HQ asgnExpr37<O asgnExpr39\ asgnExpr40| asgnExpr38(- asgnExpr41 asgnExpr42 asgnExpr43/ asgnExpr50 asgnExpr51 H& asgnExpr443 asgnExpr45 1xcondExpr condExpr86 condExpr87/[ condExpr526 condExpr84H condExpr85B condExpr53 condExpr54( condExpr55D condExpr568 condExpr57 condExpr584 condExpr59@ condExpr74M condExpr75"b condExpr76o condExpr77" condExpr60 condExpr61 condExpr62  condExpr63 condExpr64C condExpr65 condExpr66 condExpr67" condExpr68H5 condExpr698 condExpr70E condExpr71"c condExpr72H condExpr73 ~ condExpr78" condExpr79y condExpr80 condExpr81" condExpr82` condExpr83D4 computeCondA computeCond88x computeCond89\ term1term190term191term192[zPterm193jterm194term195[zeTcomputeShortCircuit hterm2nterm299term2100[zterm296term297,term298[zl computeIor computeXor term4term4101 computeAnd term5term5102jterm5103term51048s pterm6term6105term6106term6107$5Bterm6108term6109term6111term6112"term6113term6114"(term6110!" sConvToType$ uConvToType$ computeCmp computeCmp11594 computeCmp116; term7term7117term7118term7119term7120term7121?|~H computeShi^ computeShi122W computeShi123m @term8Xterm8124term8125term8126)term8127term8128term8129+&h computeAdd{ computeAdd130$ computeAdd131 computeAdd1329E~ computeSub computeSub133$ computeSub134' computeSub1359] term9term9136term9137term9139$term9140Vterm9141dterm9142term9138;/p computeMul computeMul143< computeMul1440ip computeMul145 computeMul146` computeDiv computeDiv147UrH computeModv term10 term10148 term10149 term10150 term10151+ term101529 term10153A term10154/7 term10155 term10156r term10157 term10158 term10159. term10160t term10161C term10162(?T term10163} term10166 term10167# term10168 term10169# term10164( term10165G term10170$ term10171@ term10172 term10173 term101743T term10175{ term10176' term10177, term10178 term10179 term10180 term10181k term10182 term10183  term10184; term10185- term10186 term10187 term10188N term10189 term10190 term10191 term10192 term10193# term10194 term10195#< term10196z term10197 term10198 term10199, term102019 term10202#a term10203n term10204# term10200  term10205 term10206 term10207 term10208g:R term10209; term10210$g term10211l term10212l term10222y term10223# term10224 term10225$ term102133 term10214q term10215Y term10216 term10217 &: term10218p term10219 term10220 term10221cZe ,-  term10226 term10227H  term10228 term10229 term10236=: term10230\ term10231\ term10232p term10233H term10234 term10235P term10237 term10238N term10239PUm term10240 term10241)0 term10242M term10243.c term10244 term10245 term10246 term10247M term10248 term10249 d term10250 term10251 ; term10252 term10253 term10254 term10258 term10259$  term10255  term10256$ term102577K term102609W finalizeCastQfinalizeCast261`finalizeCast262! manageNumCstmanageNumCst263Z<manageNumCst264pmanageNumCst265manageNumCst266manageNumCst271gmanageNumCst267?manageNumCst268manageNumCst269manageNumCst270$X% primQualif primQualif2724 primQualif273= primQualif274B primQualif275P primQualif276$V primQualif277 primQualif278  primQualif279<P primQualif280l primQualif281 primQualif282 primQualif287J primQualif283 primQualif284 primQualif285  primQualif286*M,p& primQualif288I  primQualif289[  primQualif290i  primQualif291|  primQualif292  primQualif293(DTu  primQualif294P  primQualif295Y  primQualif296i  primQualif297w  primQualif298  primQualif299  primQualif300  primQualif301 =  primQualif3027  primQualif303  primQualif304  primQualif3053U  primQualif306  primQualif307  primQualif308JS  primQualif309  primQualif310  primQualif311  primQualif312!V  primQualif313[  primQualif314(  primQualif315  primQualif316 y  primQualif317(i primQualif318 primQualif321 primQualif322 primQualif323# primQualif324R primQualif319 primQualif320P primQualif325 primQualif326  primQualif327( primQualif328>lz primQualif347 primQualif348J primQualif349< primQualif329T primQualif330| primQualif331 primQualif332 primQualif333< primQualif334 primQualif335 primQualif336 primQualif337-US primQualif338d%y primQualif342| primQualif343 primQualif344$ primQualif345S primQualif339 primQualif340 primQualif341'C4 primQualif346T 4iL resulIncOph resulIncOp353 resulIncOp354 H resulIncOp350 resulIncOp351 resulIncOp352[ X specialCaseOpspecialCaseOp355specialCaseOp356specialCaseOp357specialCaseOp358P|specialCaseOp359|specialCaseOp3600specialCaseOp361specialCaseOp362specialCaseOp363specialCaseOp364specialCaseOp365specialCaseOp366 AspecialCaseOp367specialCaseOp368specialCaseOp369&Tv\specialCaseOp370specialCaseOp371@specialCaseOp372specialCaseOp373/specialCaseOp374specialCaseOp375(specialCaseOp376E specialCaseOp377DadvInTypeChainIadvInTypeChain379WadvInTypeChain380#yadvInTypeChain378XarrToPtr arrToPtr381 arrToPtr385 arrToPtr386" arrToPtr387 arrToPtr388"2 arrToPtr3822 arrToPtr383@ arrToPtr384 =x authzdTypedcheckIncldFiles checkInfoLosscheckInfoLoss389# checkInfoLoss392H checkInfoLoss393c!checkInfoLoss390!checkInfoLoss391G! checkInit! checkInit394-" checkInit395\" checkInit396h" checkInit397 s" checkInit398|" checkInit399 ,j"checkNumCstNamed"checkNumCstNamed400)a,# checkPureBoolM#checkPureBool401"Dp#checkSideEffect#checkSideEffect402#checkSideEffect403$#checkSideEffect4044g$checkSideEffect405+$checkSideEffect406h$checkSideEffect407P$cleanExprThings $ commonType$ commonType408% commonType409 % commonType410'% commonType411(% commonType412I% commonType413N% commonType414S% commonType415h% commonType416-:% commonType417 x% commonType418% commonType419% commonType420& commonType4214A& commonType422d& commonType423x& commonType424& commonType425& commonType426& commonType427 & commonType428& commonType429c' commonType430dF( commonType431[( commonType432( commonType433c@) commonType434gn) commonType435)* commonType436P;* commonType437@D+ compatNumType/,compatNumType438,compatNumType439,compatNumType440d ;- computeSigAdd1- errCompoOf- errCompoOf441 \.errExpD.errOvfl.errOvfl1. errOvfl14425C.errUdfl/ errUdfl443( / errWrngType/errWrngType444 ,0 freeAlloc&T0frstMemberCompatp0frstMemberCompat4454f0freePrev#0 ignorableDPB $1indir21indir446I1indir447@p2 indirindexN2 indirindex448 ]h2initExpx2 insertBool2 insertBool4492 insertBool4502 insertBool4512 insertBool452&K 3isMember$3 isMember45313 isMember454T3 isMember455T3 isMember456a3 isMember457"*U3 isMember4583 isMember459:3manageInitlzUsed4manageInitlzUsed460#4manageInitlzUsed461/4manageInitlzUsed462 ]4manageInitlzUsed463~4 manageLogOperx5manageLogOper4646manageLogOper465-T86managePointersD6managePointers466T6managePointers467t6managePointers4686managePointers4696managePointers4706managePointers4736managePointers474&7managePointers471 7managePointers472 `7managePointers475}7managePointers4767managePointers477)Fm$8managePointers478Cn8managePointers479v8managePointers4808managePointers4818managePointers4848managePointers485"8managePointers4828managePointers483D9managePointers486 9managePointers487"09manageRetValue59manageRetValue491H9manageRetValue492C9manageRetValue4889manageRetValue489:manageRetValue490{: manageTypCmbn:manageTypCmbn4932X; modifPtdVali;modifPtdVal494u;modifPtdVal495;modifPtdVal496R< procSameType<procSameType4972_<procSameType498<procSameType499P<procSameType5002/=procSameType501l=procSameType502P> relOpTrtmt> relOpTrtmt5031WX>resulExp> resulExp504> resulExp505> resulExp506&> resulExp507J? resulExp508? resulExp509#? resulExp510#K@ resulExp511<@ resulExp512@ resulExp513)0A resulUnOpwA resulUnOp514"A resulUnOp515A resulUnOp516FB sizeOfTypeIBsizeOfTypeI520 BsizeOfTypeI521#oBsizeOfTypeI517BsizeOfTypeI518BsizeOfTypeI519#tB transfOpnd!C transfOpnd522lXCtypeToS2NoQual?C verifCstOvflCverifCstOvfl523=^C warnCstBool?8DwarnNotPureBoolVDwarnNotPureBool524KD warnOrErrl V Q  aE ce  1  ? 5 ^ c=  [0 :E# . YB i  ܎       ڐ q" %  &5 6 S@3* U~3չ  DCEXT԰addLvl0InclFNameaddLvl0InclFName1addLvl0InclFName2D| allocChunk allocChunk3,UԱ bufLongToS bufLongToS4' bufLongToS5?d bufNameToSk bufNameToS6x bufNameToS7"0 charToHexS charToHexS8"V decoratedNamedecoratedName9+decoratedName100decoratedName11DdecoratedName12YdecoratedName13tdecoratedName14decoratedName15"AdecoratedName16decoratedName17ijdecoratedName18ijdecoratedName19гdecoratedName20 #(JdecoratedName21decoratedName22 #decoratedName23#decoratedName24DdecoratedName25ldecoratedName26{ err0 err1 err127 err128#.4 дerrId< errId1errId129,errId130=X^ lerrId2errId231=R errId3ҵerrId332?RerrIlgDP# errIlgDP33# errIlgDP34$$4HerrPanic(perrUslDP errUslDP35 errUslDP36$$4 errWFName errWFName37 errWFName381 errWFName39X errWFName40Bs errWFName41 errWFName42H< errWNerrWN43errWN44 $4errWNSS& errWNSS451D XerrWNT]errWNT46xerrWNT47errWNT484C^derrWNTT˸ errWNTT49۸ errWNTT504DT errWSerrWS51&, <errWSSAerrWSS52*0lerrWSSSS0errWSTT errWSTT53 errWSTT54 errWSTT55A errWSTT56& errWSTT57@= errWSTT586terrWSTTS errWSTTS59 errWSTTS60A errWSTTS61 errWSTTS62A errWSTTS635 8errWTDerrWT64nerrWT65AerrWT66errWT67"&tinitExtһ initExt68-ܻ isBodyHdrFileisBodyHdrFile70isBodyHdrFile71CؼisBodyHdrFile69longToS!nameToS#ܽputList putList72 putList73>n putList74$ putList75 putList76!ܾputSeman  putSeman77  putSeman78Do putSeman79 putSeman80@skipPath skipPath81I strJokerEq strJokerEq82 strJokerEq83 strJokerEq84 strJokerEq85- strJokerEq86 strJokerEq87"4<typeToSl typeToS88 typeToS89 typeToS90 typeToS91Zm typeToS111[ typeToS92 typeToS93 typeToS94<L typeToS95 typeToS96 typeToS97  typeToS98$ typeToS99$ typeToS1028 typeToS100A typeToS101$5I` typeToS103 typeToS104 typeToS105 typeToS106"\P typeToS107^ typeToS108d typeToS109h typeToS110 /BdUputIdent putIdent112G putString( putString113;LtypeToS1 typeToS1114 MtypeToS2 typeToS2115N ԰ Oy v^ǹ  .:  RǾo  fj  FS ^N DCFMT initFlwgSpe  folwngSpe$ folwngSpe11 folwngSpe2D folwngSpe3T folwngSpe4 i folwngSpe58 folwngSpe6 folwngSpe7 folwngSpe8 folwngSpe9'6B folwngSpe10 folwngSpe11 folwngSpe12~DCC.BCK  [DCC_DISTRIB]DCCVAX.EXE;1d2t folwngSpe13 folwngSpe14&62 folwngSpe15: folwngSpe16D folwngSpe17)8q folwngSpe18z folwngSpe19 folwngSpe20(8 folwngSpe21 folwngSpe22 folwngSpe23(8  folwngSpe55 folwngSpe56 folwngSpe57  folwngSpe58(9O folwngSpe59Y folwngSpe60( folwngSpe61 folwngSpe62( folwngSpe24  folwngSpe25 folwngSpe37 folwngSpe38! folwngSpe39(7J folwngSpe26J folwngSpe29W folwngSpe30W folwngSpe31a folwngSpe32(9 folwngSpe33 folwngSpe34( folwngSpe35 folwngSpe36(= folwngSpe27F folwngSpe28Hk folwngSpe63o folwngSpe64y folwngSpe65'6 folwngSpe66 folwngSpe67 folwngSpe68%4 folwngSpe69 folwngSpe70 folwngSpe71%4! folwngSpe72+ folwngSpe73&Q folwngSpe40 folwngSpe41 folwngSpe42  folwngSpe43 folwngSpe44) folwngSpe454C folwngSpe46T folwngSpe47 folwngSpe48 folwngSpe50 folwngSpe51#P folwngSpe49N folwngSpe52@ folwngSpe531} folwngSpe54^G errSpec, errSpec749 errSpec75D errSpec76'T errSpec77-r S ,  x  DCINST8 enterFctBody` enterFctBody7n enterFctBody8# enterFctBody1 enterFctBody2*  enterFctBody9 enterFctBody10)enterFctBody11Ik enterFctBody3o enterFctBody4 enterFctBody5 enterFctBody6a blockDecld blockDecl16* blockDecl12 blockDecl13 blockDecl14 DOm blockDecl17& blockDecl15S stmt stmt86. 8stmt18 <stmt19 \stmt20 stmt21 stmt22 stmt82. fstmt23 stmt24 stmt25 stmt26 stmt27 Hstmt28 tstmt29! stmt30 stmt31 stmt32 stmt33 stmt34 stmt35 stmt36&DNV\ `stmt37 stmt42~ dstmt38@ stmt39 stmt40 stmt41& stmt83 stmt84 %stmt85K stmt43$ stmt44 @stmt45* stmt46 stmt47 stmt671 stmt48 stmt49 stmt50 stmt51 'stmt52 +stmt53 8stmt54 Tstmt55 3M xstmt56 stmt57 stmt58 stmt59 stmt60 stmt61 > 9stmt62 9stmt63 Bstmt64 (5 stmt651 stmt66  Sstmt68 dstmt69 }stmt70 stmt71 stmt72 )B stmt73 stmt74, stmt75 :stmt76 stmt77 stmt78{ stmt79 stmt80"& stmt81  checkIndentV checkIndent87k checkIndent88p checkIndent89cq checkIndent90 checkIndent915=(checkNotInitVar?checkNotInitVar92DcheckNotInitVar93VcheckNotInitVar9418P!xcheckNotInitVarAndSuppress#checkNotInitVarAndSuppress95#checkNotInitVarAndSuppress96#checkNotInitVarAndSuppress970;ZerrInit3 errInit98|PerrInit1linitInstu initInst99| manageLoop manageLoop100 manageLoop101 manageLoop102  manageLoop103l/ manageLoop107r manageLoop104 manageLoop105 manageLoop1060D manageLoop108i manageLoop109t manageLoop110 @ processLabel{processLabel111processLabel1120processLabel113processLabel114processLabel115/subStmtO subStmt116m subStmt120* subStmt117 subStmt121* subStmt118 e subStmt119t 8F  ' Л      .  Ҿ  C > q u  DCMAIN 8main zmain87 main1 main2 main3 main5 main6 @main7EN omain4 main8 main9 main10CL main11 main12 Hmain13AH main80 main81 main82EN main14 main15 main16 main178J| pmain83 main84 main85 ; main86 main18 !main19 !main79 pmain20 pmain785 main21 main22 main23 main24 main25 main26 -main27 @main28 Vmain29 lmain30 main31 main32 main33 main34 3 main35 main36 /main37 5main38  ^main39 tmain40 main41 main42 main43 main44 main45 main46 main47 $main48 Kmain49 amain50 rmain51 xmain52  main53 main54 main55 main56 main57 main58 main59 main60 main61 Umain62 tmain63 main64G main65 main66 main67 main68%KK @main76 Fmain775L main69 main70 main71 main72 main73 main74 main750]h  \  processCUnitprocessCUnit88processCUnit89 processCUnit90%EprocessCUnit123MprocessCUnit124vprocessCUnit125=EprocessCUnit126processCUnit127processCUnit128BJprocessCUnit91processCUnit129%processCUnit92processCUnit1060processCUnit93$processCUnit94.processCUnit95.processCUnit964processCUnit970DK|processCUnit98processCUnit99processCUnit100processCUnit101-processCUnit102;BprocessCUnit103processCUnit104processCUnit105;B:gmcprocessCUnit107processCUnit116processCUnit117)processCUnit118bJprocessCUnit108dprocessCUnit109processCUnit110 processCUnit1114DprocessCUnit112MprocessCUnit113TprocessCUnit114aprocessCUnit115&processCUnit119processCUnit120processCUnit121processCUnit122 8changeStreamToJchangeStreamTo130~changeStreamTo131changeStreamTo132changeStreamTo133changeStreamTo134@EJ checks checks135yP copyDirPrefixfcopyDirPrefix136copyDirPrefix137copyDirPrefix138copyDirPrefix139AHdispUsgK dispUsg140t demitC~emitC141emitC142!emitC143emitC144emitC145emitC146emitC147emitC148emitC149emitC1509>PemitC151emitC152$emitC153MemitC1549>UfemitC155}emitC156emitC157emitC1589>UemitC159emitC160emitC161 emitC1629>Rs emitC1630 emitC1645 emitC165^ emitC1669>R emitC167 emitC168 emitC169 emitC170AF\ ( emitS3 emitS1718 emitS172&P endPrgFp  endPrgF173{  endPrgF174  endPrgF175  endPrgF176  endPrgF177%  endPrgF178  endPrgF179 Ie err # err180 T err181 \ err182 3 err183' 0 err184 0 err189 9 err190 @ err191 M err192 V err193 \ err194 i err195 p err196 x err197 err185 err186 err187 err188# err272 err273 err274  err198  err199 ] err200 l err201 { err202 err203 err204 err205m err206 err207 err208 err209 err210 err211; Merr212 Merr213 \err214-CF err215 err216-E err217 err218 err219! err220 err221 err222-FI ?err225 Lerr226)< err223 err227 err228 err229 err224 err230# err231 err232 err233 err234 err235= Lerr266 Uerr267 \err268 verr236 verr247 err248 err249 err250 err251 err252 err237 err238 err239 err240 err241 err242 err243 err244 err245 err246V !err269 (err270 0err271 serr253 serr260 |err261 err262 err254 err255 err256 err257 err258 err259)B\ err263 err264)@ Lerr265 hderrExitx errExit275)fileErr fileErr276 fileErr277AGfmtdMsg! foundOptiondfoundOption278jfoundOption279foundOption280/5foundOption281foundOption282foundOption283JY  getNxtArgP getNxtArg284Y getNxtArg285 ht getNxtFNamegetNxtFName286getNxtFName288getNxtFName289getNxtFName290AHgetNxtFName287  initAdjFiles,initAdjFiles307|initAdjFiles291initAdjFiles292initAdjFiles293initAdjFiles294initAdjFiles295initAdjFiles2969@ZinitAdjFiles297initAdjFiles298 initAdjFiles2996initAdjFiles3009@ZFinitAdjFiles301initAdjFiles302initAdjFiles303initAdjFiles304initAdjFiles305N\l{initAdjFiles306l insideIncludeintrnErr intrnErr308 intrnErr309  intrnErr310 intrnErr311 intrnErr312 intrnErr313 intrnErr314 intrnErr315 intrnErr316 intrnErr317 intrnErr318 intrnErr319' intrnErr320, intrnErr3214 intrnErr322yLmanageEndIncludemanageEndInclude323manageEndInclude324manageEndInclude325&manageEndInclude326manageEndInclude327manageEndInclude328manageEndInclude329Rb4manageEndInclude330XmanageEndInclude331mmanageEndInclude3325\manageEndInclude333,manageEndInclude334<manageEndInclude335PmanageEndInclude337manageEndInclude338^manageEndInclude336 manageEndInclude3390 manageInclude<manageInclude340EmanageInclude341%amanageInclude342amanageInclude343jmanageInclude344 ' manageInclude345htmanageInclude346tmanageInclude355manageInclude356^manageInclude347manageInclude348manageInclude349manageInclude3521manageInclude353Y_manageInclude350manageInclude3515manageInclude354dGmanageInclude357GmanageInclude358ImanageInclude359TmanageInclude360RbmanageInclude361manageInclude362manageInclude363manageInclude364#-T!manageInclude365|manageInclude366 manageInclude367manageInclude369manageInclude370manageInclude371AH manageInclude368'W} manageInclude372 manageInclude373 manageInclude374 manageInclude3752 manageInclude376 manageInclude377#d  mngOptListTok!mngOptListTok378!mngOptListTok379/!mngOptListTok3806!mngOptListTok381c!mngOptListTok382AHo!mngOptMsgLimit*!mngOptStopAfterMsg#! mngOptVerbose4" nxtChFromTxt("nxtChFromTxt383Fj" nxtChunkOfTxt"nxtChunkOfTxt384 "nxtChunkOfTxt385"nxtChunkOfTxt386"nxtChunkOfTxt387 #nxtChunkOfTxt3880#nxtChunkOfTxt389#nxtChunkOfTxt390#nxtChunkOfTxt391Y#nxtChunkOfTxt392 y#openSourceFile1D$openSourceFile1393K$openSourceFile1394x$openSourceFile1395AH$ prmtrzMsg$ prmtrzMsg396% prmtrzMsg397(% prmtrzMsg398l% prmtrzMsg399%sameLowerCaseNamex&sameLowerCaseName400p4' saveTokCharF'saveTokChar401 ,`' searchNxtNL'searchNxtNL402'searchNxtNL403'searchNxtNL404'searchNxtNL405'searchNxtNL406'searchNxtNL407'searchNxtNL408(_}E(searchNxtNL409 `(splice( splice410( splice411"( splice412( splice413( splice414 e,) storeDMacTxt$ P)sysErrU) sysErr415) sysErr416BH)waitAndAnalAnswer)waitAndAnalAnswer417"g 8͹ < ^ q3ۡ I f    xd?آ eH! [  _o> ׹  ^%h e ()  )  DCPRAG,dpragMet, dpragMet1, dpragMet2, dpragMet3 - dpragMet4 - dpragMet75E- dpragMet5O- dpragMet6N[- manageDPrag- manageDPrag8 . manageDPrag9H. manageDPrag10. manageDPrag11. manageDPrag12d0 manageDPrag13v0 manageDPrag140 manageDPrag15 0 manageDPrag160 manageDPrag171 manageDPrag18 1 manageDPrag19,8Jnp1 manageDPrag201 manageDPrag211 manageDPrag221 manageDPrag231 manageDPrag24`r`2 manageDPrag2522 manageDPrag263 manageDPrag27D3 manageDPrag28]L 3addTCB3addTCB2994addTCB30(4addTCB31J]{4addTCB32{4addTCB334addTCB34 ,e14 checkEndDP4 checkEndDP35) 5dpNamep5dpName365freeTCB5 freeTCB375 freeTCB385 freeTCB39%Ha5 getTypeIdent6getTypeIdent40"6getTypeIdent41(V6getTypeIdent4296initPrag6 initPrag436isFNameVisible6isFNameVisible44<7manageTC>7 manageTC45O7 manageTC46/@7 manageTC477 manageTC48H8 manageTC49+8 procPrivTo8 procPrivTo508 procPrivTo519 procPrivTo52%9 procPrivTo53+9 skipToEndDP9 skipToEndDP54,9searchTC9 searchTC55: searchTC56 : searchTC57">_: searchTC58h: searchTC59p: searchTC60: searchTC61: searchTC62: searchTC63)i: searchTC64Db;verifyTC#; verifyTC67$J; verifyTC68!n; verifyTC69!; verifyTC65 ; verifyTC66, S,# `-ӹ   23 4y42 q5" 5ع DCREC? getTokFromTxt?getTokFromTxt1?getTokFromTxt2?getTokFromTxt3N@getTokFromTxt4@getTokFromTxt5 8@getTokFromTxt6@getTokFromTxt7@getTokFromTxt8@getTokFromTxt9@getTokFromTxt10 @getTokFromTxt110AgetTokFromTxt12YAgetTokFromTxt13AgetTokFromTxt14AgetTokFromTxt15AgetTokFromTxt16AgetTokFromTxt17"(BgetTokFromTxt18#QBgetTokFromTxt19 yBgetTokFromTxt20BgetTokFromTxt21 BgetTokFromTxt229 BgetTokFromTxt23I@CampersFHC ampersF24cC ampersF25C ampersF26C ampersF27  CdollFDdollF28Ci `DdotF hDdotF29c DdotF30 DdotF31c XEdotF32 |EdotF33 EdotF343XEdQuoteF EeMarkFEeMarkF35cDFeMarkF36TFeMarkF37  hFeqF pFeqF38c FeqF39 FeqF40 GgreaTFGgreaTF41cGgreaTF42GgreaTF43GgreaTF44cHgreaTF45(HgreaTF46 or .EFiles 'dcmsg.###' contain the text of all messages (including errors/Jwarnings); since these messages are C string literals, they can be changedNat will. ### indicates the language used for messages; at present, there existN"eng"lish and "fre"nch versions. The file corresponding to the chosen language=should be copied to file 'dcmsg.txt' (default option: "eng").LThe 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.PThe character sequence '@0' toggles a flip-flop telling whether or not to outputNby default the '@0' parenthesized message chunk (output if in interactive mode7with 'e'/'E' command, or with options '+zve', '+zvve').NOn an UNIX system, once these files set, compilation is done by typing 'make'.OThen test dcc on itself (type 'tstdcc'): this should generate no error nor war-Nning. The 'make install' command installs dcc into the system (first edit fileO'installfile' to define where you want it to be; unmodified, this file installsLdcc in /usr/local/bin/, adjustment files (see next paragraph) in /usr/local/Oinclude/DccAdj/, and the remaining 'execution' files in /usr/local/lib/DccExec-KFiles/ (see the DccDir symbol in file 'dccFiles.mng', or the first value in!DCCFILES environment variable)). NOn a VMS system, use 'installdccvms.com' file. The following DCL logical nameshas to be defined beforehand:B- dccdir directory where dcc execution files (see next paragraph) are installed,I- dccsysincldir directory where system header files ('stdio.h' etc.) can be found.5Also, 'dcc' has to be defined as a "foreign" command.OOn Windows95/WindowsNT, with Microsoft VisualC++4.0, use 'makefile.win32' file.MDo not forget to set the INCLUDE, LIB, and PATH environment variables, e.g. :1set INCLUDE=C:\Program Files\DevStudio\VC\include)set LIB=C:\Program Files\DevStudio\VC\libOset PATH=C:\Program Files\DevStudio\VC\bin;C:\Program Files\DevStudio\SharedIDE \bin(On other systems, you are on your own...NNote 1: each dcc source file begins with an /* */ comment, and endsN with an /* End */ comment, to make it easy to check that it( has not been truncated by error.KNote 2: possible local compiler warnings while compiling dcc can be ignored- (provided the compiler is mature...).'Execution' files-----------------5Several files are needed by dcc to execute correctly:!- a starter file ('starter.dcc'),+- a number of adjustment files ('xxx.adj'),1- an adjustment files list file ('adjFiles.dcc'). Starter fileGIts purpose is to define those symbols that are predefined by the localLcompiler. It also gives the name of the compiler (via a string literal, thatImust be the value of the '__dcc' symbol), and can override local 'exotic'Bfeatures (such as the "globalvalue" specifier of VMS C compilers).OStarter files for VMS C compilers (both VAXs and ALPHAs), the ULTRIX gcc compi-Kler, the OSF1 gcc compiler, the HP cc compiler, the LINUX gcc compiler, theNSUNOS gcc compiler, the AIX xlc compiler and the Windows VisualC++ cl compilerJare included. For SUNOS, the system header files directory must be the gccheader files directory.?A copy (named 'starter.dcc') of the chosen file has to be made.KNote: the compiler called can be changed from the default by redefining the7'__dcc' symbol in dcc command line (-D or /DEF option).Adjustment filesMTheir purpose is to amend system header files, so that their declarations areMacceptable to dcc. Conceptually, an adjustment file is appended to the end ofthe corresponding header file.MAn adjustment file should not declare/define anything not declared/defined byLthe corresponding header file (except if something is missing in it, such asMthe prototype for the "sbrk" function in stdlib.h), but they can redeclare atMwill function prototypes, external objects, typedefs (even already used ones) and macros.NAny preprocessor feature can be used in them. The 'cdefined' function (similarNto the 'defined' preprocessor function, but answering True if its parameter isNan identifier defined in the compiled program, not in the preprocessor) can bePused to adjust, in a portable manner, common (but non-ANSI imposed, that is, notGcompulsory) functions/objects that are locally defined (see for example%'isascii' management in 'ctype.adj').MShould any header file reveal to be unamendable, it can be purely replaced byPthe corresponding adjustment file. The corresponding line in file 'adjFiles.dcc'0must then begin with an exclamation point ('!').HBy convention, for a system header file named 'xxx.h', the corresponding#adjustment file is named 'xxx.adj'.OAdjustment files for assert.h, ctype.h, curses.h (courtesy of W. Briscoe, free-Nlance, UK), limits.h, math.h, setjmp.h, stdarg.h, stddef.h, stdio.h, stdlib.h,Mstring.h, time.h and unistd.h are included; adjustment files for the X-Window2library are available, but only partially checked.Adjustment files list fileLIt gives the path to the adjustment file corresponding to each system headerfile needing adaptation. Test files ----------MThese command files just check dcc on its own source files; this check should#not generate any error nor warning.JThere are many more non-regression check files, but they are not included.Article-------NUnfortunatly, the wrong version of the paper was published in SIGPLAN Notices;Nso the right version (in fact updated and somewhat more detailed) is included,Gin Postscript form, along with a pure ASCII form (for 'diff' purposes).!Implemented d-pragmas (as of now)!---------------------------------KFor the following, a "file identifier" is defined to be composed of a "fileLaccess path" (machine name, directories...), followed first by a "file name"Land then by a "file suffix" that begins on the first dot '.' seen when scan-,ning the file identifier from right to left.MA "header" file is a source file whose file suffix contains the letter 'h' atIleast once, and which is included via the '#include' directive; a "systemOheader" file is a header file whose '#include' directive uses the '<...>' form.IA "body" file is a source file which is neither a header file, nor a fileincluded by a header file.3/*~BackBranch*/ avoids warning on backward branchs:% goto alrdDefLabel /*~BackBranch*/;N/*~CastTo */ allows pseudo-cast between parallel types; also to be usedA 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;5 if (/*~CastTo unsigned int */ (ui2 - ui1) > 1) ...N/*~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 /*~ComposingHdr*/P/*~DccCompliant*/ in a system header file, indicates that the (remaining portionB of the) file conforms to dcc requirements, and that 'typedefs'A will create parallel types if applicable; usable anywhere (in a system header file),E/*~DollarSign*/ at beginning of module; autorizes '$' in identifiers,G/*~DynInit*/ avoids warning on dynamic initialization (by constants) of composite objects:. [auto] struct _s toto = {...} /*~DynInit*/;K/*~ExactCmp*/ avoids warning on floating point comparison for (in)equality:% if (fltVar == 0 /*~ExactCmp*/) ...M/*~FullEnum*/ asks dcc to warn if not all constants of the (enum) switch typeB has been used as case values; only useful if a 'default' case is> used (for example to catch possible 'strange' values of enum expression): default: /*~FullEnum*/ ...I/*~Generic*/ tells dcc that the returned type of a function is compatible= with any descendant of this type (subtyping) or, in case of0 'void *' returning function, with any pointer:' int atoi(const char *) /*~Generic*/;# double sin(double) /*~Generic*/;% void *malloc(size_t) /*~Generic*/;J/*~IndexType */ specifies type of index values usable for an array,< either statically or dynamically allocated (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:- arr[ArrSiz /*~IndexType TcolorIndex */];5 bool * /*~IndexType Trow*/ * /*~IndexType Tcol*/ twoDimSwitchArray; or pointer creation: & /*~IndexType Tcol*/ colN/*~Init */ tells the initialization-checking algorithm that, from now on,? can be considered as initialized. Very specific (see X-@ Window applications, or adjustment files). Usable anywhere (in the scope of the variable):3 XtSetArg(arg[0], XmNchildren, /*~Init children*/ &children);L/*~LiteralCst*/ tells that expressions of a so qualified type accept unnamed$ constants without warnings:# typedef int Int /*~LiteralCst*/;K/*~LocalAdr*/ marks a local address so that no warning on returning it from; a function, or assigning it to a global/external pointer:- gblPtr = &localObject + 1 /*~ LocalAdr */;G/*~Masking*/ avoids warning if a macro name is the same than an already existing identifier:+ #define /*~Masking*/ macroName macroBodyK/*~MayModify */ indicates that modifications may occur through a supposedlyA const-pointing pointer (via casting), or through a struct/union containing non-const pointers:- void fct1601(struct _tag x /*~MayModify*/)G/*~NeverReturns*/ specifies that a void function never returns control:. static void errExit(...) /*~NeverReturns*/;M/*~NoBreak*/ avoids warning if falling through the end of a 'case' statement:! case C1 : i = 1; /*~NoBreak*/ case C2 : i++; break;O/*~NoDefault*/ avoids warning if no 'default' case at end of 'switch' statementA (not to be used if type of switch driving expression is an enum= type of which all constants have been used as case values): case Cn : i = ... ; /*~NoDefault*/K/*~NonConstExp*/ makes dcc believe that a (parenthesized) expression is not constant:$ if ((~0==-1)/*~NonConstExp*/) ...A (notice that the Pascalian form "while (TRUE)" can be advanta-r3 geously replaced by the C idiom "for (;;)"...),AE/*~NotUsed*/ indicates that an object or an enum constant or a formale, parameter (function or macro) is not used:( enum {Ce1, Ce2 /*~NotUsed*/, Ce3 ...}: static void shift (Tstring x, TtypeElt y /*~NotUsed*/);! #define Sink(x /*~ NotUsed */)i9 static const char *bof = "Version 3.3.1" /*~NotUsed*/;fL/*~NoWarn*/ to be used in front of sections of code not (yet) dcc-compliant A (see also /*~Warn*/, /*~PopWarn*/ d-pragmas; warnings are auto-RB matically disabled inside system header files); usable anywhere,7/*~OddCast*/ to make dcc swallow a cast it frowns upon:y+ ptrInt = (int * /*~OddCast*/) ptrStruct;aK/*~PopWarn*/ goes back to previous Warn/NoWarn state (see /*~Warn*/, /*~No-n> Warn*/ d-pragmas); at least 16 levels kept; usable anywhere,M/*~PortableQM*/ to make dcc swallow a cast it has good reasons to believe not portable:s. ptrFloat = (float * /*~PortableQM*/)ptrDbl;L/*~PrivateTo "" [, ""]* */ indicates that struct/union: members, or enum constants, declared thereafter are only? visible from the indicated file(s), or from macros defined inD? the indicated files or called by such macros; usable anywhereY9 (in a header file). Scope: until next /*~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 character(s):P% /*~PrivateTo "dc*.c", "dcrec.h" */NH/*~PseudoVoid*/ authorizes a non void-returning function to be used as a statement:8 char *strcpy(char *x, const char *y) /*~PseudoVoid*/;K/*~Public*/ indicates end of last /*~PrivateTo*/ scope; usable anywhere (inS a header file),SL/*~ResultPtr*/ for (pointer) parameters that are returned as result; implies@ /*~ResultType*/, plus allows "should be 'const'" pointer chec- king propagation:g3 char *strchr(const char * /*~ResultPtr*/, char); O/*~ResultType*/ indicates that the type of the result of a function call is thev? type (or the highest type) of the current actual parameter(s)u8 corresponding to the so qualified formal parameter(s):9 void *realloc(void *old /*~ResultType*/, size_t size);t, Window mergeWindow(Window/*~ResultType*/, Window/*~ResultType*/);pL/*~RootType*/ renders invisible from its hierarchy the subtree headed by the so qualified (parallel) type:i, typedef unsigned int Talgn /*~RootType*/;M/*~SameValue*/ must qualify enum constants having the same value that a prev- # ious constant (of the same enum):gA enum _colors {BegColors, InfraRed=BegColors /*~SameValue*/r: /* ~SameValue optional here, because 'BegColor' is last defined constant */,m Red, Orange, Yellow, ...,+ BegVisibleColors=Red /*~SameValue*/}tG/*~SideEffectOK*/ tells that a side effect via a macro parameter is OK:a; #define DangerousMin(x, y/*~SideEffectOK*/) (x as parameter, whether the type of the sizeof argument is the( type pointed by the receiving pointer:* void *malloc(size_t /*~SizeOfMemBlk*/);G/*~SizeOK*/ avoids warning when no width limit is specified ('sscanf'):c5 (void)sscanf(charPtr1, "%s", charPtr2/*~SizeOK*/);rO/*~TypeCombination */ indicates allowed combinations between indepen- A dant parallel types. The possible operators are: +, -, *, /, %,tA ~+ (non-commutative add) and ~* (non-commutative multiply). Be-i5 sides, some combinations are automatically deduced:r, - for '+', from Ta + Tb -> Tc are deduced: Tb + Ta -> Tc (1) Ta - Tb -> Tc (2)A Line 1 is not deduced in case '~+'; line 2 is 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, 7 are not deduced if either Ta or Tb is floating./ Lines 3, 6, 7 are not deduced in case '~*'.e> If necessary, type hierarchy is searched to find an applying type combination. ? Usable only outside of any block. Once given, a type combina-e tion cannot be desactivated.& typedef float Volt, Amp, Watt, Ohm;) typedef int Tgen /* 'generic' type */;e typedef Tgen Tspe;a% /*~TypeCombination Volt*Amp->Watt,' Amp*Ohm->Volt, Tspe~+Tgen->Tspe */d typedef int Tfruit; typedef Tfruit Tapple, Tpear;1 /*~TypeCombination Tapple + Tpear -> Tfruit */u {2 Volt v;Amp i;Watt p;Ohm r; Tspe spe;Tgen gen; typedef Tapple MacIntosh;3 MacIntosh macIntosh; Tfruit fruit; Tpear pear;z p = r * i * i; /* OK */o p = v * (v / r); /* OK */'4 spe -= gen; /* OK; illegal by default, because4 contrary to dcc default hierarchy rules. */+ fruit = pear + macIntosh;} /* idem */eP/*~Undef */ terminates (for dcc) the scope of all indicated iden-O/*~UndefTag */ tifiers ('general' or 'tag' name space); usable any-t where (at block level 0):o /*~Undef obj3, type22 */J/*~Utility*/ to be used for functions returning a representation type that has no reason to be named:- int scanf(const char *, ...) /*~Utility*/;mP/*~VoidToOther*/ autorizes automatic conversion from (non-generic) 'void *' typeB to any other pointer type, or to read, via scanf, into a 'void  *' variable:n' objPtr = /*~VoidToOther*/ ptrOnVoid;c+ scanf("%i", /*~VoidToOther*/ ptrOnVoid);iJ/*~Warn*/ to be used in front of dcc-compliant code (default state at beg-B inning of program, except if '-znw' option used); usable anywhe-3 re; see also /*~PopWarn*/, /*~NoWarn*/ d-pragmas,aL/*~zif */ causes emission on stderr (at dcc checking< time) of if is true; can make use ofA special 'zif' functions (see "Software engineering tool" in the ; paper on dcc), and be used anywhere (also inside macros):(3 /*~ zif (sizeof(typArray)/sizeof(typArray[0]) !=,: __extent(TtypName)+1) "Array 'typArray': bad " "length" */NNotes: - For dcc, a d-pragma is made up of tokens, perfectly macro-substituta-F ble; for instance, the /*~LocalAdr*/ d-pragma consists of the three following tokens: /*~ (pseudo-token)  LocalAdr (identifier)e */ (normal token) A - An empty d-pragma name is legal; the d-pragma is then ignored. 0 - D-pragmas are visible with the '+zlt' option.Indentation rules -----------------cOIndentation is checked only on lines beginning by a declaration or a statement. O- general case: indentation level is increased on entering a block (just aftereA its opening brace), for the duration of the block, or on ente-t= ring a substatement (statement controlled by 'if', 'else',e? 'do', 'while', 'for'), for the duration of the substatement.lO- special cases: . no change of indentation level for construct "else if", botho& tokens being on same line;? . indentation level increased only once if substatement is a & block (outside of macro body);; . 'case/default's can be lined up with the correspondingd 'switch'. dcc options. -----------cNTheir list can be obtained by executing a dcc command alone (no argument); theNversion/release number is also given. If the prefix '+' is replaced by '-', or*vice versa, the option effect is reversed.Ldcc also interprets -I/-D/-U cc options (or their VMS counterparts), besidespassing them to the compiler.\MFor VMS, only one macro can be defined by a given /DEF, and /DEF,/INCL,/UNDEF )options have to be separated by space(s).wOThe environment variable DCCDFLTS can contain any part of the command line; itsnOcontent is logically added (just after 'dcc') to the beginning of all followingtdcc command lines.KA given option is valid for all following files met in command line, unlessgEreverted; options given after last file name apply only to last file. Exit statuse ------------Odcc provides six different exit statuses, whose values depend on local platformiO(see file 'configdc.th'): EXIT_SUCCESS, two EXIT_WARNINGS, two EXIT_ERRORS, andn8EXIT_FAILURE (returned when dcc has to stop before end).&Badly implemented features (as of now)&--------------------------------------N- floating constants are recognized lexically, but ill converted if fractionalM part or non-null exponent (only noticeable in array declaration, e.g. "char ( arr[(int)(2.5+6.5)]" => [4], not [9]),6- 'sizeof' does not take into account alignment holes,H- commas in macro body not correctly interpreted if dynamically created,'- portability not checked in all cases.O"Unimplemented features (as of now)"----------------------------------M- check for lack of 'volatile' qualifier in the reach of a setjmp()/longjmp()r pair,2- check for non-ambiguity of external identifiers,,- size of objects not given ('+zsy' option),5- computation of floating-point constant expressions, ,- propagation of /*~MayModify*/ information. Known bug(s) ------------NMacro are sometimes badly expanded in convoluted cases involving concatenation(##) and quotation (#).,)Main changes with respect to version 2.0:)-----------------------------------------m<- several compilation units checkable with same dcc command,>- introduction of DCCDFLTS and DCCFILES environment variables,- new exit statuses.'16 bits int' platformsf----------------------- Portage in progress./* End DCREADME.TXT */*[DCC_DISTRIB]EXEC.DIR;1+,m./( 4- 0123 KPWO56)S7)S89G(HJI ADJFILES.DCC l ASSERT.ADJb CTYPE.ADJ X CURSES.ADJj LIMITS.ADJMATH.ADJ SETJMP.ADJmq STARTER.DCCVMSALPHA *7VSTARTER.DCCVMSVAXy  STDARG.ADJ STDDEF.ADJ STDIO.ADJ,R STDLIB.ADJ#+ STRING.ADJ#<1TIME.ADJR3D UNISTD.ADJ3>!*[DCC_DISTRIB.EXEC]ADJFILES.DCC;11+,l./( 4P-m0123KPWO56m7@S89G(HJ/* ADJFILES.DCC */P/* File telling, for each system header file needing adaptation, the name of theB corresponding "adjustment" file (or rather, the path to it). */ #ifdef VMS#define DccAdjDir "dccdir:"#elif defined(_WIN32)<#define DccAdjDir "c:\\developm\\visualc\\include\\dccadj\\"#else.#define DccAdjDir "/usr/local/include/DccAdj/"#endif#"assert.h", DccAdjDir "assert.adj";""ctype.h", DccAdjDir "ctype.adj";#"curses.h", DccAdjDir "curses.adj";#"limits.h", DccAdjDir "limits.adj";!"math.h", DccAdjDir "math.adj";#"setjmp.h", DccAdjDir "setjmp.adj";#"stdarg.h", DccAdjDir "stdarg.adj";#"stddef.h", DccAdjDir "stddef.adj";""stdio.h", DccAdjDir "stdio.adj";#"stdlib.h", DccAdjDir "stdlib.adj";#"string.h", DccAdjDir "string.adj";!"time.h", DccAdjDir "time.adj";#"unistd.h", DccAdjDir "unistd.adj";#undef DccAdjDir/* End ADJFILES.DCC */*[DCC_DISTRIB.EXEC]ASSERT.ADJ;3+,b./( 4J-m0123KPWO56+D7hS89G(HJ/* ASSERT.ADJ */#ifndef __ASSERT_ADJ#define __ASSERT_ADJJextern void __assert (const char *__expr, const char *__file, int __line);#endif /* __ASSERT_ADJ *//* End ASSERT.ADJ */*[DCC_DISTRIB.EXEC]CTYPE.ADJ;32+,X./( 4*-m0123KPWO56Y77 S89G(HJ/* CTYPE.ADJ */#ifndef __CTYPE_ADJ#define __CTYPE_ADJ#undef isalnumextern bool isalnum(char);#undef isalphaextern bool isalpha(char);#undef iscntrlextern bool iscntrl(char);#undef isdigitextern bool isdigit(char);#undef isgraphextern bool isgraph(char);#undef islowerextern bool islower(char);#undef isprintextern bool isprint(char);#undef ispunctextern bool ispunct(char);#undef isspaceextern bool isspace(char);#undef isupperextern bool isupper(char);#undef isxdigitextern bool isxdigit(char);)#if cdefined(isascii) || defined(isascii)# undef isasciiextern bool isascii(char);#endif)#if cdefined(tolower) || defined(tolower)# undef tolower*extern char tolower(char /*~ResultType*/);#endif)#if cdefined(toupper) || defined(toupper)# undef toupper*extern char toupper(char /*~ResultType*/);#endif#endif /* __CTYPE_ADJ *//* End CTYPE.ADJ */*[DCC_DISTRIB.EXEC]CURSES.ADJ;3+,j./( 4{@-m0123KPWO56IYᾜ7`S89G(HJ/*R** "curses.h" adjustment file, 19970604 Walter Briscoe walter@wbriscoe.demon.co.ukB** Amended, 19980204/19980828 Yves Noyelle Yves.Noyelle@supelec.fr**** Undertested version**J** About half of the functions declared were derived from a combination ofN** their use in a program and their documentation in a man page. The rest wereJ** deduced purely from their description in man pages and are likely to beE** incorrect. The man pages tended not to distinguish char and char *K** The absence of ~PseudoVoid is usually an omission due to lack of time to** complete the work.*/#ifndef __CURSES_ADJ#define __CURSES_ADJ #ifdef _lint>#include "/usr/include/curses.h" /* For use with FlexeLint */#endif #ifdef __dcc/* dcc rejects usual 1 and 0 */# undef FALSE # undef TRUE# define FALSE (0!=0)# define TRUE (0==0) # undef bool# if ! cdefined (bool)typedef unsigned int bool;# endif#endif&#define __ZCRSBASE(n,t,a) extern t n a*#define __ZCRSNO(n,t,a) __ZCRSBASE(n,t,a);8#define __ZCRSNOU(n,t,a) __ZCRSBASE(n,t,a) /*~Utility*/;:#define __ZCRSPV(n,t,a) __ZCRSBASE(n,t,a) /*~PseudoVoid*/;H#define __ZCRSPVU(n,t,a) __ZCRSBASE(n,t,a) /*~PseudoVoid*/ /*~Utility*/; #if FALSEb__ZCRSNOU(_showstring, int, (int Line, int Column, int First, int Last, const char *String))#endif #undef addchI__ZCRSPVU(addch, int, (char Char) /*lint -esym(534,addch) */) #undef addstrO__ZCRSPVU(addstr, int, (const char *String) /*lint -esym(534,addstr)*/) #if FALSE<#undef attrset /* attrset man page shows char *Attributes */Z__ZCRSPVU(attrset, int, (unsigned long Attributes) /*lint -esym(534,attrset) */))__ZCRSNOU(baudrate, int, (void))#endifj__ZCRSPVU(box, int, (WINDOW *window, char VertChar, char HorChar) /* lint -esym(534,box) */) #if FALSEE__ZCRSPVU(cbreak, int, (void) /*lint -esym(534,cbreak) */)#endif #undef clearD__ZCRSPVU(clear, int, (void) /*lint -esym(534,clear) */)~DCC.BCKjm[DCC_DISTRIB.EXEC]CURSES.ADJ;3{{*#undef clearok[__ZCRSPVU(clearok, int, (WINDOW *window, bool Flag) /*lint -esym(534,clearok) */)#undef clrtobotG__ZCRSPVU(clrtobot, int, (void) /*lint -esym(534,clrtobot) */)#undef clrtoeolG__ZCRSPVU(clrtoeol, int, (void) /*lint -esym(534,clrtoeol) */) #undef crmodeE__ZCRSPVU(crmode, int, (void) /*lint -esym(534,crmode) */) #if FALSE)__ZCRSNOU(def_prog_mode,int, (void)))__ZCRSNOU(def_shell_mode,int, (void))5__ZCRSNOU(delay_output, int, (int Milliseconds))#endif #undef delchD__ZCRSPVU(delch, int, (void) /*lint -esym(534,delch) */)#undef deletelnG__ZCRSPVU(deleteln, int, (void) /*lint -esym(534,deleteln) */)O__ZCRSPVU(delwin, int, (WINDOW *Window) /*lint -esym(534,delwin) */) #if FALSEG__ZCRSPVU(doupdate, int, (void) /*lint -esym(534,doupdate) */)#endif #undef echoC__ZCRSPVU(echo, int, (void) /*lint -esym(534,echo) */)E__ZCRSPVU(endwin, int, (void) /*lint -esym(534,endwin) */) #undef eraseD__ZCRSPVU(erase, int, (void) /*lint -esym(534,erase) */) #if FALSE)__ZCRSNO(erasechar, char, (void)))__ZCRSNOU(fixterm, int, (void)))__ZCRSNOU(flushinp, int, (void))#undef flushok>__ZCRSNOU(flushok, int, (WINDOW *Window, bool Flag))/__ZCRSNO(getcap, char *, (char *Name))#endif #undef getch)__ZCRSNO(getch, wchar_t, (void)) #undef getstrM__ZCRSPVU(getstr, int, (char *String) /*lint -esym(534,getstr) */) #if FALSE)__ZCRSNOU(gettmode, int, (void))#endif #if FALSE)__ZCRSNOU(has_ic, int, (void)))__ZCRSNOU(has_il, int, (void))Y__ZCRSPVU(idlok, int, (WINDOW *Window, bool Flag) /*lint -esym(534,idlok) */)#endif #undef inch)__ZCRSNO(inch, wchar_t, (void))F__ZCRSPV(initscr, WINDOW *, (void) /*lint -esym(534,initscr) */) #undef inschI__ZCRSPVU(insch, int, (char Char) /*lint -esym(534,insch) */)#undef insertlnG__ZCRSPVU(insertln, int, (void) /*lint -esym(534,insertln) */) #if FALSE]__ZCRSPVU(intrflush, int, (WINDOW *Window, bool Flag) /*lint -esym(534,intrflush) */)Z__ZCRSPVU(keypad, int, (WINDOW *Window, bool Flag) /*lint -esym(534,keypad) */))__ZCRSNO(killchar, char, (void))[__ZCRSPVU(leaveok, int, (WINDOW *Window, bool Flag) /*lint -esym(534,leaveok) */)#endifD__ZCRSPV(longname, char *, (const char *Termbuf, char *Name)) #if FALSE)__ZCRSNO(makenew, WINDOW *, (void))>__ZCRSNOU(meta, int, (WINDOW *Window, bool Flag))#endif #undef moveS__ZCRSPVU(move, int, (int Line, int Column) /*lint -esym(534,move) */)#undef mvaddch`__ZCRSPVU(mvaddch, int, (int Line, int Column, char Char) /*lint esym(534,mvaddch) */)#undef mvaddstrk__ZCRSPVU(mvaddstr, int, (int Line, int Column, const char *String) /*lint -esym(534,mvaddstr) */) #undef mvcur[__ZCRSNOU(mvcur, int, (int OldLine, int OldColumn, int NewLine, int NewColumn))#undef mvdelchV__ZCRSPVU(mvdelch, int, (int Line, int Column) /*lint -esym(534,mvdelch) */)#undef mvgetch9__ZCRSNO(mvgetch, wchar_t, (int Line, int Column))#undef mvgetstre__ZCRSPVU(mvgetstr, int, (int Line, int Column, char *String) /*lint -esym(534,mvgetstr) */) #undef mvinch9__ZCRSNO(mvinch, wchar_t, (int Line, int Column))#undef mvinschq__ZCRSPVU(mvinsch, int, (WINDOW *Window, int Line, int Column, char Char) /*lint -esym(534,mvinsch) */) #if FALSE#undef mvinsstrr__ZCRSPVU(mvinsstr, int, (WINDOW *Window, int Line, int Column, char Char) /*lint -esym(534,mvinsstr) */)#endifp__ZCRSPVU(mvprintw, int, (int Line, int Column, const char *Format, ...) /*lint -esym(534,mvprintw) */)#undef mvwaddchq__ZCRSPVU(mvwaddch, int, (WINDOW *Window, int Line, int Column, char Char)/*lint -esym(534,mvwaddch) */)#undef mvwaddstr{__ZCRSPVU(mvwaddstr, int, (WINDOW *Window, int Line, int Column, const char *String)/*lint -esym(534,mvwaddstr) */)#undef mvwgetchI__ZCRSNO(mvwgetch, wchar_t, (WINDOW *Window, int Line, int Column))#undef mvwgetstrv__ZCRSPVU(mvwgetstr, int, (WINDOW *Window, int Line, int Column, char *String) /*lint -esym(534,mvwgetstr) */)I__ZCRSNOU(mvwin, int, (WINDOW *Window, int Line, int Column))#undef mvwinchI__ZCRSNO(mvwinch, wchar_t, (WINDOW *Window, int Line, int Column))#undef mvwinschr__ZCRSPVU(mvwinsch, int, (WINDOW *Window, int Line, int Column, char Char) /*lint -esym(534,mvwinsch) */)a__ZCRSNOU(mvwprintw, int, (WINDOW *Window, int Line, int Column, const char *Format, ...)//*~PseudoVoid*/ /*lint -esym(534,mvwprintw) */)R__ZCRSNOU(mvscanw, int, (int Line, int Column, const char *Format, ...))#undef mvwdelchI__ZCRSNOU(mvwdelch, int, (WINDOW *Window, int Line, int Column)) #if FALSE#undef mvwinsstrs__ZCRSPVU(mvwinsstr, int, (WINDOW *Window, int Line, int Column, char Char) /*lint -esym(534,mvwinsstr) */)#endifb__ZCRSNOU(mvwscanw, int, (WINDOW *Window, int Line, int Column, const char *Format, ...)) #if FALSET__ZCRSNO(newpad, WINDOW *, (int Numlines, int Numcols, int Line, int Column))R__ZCRSNO(newterm, SCREEN *, (const char *Type, FILE *Outfile, FILE *Infile))#endifT__ZCRSNO(newwin, WINDOW *, (int NumLines, int NumCols, int Line, int Column)) #undef nlA__ZCRSPVU(nl, int, (void) /*lint -esym(534,nl) */) #if FALSEG__ZCRSPVU(nocbreak, int, (void) /*lint -esym(534,nocbreak) */)#endif#undef nocrmodeG__ZCRSPVU(nocrmode, int, (void) /*lint -esym(534,nocrmode) */) #if FALSE>__ZCRSNOU(nodelay, int, (WINDOW *Window, bool Flag))#endif #undef noechoE__ZCRSPVU(noecho, int, (void) /*lint -esym(534,noecho) */) #undef nonlC__ZCRSPVU(nonl, int, (void) /*lint -esym(534,nonl) */) #undef norawD__ZCRSPVU(noraw, int, (void) /*lint -esym(534,noraw) */)f__ZCRSPVU(overlay, int, (WINDOW *TopWindow, WINDOW *BotWindow) /*lint -esym(534,overlay) */)h__ZCRSPVU(overwrite, int, (WINDOW *TopWindow, WINDOW *BotWindow) /*lint -esym(534,overwrite) */) #if FALSE^__ZCRSPVU(pnoutrefresh, int, (WINDOW *Pad, int PY, int PX, int TTY, int TTX, int TBY, int'TBX) /*lint -esym(534,pnoutrefresh) */)^__ZCRSNOU(prefresh, int, (WINDOW *Pad, int PY, int PX, int TTY, int TTX, int TBY, intTBX))#endifX__ZCRSPVU(printw, int, (const char *Format, ...) /*lint -esym(534,printw) */) #if FALSE7__ZCRSNOU(putp, int, (const char *String))#endif #undef rawB__ZCRSPVU(raw, int, (void) /*lint -esym(534,raw) */)#undef refreshF__ZCRSPVU(refresh, int, (void) /*lint -esym(534,refresh) */) #if FALSE)__ZCRSNOU(reset_prog_mode,int, (void)))__ZCRSNOU(reset_shell_mode,int, (void)))__ZCRSNOU(resetterm, int, (void)))__ZCRSNOU(resetty, int, (void)))__ZCRSNOU(restartterm, int, (void)))__ZCRSNOU(saveterm, int, (void)))__ZCRSNOU(savetty, int, (void))#endif<__ZCRSNOU(scanw, int, (const char *Format, ...))O__ZCRSPVU(scroll, int, (WINDOW *Window) /*lint -esym(534,scroll) */)#undef scrollok\__ZCRSPVU(scrollok, int, (WINDOW *Window, bool Flag) /*lint -esym(534,scrollok) */) #if FALSE#undef setscrreg=__ZCRSNOU(setscrreg, int, (int Tmargin, int Bmargin)).__ZCRSNO(set_term, SCREEN *, (SCREEN *n))5__ZCRSNOU(setterm, int, (const char *Name))W__ZCRSNOU(setupterm, int, (const char *Term, FILE *FileNumber, int *ErrorCode))#endifj__ZCRSNO(subwin, WINDOW *, (WINDOW *ParentWindow, int NumLines, int Numcols, int Line, int Column)) #if FALSEE__ZCRSNOU(tgetent, int, (const char *Bp, const char *Name))3__ZCRSNOU(tgetflag, bool, (const char *ID))3__ZCRSNOU(tgetnum, int, (const char *ID))E__ZCRSNO(tgetstr, char *, (const char *ID, const char *Area))P__ZCRSNO(tgoto, char *, (const char *Capability, int Column, int Row))Z__ZCRSNOU(touchline, int, (WINDOW *Window, int Line, int FirstCol, int NumOfCols))E__ZCRSNOU(touchoverlap, int, (WINDOW *Window1, WINDOW *Window2))#endifQ__ZCRSPVU(touchwin, int, (WINDOW *Window) /*lint -esym(534,touchwin) */)Z__ZCRSPVU(waddch, int, (WINDOW *Window, char Char) /*lint -esym(534,waddch) */)d__ZCRSPVU(waddstr, int, (WINDOW *Window, const char *String) /*lint -esym(534,waddstr) */) #if FALSEk__ZCRSPVU(wattrset, int, (WINDOW *Window, unsigned long Attributes) /*lint -esym(534,wattrset) */)#endifO__ZCRSPVU(wclear, int, (WINDOW *window) /*lint -esym(534,wclear) */)R__ZCRSPVU(wclrtobot, int, (WINDOW *window) /*lint -esym(534,wclrtobot) */)R__ZCRSPVU(wclrtoeol, int, (WINDOW *Window) /*lint -esym(534,wclrtoeol) */)O__ZCRSPVU(wdelch, int, (WINDOW *Window) /*lint -esym(534,wdelch) */)L__ZCRSPVU(wdeleteln, int, (WINDOW *) /*lint -esym(534,wdeleteln) */)O__ZCRSPVU(werase, int, (WINDOW *Window) /*lint -esym(534,werase) */)O__ZCRSPVU(wgetch, int, (WINDOW *Window) /*lint -esym(534,wgetch) */)^__ZCRSPVU(wgetstr, int, (WINDOW *Window, char *String) /*lint -esym(534,wgetstr) */) #undef winch3__ZCRSNO(winch, wchar_t, (WINDOW *Window))Z__ZCRSPVU(winsch, int, (WINDOW *Window, char Char) /*lint -esym(534,winsch) */)R__ZCRSPVU(winsertln, int, (WINDOW *Window) /*lint -esym(534,winsertln) */)d__ZCRSPVU(wmove, int, (WINDOW *Window, int Line, int Column) /*lint -esym(534,wmove) */) #if FALSEU__ZCRSPVU(wnoutrefresh, int, (WINDOW *window) /*lint -esym(534,wnoutrefresh) */)#endifi__ZCRSPVU(wprintw, int, (WINDOW *Window, const char *Format, ...) /*lint -esym(534,wprintw) */)Q__ZCRSPVU(wrefresh, int, (WINDOW *Window) /*lint -esym(534,wrefresh) */)L__ZCRSNOU(wscanw, int, (WINDOW *Window, const char *Format, ...)) #if FALSE#undef wsetscrregM__ZCRSNOU(wsetscrreg, int, (WINDOW *Window, int Tmargin, int Bmargin))#endif #undef __ZCRSBASE#undef __ZCRSNO#undef __ZCRSNOU#undef __ZCRSPV#undef __ZCRSPVU#endif /* __CURSES_ADJ */*[DCC_DISTRIB.EXEC]LIMITS.ADJ;7+,./( 4P-m0123KPWO56R67 S89G(HJ/* LIMITS.ADJ */N/*~ zif UCHAR_MAX!=255 "Trouble with UCHAR_MAX; change line 5 of this file" */#undef UCHAR_MAXP#define UCHAR_MAX 255U /* 'U' sometimes missing in standard header file (cannot; use cast, for looses 'genericity' of constant). *//* End LIMITS.ADJ */*[DCC_DISTRIB.EXEC]MATH.ADJ;6+,./( 4EP-m0123KPWO56@87`AS89G(HJ/* MATH.ADJ */#ifndef __MATH_ADJ#define __MATH_ADJ #undef acos.extern double acos (double __x) /*~Generic*/; #undef asin.extern double asin (double __x) /*~Generic*/; #undef atan.extern double atan (double __x) /*~Generic*/; #undef atan2:extern double atan2 (double __y, double __x) /*~Generic*/; #undef cos.extern double cos (double __x) /*~Generic*/; #undef sin.extern double sin (double __x) /*~Generic*/; #undef tan.extern double tan (double __x) /*~Generic*/; #undef cosh.extern double cosh (double __x) /*~Generic*/; #undef sinh.extern double sinh (double __x) /*~Generic*/; #undef tanh.extern double tanh (double __x) /*~Generic*/; #undef exp.extern double exp (double __x) /*~Generic*/; #undef log.extern double log (double __x) /*~Generic*/; #undef log10.extern double log10 (double __x) /*~Generic*/; #undef pow:extern double pow (double __x, double __y) /*~Generic*/; #undef sqrt.extern double sqrt (double __x) /*~Generic*/; #undef frexpAextern double frexp (double __value /*~ResultType*/, int *__exp); #undef ldexp<extern double ldexp (double __x /*~ResultType*/, int __exp); #undef modfEextern double modf (double __value /*~ResultType*/, double *__iptr); #undef ceil1extern double ceil (double __x /*~ResultType*/); #undef floor1extern double floor (double __x /*~ResultType*/); #undef fabs1extern double fabs (double __x /*~ResultType*/); #undef fmod=extern double fmod (double __x /*~ResultType*/, double __y);#endif /* __MATH_ADJ *//* End MATH.ADJ */*[DCC_DISTRIB.EXEC]SETJMP.ADJ;30+,mq./( 4A-m0123KPWO56@ߜ7xS89G(HJ/* SETJMP.ADJ */#ifndef __SETJMP_ADJ#define __SETJMP_ADJAextern void longjmp(jmp_buf, int /*~Generic*/) /*~NeverReturns*/;#endif /* __SETJMP_ADJ *//* End SETJMP.ADJ */'*[DCC_DISTRIB.EXEC]STARTER.DCCVMSALPHA;9+,*7V./( 4IN-m0123KPWO56@&7whS89G(HJ #define ALPHA#define __ALPHA #define VMS #define __VMS#define VMS_VERSION V5.0#define __VMS_VERSION V5.0#define _ANSI_C_SOURCEI#define __dcc "cc/warn=disable=(ptrmismatch)" /* because of const [][] */#define __LINE__ 1#define __FILE__ ""#define __DATE__ "Jan 01 1900"#define __TIME__ "00:00:00"#define __STDC__ 1#define CC$gfloat (0==0)#define variant_struct struct#define variant_union union#define globaldef static#define globalref extern#define globalvalue static#define readonly#define noshare#define _align#define __int64 long long%*[DCC_DISTRIB.EXEC]STARTER.DCCVMSVAX;6+,y ./( 4IL-m0123KPWO56^|7ޝS89G(HJ #define VAX #define __VAX #define VMS #define __VMS#define VMS_VERSION V5.0#define __VMS_VERSION V5.0 #define VAXC#define __VAXC#define _ANSI_C_SOURCEI#define __dcc "cc/warn=disable=(ptrmismatch)" /* because of const [][] */#define __LINE__ 1#define __FILE__ ""#define __DATE__ "Jan 01 1900"#define __TIME__ "00:00:00"#define __STDC__ 1#define CC$gfloat (0==0)#define variant_struct struct#define variant_union union#define globaldef static#define globalref extern#define globalvalue static#define readonly#define noshare#define _align*[DCC_DISTRIB.EXEC]STDARG.ADJ;31+,./( 49-m0123KPWO56?㽜7ΤS89G(HJ/* STDARG.ADJ */#ifndef __STDARG_ADJ#define __STDARG_ADJ#undef va_start9#define va_start(list, parmN /*~NotUsed*/) /*~Init list*/ #undef va_end6#define va_end(x) (void)x; /* so looks used to dcc */#endif /* __STDARG_ADJ *//* End STDARG.ADJ */*[DCC_DISTRIB.EXEC]STDDEF.ADJ;28+,./( 4O-m0123KPWO56@975S89G(HJ/* STDDEF.ADJ */ #ifdef size_t #undef size_tO/*~zif 0==0 "define 'size_t' by a typedef instead of a '#define', and replace " "this line by the definition."*/#endif#ifdef ptrdiff_t#undef ptrdiff_tJ/*~zif 0==0 "define 'ptrdiff_t' by a typedef instead of a '#define', and "("replace this line by the definition."*/#endif #undef NULL#define NULL (void *)0/* End STDDEF.ADJ */*[DCC_DISTRIB.EXEC]STDIO.ADJ;44+,R./( 4PH-m0123KPWO56[;7S89G(HJ /* STDIO.ADJ */#ifndef __STDIO_ADJ#define __STDIO_ADJ'extern int fflush(FILE *) /*~Utility*/,E remove(const char *fileName) /*~Utility*/ /*~PseudoVoid*/; #undef printfHextern int printf(const char *format, ...) /*~Utility*/ /*~PseudoVoid*/;#undef sprintfPextern int sprintf(char *, const char *format, ...) /*~Utility*//*~PseudoVoid*/;#undef fprintfPextern int fprintf(FILE *, const char *format, ...) /*~Utility*//*~PseudoVoid*/;#undef vprintf)#if defined(va_list) || cdefined(va_list)Pextern int vprintf(const char *format, va_list arg) /*~Utility*//*~PseudoVoid*/;#elseNextern int vprintf(const char *format, void *arg) /*~Utility*//*~PseudoVoid*/;#endif#undef vsprintf)#if defined(va_list) || cdefined(va_list)Iextern int vsprintf(char *, const char *format, va_list arg) /*~Utility*/ /*~PseudoVoid*/;#elseGextern int vsprintf(char *, const char *format, void *arg) /*~Utility*/ /*~PseudoVoid*/;#endif#undef vfprintf)#if defined(va_list) || cdefined(va_list)Iextern int vfprintf(FILE *, const char *format, va_list arg) /*~Utility*/ /*~PseudoVoid*/;#elseGextern int vfprintf(FILE *, const char *format, void *arg) /*~Utility*/ /*~PseudoVoid*/;#endif #undef scanf7extern int scanf(const char *format, ...) /*~Utility*/; #undef fscanf@extern int fscanf(FILE *, const char *format, ...) /*~Utility*/; #undef sscanfFextern int sscanf(const char *, const char *format, ...) /*~Utility*/; #undef feofextern bool feof(FILE *stream); #undef ferror!extern bool ferror(FILE *stream); #undef fgetc extern char fgetc(FILE *stream); #undef getcextern char getc(FILE *stream);#undef getcharextern char getchar(void); #undef fputcDextern int fputc(char c, FILE *stream) /*~Utility*/ /*~PseudoVoid*/; #undef putcCextern int putc(char c, FILE *stream) /*~Utility*/ /*~PseudoVoid*/;#undef putchar8extern int putchar(char c) /*~Utility*/ /*~PseudoVoid*/; #undef fputsJextern int fputs(const char *, FILE *stream) /*~Utility*/ /*~PseudoVoid*/; #undef puts;extern int puts(const char *) /*~Utility*/ /*~PseudoVoid*/; #undef ungetcEextern int ungetc(char c, FILE *stream) /*~Utility*/ /*~PseudoVoid*/;Oextern size_t fwrite(const void *ptr, size_t size_of_char, size_t number_items, FILE *);'extern long ftell(FILE *) /*~Utility*/;Bextern int fseek(FILE *, long offset, int direction) /*~Utility*/,E fgetpos(FILE *, fpos_t *ptr) /*~Utility*/ /*~PseudoVoid*/,K fsetpos(FILE *, const fpos_t *ptr) /*~Utility*/ /*~PseudoVoid*/; #ifdef linux+/* Beginning of complement for Linux gcc */# undef stdin# undef stdout# undef stderr#endif /* ifdef linux */%/* End of complement for Linux gcc */ #undef NULL#define NULL (void *)0#endif /* __STDIO_ADJ *//* End STDIO.ADJ */*[DCC_DISTRIB.EXEC]STDLIB.ADJ;35+,+./( 4P-m0123KPWO56@B{:7HS89G(HJ/* STDLIB.ADJ */#ifndef __STDLIB_ADJ#define __STDLIB_ADJ;extern double atof (const char *__nptr) /*~Generic*/;;extern int atoi (const char *__nptr) /*~Generic*/;;extern long int atol (const char *__nptr) /*~Generic*/;-extern int rand (void) /*~Generic*/;Iextern double strtod (const char *__nptr, char **__endptr) /*~Generic*/;Dextern long strtol (const char *__nptr, char **__endptr, int __base) /*~Generic*/;Nextern unsigned long strtoul (const char *__nptr, char **__endptr, int __base) /*~Generic*/;Kextern void *realloc(void * /*~ResultPtr*/, size_t size /*~SizeOfMemBlk*/),9 *malloc(size_t size /*~SizeOfMemBlk*/) /*~Generic*/,F *calloc(size_t nobj, size_t size /*~SizeOfMemBlk*/) /*~Generic*/,* abort(void) /*~NeverReturns*/,/ exit(int status) /*~NeverReturns*/,F *bsearch(const void *key, const void *base /*~ResultPtr*/,P size_t n, size_t size, int (*pCmpFct)(const void *keyval, const void *datum));$extern int abs(int /*~ResultType*/);'extern long labs(long /*~ResultType*/);0extern char *getenv (const char *) /*~Generic*/; #undef NULL#define NULL (void *)0#endif /* __STDLIB_ADJ *//* End STDLIB.ADJ */*[DCC_DISTRIB.EXEC]STRING.ADJ;35+,<1./( 4O-m0123KPWO56`97@`wS89G(HJ/* STRING.ADJ */#ifndef __STRING_ADJ#define __STRING_ADJHextern char *strcpy(char * /*~ResultPtr*/, const char * /*~ResultType*/) /*~PseudoVoid*/,I *strncpy(char * /*~ResultPtr*/, const char * /*~ResultType*/, size_t) /*~PseudoVoid*/,H *strcat(char * /*~ResultPtr*/, const char * /*~ResultType*/) /*~PseudoVoid*/,I *strncat(char * /*~ResultPtr*/, const char * /*~ResultType*/, size_t) /*~PseudoVoid*/,7 *strchr(const char * /*~ResultPtr*/, char),8 *strrchr(const char * /*~ResultPtr*/, char),@ *strpbrk(const char * /*~ResultPtr*/, const char *),O *strstr(const char * /*~ResultPtr*/, const char * /*~ResultType*/);8extern void *memcpy(void * /*~ResultPtr*/, const void *, size_t) /*~PseudoVoid*/,9 *memmove(void * /*~ResultPtr*/, const void *, size_t) /*~PseudoVoid*/,H *memchr(const void * /*~ResultPtr*/, unsigned char, size_t),A *memset(void * /*~ResultPtr*/, unsigned char, size_t) /*~PseudoVoid*/; #undef NULL#define NULL (void *)0#endif /* __STRING_ADJ *//* End STRING.ADJ */*[DCC_DISTRIB.EXEC]TIME.ADJ;26+,R3D./( 4N-m0123KPWO5697'S89G(HJ/* TIME.ADJ */ #undef NULL#define NULL (void *)0/* End TIME.ADJ */*[DCC_DISTRIB.EXEC]UNISTD.ADJ;26+,3>./( 4R-m0123KPWO563=97 S89G(HJ/* UNISTD.ADJ */ #undef NULL#define NULL (void *)0/* End UNISTD.ADJ */!*[DCC_DISTRIB]FREEWARE_DEMO.COM;15+,!./( 4Gx- 0123KPWO56YD7@S89G(HJ$ ! FREWARE_DEMO.COM3$ write sys$output ">>> Setting up dcc environment"?$ arch := 'F$GETSYI("arch_name") ! ':=' converts to upper-case.$ if arch .nes. "VAX" .and. arch .nes. "ALPHA"$ thenG$ write sys$error "Current machine has unknown architecture: ''arch'"$ exit$ endifB$ define dccsysincldir sys$common:[decc$lib.reference.decc$rtldef]$ set def [.exec])$ define dccdir 'F$ENVIRONMENT("DEFAULT") $ set def [-]$ if arch .eqs. "VAX"$ then>$ copy/replace dccdir:starter.dccvmsvax dccdir:starter.dcc;1%$ copy/replace dccvax.exe dcc.exe;1$ endif$ if arch .eqs. "ALPHA"$ then@$ copy/replace dccdir:starter.dccvmsalpha dccdir:starter.dcc;1'$ copy/replace dccalpha.exe dcc.exe;1$ endif)$ dcc =="$ ''F$ENVIRONMENT("DEFAULT")dcc"D$ write sys$output ">>> Starting dcc test (in non-interactive mode)"!$ dcc -zcc -zsam +zmsg1000 trydcc *[DCC_DISTRIB]FREEWARE_DEMO.TXT;8+,!W./( 4P - 0123KPWO5617ȍS89G(HJWelcome to 'dcc' !LIt is a good tool to improve one's C coding style (if necessary), especiallyGwhen developping a new application; it also checks that a C source file-contains no pifalls and is ANSI C conformant.KJust use the FREEWARE_DEMO.COM menu to have a try at it (in non-interactiveOmode). The source file being tested is named "trydcc.c", and you can edit it at-will (as well as the header file "trydcc.h").ITo test dcc in interactive mode, type "dcc -zcc trydcc" in a Decterm-likeOwindow (but don't do it first, because the FREEWARE_DEMO.COM sets up the appli-cation environment).MYou can add/remove dcc options in the dcc command line. The list of available>options is obtained using the command 'dcc' without parameter.NYou can add default dcc options via the environment variable (symbol) DCCDFLTSP(DCC DeFauLTS); to do so, use the DCL command DCCDFLTS :== "...", for example :* DCCDFLTS :== "+zepl -zsam +zmsg1000 +zae"JThe TSTDCC.COM file tests dcc on its own source files; it should detect noerror nor warning.MThe TSTDIFFTRY.COM file does a 'diff' between the current results of checkingN'trydcc' and results obtained at Supelec and stored in the RESTRYDCC.TXT file.KThe DCREADME.TXT file explains more about dcc, especially how to install itNinto the system; you will then have to redefine the 'dccdir' logical name. TheO'dccsysincldir' logical name value is hopefully right for your system; it tellsJdcc the directory where system header files ('stdio.h' etc.) can be found."*[DCC_DISTRIB]FREEWARE_README.TXT;6+, ./( 4O- 0123KPWO56`5O7`x89G(HJ3DCC, LANGUAGES, Disciplined ANSI C Language CheckerFThis product checks that a C source file complies with the precepts ofGDisciplined C, a set of rules aiming at elevating ANSI C to the rank ofJhigh level language (as opposed to portable assembly language), and makingKas much semantics as possible flow from the design to the source code. ThisJis achieved mainly via quasi-compulsory types/constants naming and 'const'qualifier use.JThe product also detects most of the pitfalls of the C langu~DCC.BCK  "[DCC_DISTRIB]FREEWARE_README.TXT;6O?age, helps theLprogrammer organize his program modules and write them so that they are wellOencapsulated and more portable, and finally gives some much-needed compile-timechecking tools.Ldcc is quite fast (from 5 to 10 times faster than a compiler), and is itselfwritten in Disciplined C.MIts updates are available via anonymous ftp at 'ftp.supelec.fr', subdirectory"'pub/lang/dcc'. Have a try at it !&Yves Noyelle (Yves.Noyelle@supelec.fr)JSupelec, Service Informatique, Plateau de Moulon, F-91192 Gif/Yvette Cedex*[DCC_DISTRIB]RESTRYDCC.TXT;2+,#./( 4- 0123KPWO56 t78S89G(HJ ***** WArning(s)/ERror(s) found in compilation unit "trydcc.c" ***** */ void __assert (char *__expr, char *__file, int __line); ___^ ERror line 49 of file "assert.h": ';' expected at end of declaration started line 3 of file "trydcc.h". ###### static char *errMsg[] = { "...", _______^ WArning (lvl. 3) line 17: 'const'/'volatile' mismatch in pointers for operator '='. ###### "..." /*~zif __index() != __extent(ErrNb) "Missing message(s) in 'errMsg[]'" */ __________________________________________________________________________^ WArning (lvl. 3) line 20: 'zif' not false; message: "Missing message(s) in 'errMsg[]'". ###### char *tryAtDcc(void) { ^ WArning (lvl. 1) line 24: Variable/function "tryAtDcc": missing 'static' attribute ? ###### { unsigned int a, b=0, d=b, *pi=malloc(sizeof(pi)); __________________________________________________^ WArning (lvl. 3) line 25: Wrong 'sizeof' argument? ###### Flags fl = {TRUE, FALSE /*~zif !__member(fl3) "Incorrect initialization " "of flQual" */}; /* Exemple too simple to be really significant, ________________^ WArning (lvl. 3) line 29: 'zif' not false; message: "Incorrect initialization of flQual". ###### Flags fl = {TRUE, FALSE /*~zif !__member(fl3) "Incorrect initialization " "of flQual" */}; /* Exemple too simple to be really significant, __________________^ WArning (lvl. 1) line 29: Initialization of compound automatic objects should be avoided. ###### char buf[10], c; _____________^ WArning (lvl. 1) line 33: Bound of array "buf" should be a named constant. ###### char buf[10], c; short s = 32768; _________________^ WArning (lvl. 1) line 34: Numeric constants (except 0, 1, -1) should be named. ###### char buf[10], c; short s = 32768; _________________^ WArning (lvl. 2) line 34: Operator '=': overflow. ###### short s = 32768; a = a - TWO; __^ WArning (lvl. 1) line 35: Statements should be separated from declarations by white line(s) (or use ";;"). ###### short s = 32768; a = a - TWO; ____________^ WArning (lvl. 3) line 35: Local variable "a" not initialized. ###### short s = 32768; a = a - TWO; _____________^ WArning (lvl. 3) line 35: Ill-parenthetized macro body or parameter ? (operator '+'). ###### a = a - TWO; a = _min(a++,b); ________________^ WArning (lvl. 3) line 36: Side effect via macro parameter used more than once (operator '++'). ###### a = a - TWO; a = _min(a++,b); _________________^ WArning (lvl. 1) line 36: Previous value of variable "a" not used. ###### a = _min(a++,b); if (b = 0); ___________^ WArning (lvl. 3) line 37: Missing '==' ? ###### a = _min(a++,b); if (b = 0); ____________^ WArning (lvl. 2) line 37: Empty loop or 'if'/'else' arm; if really meant, replace ';' by empty block. ###### if (b = 0); else _changeSign(a, b); _______________________^ WArning (lvl. 2) line 38: Second statement included in loop or 'if'/'else' arm? (if so, use a block, else put second statement on next line). ###### else _changeSign(a, b); tryAtDcc; b; __________^ WArning (lvl. 3) line 39: Missing parenthesis after function name ? ###### else _changeSign(a, b); tryAtDcc; b; _____________^ WArning (lvl. 2) line 39: Value of expression not used. ###### tryAtDcc; b; x = 0; ___^ ERror line 40: Identifier "x" undeclared. ###### x++; /* 'UndecldVar' message not repeated (except if '+zae' option used) */ c = *errMsg[sizeof(errMsg)]; ____________________________^ WArning (lvl. 3) line 42: Index value (12) greater or equal to bound (3). ###### c = *errMsg[sizeof(errMsg)]; if (a<=0 || a-b>d || a&BIT2==BIT2) return &buf[0]; ____________^ WArning (lvl. 2) line 43: Operator '<=': unsigned value cannot be negative. ###### c = *errMsg[sizeof(errMsg)]; if (a<=0 || a-b>d || a&BIT2==BIT2) return &buf[0]; _____________________^ WArning (lvl. 2) line 43: Operator '>': comparing expressions involving subtraction of 'unsigned' (difference never negative !); rather add to other operand or, if correct, use /*~CastTo */ d-pragma. ###### c = *errMsg[sizeof(errMsg)]; if (a<=0 || a-b>d || a&BIT2==BIT2) return &buf[0]; ___________________________________^ WArning (lvl. 2) line 43: Operator '&': incompatible operand types. ###### c = *errMsg[sizeof(errMsg)]; if (a<=0 || a-b>d || a&BIT2==BIT2) return &buf[0]; ___________________________________________________^ WArning (lvl. 3) line 43: Attempt to return pointer on 'auto' object. ###### for(;;) c = 128; ___________^ WArning (lvl. 1) line 45: Numeric constants (except 0, 1, -1) should be named. ###### for(;;) c = 128; ___________^ WArning (lvl. 2) line 45: Operator '=': bad expression type. ###### for(;;) c = 128; ___________^ WArning (lvl. 1) line 45: Previous value of variable "c" not used. ###### c = 128; pi = pv = &fl; ____^ WArning (lvl. 2) line 46: Unreachable statement. ###### c = 128; pi = pv = &fl; _______________^ WArning (lvl. 2) line 46: Operator '=': bad expression type. ###### c = 128; pi = pv = &fl; _______________^ WArning (lvl. 1) line 46: Previous value of variable "pi" not used. ###### pi = pv = &fl; if (pi == NULL) pi = cpi; __________________________^ WArning (lvl. 3) line 47: 'const'/'volatile' mismatch in pointers for operator '='. ###### case 0: case 1: b=1; default: b = 0;} __________^ WArning (lvl. 3) line 50: Missing 'break'? (if really meant, use /*~NoBreak*/ d-pragma). ###### WArning (lvl. 1): (Final) value of variable "s" not used (variable defined line 34 or just before). ###### WArning (lvl. 1): (Final) value of variable "c" not used (variable defined line 33 or just before). ###### WArning (lvl. 1): Variable "buf" useless (defined line 33 or just before). ###### WArning (lvl. 1): (Final) value of variable "pv" not used (variable defined line 27 or just before). ###### WArning (lvl. 1): (Final) value of variable "pi" not used (variable defined line 25 or just before). ###### WArning (lvl. 1): (Final) value of variable "b" not used (variable defined line 25 or just before). ###### default: b = 0;} } ^ WArning (lvl. 3) line 51: No 'return' at end of function "tryAtDcc". ###### static int tstTypCmbn(int *pi) { ^ WArning (lvl. 2) line 57: Functions should return information type (e.g. "Position"). ###### if (pi == NULL) p = v*v; _________________________^ WArning (lvl. 1) line 60: No /*~TypeCombination*/ provided for "Volt*Volt". ###### if (pi == NULL) p = v*v; return AlrdQual+ArrToPtr; __________________________^ WArning (lvl. 2) line 61: Operator '+': illegal operand types. ###### WArning (lvl. 1): (Final) value of variable "p" not used (variable defined line 58 or just before). ###### WArning (lvl. 1): Function "tstTypCmbn": pointer "pi" should point on 'const' element. ###### WArning (lvl. 1): Function "tstTypCmbn" not used. ###### WArning (lvl. 1): Enum constant "ArrExptd" not used (defined on line 15 or just before), or missing /*~NotUsed*/ d-pragma ? ###### WArning (lvl. 1): Enum constant "AlrdDefId" not used (defined on line 15 or just before), or missing /*~NotUsed*/ d-pragma ? ###### WArning (lvl. 2): External variable/function "transfCoo" declared but not defined. *[DCC_DISTRIB]SRC.DIR;1+,"./( 4- 0123 KPWO56@S7@S89G(HJI CONFIGDC.TH7DC.THDDCBLK.C+mDCBLK.HhDCBLK.PHq DCCFILES.MNGgDCDECL.CDCDECL.H4p DCDECL.PHWDCDIR.CdDCDIR.H.ADCDIR.PH\DCEXP.CIEDCEXP.H 0DCEXP.PH HDCEXT.Cu7DCEXT.H}VDCEXT.PH (DCFMT.C\DCFMT.H@DCINST.C. 8WDCINST.H+^C DCINST.PHDCMAIN.CtDCMAIN.H  DCMAIN.PH, DCMSG.ENG!!M DCMSG.FREv DCMSG.TXTNlDCPRAG.CpDCPRAG.HaW DCPRAG.PH DCREC.C};DCREC.HCDCREC.PH8 DCRECDIR.C,v DCRECDIR.PH K DCRECDIR.TH 2- DCTXTTOK.C=!t DCTXTTOK.H60R DESCRIP.MMS 1\*[DCC_DISTRIB.SRC]CONFIGDC.TH;55+,./( 4Q-"0123KPWO56/Ӝ7#S89G(HJ/* CONFIGDC.TH */(/* Y.L. Noyelle, Supelec, France 1994 */N/* The following program assumes throughout that the sign bit (signed integralL types) is the leftmost bit, and that its value is 1 for a negative numberO (cf, for example, macro 'InsideInterval', file 'dc.h'). It also assumes that: address 1 is not the address of any object/function. */#include #include #ifdef NULL # undef NULL#endifE#define NULL (void *)0 /* some platforms define NULL as 0, and then4 cannot compile pointer conditional expres-. sions of which one arm is NULL... */#define False (0 != 0)#define True (0 == 0)#define TstAdjFiles True#define debug False#ifndef FILENAME_MAX# define FILENAME_MAX 255#endif #ifdef VMS# pragma member_alignmentB# define LcEqUc /* Lower case == Upper case (for file names) */# ifndef __STDC__# define NotInitUnions# endif /* __STDC__ */#else /* ! VMS */# define CrEchoedAsNewLine#endif /* VMS */$#if defined(VMS) && defined(__ALPHA)/*# include */# define LONGLONG __int64#endif#ifdef EXIT_FAILURE # ifdef VMS# undef EXIT_SUCCESS# define EXIT_SUCCESS 1# undef EXIT_FAILURE## define EXIT_FAILURE 0x10000002%# define EXIT_WARNINGS1 0x10000000# define DELTASTAT 0x87# define EXIT_WARNINGS2 (EXIT_WARNINGS1 + DELTASTAT)# else# if EXIT_FAILURE > 0# define DELTASTAT 1 # else# define DELTASTAT -1 # endif'# define EXIT_WARNINGS1 EXIT_SUCCESSC# define EXIT_WARNINGS2 (EXIT_FAILURE + DELTASTAT + DELTASTAT)# endif4# define EXIT_ERRORS1 (EXIT_WARNINGS2 + DELTASTAT)4# define EXIT_ERRORS2 (EXIT_ERRORS1 + DELTASTAT)#endif?/* Default out streams for warning/error and summary reports */#define MAIN_OUT_STREAM stderr#define SUMMARY_STREAM stdoutD#define ConstWarn Warn3 /* 'Warnx'/'Err' if warning/error wished on - "'const' qualifier not heeded". */I#define DefaultMessagesLimit 20 /* number of error/warning messages after1 which dcc quits (non-interactive mode). */8#define DefaultTabSpacing 8 /* Tab spacing by default */?#define ExplainMsgChar 'e' /* character to be typed to get more& information about a message. */I#define IsVisibleChar(c) ((uint)c >= (uint)' ') /* to be adapted to suit local needs. */@#define LineSize 80 /* size of physical line on screen (used for- formatting error/warning messages). */D#define MaxConcatLvl 10 /* maximum level of concatenation nesting */B#define MaxLgtId 48 /* nb of kept characters in non-external iden-1 tifiers (arbitrary, max UCHAR_MAX, that is 255 for 8-bits bytes). */?#define NbBitsChar 7 /* number of bits used to code a character/ (ASCII character codind assumed; if not,1 change array 'charInfo' in file DCREC.C */I#define NbUnivEltChunk 21 /* number of 'universal' blocks (used and freed1 by various linked structures) allocated at4 each 'malloc' request. Optimized so that uses4 efficiently memory under most malloc schemes./ Corresponding memory never given back to heap. */L#define PowTwoSizeSymTab 10 /* log2(size of bucket array for symbolTable) */<#define PtrGtLong False /* tells whether addresses cannot be& represented in a 'long'. */#ifndef LONGLONGP/*~zif PtrGtLong != (sizeof(void *)>sizeof(long)) "Change value of PtrGtLong" */#else5/*~zif PtrGtLong != (sizeof(void *)>sizeof(LONGLONG))& "Change value of PtrGtLong" */#endifJ/* SignedChar tells whether 'char' are signed/unsigned by default in local implementation. */<#if (defined(__alpha) || defined (__ALPHA)) && !defined(VMS)#define SignedChar False #else#define SignedChar True#endifL#define SignedIntField True /* tells whether 'int' bit-fields are signed/un-4 signed by default in local implementation. */F#define SignifLgtId 31 /* nb of significant characters in non-external identifiers. */'/*~zif (MaxLgtId < SignifLgtId) "Pb" */=#define SizeMacroStorageBlk 248 /* constraints: see 'zif' on- SizeMacroStorageChunk in dcdir.c. */;#define SizeNameStorageBlk 248 /* constraint: see 'zif' on- SizeNameStorageChunk in dcrec.c. */L#define SizTypTxtBuf (2)*LineSize /* (arbitrary) size of buffer for decoded- types (in error/warning messages). */D#define TolLostSpace 10 /* length of maximum tolerated lost space at/ end of message line (in character units; arbitrary). */K#define TransfSize ((236) - LineSize) /* minimum wished size for load chunk4 of source file. Must be larger than MaxLgtId.* Optimised for 'power of two' malloc allocators. */"/*~zif TransfSize# define Log10MaxLongNb 18 /* log10(MaxPowOfTenInGtstInt) */#elif defined(LONGLONG)4# define MaxPowOfTenInGtstInt 1000000000000000000LL># define Log10MaxLongNb 18 /* log10(MaxPowOfTenInGtstInt) */#else)# define MaxPowOfTenInGtstInt 1000000000># define Log10MaxLongNb 9 /* log10(MaxPowOfTenInGtstInt) */M /*~zif (sizeof(long) != 4) "'long' on more than 4 bytes; change previous "; "'MaxPowOfTenInLong' and 'Log10MaxLongNb' symbols." */#endifC/* The following definitions in order to allow cross-compilation */#define CHAR_BITC CHAR_BIT#define SCHAR_MINC SCHAR_MIN#define SCHAR_MAXC SCHAR_MAX#define UCHAR_MAXC UCHAR_MAX#define CHAR_MAXC CHAR_MAX#define SHRT_MINC SHRT_MIN#define SHRT_MAXC SHRT_MAX#define ShortSiz sizeof(short)#define USHRT_MAXC USHRT_MAX#define INT_MINC INT_MIN#define INT_MAXC INT_MAX#define IntSiz sizeof(int)#define UINT_MAXC UINT_MAX#define LONG_MAXC LONG_MAX#define LONG_MINC LONG_MIN#define ULONG_MAXC ULONG_MAX#ifdef LONGLONG# ifdef __ALPHA&# define LONGLONG_MAXC __INT64_MAX&# define LONGLONG_MINC __INT64_MIN'# define ULONGLONG_MAXC __UINT64_MAX# else(# define LONGLONG_MAXC LONG_LONG_MAX(# define LONGLONG_MINC LONG_LONG_MIN)# define ULONGLONG_MAXC ULONG_LONG_MAX# endif&# define LongLongSiz sizeof(LONGLONG)#else## define LONGLONG_MAXC LONG_MAXC## define LONGLONG_MINC LONG_MINC$# define ULONGLONG_MAXC ULONG_MAXC#endif#define LongSiz sizeof(long)#define FloatSiz sizeof(float) #define DoubleSiz sizeof(double)$#if defined(VMS) && !defined(__DECC)Q# define LongDblSiz sizeof(double) /* no 'long double' on old VMS compiler... */#else(# define LongDblSiz sizeof(long double)#endif#define PtrSiz sizeof(void *)#define size_tc size_t#define ptrdiff_tc ptrdiff_t/* End CONFIGDC.TH */*[DCC_DISTRIB.SRC]DC.TH;286+,D.H/( 4PHG-"0123KPWOI56߫7`S89G(HJ4 /* DC.TH */(/* Y.L. Noyelle, Supelec, France 1994 */ #ifndef DC_TH #define DC_TH#include "configdc.th"#define ubyte unsigned char#define ushort unsigned short#define uint unsigned int#define ulong unsigned longtypedef uint bool;/* Anormal exit codes */#define ExCod1 "1"#define ExCod2 "2"#define ExCod3 "3"#define ExCod4 "4"#define ExCod5 "5"#define ExCod6 "6"#define ExCod7 "7"#define ExCod8 "8"#define ExCod9 "9"%#define AdLastElt(x) &x[NbElt(x) - 1];#define AllocXElt(xname, xtype, xctr, xstmtSeq) \" xtype xname(void) \ { \; /*~ zif (sizeof(TqElt6) < sizeof(*(xtype)0)) \- #xname ": " #xtype " size too big" */\ xtype resul; \ \P if (headQElt6 != NULL) { /* if there remains free(d) elements, */\M resul = (xtype /*~OddCast*/) headQElt6; /* use one of them, */ \0 headQElt6 = headQElt6->next;} \O else resul = allocChunk(); /* else allocate a new chunk. */ \ xctr++; \: xstmtSeq /* parameter statement sequence */ \ return resul; \ }#define ArrLimErr (-(size_t)1)'#define BaseStrunType(x) x->tagId->type#define Base10 10#define BitsHexDigit 4B#define CompatType(x, y, z) ((x == y)? True : compatType(x, y, z))L#define ConvToString(x) ConvToString1(x) /* for parameter to be expanded */#define ConvToString1(x) #x#define ConvTname(x) (Tname)xP#define CreateParArr(n) Tstring parArr##n[(n)+1 /*~IndexType TmsgParIndex*/] \F = {(Tstring /*~OddCast*/)(n)} /* creates a message parameter array */$#define DefIsSameName \P static bool isSameName(ThCode xh, Tname xn, ThCode yhCode, Tname zname) \ { \E return xh==yhCode && memcmp(xn, zname, FullLgt(xn))==0; \ }$#define DefRepresType \@ static TpcTypeElt represType(register TpcTypeElt x) \ { \< while (NxtIsTypeId(x)) {x = x->typeId->type;} \ return x; \ }P#define DefSem(xname, xkind, xdefnd) DefSem1(xname, xkind, xdefnd, False, False)@#define DefSem1(xname, xkind, xdefnd, xused, xinitlz) \0 static const TinfoSeman xname = { \< NoAttrib+(0-0) /*~ zif (! __member(_attribb)) \; "misplaced initialization for field '_attribb'" */, \1 xkind /*~ zif (! __member(_kind)) \; "misplaced initialization for field '_kind'" */, \3 xdefnd /*~ zif (! __member(_defnd)) \; "misplaced initialization for field '_defnd'" */, \1 xused /*~ zif (! __member(_used)) \; "misplaced initialization for field '_used'" */, \2 False /*~ zif (! __member(_undef)) \; "misplaced initialization for field '_undef'" */, \5 xinitlz /*~ zif (! __member(_initlz)) \; "misplaced initialization for field '_initlz'" */, \7 False /*~ zif (! __member(_msngConstQM)) \; "misplaced initialization for field '_msngConstQM'" */,\5 False /*~ zif (! __member(_variousS1)) \; "misplaced initialization for field '_variousS1'" */, \5 False /*~ zif (! __member(_variousS2)) \; "misplaced initialization for field '_variousS2'" */, \5 False /*~ zif (! __member(_variousS3)) \; "misplaced initialization for field '_variousS3'" */, \5 False /*~ zif (! __member(_variousS4)) \; "misplaced initialization for field '_variousS4'" */, \5 False /*~ zif (! __member(_variousS5)) \; "misplaced initialization for field '_variousS5'" */, \5 False /*~ zif (! __member(_variousS6)) \; "misplaced initialization for field '_variousS6'" */, \D /*~ zif ! __member() "Structure '" ConvToString(xname) \% "' not fully initialized" */}#define DispLgtId 0 #define DispNSId (DispLgtId + 1)#define Dots "..."A#define Found(x) ((curTok.tok == x)? (GetNxtTok(), True) : False)B#define FreeXElt(xname, xtype, xctr, xstmtSeq, xfollow) \2 xtype xname(xtype x /*~MayModify*/) \ { \ xtype resul; \ \& resul = x->xfollow; \ xstmtSeq \< ((TqElt6 * /*~OddCast*/)x)->next = headQElt6; \5 headQElt6 = (TqElt6 * /*~OddCast*/)x; \ xctr--; \ return resul; \ }&#define FullLgt(x) (Lgt(x) + LgtHdrId)#define GapNxtVarie 2-#define GenericEnum QuasiNULLval(TsemanElt *)G#define GetNxtTok() (*pCurGNT)() /* calls current 'token dispenser' */1#define InsideInterval(p, LLim,HLim) \P /*~ zif (! __sametype(LLim, p)) "InsideInterval: bad parameter type (must " \& "also be <= 'uint')" */ \A /*~ zif (HLim <= LLim) "InsideInterval: bad HLim" */ \G ((uint)(p - (LLim)) <= (uint)((HLim) - (LLim))) /* limits included */#define IntStr "int"#ifdef INT_BIT#undef INT_BIT#endif)#define INT_BIT (CHAR_BIT * sizeof(int))'#define IsArr(x) (x->typeSort == Array)-#define IsArrFct(x) IsArrFctSort(x->typeSort)6#define IsArrFctSort(x) InsideInterval(x, Array, VFct)'#define IsFct(x) IsFctSort(x->typeSort)1#define IsFctSort(x) InsideInterval(x, Fct, VFct)%#define IsPtr(x) (x->typeSort == Ptr)-#define IsPtrArr(x) IsPtrArrSort(x->typeSort)5#define IsPtrArrSort(x) InsideInterval(x, Ptr, Array)<#define IsScalar(x) (IsTypeSort(x, NumEnumBool) || IsPtr(x))+#define IsStrun(x) IsStrunSort(x->typeSort)6#define IsStrunSort(x) InsideInterval(x, Struc, Union):#define IsTypeSort(x, msk) ((x->typeSort & (msk)) != Void)!#define Lgt(x) ((size_t)Lgt1(x))H#define Lgt1(x) /*~ zif !__sametype(Tname, x) "Lgt1: parameter not of \ 'Tname' type."*/*(x + DispLgtId)I#define LgtHdrId (DispNSId + 1) /* size of header of identifiers name */!#define LitLen(x) (sizeof(x) - 1)#define LongStr "long""#define LSIGN_BIT ~(ulong)LONG_MAX(#define ModifType TpTypeElt /*~OddCast*/$#define MyAlloc(w, x) \: if ((w = malloc(x)) == NULL) sysErr(errTxt[RanOutOfMem]).#define NoFreeExpType QuasiNULLval(TpcTypeElt)#define NbElt(x) NbEltGen(x, 0)4#define NbEltGen(x, y) (int)(sizeof(x)/sizeof(x[y]))#define NonHdrFName ""J#define NO_GREATER_INT (!defined(LONGLONG) && UINT_MAX==ULONG_MAX) /* for4 preprocessor may not manage LLong type. */2#define NxtIsTypeId(x) (x->paralTyp || x->sysTpdf)*#define NxtTok() (GetNxtTok(), curTok.tok)M#define NxtTypElt(x) /*~ zif !__sametype(TpcTypeElt, x) "NxtTypElt: " \B "parameter not of 'TtypeElt *' type." */ (represType(x)->nextTE)K#define Offset(strunType, fieldName) (size_t)(&((strunType *)0)->fieldName)$#define PopHist(x) x >>= SizeHistEltL#define PushHist(x) cExp.hist = cExp.hist<# ifdef _tolower## define RealChar(x) _tolower(x)# else"# define RealChar(x) tolower(x)# endif#else# define RealChar(x) x#endif$#define SearchDot(x) strrchr(x, '.')#define SIGN_BIT ~INT_MAX#define SmallestWdthInt 16<#define SpaceCntNoBegLine -2 /* -1 : comment begins line */&#define StrEq(x,y) (strcmp(x, y) == 0)#ifdef LONGLONG# define TgreatestInt LONGLONG#else# define TgreatestInt long#endifN/* Order is very meaningful in the following enum; see for example curTokTxt() or getTokFromMac(). */typedef enum {N WHITESPACE /* here for efficiency reasons (=0) */, EndSTok=0 /*~SameValue*/,O COLON, COMMA, LBRA, LPAR, LSBR=LPAR+1,ARROW=LSBR+1, DOT=ARROW+1, QMARK, RBRA, RPAR, RSBR, SCOL, TILDE,A ETok1Char, BKeyWords=ETok1Char, BDecl=BKeyWords, BAttrib=BDecl,. NOATTRIB=BAttrib, STATI, EXTRN, TYPDF, AUTO," REG, EAttrib, BQualif = EAttrib,4 CONST=BQualif, VOLAT, ENUM, STRUC, UNION, BNatTyp,? VOID=BNatTyp, FLOAT, DOUBLE, CHAR, SHORT, INT, LONG, ENatTyp, USGND=ENatTyp, SGND, EDecl,< BREAK=EDecl, CASE, CONTINUE, DEFAULT, DO, ELSE, FOR, GOTO,/ IF, RETURN, SIZEOF, SWITCH, WHILE, EKeyWords,< ADDOP=EKeyWords, AND, XOR=AND+1, IOR=XOR+1, APSAND, ELLIP,N EMARK, ENDPROG, EQUALOP, FPTR, LOGAND, LOGOR, MULOP, ORDEROP, SHIFTOP, STAR,' FCTC, DPPREFIX=FCTC, ENDDPRAG=FCTC+1,= BSideEffTok=ENDDPRAG+1, ASGNOP=BSideEffTok, INCOP=ASGNOP+1, SIDEFF, VFCTC, ESideEffTok,? CSTCH=ESideEffTok, CSTCH1, CSTNU, CSTST=CSTNU+1, IDENT, CAST, DOLLVAL, BegDPragTok,G BCKBRCH=BegDPragTok, CMPSGHDR, DOLLSIGN, DYNINIT, EXACTCMP, FULLENUM,? GENERIC, LITCST, LOCALADR, MASKING, MAYMODIFY, NEVRET, NOBRK,E NONCONST, NOTUSED, ODDCAST, PORTQM, PSEUDOVOID, RESULPTR, RESULTYP,D ROOTTYP, SAMEVAL, SIDEFFOK, SIZEOFBL, SIZEOK, UTILITY, VOIDTOTHER,/ EndDPragTok, DPRAG=EndDPragTok, BegSpeMacTok,/ BegServTok=BegSpeMacTok, CONCATOP=BegServTok,J ENDARG1CONC, ENDBLK, SKIPTO=ENDBLK+1, ENDDIR=SKIPTO+1, ENDPAR= ENDDIR+1,4 FORCEMACEXP, FORCEMACEXP1=FORCEMACEXP+1, NOMACEXP== FORCEMACEXP1+1, IDSTNU, MACPAR, MACPAR1, SUNDR, EndServTok,( CASTTO=EndServTok, INDEXTYPE, QUOTEOP, NoSwallowTok,K PARENSEEN=SIGN_BIT, PRIMARY=(SIGN_BIT>>1)&INT_MAX, NONASSOC = PRIMARY>>1, LOWEST_BIT_TOK = NONASSOC} Ttok;?/*~ zif NoSwallowTok>=LOWEST_BIT_TOK "Too many token values" */*typedef enum {Add, Sub, AddSubAsgn} TkAdd;Ntypedef enum {SimplAsgn, IorAsgn, XorAsgn, AndAsgn, LShAsgn, RShAsgn, AddAsgn,; SubAsgn=AddAsgn+1, MulAsgn, DivAsgn, ModAsgn} TkAsgn;Ktypedef enum {EQ, NE, GT, GE, LE, LT} TkCmp; /* order important (see array 'cmpCod'). */typedef enum {Inc, Dec} TkInc;#typedef enum {Mul, Div, Mod} TkMul;typedef enum {LSh, RSh} TkShi;H/*~zif ModAsgn-AddAsgn != (int)Mod+(int)Sub+1 "see searchTC function" */typedef enum {A Err = 0, NoErrMsg = 0 /*~SameValue*/, NoConcErr = NoErrMsg + 1, BegErr = 0 /*~SameValue*/,3 Warning = 0 /*~SameValue*/, Error /*~SameValue*/,C Arithm, At0, ComponOf, ComposOf, DblIncldFile, EGConstPtr, Empty,/ EmptyTxt, EndFileName, EndMsg, ErrWarn, File,3 LastToks, Left, Line, MayM, NoErrWarn, OrJustBef,= ProceedMsg, RanOutOfMem, Right, SeparMsg, StopAftMsgBanner,+ SubPre, Use1, Use2, WarnErrInFile, WillM,M AlrdDefId, AlrdDefLabel, AlrdQual, AlrdSeenOpt, AlrdUndef, AlrdUsedCaseVal,I ArgCollGetsOutMacBody, ArrExptd, ArrOfIncplOrFctElt, ArrOrFctCantBeRet,B ArrowExptd, ArrShdBeConst, ArrTooSmall, ArrToPtr, AsgnGblWLclAd,< AtLeastOnePar, BackwdBranch, BadActParListLgth, BadAttrib,> BadAttribForMain, BadDOption, BadDPForFctPar, BadForLftType,A BadIndent, BadIndent1, BadIndent2, BadIndexType, BadIndexType1,# BadIntgrlType, BadlyIncldHdrFile,B BadParForMain, BadRetType, BadRetTypeForMain, BadUUdcc, BlockQM,0 BndShdBeNamed, BndShdBeOfNamedType, BoolExptd,@ CantBeGeneUtil, CantChgMnng, CantInitTpdf, CaseExptd, ChkUcLc,5 CmplSColE1, CmpsgHdrWithSelf, ColExptd, CommaExptd,F CompHdrFile, ConcOprIlgLast, ConstQalNotHeeded1, ConstQalNotHeeded2,D ConstStrun, ConvToUnsig, ConvToUnsig1, CrtdTokTooLong, CstBoolExp,8 CstExpExptd, CstOnLftSide, CstSwitchExp, DblDefMember,7 DblDefStrun, DccCantProcDef, DeclExptd, DefaultExptd,E DiffIncptblPtr, DirNameExptd, DontInclBodyFile, DontWriteIntoConst,? DPragNameExptd, DPragNotAlwd, DWhileNotLinedUp, ElseAlrdSeen,; EmbdFctNotAlwd, EmptyStmt, EmptyStrun, EndDPragLineExptd,G EndOfLineIgnd, ErrorDir, ExtDeclBeInHdrFile, ExtObjNotDef, ExtraRBra,B ExtraSColAtEndMac, ExtrnExptd, FctCantBeInit, FctDeclDefNotAlwd,* FctDefViaTpdf, FileOpenFail, FldNotAlwd,C FldSizIncor, FltNotEq, FmtExhstd, GroupQual, HzrdConv, HzrdConv1,@ IdExptd, IdOrSColExptd, IgndCharsOpt, IlgArraySize, IlgAttrib,L IlgAttribForFct, IlgBoolDef, IlgCastSource, IlgCastTarget, IlgCastTarget1,: IlgCastTo, IlgChar, IlgCharD, IlgCmpsgHdr, IlgCmpsgHdr1,H IlgCmpsgHdr2, IlgCrtdTok, IlgDccCmpl, IlgDirName, IlgDPrag, IlgEscSeq,? IlgFmtSpe, IlgId, IlgInclArg, IlgInIfExp, IlgInit, IlgInitBU,? IlgLftType, IlgOctDig, IlgOpndType, IlgOptForSpe, IlgPrecFld,G IlgRhtType, IlgSpeForType, IlgSynt, IlgTCModOpnd, IlgTCOptr, IlgType,M IlgTypeForFld, IlgTypes, IllParenMacro, IllPositDecl, IllUndef, IncldAfter,I IncohResultType, IncorNevRet, IncorTCModRes, IncorTCResTyp, IncplArray,> IncplPar, IncplPtr, IncplRetType, IncplStrunType, IncplType,= IncptblAttrib, IncptblPar, IncptblTypes, IndexTypeTooSmall,C IndexValTooBig, IneffOrSideEff, InitDP, InptFileErr, IntBitField,M IntgrlTypeExptd, IntgrNbExptd, LBraExptd, LegalOnlyInMac, LgtCharCstNotOne,B LowerCaseH, LParExptd, LParOutsideMac, MacAlrdDef, MacNameExptd,E MayModify, MemberCantBeInit, MisplaLbl, MnlsPtrDiff, MoreStrngType,M MoreThanOneAttrib, MsngBrk, MsngConcOpnd, MsngConstQ, MsngEndif, MsngEqual,A MsngExp, MsngExtTpdf, MsngFctAttrib, MsngFctName, MsngFctParen,J MsngFldWdth, MsngFldWdth1, MsngIF, MsngMacArg, MsngMembName, MsngNevRet,5 MsngObjTypName, MsngStati, MsngStrunEnum, MsngVoid,5 NameAlrdInUse, NegIndexVal, NoAttribAlwd, NoCUName,J NoDefInHdrFile, /*NoDfngFile,*/ NoDirInDPrag, NoHghrTyp, NoIdAlwdInT~DCC.BCKD"[DCC_DISTRIB.SRC]DC.TH;286PHype,P NoIndentIndct, NonCoheDPInFct, NonCommutOper, NonNumCantBeCast, NonPortCastQM,O NonPortCmbn, NonPortOpnd, NonPortTC, NonUndfnblMac, NonVisiLabel, NoOrderRel,G NoPrecIf, NoQualifAlwd, NoRetAtEnd, NotAFct, NotArrInit, NotArrToNum,F NotASCIIChar, NoTCAllows, NotDefTag, NotEnumTypeOrTag, NotExptdType,: NotInit, NotInit1, NotInsideLoop, NotInsideLoopOrSwitch,7 NotInsideSwitch, NotInsideSwitch1, NotLVal, NotLValP,B NotMacParForQuo, NotModfbl, NotNamedStrunCst, NotPureSideEffect,K NotPureSideEffect1, NotSameNbOfPar, NotSameType, NotStrunInit, NotTypeId,= NotUsdEnumCst, NotUsdObj, NotUsdPar, NotVarId, NotVisiChar,K NumCstShdBeNamed, NumCstShdBeNamed1, OnlyExtrn, OnlyRegAttrib, Outside01,? Overflow, Overflow1, Overflow2, ParAlrdExist, ParMustBeNamed,G ParNameExptd, ParNamesNotEq, ParRepreType, ParTypesNotEq, PortCastQM,> PossOvfl, PrevCastUsl, PrivNotVisi, PtrExptd, PtrOnFctExptd,H PtrShdBeConst, PtrToNum, RBraExptd, RBraOrCommaExptd, RegAttribForAmp,C RegVolatIncptbl, ResRepreType, ResulPtrNotHghsTyp, RetPtrOnLclAd,C RParExptd, RParOrCommaExptd, RSBrExptd, SameEnumCst, SameParName,O SColExptd, SColExptd1, SepDeclStmt, ShdBeBlk, ShdBeInHdrFile, ShdBePrntzBool,B ShdntBePtrOnArr, SideEffInMacPar, SimplAsgnExptd, SizeofCharCst,F SizeofDontEval, SlowingInit, StaFctNotDef, StddefNotIncl, StmtExptd,P StrCstExptd, StringTooLong, StrunEnumDeclNotAlwd, SysError, TagNotVisi, TagQM,+ TargLabelNotVisi, TCAlrdDef, TCNotAtLvl0,; TooManyBraLvl, TooManyFmtSpe, TooManyIniz, TooManyMacArg,O TooManyMacPar, TooManyMsg, TooManyParForMain, TrnctdId, TryPermut, TypeExptd,K TypeNotParal, UnclosedCmt, UnclosedDP, UncomputAd, UndefEnum, UndefFctId,G UndefId, UndefLabel, UndefPtdSize, UndefResul, UndefSize, UndefStrun,I UndefTag, Underflow, UndfndId, UnFnshArgList, UnFnshCharCst, UnFnshCmt,2 UnFnshFileName, UnFnshStrCst, UnknDPrag, UnknId,O UnknMacro, UnknMember, UnknOption, UnreachStmt, UnsigDiffNotNeg, UnsigNonNeg,O UnsuitFldType, UnusedEnumCst, UnusedFct, UnusedId, UnusedLabel, UnusedMacPar,< UnusedPar, UnusedTag, UnusedTypeId, UnusedVar, UnusedVar1,5 UpCaseTypName, UseIndexTypForPtr, UseTC, UslAttrib,D UslCast, UslCastTo, UslDPrag, UslFctQual, UslInitBU, UslNoDefault,< UslObj, UslTypSpe, VariNotVari, VoidNotAlone, VoidNotAlwd,1 WarnAlrdOff, WarnAlrdOn, WhileExptd, WrngCUnit,O WrngFullEnum, WrngHdrFile, WrngNb, WrngNb1, WrngSameVal, WrngSizeof, ZifWarn,L EndErr, Warn2 = SIGN_BIT, Warn1 = (SIGN_BIT>>1)&INT_MAX, CWarn = Warn1>>1,D NoDispLine = CWarn>>1, PossErr = NoDispLine>>1, Rdbl = PossErr>>1, EndErrInfoBits} Terr;D/*~ zif (EndErr > EndErrInfoBits - 1) "Too many error messages !" */#define Warn3 (Warn2 | Warn1)#define WarnMsk Warn39/* Warnings not to be delivered if inside system macro */#define CWarn1 Warn1 | CWarn#define CWarn2 Warn2 | CWarn#define CWarn3 Warn3 | CWarn0/* Definitions for 'universal' storage blocks */typedef struct _TqElt6 TqElt6;#define SizeUnivBlk 52typedef union {void *bid1; long bid2;} TallocUnit;struct _TqElt6 {A TallocUnit bid[SizeUnivBlk]; /* to get space for 'SizeUnivBlk'C& universal memory units. */P TqElt6 *next; /* must come last (so as not to destroy content of freed block,= which may be used some more just after freeing (cf, form3 example, 'shared' flag in freeTypeElt() ). */"};O/*~ zif (size_t)&(((TqElt6 *)0)->next) + sizeof(((TqElt6 *)0)->next) != sizeof(d; TqElt6) "Field 'next' of TqElt6 not last field" */d#undef SizeUnivBlk4/* Offsets in L"array 'natTyp' of predefined types */#ifdef LONGLONG (# define DeltaTyp (LONG - CHAR + 1 + 1)#else $# define DeltaTyp (LONG - CHAR + 1)#endif#define _VOID (VOID - BNatTyp) #define _SBYTE (CHAR - BNatTyp)##define _UBYTE (_SBYTE + DeltaTyp) #define _INT (INT - BNatTyp)f #define _UINT (_INT + DeltaTyp)#define _LONG (LONG - BNatTyp)t"#define _ULONG (_LONG + DeltaTyp)#ifdef LONGLONG # define _LLONG (_LONG + 1)# define _ULLONG (_ULONG + 1)#else # define _LLONG _LONG# define _ULLONG _ULONG#endif#define _CHAR (_ULLONG + 1)#define _LONGDBL (_CHAR + 1)"#define _ENDCNATTYP (_LONGDBL + 1)/* Authorization masks */\3#define SigWho (Byte | Short | Int | Long | LLong)L9#define UnsigWho (UByte | UShort | UInt | ULong | ULLong) #define Who (SigWho | UnsigWho)9#define Flt (Float | Double | LongDbl) /* "Floating" */o#define SigAri (SigWho | Flt)"#define SigWhoEnum (SigWho | Enum)#define WhoEnum (Who | Enum)d9#define WhoEnumBool (WhoEnum | Bool) /* "Integral" */>#define NumEnumBool (WhoEnumBool | Flt) /* "Arithmetic" */#define Num (Who | Flt)#define NumEnum (Num | Enum)e#define NumBool (Num | Bool)'/* Flags to manage numeric constants */t#define NegSeen 1UC#define SignSeen (NegSeen << 1)T#define USeen (SignSeen << 1)#define LSeen (USeen << 1)d#define LLSeen (LSeen << 1)#define FltSeen (LLSeen << 1)#define FSeen (FltSeen << 1)\#define LDSeen (FSeen << 1)#define OctHex (LDSeen << 1) /* Shorthands */#define lim u1._lim#define paramList u1._paramList;!#define memberList u1._memberList ##define frstEnumCst u1._frstEnumCst #define tagId u2._tagId#define indexType u2._indexType#define nextTE u3._nextTE#define typeId u3._typeId#define attriba infoD._attribaa#define parQal infoD._parQalo#define fldSize infoD._fldSize_#define fldFl infoD._fldFlp #define memberFl infoD._memberFl#define MayModifFl memberFl #define declFl infoD._declFl #define ResulPtrFl declFlt&#define noNewTypeFl infoD._noNewTypeFl"#define SignedInt infoD._signedInt#define SizeofBlFl noNewTypeFl#define initFl infoD._variousDf!#define notUsedFl infoD._variousDf$#define paralTypeFl infoD._variousD1#define _paralTypeFl _variousD1d#define _prioToCast _variousD1#define attribb infoS._attribb #define kind infoS._kindt#define defnd infoS._defnd"#define used infoS._used/=#define undef infoS._undef /* for ~Undef(Tag) management */i#define initlz infoS._initlz &#define MsngConstQM infoS._msngConstQM"#define variousS1 infoS._variousS1#define initBefUsd variousS1.#define declInInHdr variousS1 /* Extrn Obj */"#define variousS2 infoS._variousS2%#define inner variousS2 /* Label */o/#define usedMorThOnce variousS2 /* ParamMac */a)#define lclAd variousS2 /* Obj (Ptr) */iD#define notPureBoo lclAd /* Obj (Bool); often managed as lclAd */"#define variousS3 infoS._variousS3(#define notVisible variousS3 /* Tags */,#define forceUsed variousS3 /* Param/Obj */,#define reallyUsed variousS3 /* ParamMac */"#define variousS4 infoS._variousS40#define pureBoolAskd variousS4 /* Obj (Bool) */G#define noErrTypInd variousS4 /* Obj (Array/Ptr) : to prevent multiplea& warnings on IndexType. */"#define VariousS5 infoS._variousS56#define Dmodfd VariousS5 /* Param/obj (Array/Ptr) */"#define VariousS6 infoS._variousS6'#define MayModif VariousS6 /* Param */l'#define CheckConst VariousS6 /* Obj */ #define qualif infoT._qualifn#define generic infoT._generic(#define shared infoT._shared, #define paralTyp infoT._paralTyp#define sysTpdf infoT._sysTpdfo&#define noFreeDepdt infoT._noFreeDepdt#define noOwner infoT._noOwner &#define stopFreeing infoT._stopFreeing#define rootTyp infoT._rootTyp #define variousT infoT._variousT:#define pvNr variousT /* Fct: PseudoVoid/NeverReturns */"#define variousT1 infoT._variousT1>#define errSiz variousT1 /* Array/Strun (to prevent multiple errors 'size = 0'. */r8#define intPoss variousT1 /* EnumCst in sysHdrFiles */%#define litCsta variousT1 /* Num */n&#define SynthQualif infoT._synthQualif#define algn infoT._algnr#define enumVal u1._enumVal#define nstLvla u1._nstLvla#define nameb u1._nameb#define noPar u1._noPar'#define declaringFile u2._declaringFiled'#define listAlwdFiles u2._listAlwdFiles"!#define nxtEnumCst u2._nxtEnumCst #define namedType u2._namedTypea#define sVal u1._sVal#define uVal u1._uVal#define pVal u1._pVal)#define pseudoAttrib u2.s21._pseudoAttribi#define rEvlbl u2.s21._rEvlbl'#define ValMltplDef u2.s21._valMltplDef*#define errEvl u2.s21._errEvl!#define cstImpsd u2.s21._cstImpsds#define lValFl u2.s21._lValFl#define lEvlbl u2.s21._lEvlbl#define lclAdr u2.s21._lclAdr#define notPureBool lclAdr #define oldUsed u2.s21._oldUsed#define litCst u2.s21._litCst+#define LitCstOutsMac u2.s21._litCstOutsMac %#define inhibWaNPB u2.s21._inhibWaNPB##define unsigDiff u2.s21._unsigDiffl)#define PointedByObj u2.s21._pointedByObjp+#define PointingOnObj u2.s21._pointingOnObjs'#define FctCallSeen u2.s21._fctCallSeenn#define Einfo u2._eInfo#define ptrSem u2._ptrSem#define dpType u2._dpType#define numVal u2._numVal#define val u3._val#define hCod u3._hCod/* Shared typedefs */etypedef char Tchar;atypedef const Tchar *Tstring;/typedef Tchar *TstringNC;gOtypedef Tchar TnbBuf1[Log10MaxLongNb +1+1+1]; /* possible sign, leading digit,  ending '\0'. */;typedef TnbBuf1 TnbBuf; /* buffer type for bufLongToS() */ &typedef Tchar TnameBuf1[MaxLgtId + 1];>typedef TnameBuf1 TnameBuf; /* buffer type for bufNameToS() */Ntypedef ubyte TnameAtom; /* for local representation of nameString (,& , ). */ typedef const TnameAtom *CTname;typedef TnameAtom *TnameNC;"!typedef CTname Tname, TlitString;L+typedef int TnstLvl, TcharStream, TcharTok; Ntypedef int TenumCst; /* must stay 'int', for enum constants of 'int' type */Otypedef uint ThCode, TmacLvl, TmacExpnd, TmsgParIndex /*~LiteralCst*/, TlineNb;(#ifdef LONGLONGytypedef LONGLONG TcalcS;!typedef unsigned LONGLONG TcalcU; #elseltypedef long TcalcS;typedef ulong TcalcU;n#endifJtypedef enum {Terse=-1 /* for efficiency */, HalfVerbo, FullVerbo} Tverbo;Otypedef enum {VerifCast = -3, VerifCastF, StrictChk, NoCheck, Cmpar, LitString, K Asgn, ExtDcl, FctCall, IlgIcp, CCheck1, CCheck, CStrictChk, CStrChkExtDcln} TkTypeEquiv;L/*~ zif NoCheck != (TkTypeEquiv)0 "NoCheck must be nul (cf 'compatType')" */Ftypedef enum {ObjectSpace, TagSpace, LabelSpace, DeltdMac} TnameSpace;%typedef ulong Thistory /*~RootType*/;s#define H_EMPTY (Thistory)0#define H_ARROW H_EMPTYo#define H_DOT (H_ARROW + 1) #define H_PTR (H_DOT + 1) #define H_ARRAY (H_PTR + 1)p#define SizeHistElt 2-5#define MskHistElt (((Thistory)1 << SizeHistElt) - 1)x=/*~ zif (H_ARRAY > MskHistElt) "Bad value for SizeHistElt" */:#define MaxHistDescr sizeof(Thistory)*CHAR_BIT/SizeHistElt#typedef uint Tattrib /*~RootType*/;sM#define NoAttrib (Tattrib)0 /* here for efficiency; NoAttrib, Stati chked */SO#define StatiL (NoAttrib + 1)/* 'local' static; must be here (cf attrib()) */CN#define Stati (StatiL + 1) /* together (cf funcDef(), initOrSizFld()). */?#define Extrn (Stati + 1) /* Stati, Extrn checked together */oM#define Typdf (Extrn + 1) /* Typdf, Extrn checked together (cf decl() ) */tK#define Auto (Typdf + 1) /* Auto, Reg at end of enum (cf checkInit(), */,6#define Reg (Auto + 1) /* declObj(), ...). */#define MaxAttrib RegB/*~ zif ((int)MaxAttrib != EAttrib - BAttrib) "Pb with Tattrib" */F/*~ zif (Typdf != NoAttrib + 4) "Constraints of Tattrib not heeded" */#typedef uint Tqualif /*~RootType*/;P#define NoQualif (Tqualif)0 #define ConstQal (Tqualif)1U"#define VolatQal (ConstQal << 1)#define MaxQualif VolatQalC#define IntDelType (int)DelTypeNtypedef enum {M Void=0, Bool, Byte=Bool<<1, UByte=Byte<<1, Short=UByte<<1, UShort=Short<<1,C: Int=UShort<<1, UInt=Int<<1, Long=UInt<<1, ULong=Long<<1,#ifdef LONGLONGr" LLong=ULong<<1, ULLong=LLong<<1,#elseP9 LLong=Long /*~SameValue*/, ULLong=ULong /*~SameValue*/,F#endifG Float=ULLong<<1, Double=Float<<1, LongDbl=Double<<1, Enum=LongDbl<<1,E DelType=Enum<<1,G Ptr=DelType, Array=Ptr+IntDelType, /* Ptr/Array checked together (cf,& primQualif(), authzdType(). */ Fct=Array+IntDelType, VFct==#define X7FFF 0x7FFF#if INT_MAX == X7FFF ~INT_MAXD& /*~ zif Fct > X7FFF "Problem..." */#elseF Fct+IntDelTypeC#endifO , /* Fct/VFct checked together (cf IsFct macro); Array/VFct checked togetherO- (cf IsArrFct macro, compatType()). */kI Struc=VFct+IntDelType, Union=Struc+IntDelType /* Struc/Union checked>& together (cf IsStrun macro). */ } TtypeSort;L/* TtypeSort constraint 1 : Fct, VFct, Struc, Union supposed to be last (seeB 'cast' check on types in term10(), see also expr(), exprN(). */7/* zif Fct != Void + __extent(TtypeSort) - IntDelType*3+- "TtypeSort constraint 1 not heeded" */ K/* TtypeSort constraint 2 : Array just after Ptr (see primQualif()/LPAR) */ H/*~ zif Array != Ptr + IntDelType "TtypeSort constraint 2 not heeded" */N/* (Weak) TtypeSort constraint 3 : Enum just before DelType (see compatType(),& typeToS(), NumBoolOther ). */C/*~ zif Enum != DelType >> 1 "TtypeSort constraint 3 not heeded" */ O/* (Weak) TtypeSort constraint 4 : Array just before Fct (see IsArrFct macro); o4 VFct just after Fct (see IsFct macro). */J/* zif VFct != Array + IntDelType*2 "TtypeSort constraint 4 not heeded" */H/* TtypeSort constraint 5 : 'Uxx' just after 'xx' (see computeCstType(), specialCaseOp(). */ O/*~ zif UByte!=Byte<<1 || GapNxtVarie!=2 "TtypeSort constraint 5 not heeded" */AN/* TtypeSort constraint 6 : arithmetic types to be adjacent, and in increasing- width order (cf management of casts). */c#ifdef LONGLONGrE/*~ zif LongDbl-Byte != 0x1FFE "TtypeSort constraint 6 not heeded" */s#define PosDelT 15>/*~ zif 1</*~ zif 1<= (Tattrib)1 << NbBitsAttrib)o4 "Bad field size for storing attribute" */#define NbBitsParQal 21/*~ zif (MaxParQal >= (TparQal)1 << NbBitsParQal)nB "Bad field size for storing formal parameter d-qualifier" */typedef struct {L uint _fldSize:SmallestWdthInt; /* also to force efficient alignment */ Tattrib _attriba:NbBitsAttrib; TparQal _parQal:NbBitsParQal;a bool _fldFl:1;t bool _memberFl:1; bool _declFl:1; bool _noNewTypeFl:1;t bool _signedInt:1;n bool _variousD:1; bool _variousD1:1;#define NbFlags 7,L#define Pad INT_BIT - SmallestWdthInt - NbBitsAttrib - NbBitsParQal- NbFlags3 uint :Pad; /* to force efficient alignment */s } TinfoDecl;#undef NbBitsParQaln#undef NbFlags #undef Pad e"typedef struct _TdeclElt TdeclElt;typedef TdeclElt *TpDeclElt;Ntypedef TpDeclElt TdeclList; /* 'parallel' type, to differentiate a list from- a pointer on elements of the list. */ struct _TdeclElt { Tname idName; ThCode hCode;s TpcTypeElt type; TinfoDecl infoD;N TdeclList cdr;b};#define NbBitsKind 3'/*~ zif MaxKind >= (Tkind)1<= (Tqualif)1<= (Talgn)1< incompletei type). */; /* *doIt* size in bits (for err in '>>', '<<') */t union { > size_t _lim; /* Array: index limit (-(1U) if incorrect or0 non positive size-giving expression, 0 if unspecified). */,0 TsemanElt *_frstEnumCst; /* Enum */1 TdeclList _paramList; /* Fct, VFct */eB TdeclList _memberList; /* Struct/Union (root element) */ } u1;6 union {)= TpcTypeElt _indexType; /* Array, Ptr: type of size-giving - expression (NULL if invalid type). */ 6 TsemanElt *_tagId; /* Struct/Union/Enum */ } u2;n union {(H TpcTypeElt _nextTE; /* points on next element of type chain, */@ TsemanElt *_typeId; /* or, for 'parallel' type elements, on$ parallel type identifier. */ } u3;n};M/*~ zif (size_t)&(((TtypeElt*)0)->nextTE) + sizeof(((TtypeElt*)0)->nextTE) !=BB sizeof(TtypeElt) "Beware, freed typeElt may still be used..." */typedef union {  ulong _eInfo;U struct {( Tattrib _pseudoAttrib: NbBitsAttrib;6 bool _rEvlbl: 1; /* True if constant expression */M bool _valMltplDef: 1; /* True if constant expression has several possiblet values. */9 bool _errEvl: 1; /* True if error (overflow) occurredn during evaluation. */L= bool _cstImpsd: 1; /* True if type imposed by constant */(6 bool _lValFl: 1; /* True if operand has address */F bool _lEvlbl: 1; /* True if address is constant (for 'auto' class,B if address stays constant during function evaluation). */7 bool _lclAdr: 1; /* True if address inside stack */"7 bool _oldUsed:1; /* previous value of 'used' bit */ K bool _litCst: 1; /* True if there exists an unnamed constant in expr */cM bool _litCstOutsMac: 1; /* True if unnamed constant not found in macro */SG bool _inhibWaNPB:1; /* True => inhibit warnings on 'notPureBool' */nI bool _unsigDiff: 1; /* True if diff. of unsigned met in expression */fC bool _pointedByObj: 1;/* True if expr. is pointed by 'ptrId' */a? bool _pointingOnObj:1;/* True if expr. points on 'ptrId' */d bool _fctCallSeen:1; } s21; } TREInfo;typedef struct {H TpcTypeElt type; /* NULL indicates type error in expression */9 TsemanElt *ptrId; /* pointer on (root) identifier */b4 Thistory hist; /* for objects not constants */K union { /* values of expression (if evaluable: flag 'xEvlbl' set) */l6 TcalcS _sVal; /* numeric value (if signed) */8 TcalcU _uVal; /* numeric value (if unsigned) */H const char *_pVal; /* pointer value ('char *', so that it can be compared). */ } u1; @ Ttok topOper; /* top operator of the expression tree */ TmacLvl macLvl; TREInfo u2; } TresulExp;3/*~zif sizeof(((TresulExp *)0)->u2) > sizeof(ulong) B "Einfo = 0 won't reset all bit fields in structure s21" */#undef NbBitsAttribntypedef struct { Ttok tok; Tname name; D bool error; /* cannot be in a union with 'name', because of macro expanding to string. */t union {  TsemanElt *_ptrSem; TcalcS _numVal; TpcTypeElt _dpType;u } u2;x union { uint _val;n ThCode _hCod; } u3;v } TvalTok;#endif /* ifndef DC_TH *//* End DC.TH */ *[DCC_DISTRIB.SRC]DCBLK.C;43+,m.*/( 4P*(-"0123KPWO+56@W1e7S89G(HJ  /* DCBLK.C */(/* Y.L. Noyelle, Supelec, France 1994 */J/* Manages blocks and associated identifiers; also symbol table and string literals. */#include #include #include "dcblk.h"#include "dcblk.ph"#include "dcdecl.h"#include "dcdir.ph"#include "dcext.h"#include "dcinst.h"#include "dcmain.h"#include "dcprag.h"#include "dcrec.h"#include "dcrec.ph"P#define PosEndNameStoArr (Offset(TnameBlk, nameSto) + SizeNameStorageChunk \ * sizeof(TnameAtom))P#define SizeNameStorageChunk ((SizeNameStorageBlk - Offset(struct _bid, bid))/ \ sizeof(TnameAtom)) DefRepresType/* Structures definitions */&typedef struct _TblkStkElt TblkStkElt;struct _TblkStkElt { TdescrId *headSameBlk;+ Tname pFreeNameStorage, endCurNameStoBlk; size_t lastStrLitLgt; TnstLvl baseNstLvl; TblkStkElt *prec;}; "typedef struct _TnameBlk TnameBlk;Estruct _bid{ /* just to allow computation of SizeNameStorageChunk */ TnameBlk *bid1, *bid2; TnameAtom bid;};struct _TnameBlk { TnameBlk *next, *prec;* TnameAtom nameSto[SizeNameStorageChunk];};>/*~zif (Offset(struct _bid, bid) != Offset(TnameBlk, nameSto))4 "struct _bid non coherent with TnameBlk" */./*~zif (SizeNameStorageBlk < sizeof(TnameBlk))4 "incorrect struct _TnameBlk organization" *//* Function profiles */'static TdescrId *allocDescrIdElt(void);Fstatic TblkStkElt *allocBlkStkElt(void), *freeBlkStkElt(TblkStkElt *);Bstatic TsemanElt *allocSemanElt(void), *freeSemanElt(TsemanElt *);*static void initSymTab(void), stats(void);./* Global variables (should be hidable !!!) */+static const TnameAtom *litPtr, *endLitBuf;static TdescrId *pCurIdInBlk;Mstatic TblkStkElt *pTopBlkStk; /* top of (nested) blocks description stack */Lstatic Tname pFreeLblSpace = NULL, endLblNameBlk = NULL; /* to manage label name string space. */9static AllocXElt(allocBlkStkElt, TblkStkElt *, ctrBSE, ;)8static AllocXElt(allocDescrIdElt, TdescrId *, ctrDIE, ;)6static AllocXElt(allocSemanElt, TsemanElt *, ctrSE, ;)TnstLvl baseNstLvl(void){ return pTopBlkStk->baseNstLvl;}3static int cmpId(Tname id1, Tname id2) /*~Utility*/{ int w;> if ((w = memcmp(id1 + LgtHdrId, id2 + LgtHdrId, *(((Lgt(id1); < Lgt(id2))? id1 : id2) + DispLgtId))) != 0) return w;) return (int)Lgt1(id1) - (int)Lgt1(id2);}Tname curIdName(void){ return pCurIdInBlk->idName;}void enterBlock(void){ register TblkStkElt *w; w = allocBlkStkElt();5 w->pFreeNameStorage = pTopBlkStk->pFreeNameStorage;5 w->endCurNameStoBlk = pTopBlkStk->endCurNameStoBlk; w->headSameBlk = NULL; w->baseNstLvl = ++nestLvl;) w->prec = pTopBlkStk; /* push */1 pTopBlkStk = w; /* new blockDescriptor. */ }$TsemanElt *enterSymTab(Tname idName){F return enterSymTabHC(idName, (idName != NULL)? hCodFct(idName) : 0);}4TsemanElt *enterSymTabHC(Tname idName, ThCode hCode)K/* Returns NULL if symbol already exist in current block (same name space);G else enters symbol into symbol table, and chains it to other symbols defined in same block. */{ TdescrId *pId;O if ((pId = enterSymTabHC1(idName, hCode)) == NULL) return NULL; /* identifier- already existing in the same block. */K pId->sameBlk = pTopBlkStk->headSameBlk; /* record new identifier */P pTopBlkStk->headSameBlk = pId; /* (declared at current block level). */+ return (pId->pIdSeman = allocSemanElt());}4TdescrId *enterSymTabHC1(Tname idName, ThCode hCode)N/* 'idName' is supposed to have its own storage, that becomes owned by the new descriptionId element. */{ register TdescrId *pId, **w; TdescrId *pIdMacro = NULL;7 register TnstLvl realNstLvl = pTopBlkStk->baseNstLvl;N if (idName != NULL) { /* if name exist, try to enter it into symbol table */N w = &symTabHeads[hCode & (SizeSymTab - 1)]; /* address of pointer on first4 element of corresponding 'small table'. */M /* Search if identifier already there, in the same block ('pId' used here& as temporary roaming index). */2 for (pId = *w; pId != NULL; pId = pId->next) {L if ((int)pId->nstLvl!=realNstLvl && pId->nstLvl>=0) break; /* exiting4 current block (macro names are skipped). */D if (*(pId->idName + DispLgtId)==*(idName + DispLgtId) /* sameI length ? */ && memcmp(pId->idName, idName, FullLgt(idName))==0) {B if (pId->nstLvl >= 0) return NULL; /* already there... */G pIdMacro = pId;}} /* there exist a macro with the same name */ pId = allocDescrIdElt();M if (pIdMacro == NULL) { /* add new identifier at front of 'small table',; so symbol table as a whole organized as stack. */L if ((pId->next = *w) != NULL) (*w)->prec = pId; /* double chaining */- pId->prec = (TdescrId * /*~OddCast*/)w; *w = pId;}N else { /* do not mask macro (and do not change its descriptor address !),B so add new identifier just after macro (of same name). */F if ((pId->next = pIdMacro->next) != NULL) pId->next->prec = pId; pId->prec = pIdMacro; pIdMacro->next = pId;}}+ else pId = allocDescrIdElt(); /* stub */ pId->idName = idName;! pId->nstLvl = (long)realNstLvl; return pId;}void exitBlock(void){ TdescrId *w; Tname curEndNameSto; TsemanElt *pId; #ifdef debug TnstLvl prevNstLvl = nestLvl;#endifF if (printStat && macroExpand) stats(); /* !macroExpand => exitBlock& called in #define processing. */ nestLvl--;L /* Get rid of all symbols and stubs declared in block being exited (exceptK for labels if not exiting function; then move them to outer block). */N curEndNameSto = pTopBlkStk->endCurNameStoBlk; /* free their name storage */ w = pTopBlkStk->headSameBlk;) pTopBlkStk = freeBlkStkElt(pTopBlkStk); while (w != NULL) { #ifdef debug if (w->nstLvl != prevNstLvl) sysErr(ExCod4);#endif ignoreErr = False; pId = w->pIdSeman;N if (pId->kind!=Label || nestLvl==0) { /* not a label, or function exit */ Tname symName;< if ((symName = w->idName) != NULL) { /* not a stub */& /* Check various conditions */ if (!pId->used" && pId->attribb!=ExtrnM && (warnNUI || pId->kind==Obj && (pId->type==NULL || !IsFct(pId->& type)) && pId->initlz)) errId( (pId->kind == Param)< ? (warnNUP && !pId->forceUsed)< ? UnusedPar|NoDispLine|Warn1* : NoErrMsg2 : (pId->kind == Obj)G ? (pId->type!=NULL && IsFct(pId->type))F ? UnusedFct|NoDispLine|Warn1|PossErr1 : (pId->initlz)6 ? (pId->forceUsed)0 ? NoErrMsgJ : UnusedVar|NoDispLine|Warn1|PossErrE : UslObj|NoDispLine|Warn1|PossErr5 : (pId->kind == Type)I ? UnusedTypeId|NoDispLine|Warn1|PossErr; : (pId->kind <= StrunTag)H ? UnusedTag|NoDispLine|Warn1|PossErr< : (pId->kind == EnumCst)N ? UnusedEnumCst|NoDispLine|Warn1|PossErr< : (pId->kind == Label)N ? UnusedLabel|NoDispLine|Warn1|PossErrA : (pId->kind == ParamMac)F ? UnusedMacPar|Warn2|PossErrN : UnusedId|NoDispLine|Warn1|PossErr,@ pId, symName, nameToS(curFctName), (pId->MsngConstQM)? errTxt[ MsngConstQ] : NULL); if (! pId->defnd) {L if (pId->kind == Label) errId(UndefLab~DCC.BCKm"CC_DISTRIB.SRC]DCBLK.C;43P*0el|NoDispLine, pId, symName,& nameToS(curFctName), NULL);M else if (pId->kind == StrunTag) {if (pId->attribb != Extrn) errId1(? (pId->used)? UndefTag|NoDispLine : UndefTag|NoDispLine|Warn1| PossErr, pId, NULL);}J else if (nestLvl<0 && pId->attribb==Extrn && isBodyHdrFile(pId->? declaringFile)) errId1(ExtObjNotDef|NoDispLine|Warn2|PossErr, pId, NULL);? /* tests 'declaringFile', and not 'defFileName', because ofB possible inclusion of non-header file in (body) header file. */M else if (pId->attribb==Stati && pId->type!=NULL && IsFct(pId->type)A ) errId1((pId->used)? StaFctNotDef|NoDispLine : StaFctNotDef|- NoDispLine|Warn1|PossErr, pId, NULL);} if ( !pId->Dmodfd && (pId->kind==Param || pId->kind==Obj9 && (pId->CheckConst || verifAllPtrForConst)> && pId->attribb>NoAttrib && pId->attribb!=Extrn) && askConstFl) {H if (tstPtd(pId->type, False) & NOTALLCONST && pId->defnd /* cf ~NotUsed */) {) TpcTypeElt w = pId->type, w1; cExp.ptrId = pId; cExp.Einfo = 0; cExp.hist = H_EMPTY;1 while ((w1 = NxtTypElt(w)) != NULL) {N if ((pId->kind==Param || IsPtr(w) /* only Ptr, for non-parameterB array stands for its elements. */) && !(IsArr(w) && (cExp.histB & MskHistElt)==H_ARRAY) && tstPtd(w, True) & NOTALLCONST) errId(C (IsPtr(w))? PtrShdBeConst|NoDispLine|Warn1|Rdbl :- ArrShdBeConst|NoDispLine|Warn1|Rdbl, pId,' decoratedName(&cExp),& nameToS(curFctName),: (IsPtr(w1))? errTxt[EGConstPtr] : NULL);> PushHist(((IsPtr(w))? H_PTR : H_ARRAY)); /* for decoratedName(). */ w = w1;}}L else if (pId->kind==Param && pId->MayModif) errId2(BadDPForFctPar|B NoDispLine|Warn1, pId, nameToS(curFctName), dpName(MAYMODIFY));}- /* Remove symbol from symbol table */ w->prec->next = w->next;6 if (w->next != NULL) w->next->prec = w->prec;}B if (notInitVarList != NULL) checkNotInitVarAndSuppress(pId);I /* Stub or not, free associated type chain, semanElt, descriptor */ freeTypes(pId); (void)freeSemanElt(pId); w = freeDescrIdElt(w);}. else { /* label, and not function exit */ TdescrId *w1; w1 = w;G w = w->sameBlk; /* must be here, because field 'sameBlk' is going to change. */P w1->nstLvl = pId->nstLvla = pTopBlkStk->baseNstLvl;/* move to */F w1->sameBlk = pTopBlkStk->headSameBlk; /* outer */> pTopBlkStk->headSameBlk = w1; /* block.*/ pId->inner = pId->defnd;}}O /* Free (non-label) name storage (keep one more block than needed at present,1 so that calls to 'malloc' are minimized). */6 if (curEndNameSto != pTopBlkStk->endCurNameStoBlk) {L TnameBlk *w1, *w2, *nxtNameBlk = ((TnameBlk * /*~OddCast*/)(pTopBlkStk->4 endCurNameStoBlk - PosEndNameStoArr))->next;E w1 = (TnameBlk * /*~OddCast*/)(curEndNameSto - PosEndNameStoArr);N while (w1->next != NULL) {w1 = w1->next;} /* to reclaim waiting blocks */J while (w1 != nxtNameBlk) {w2 = w1->prec; free(w1); ctrNSB--; w1 = w2;} nxtNameBlk->next = NULL;}P /* If exiting from a function, free label name storage (keep one block, as for name storage). */* if (nestLvl==0 && pFreeLblSpace!=NULL) {B TnameBlk *precNameBlk, *curNameBlk = (TnameBlk * /*~OddCast*/)- (endLblNameBlk - PosEndNameStoArr);F while ((precNameBlk = curNameBlk->prec) != NULL) {free(curNameBlk)- ; ctrNSB--; curNameBlk = precNameBlk;}3 pFreeLblSpace = (Tname)&curNameBlk->nameSto[0];: endLblNameBlk = (Tname)curNameBlk + PosEndNameStoArr;}}>static FreeXElt(freeBlkStkElt, TblkStkElt *, ctrBSE, ; , prec)9FreeXElt(freeDescrIdElt, TdescrId *, ctrDIE, ; , sameBlk)>static FreeXElt(freeSemanElt, TsemanElt *, ctrSE, ; , u1._bid)TlitString getLitString(void)8/* 'exitBlock()' must be called when done with string */{ TlitString result;< enterBlock(); /* for string storage reclaiming purpose */< if (curTok.tok != CSTST) {err0(StrCstExptd); return NULL;} result = ptrFreeIdSpace();: do {analStrCst(&storeStrCh);} while (NxtTok() == CSTST); storeStrCh('\0'); return result;}(char getNxtStrLitChar(void) /*~Generic*/{ if (litPtr == endLitBuf) {A TnameBlk *nxtNameBlk = ((TnameBlk * /*~OddCast*/)(endLitBuf -& PosEndNameStoArr))->next;% litPtr = &nxtNameBlk->nameSto[0];/ endLitBuf = litPtr + SizeNameStorageChunk;} return (char)*litPtr++;}void initBlk(void){ register TnameBlk *w; static bool frstInit = True; if (frstInit) { initSymTab();B /* Initialize blockStack and identifiers nameString storage */" pTopBlkStk = allocBlkStkElt();2 pTopBlkStk->prec = NULL; /* bottom of stack */# pTopBlkStk->headSameBlk = NULL;% pTopBlkStk->baseNstLvl = nestLvl;! MyAlloc(w, sizeof(TnameBlk));B /*~zif ((ptrdiff_t)SizeNameStorageChunk < MaxLgtId + LgtHdrId)- "SizeNameStorageBlk too small" */ ctrNSB++; w->prec = w->next = NULL;= pTopBlkStk->pFreeNameStorage = ConvTname(&w->nameSto[0]);C pTopBlkStk->endCurNameStoBlk = ConvTname(w) + PosEndNameStoArr; frstInit = False; }}2size_t initGetStrLit(TlitString x) /*~PseudoVoid*/K/* Does initializations for access to string literal 'x' (adjacent literalsM coalesced), and answers length (including ending '\0') of last seen string literal. */{ if (x != NULL) {- endLitBuf = pTopBlkStk->endCurNameStoBlk; /* Search beginning block */8 while ((size_t)(endLitBuf - x) > sizeof(TnameBlk)) {D TnameBlk *precNameBlk = ((TnameBlk * /*~OddCast*/)(endLitBuf -& PosEndNameStoArr))->prec;C endLitBuf = &precNameBlk->nameSto[0] + SizeNameStorageChunk;} litPtr = x;}# return pTopBlkStk->lastStrLitLgt;}%TsemanElt *initGetNxtIdInCurBlk(void){( pCurIdInBlk = pTopBlkStk->headSameBlk;= return (pCurIdInBlk == NULL)? NULL : pCurIdInBlk->pIdSeman;}static void initSymTab(void){# TdescrId **ptr = &symTabHeads[0];B do {*ptr++ = NULL;} while (ptr <= &symTabHeads[SizeSymTab - 1]);}TsemanElt *nxtId(void){% pCurIdInBlk = pCurIdInBlk->sameBlk;= return (pCurIdInBlk == NULL)? NULL : pCurIdInBlk->pIdSeman;}TlitString ptrFreeIdSpace(void){ pTopBlkStk->lastStrLitLgt = 0;2 return (TlitString)pTopBlkStk->pFreeNameStorage;}%TsemanElt *searchSymTab(Tname idName){1 return searchSymTabHC(idName, hCodFct(idName));}ATsemanElt *searchSymTabHC(register Tname adBegName, ThCode hCode)H/* Returns NULL if symbol not found in the whole symbol table (same name space). */{ TdescrId *pCurId;' SearchSym(adBegName, MacroNotVisible)3 return (pCurId == NULL)? NULL : pCurId->pIdSeman;}static void stats(void)I/* Print symbol table content for current block, in alphabetical order */{& Tname lowLimit = ConvTname("\1\0 "); uint lowLimitPos; bool identSeen = False; for(;;) { TdescrId *pCurId, *pMinId;/ Tname curMinId, maxId = ConvTname("\1\0~"); uint posit, minIdPos; curMinId = maxId;L for (posit = 0, pCurId = pTopBlkStk->headSameBlk; pCurId != NULL; pCurId& = pCurId->sameBlk, posit++) { int w;7 if (pCurId->idName == NULL) continue; /* stub */D if (((w = cmpId(pCurId->idName, lowLimit))>0 || w==0 && posit>; lowLimitPos) && cmpId(pCurId->idName, curMinId)<0) {" curMinId = pCurId->idName; minIdPos = posit; pMinId = pCurId;}}! if (curMinId == maxId) break; lowLimit = curMinId; lowLimitPos = minIdPos; {( TsemanElt *pId = pMinId->pIdSeman;K if (pId->kind!=Label || pId->defnd && !pId->inner) { /* output label& only at definition level. */H emitS((identSeen)? "\n" : (identSeen = True, errTxt[SeparMsg])); emitS("- ");! emitS(nameToS(curMinId)); {next) {nbIdBckt++; nbId++;} if (nbIdBckt != 0) {; if (nbIdBckt > maxNbIdBckt) maxNbIdBckt = nbIdBckt;w nbUsedBckts++;}}= emitS("\n"); emitS(longToS((long)nbId)); emitS(" id(s)");D emitS("; nb buckets used: "); emitS(longToS((long)nbUsedBckts));G emitS("; max bucket filling: "); emitS(longToS((long)maxNbIdBckt));l? emitS("; nbUnivEltChunks: "); emitS(longToS((long)ctrUEC));/ emitS("\n");}t} Tname storeLabelName(Tname x) L/* Cannot use same name string storage as 'storeName', because labels may beN moved from one block to an outer one; so storage must not be freed at block& exit, but only at function exit. */{a TnameNC ptr; size_t size; size = FullLgt(x);- if (pFreeLblSpace + size > endLblNameBlk) {* TnameBlk *nxtNameBlk;e* MyAlloc(nxtNameBlk, sizeof(TnameBlk)); ctrNSB++;6 nxtNameBlk->prec = (endLblNameBlk == NULL)? NULL :B (TnameBlk * /*~OddCast*/)(endLblNameBlk - PosEndNameStoArr);, pFreeLblSpace = &nxtNameBlk->nameSto[0];: endLblNameBlk = pFreeLblSpace + SizeNameStorageChunk;}, ptr = (TnameNC /*~OddCast*/)pFreeLblSpace; pFreeLblSpace += size;G memcpy(ptr, x, FullLgt(x)); /* copy name into new allocated space */tB *(ptr + DispNSId) = (TnameAtom)LabelSpace; /* set name space */ return (Tname)ptr;}&Tname storeName(Tname x, TnameSpace y)K/* Allocates a memory block to store contiguously the name 'x', and returnsr: pointer on stored name. Storage freed at block exit. */{= TnameNC ptr; size_t size;) register TblkStkElt *pTBS = pTopBlkStk;I size = FullLgt(x);? if (pTBS->pFreeNameStorage + size > pTBS->endCurNameStoBlk) {iN TnameBlk *nxtNameBlk = ((TnameBlk * /*~OddCast*/)(pTBS->endCurNameStoBlk -& PosEndNameStoArr))->next;6 if (nxtNameBlk == NULL) { /* needs a new block */, MyAlloc(nxtNameBlk, sizeof(TnameBlk)); ctrNSB++;  nxtNameBlk->next = NULL;K nxtNameBlk->prec = (TnameBlk * /*~OddCast*/)(pTBS->endCurNameStoBlk -e PosEndNameStoArr);bA nxtNameBlk->prec->next = nxtNameBlk;} /* double chaining */ 5 pTBS->pFreeNameStorage = &nxtNameBlk->nameSto[0];NL pTBS->endCurNameStoBlk = pTBS->pFreeNameStorage + SizeNameStorageChunk;}5 ptr = (TnameNC /*~OddCast*/)pTBS->pFreeNameStorage;b! pTBS->pFreeNameStorage += size;G memcpy(ptr, x, FullLgt(x)); /* copy name into new allocated space */L8 *(ptr + DispNSId) = (TnameAtom)y; /* set name space */ return (Tname)ptr;}Ivoid storeStrCh(char x)aE/* Strings are stored in the "name" area, freed only at block exit */ {I TblkStkElt *pTBS = pTopBlkStk;% Tname ptr = pTBS->pFreeNameStorage;aO if (ptr == pTBS->endCurNameStoBlk) ptr = storeName((Tname)"", (TnameSpace)0);- /* to force allocation of a new block */,E *(TnameNC /*~OddCast*/)ptr++ = (TnameAtom)x; /* store character */i pTBS->lastStrLitLgt++; pTBS->pFreeNameStorage = ptr;e}t/* End DCBLK.C */ *[DCC_DISTRIB.SRC]DCBLK.H;6+,h./( 4LJ-"0123KPWO56 1R7{VS89G(HJ /* DCBLK.H */(/* Y.L. Noyelle, Supelec, France 1994 */#ifndef DCBLK_H#define DCBLK_H#include "dc.th"/* Function profiles */ extern TnstLvl baseNstLvl(void);extern Tname curIdName(void);extern void enterBlock(void);Dextern TsemanElt *enterSymTab(Tname), *enterSymTabHC(Tname, ThCode);extern void exitBlock(void);%extern TlitString getLitString(void);0extern char getNxtStrLitChar(void) /*~Generic*/;-extern TsemanElt *initGetNxtIdInCurBlk(void);8extern size_t initGetStrLit(TlitString) /*~PseudoVoid*/;extern TsemanElt *nxtId(void);'extern TlitString ptrFreeIdSpace(void);Lextern TsemanElt *searchSymTab(Tname), *searchSymTabHC(Tname, ThCode hCode);Aextern Tname storeLabelName(Tname), storeName(Tname, TnameSpace);extern void storeStrCh(char);#endif /* ifndef DCBLK_H *//* End DCBLK.H */*[DCC_DISTRIB.SRC]DCBLK.PH;8+,q./( 4L6-"0123KPWO56nT=R7S89G(HJ/* DCBLK.PH */(/* Y.L. Noyelle, Supelec, France 1994 */#ifndef DCBLK_PH#define DCBLK_PH#include "dcrecdir.th"/* Function profiles */Lextern TdescrId *enterSymTabHC1(Tname, ThCode), *freeDescrIdElt(TdescrId *);extern void initBlk(void);#endif /* ifndef DCBLK_PH *//* End DCBLK.PH */*[DCC_DISTRIB.SRC]DCCFILES.MNG;5+,g./( 45-"0123KPWO560p7ZS89G(HJ/* DCCFILES.MNG */ #ifdef VMS#define DccDir "dccdir:"##define SysInclDir "dccsysincldir:"#elif defined(_WIN32).#define DccDir "c:\\developm\\visualc\\dcc\\"5#define SysInclDir "c:\\developm\\visualc\\include\\"#else0#define DccDir "/usr/local/lib/" "DccExecFiles/"!#define SysInclDir "/usr/include"#endif!#define StarterFile "starter.dcc"&#define AdjustFilesList "adjFiles.dcc"/* End DCCFILES.MNG */*[DCC_DISTRIB.SRC]DCDECL.C;1739+,./( 4V-"0123KPWO56)Q73OS89G(HJ@/* DCDECL.C */(/* Y.L. Noyelle, Supelec, France 1994 */ #ifdef VMS1#pragma noinline (errMsngStati, getINDEXTYPEtype) #pragma noinline (cleverSkipTok)#endif#include #include #include #include -#include /* memcmp, strchr used */#include "dcdecl.h"#include "dcdecl.ph"#include "dcblk.h"#include "dcdir.h"#include "dcexp.h"#include "dcext.h"#include "dcinst.h"#include "dcmain.h"#include "dcprag.h"#include "dcrec.h"#include "dctxttok.h"/* Miscelleanous */@#define BoolHCode 0x181C /* to be changed if hCodFct changes */##define BoolTName (Tname)"\4\0bool"B#define InfoDcl(wName, xmemberFl, ydeclFl, znoNewTypeFl) \J static TinfoDecl wName = { /* 'static' to avoid local compiler \ gross inefficiency. */\5 0-0 /*~ zif (! __member(_fldSize)) \; "misplaced initialization for field '_fldSize'" */,\< NoAttrib+0-0 /*~ zif (! __member(_attriba)) \; "misplaced initialization for field '_attriba'" */,\; NoParQal+0-0 /*~ zif (! __member(_parQal)) \; "misplaced initialization for field '_parQal'" */,\; (bool)(0-0) /*~ zif (! __member(_fldFl)) \; "misplaced initialization for field '_fldFl'" */,\; xmemberFl /*~ zif (! __member(_memberFl)) \; "misplaced initialization for field '_memberFl'" */,\7 ydeclFl /*~ zif (! __member(_declFl)) \; "misplaced initialization for field '_declFl'" */,\@ znoNewTypeFl /*~ zif (! __member(_noNewTypeFl)) \; "misplaced initialization for field '_noNewTypeFl'" */,\> (bool)(0-0) /*~ zif (! __member(_signedInt)) \; "misplaced initialization for field '_signedInt'" */,\= (bool)(0-0) /*~ zif (! __member(_variousD)) \; "misplaced initialization for field '_variousD'" */,\B (bool)(0-0)||False /*~ zif (! __member(_variousD1)) \; "misplaced initialization for field '_variousD1'" */,\& /*~ zif ! __member() \B "Structure '" ConvToString(wName) "' not fully initialized" */ \ }@#define MainHCode 0x1C01 /* to be changed if hCodFct changes */0#define OutsideStrunInit QuasiNULLval(TdeclList)#define Sgnd (Tqualif)1#define StartTagCh '#',#define VerySpclRule QuasiNULLval(TdeclList)/DefRepresType /* define represType function *//DefIsSameName /* define isSameName function *//* Type definitions */typedef struct { Tname idName; ThCode hCode; TpcTypeElt headType, tailType; } TcreatType;struct _TtagVisi;"typedef struct _TtagVisi TtagVisi;struct _TtagVisi { int brLvl; TsemanElt *pTagId; TtagVisi *preced;};/* Function profiles */$static TpTypeElt allocTypeElt(void);Mstatic void accumulateQal(TpcTypeElt, TpcTypeElt), chkEndAccumQal(TpcTypeElt,I TpcTypeElt), checkWrngHdrFile(const TsemanElt *), cleverSkipTok(void), K computeSize(TpTypeElt), declObj(TdeclList), defFunc(TdeclList), defStrun(O TsemanElt *, TtypeSort, Tname), errMsngStati(Tname), freeDeclList(TdeclList),P init(TpTypeElt, bool, bool, TmacExpnd), initCreateTagName(void), initOrSizFld(H TdeclList, TsemanElt *), makeGeneric(TpTypeElt), manageFctDPrags(const! TdeclElt *), nbBits(TdeclList);static Tattrib attrib(void);Kstatic TdeclList allocDeclElt(void), createDLElt(TcreatType /*~MayModify*/,E TinfoDecl, TpcTypeElt, Tqualif), decl1(TinfoDecl), decl3(TdeclList,/ TpcTypeElt, Tqualif), freeDeclElt(TdeclList);=static Tqualif arrQal(TpcTypeElt, Tqualif), typeQualif(void);static TcreatType declId(void);Kstatic TsemanElt *enterEnumTagName(Tname, TinfoSeman), *errAlrdDefId(Tname, TpcTypeElt, Tkind);Dstatic TtagVisi *allocTagListElt(void), *freeTagListElt(TtagVisi *);"static Tname createTagName(Tname);#static TpcTypeElt nativeType(void);Ostatic bool compatTypeR(TpcTypeElt, TpcTypeElt, TkTypeEquiv), rowUp(TpcTypeElt,/ TpcTypeElt), sameQal(TpcTypeElt, TpcTypeElt);/* Objects declarations */Bstatic int braceLvl; /* +/- 1 at each strun opening/closing brace inside strun. */2static TdeclList curInitMember = OutsideStrunInit;,static size_t curInitArrayIndex = ArrLimErr;/static TpcTypeElt curInitArrayIndexType = NULL;static Tstring fileAtBegDecl;static TlineNb lineAtBegDecl;static bool mainFl;static bool msngAttribFl;@InfoDcl(noNewTypeInfo, False/*memberFl*/, False /*declFl*/, True /*noNewTypeFl*/);Pstatic TtagVisi *pTagList; /* head of list of strun to be rendered invisible */static bool signSpecSeen;Gstatic const TtypeElt valInitTypeElt; /* static => initialized to 0 =>- all fields either False, NULL, or 0. */5static const Ttok rBraSCol[] = {RBRA, SCOL, EndSTok};5static const Ttok sColLBra[] = {SCOL, LBRA, EndSTok};5static const Ttok sColRBra[] = {SCOL, RBRA, EndSTok};Dstatic const Ttok zRbraSCol[] = {NoSwallowTok, RBRA, SCOL, EndSTok};Pstatic const Ttok zCommaRBraSCol[] = {NoSwallowTok, COMMA, RBRA, SCOL, EndSTok};Pstatic const Ttok zCommaRParSCol[] = {NoSwallowTok, COMMA, RPAR, SCOL, EndSTok};Nstatic const Ttok zCoScEdpRPRB[] = {NoSwallowTok, COMMA, SCOL, ENDDPRAG, RPAR, RBRA, EndSTok};/* External objects */bool heedRootType = True;void prog(void){ jmp_buf mainErrRet;* curErrRet = &mainErrRet /*~ LocalAdr */;C if (setjmp(*curErrRet) != 0) { /* return point in 'panic' mode */ skipTok(sColLBra);' if (curTok.tok == ENDPROG) return;}? else {GetNxtTok(); if (Found(DOLLSIGN)) dollAlwdInId = True;} pTagList = NULL; braceLvl = 0; do { decl();" } while (curTok.tok != ENDPROG);}void decl(void){ TdeclList declList; Tattrib curAttrib;@ InfoDcl(attribAndFalseFl, False /*memberFl*/, True /*declFl*/, False /*noNewTypeFl*/); checkIndent();6 fileAtBegDecl = curFileName; lineAtBegDecl = lineNb;3 attribAndFalseFl._attriba = curAttrib = attrib();% declList = decl1(attribAndFalseFl);7 if (declList != NULL) { /* not function definition */# if (declList != VerySpclRule) {; while ((declList = freeDeclElt(declList)) != NULL) {}P if (headerFile) {if (curAttrib!=NoAttrib /* error detected in declObj() */P && !InsideInterval(curAttrib, Extrn, Typdf)) err0(ExtrnExptd | Warn2);}F else if (curAttrib==Extrn) err0(ExtDeclBeInHdrFile|Warn1|Rdbl);}* if (ignoreErr = False, !Found(SCOL)) {G errWFName(SColExptd1, lineAtBegDecl, fileAtBegDecl, NULL, errTxt[I CmplSColE1], (fileAtBegDecl == curFileName)? errTxt[At0] : NULL);! errPanic(NoErrMsg, NULL);}}}static Tattrib attrib(void){ Tattrib w;' w = (Tattrib) (curTok.tok - BAttrib);O if ((uint)w <= (uint)(EAttrib - 1 - BAttrib)) { /* if found legal attribute,B absorb token, and absorb any other (useless) 'attrib' token. */@ while (InsideInterval(NxtTok(), BAttrib, EAttrib - 1)) err0( MoreThanOneAttrib); w += StatiL;, if (w==Stati && nestLvl!=0) w = StatiL;} else w = NoAttrib; return w;}static Tqualif typeQualif(void){" Tqualif curQual, res = NoQualif; for (;;) { switch (curTok.tok) {* case CONST: curQual = ConstQal; break;* case VOLAT: curQual = VolatQal; break; default: return res;}& if (res & curQual) err0(AlrdQual); res |= curQual; GetNxtTok();}})static TdeclList decl1(TinfoDecl infoDcl)N/* May return VerySpecialRule or NULL (declaration of tag alone, or definition of function). */{ Tname tagName = NULL; TpcTypeElt type; Tqualif qual; TtypeSort typS; TsemanElt *sPtrTagId = NULL; qual = typeQualif();A if ((qual & VolatQal)!=NoQualif && infoDcl._attriba==Reg) err0(& RegVolatIncptbl|Warn2|PossErr);2 if (InsideInterval(curTok.tok, BNatTyp, SGND)) { type = nativeType();B if (type->typeSort == Int) infoDcl._signedInt = signSpecSeen;} else switch (curTok.tok) {3 case COLON: /* in case of bit-field padding */ type = &natTyp[_UINT]; break; case ENUM: { TsemanElt *ptrTagId; if (NxtTok() == IDENT) {5 tagName = storeName(curTok.name, TagSpace); GetNxtTok();}! if (curTok.tok == LBRA) {H volatile TcalcS enumCtr = -1; /* value of last enum constant;- 'volatile' because of setjmp(). */I TsemanElt *volatile pLastEnumCst = NULL, *volatile pIdEnumCst =& QuasiNULLval(TsemanElt *);" volatile bool firstTurn;6 jmp_buf localJmpBuf, *savErrRet = curErrRet; TpTypeElt enumCstType;8 DefSem(defndEnumTag, EnumTag, True /*defnd*/);M /* It is a new enum, so declare it, that is declare its enum tag */? if (infoDcl._noNewTypeFl) err0(StrunEnumDeclNotAlwd);= ptrTagId = enterEnumTagName(tagName, defndEnumTag);C /* Create a type element for associated enum constants */A enumCstType = allocTypeEltIC(ptrTagId->type, NoQualif);= enumCstType->shared = True; /* owned by EnumTag */M enumCstType->generic = True; /* for enum constants to be usable by derived types. */9 GetNxtTok(); /* here for good error position */+ /* Process enum constants list */3 curErrRet = &localJmpBuf /*~ LocalAdr */;8 if (setjmp(*curErrRet) == 0) firstTurn = True;' else skipTok(zCommaRBraSCol);- while (firstTurn || Found(COMMA)) { Tname enumCName; ThCode enumCHCode;( bool initByPrevECst = False;* ignoreErr = firstTurn = False;= if (curTok.tok != IDENT) errPanic(IdExptd, NULL);< enumCName = storeName(curTok.name, ObjectSpace);% enumCHCode = curTok.hCod;C if (NxtTok() == ASGNOP) { /* if initialized constant */ TkAsgn oper;A if ((oper = (TkAsgn)curTok.val) != SimplAsgn) err0( SimplAsgnExptd); GetNxtTok();J lExp.ptrId = NULL; /* for managePointers()/modifPtdVal() */H if (correctExprN(enumCstType, Int, True, txtAsgnTok[oper], False)) {$ enumCtr = cExp.sVal;D if (cExp.ptrId == pIdEnumCst) initByPrevECst = True;& goto initlzEnumCstL;}}K if (! computeSigAdd(enumCtr, 1, (TcalcS */*~OddCast*/)&enumCtr)#if ! NO_GREATER_INT || enumCtr>INT_MAXC#endif& ) err0(Overflow1 | Warn2);initlzEnumCstL:L if ((pIdEnumCst = enterSymTabHC(enumCName, enumCHCode))==NULL &&@ (pIdEnumCst = errAlrdDefId(enumCName, NULL, EnumCst))==NULL- ) pIdEnumCst = enterSymTab(NULL); {( /* Chain enum constants */B register TsemanElt *w = pLastEnumCst, *prevW = NULL;4 TenumCst iEnumCtr = (TenumCst)enumCtr;H while (w!=NULL && iEnumCtrenumVal) {prevW = w; w = w-> nxtEnumCst;}7 if (initByPrevECst) (void)Found(SAMEVAL);M else if ((w!=NULL && iEnumCtr==w->enumVal) != Found(SAMEVAL)) { Tchar *pBuf;6 if (w!=NULL && iEnumCtr==w->enumVal) {G /* Search name of (last) same-valued enum constant */! TsemanElt *pId; TnameBuf buf;/ (void)initGetNxtIdInCurBlk();L while (pId = nxtId(), pId->kind!=EnumCst || pId->enumVal!= iEnumCtr) {}/ bufNameToS(curIdName(), buf);" pBuf = &buf[0];}! else pBuf = NULL;N errWNSS((pBuf == NULL)? WrngSameVal|Warn1 : SameEnumCst|Warn2|B PossErr, enumCName, longToS((TgreatestInt)iEnumCtr), pBuf);}) pIdEnumCst->nxtEnumCst = w;H if (prevW == NULL) pLastEnumCst = pIdEnumCst; else prevW-> nxtEnumCst = pIdEnumCst;. pIdEnumCst->enumVal = iEnumCtr;} {< DefSem(defndEnumCst, EnumCst, True /*defnd*/);N DefSem1(notUsedEnumCst, EnumCst, False /*defnd*/, True /*used*/, False /*initlz*/); #ifdef _AIXE if (Found(NOTUSED)) pIdEnumCst->infoS = notUsedEnumCst;4 else pIdEnumCst->infoS = defndEnumCst;#elseD pIdEnumCst->infoS = (Found(NOTUSED))? notUsedEnumCst : defndEnumCst;#endif }8 if (headerFile) pIdEnumCst->attribb = Extrn;+ pIdEnumCst->type = enumCstType;M pIdEnumCst->defLineNb = lineNb; /* record */M pIdEnumCst->defFileName = curFileName;} /* birth place. */ curErrRet = savErrRet;B ((ModifType)ptrTagId->type)->frstEnumCst = pLastEnumCst;C if (pLastEnumCst == NULL) { /* no enum constant found */( enumCstType->shared = False;, (void)freeTypeElt(enumCstType);}D else ((ModifType)enumCstType)->frstEnumCst = pLastEnumCst;K if (sysAdjHdrFile && tagName==NULL && infoDcl._attriba!=Typdf) ((; ModifType)ptrTagId->type)->intPoss = True; /* 'enum' cst usable as 'int'. */3 ptrTagId->listAlwdFiles = headListPrivTo;H if (! Found(RBRA)) {err0(RBraOrCommaExptd); cleverSkipTok();}}B else { /* no left brace seen ; is tag already defined ? */< DefSem(notDefndEnumTag, EnumTag, False /*defnd*/);/ if (tagName == NULL) err0(UndefEnum);@ else if ((ptrTagId = searchSymTab(tagName)) != NULL) {? if (ptrTagId->kind == EnumTag) goto foundEnumTagL;}) else errWN(NotDefTag, tagName);G ptrTagId = enterEnumTagName(tagName, notDefndEnumTag); /* if- unknown enumTag, declare it... */foundEnumTagL: ptrTagId->used = True;G tagName = NULL;} /* enforce that variables has to be declared0 (NULLing tagName can be done because name4 storage freeing only occurs at block exit). */ type = ptrTagId->type; sPtrTagId = ptrTagId; break;} case IDENT:G if (adjustFile && isSameName(curTok.hCod, curTok.name, BoolHCode,; BoolTName)) type = &boolCstTypeElt; /* => generic */ else {) TsemanElt *ptrId = curTok.ptrSem;/ if (ptrId==NULL || ptrId->kind!=Type) {, TcharTok peep = nxtCharOrMacTok(); if ((peep < 0)6 ? peep==-(TcharTok)IDENT || peep==-(TcharTok)STAR ||4 infoDcl._prioToCast && peep==-(TcharTok)RPAR9 : isAlfa((char)peep) || peep==(TcharTok)'*' || infoDcl.6 _prioToCast && peep==(TcharTok)')') { /* should be type identifier. */ if (ptrId == NULL) {N if ((ptrId = searchSymTab(storeName(curTok.name, TagSpace) /* do9 not modify curTok.name, which may be in macro storage,7 and so, remanent */)) != NULL) {errWN(TagQM, curTok.& name); ptrId->used = True;} else {F DefSem1(artifDef, Type, True /*defnd*/, True /*used*/, False /*initlz*/);, errWN(UndefId, curTok.name);K if (!chkTypName || isupper((char)*(curTok.name + LgtHdrId))@ || (char)*(curTok.name + LgtHdrId)=='_') (void)defineId( artifDef);}}H else if (ptrId->type != NULL) errWN(NotTypeId, curTok.name); type = NULL;}# else goto forceIntTypeL;} else {" type = ptrId->namedType; ptrId->used = True;}} GetNxtTok(); break; case LBRA:L if (qual==NoQualif && infoDcl._declFl && infoDcl._attriba==NoAttrib) {> type = &natTyp[_INT]; /* to handle 'cleanly' */G break;} /* blocks declared (wrongly) at level zero. */ err0(MsngStrunEnum);M typS = Struc; /* could be Union (or Enum); just to have dcc behave the& less stupidly possible... */ goto strunTrmt;: case STRUC: GetNxtTok(); typS = Struc; goto strunTrmt;* case UNION: GetNxtTok(); typS = Union; strunTrmt: { TsemanElt *ptrTagId;< volatile TdeclList membList = NULL, lastEltMembList;4~DCC.BCK"[DCC_DISTRIB.SRC]DCDECL.C;1739VB72! jmp_buf localJmpBuf, *savErrRet = curErrRet;@ InfoDcl(memberInfo, True /*memberFl*/, False /*declFl*/, False /*noNewTypeFl*/);k" if (curTok.tok == IDENT) {5 tagName = storeName(curTok.name, TagSpace);t GetNxtTok();}gP if (curTok.tok == LBRA) {/* if left brace seen, definitely a new type */? if (infoDcl._noNewTypeFl) err0(StrunEnumDeclNotAlwd);c braceLvl++;tF if ((ptrTagId = enterSymTab(tagName)) == NULL) { /* already- defined tag; is it compatible? */d- ptrTagId = searchSymTab(tagName);d3 if (ptrTagId->type->typeSort == typS) {& if (! ptrTagId->defnd) {D /* Declared but not defined ('Very Special Rule') */O ptrTagId->defLineNb = lineNb; /* record */*O ptrTagId->defFileName = curFileName; /* birth place. */e" goto commonStrun;} if (adjustFile) {)$ freeTypes(ptrTagId);* tagName = ptrTagId->nameb;$ goto commonStrun1;}}I if (errAlrdDefId(tagName, NULL, StrunTag) == NULL) ptrTagId =,& enterSymTab(NULL);} /* stub */* /* Yet undefined tag, or stub */ commonStrun1:nK defStrun(ptrTagId, typS, tagName); /* uncomplete strun as yet */ commonStrun: type = ptrTagId->type;9 GetNxtTok(); /* here for good error position */r# /* Explore member list */l3 curErrRet = &localJmpBuf /*~ LocalAdr */;n9 if (setjmp(*curErrRet) != 0) skipTok(sColRBra);; while (curTok.tok!=RBRA && curTok.tok!=ENDPROG) {) TdeclList newMembList, w, w1;n+ memberInfo._attriba = attrib();i, newMembList = decl1(memberInfo);G if (ignoreErr = False, curTok.tok != SCOL) err0(SColExptd);iP if (memberInfo._attriba != NoAttrib) err0(NoAttribAlwd); /* checked- here for deceitless error position... */a= if (newMembList == NULL) err0(FctDeclDefNotAlwd);)3 else if (newMembList != VerySpclRule) {'8 /* Accumulate const/volatile qualifiers */. if (newMembList->type != NULL) {I ((ModifType)ptrTagId->type)->SynthQualif |= newMembList->f type->qualif;M if (IsStrun(newMembList->type)) ((ModifType)ptrTagId->type)->u9 SynthQualif |= BaseStrunType(newMembList->type)-> SynthQualif;}O /* Check that there are no double definition of member names, andiG that members are allowed and of complete type; computea qualifiers. */ 2 for (w = newMembList; w != NULL; ) {M if (w->type!=NULL && IsFct(w->type)) err0(FctDeclDefNotAlwd);iO if (w->idName != NULL) { /* not unnamed field (for non-fields,t4 naming is checked in 'initOrSizeFld'). */A for (w1 = membList; w1 != NULL; w1 = w1->cdr) {cP if (isSameName(w1->hCode, w1->idName, w->hCode, w->idName)){5 errWN(DblDefMember, w->idName);x break;}}}i8 /* Insert new member into member list */3 if (membList == NULL) membList = w;c. else lastEltMembList->cdr = w;$ lastEltMembList = w;O w = w->cdr; /* to be left there (because of next statement) */l. lastEltMembList->cdr = NULL;}}K if (ignoreErr = False, !Found(SCOL)) errPanic(NoErrMsg, NULL);}f curErrRet = savErrRet;B /* Define corresponding baseType (no more incomplete) */N if (ptrTagId->defnd) errId1(DblDefStrun, ptrTagId, NULL); /* cannot1 be checked before, because the tag mayt4 be defined by a member of the strun... */3 ((ModifType)type)->memberList = membList;y2 if (membList == NULL) err0(EmptyStrun);  else {Q /* Compute size of strun (may be a minorand, because of alignment) */n size_t size = 0;# bool fldBefore = False;c do { size_t membSize;1 if (membList->fldFl) { /* field */AN if ((membSize = (size_t)membList->fldSize) == 0) size = ((size8 + (CHAR_BITC - 1))/CHAR_BITC)*CHAR_BITC; /* round to next byte. */' else fldBefore = True;}  else { if (fldBefore) {L size = ((size + (CHAR_BITC - 1))/CHAR_BITC)*CHAR_BITC; /* round to next byte. */I% fldBefore = False;}oA membSize = sizeOfTypeD(membList->type, IncplType,t& membList->idName) * CHAR_BITC;}2 if (typS == Struc) size += membSize;8 else if (membSize > size) size = membSize;' membList = membList->cdr;S' } while (membList != NULL);cL ((ModifType)type)->size = (size + (CHAR_BITC - 1)) / CHAR_BITC;}L ((ModifType)type)->errSiz = True; /* in case size = 0 (no correct field type...). */=! ptrTagId->defnd = True;AL /* Search if there are tags to be marked 'invisible' (from outside" this declaration). */G while ((pTagList != NULL) && (pTagList->brLvl == braceLvl)) {(0 pTagList->pTagId->notVisible = True;1 pTagList = freeTagListElt(pTagList);}k if (--braceLvl > 0) {e, TtagVisi *w = allocTagListElt(); w->brLvl = braceLvl;! w->pTagId = ptrTagId;! w->preced = pTagList;; pTagList = w;}3 ptrTagId->listAlwdFiles = headListPrivTo;o; GetNxtTok();} /* here for good error position */ ' else { /* no left brace seen */I: if (tagName == NULL) errPanic(UndefStrun, NULL);N type = NULL;} /* to be able to cope with the 'Very Special Rule' */ break;} default:G if (nestLvl==0 && curTok.tok==RBRA) {curTok.tok = SCOL; errPanic(l ExtraRBra, NULL);}=I if (qual==NoQualif && infoDcl._attriba==NoAttrib && infoDcl._declFl=B ) errPanic((cUnitFName==NULL && curTok.tok==ENDPROG)? NoErrMsg : DeclExptd, NULL);0forceIntTypeL:N err0((qual!=NoQualif || infoDcl._attriba!=NoAttrib || infoDcl._declFl /*8 because function definition may have an empty baseType" and no qualif/attrib. */) ? TypeExptd|Warn1|Rdbl : TypeExptd);, type = &natTyp[_INT];} {r# Tqualif postQal = typeQualif();E' if (qual & postQal) err0(AlrdQual);iM else if (qual!=NoQualif && postQal!=NoQualif) err0(GroupQual|Warn1|Rdbl);u qual |= postQal; } P if (qual!=NoQualif && type!=NULL && IsFct(type)) errWT(UslFctQual|CWarn1|Rdbl, type);' {n" TcreatType firstId = declId();A if (tagName != NULL) { /* tag exists => Union/Struct/Enum */ if (type == NULL) {=K /* structure or union ('strun') tag alone (no 'strun-decl-list') */ TsemanElt *ptrTagId;G if (firstId.idName==NULL && firstId.headType==NULL && !infoDcl.TG _noNewTypeFl) { /* no declaration of object => 'very special ru-uI le' (K&R p213) : declaration of incompletely specified 'strun'. */) TpcTypeElt w; ? if (infoDcl._attriba != NoAttrib) err0(NoAttribAlwd);o3 if (qual != NoQualif) err0(NoQualifAlwd); 8 if ( (ptrTagId = enterSymTab(tagName))!=NULLN || (ptrTagId = errAlrdDefId(tagName, ((w = searchSymTab(tagName) ->type) != NULL) ? (w->typeSort == typS) ? QuasiNULLval(TpcTypeElt)o : NULLa@ : NULL, StrunTag))!=NULL) defStrun(ptrTagId, typS, tagName); return VerySpclRule;}cA /* Utilization of strun (at least one object is declared,e or noNewType True). */9 if ((ptrTagId = searchSymTab(tagName)) != NULL) {K if (ptrTagId->type->typeSort == typS) {sPtrTagId = ptrTagId; gotoI foundStrunTag;}N if (errAlrdDefId(tagName, NULL, StrunTag) != NULL) goto defStrunTag;% tagName = NULL;} /* stub */,H else if (infoDcl._noNewTypeFl) {err0(StrunEnumDeclNotAlwd); goto ignoreTag;}( ptrTagId = enterSymTab(tagName); defStrunTag:K defStrun(ptrTagId, typS, tagName); /* if unknown strunTag, declareE it... */afoundStrunTag: type = ptrTagId->type; ptrTagId->used = True;H if (ptrTagId->notVisible) errWN(TagNotVisi|Warn1|Rdbl, tagName); ignoreTag:;}0 else { /* there exist a strun-decl-list */> if (firstId.idName==NULL /* no identifier declared */< && infoDcl._attriba!=Typdf /* not a typedef */A && firstId.headType==NULL /* no type modifier seen */=: && !infoDcl._memberFl /* not a strun member */' && !infoDcl._noNewTypeFl) {n: /* Then declaration of a strun/enum tag alone */H if (infoDcl._attriba != NoAttrib) err0(UslAttrib|CWarn1|Rdbl);G if (ignoreErr = False, !Found(SCOL)) errWFName(IdOrSColExptd,o= lineAtBegDecl, fileAtBegDecl, NULL, errTxt[CmplSColE1],N; (fileAtBegDecl == curFileName)? errTxt[At0] : NULL);o return NULL;}}}G if (sPtrTagId!=NULL && sPtrTagId->undef) errWN(UndfndId|Warn1|Rdbl,j sPtrTagId->nameb);T { B TdeclList dList = createDLElt(firstId, infoDcl, type, qual);H return (infoDcl._noNewTypeFl)? dList : decl3(dList, type, qual);}}};"static TpcTypeElt nativeType(void){; TpcTypeElt resulType;  int codNatTyp; signSpecSeen = False;t< if (curTok.tok >= USGND) { /* 'unsigned'/'signed' seen */ signSpecSeen = True;4 codNatTyp = (curTok.tok == USGND)? DeltaTyp : 0;1 if (! InsideInterval(NxtTok(), CHAR, LONG)) {i( err0(BadIntgrlType|Warn2|PossErr); codNatTyp += _INT;}e: else {codNatTyp += curTok.tok - BNatTyp; GetNxtTok();}#ifdef LONGLONG 7 if (curTok.tok == LONG) {codNatTyp++; GetNxtTok();}*#endif }i else {C codNatTyp = (curTok.tok == CHAR)? _CHAR : curTok.tok - BNatTyp;, GetNxtTok(); if (codNatTyp == _LONG) { D if (curTok.tok == DOUBLE) {codNatTyp = _LONGDBL; GetNxtTok();}#ifdef LONGLONGrE else if (curTok.tok == LONG) {codNatTyp = _LLONG; GetNxtTok();}(#endif }}K if ((resulType = &natTyp[codNatTyp])->typeSort & (Short | UShort | Long | F ULong | LLong | ULLong) && curTok.tok==INT) GetNxtTok(); /* short/ long int'. */D while (InsideInterval(curTok.tok, BNatTyp, SGND)) {err0(UslTypSpe) ; GetNxtTok();} return resulType;C})Hstatic void defStrun(TsemanElt *ptrTagId, TtypeSort typS, Tname tagName){  TpTypeElt newElt;o6 DefSem(notDefndStrunTag, StrunTag, False /*defnd*/);: ptrTagId->type = newElt = allocTypeEltID(typS,NoQualif);O newElt->shared = True; /* the tag is the only owner of this type element */;/ newElt->tagId = ptrTagId; /* remember tag */ D newElt->algn = Alig3; /* *doIt* compute alignment from members */O /* newElt->memberList = NULL; done by initialization */ /* incomplete type */;% ptrTagId->infoS = notDefndStrunTag;m, if (headerFile) ptrTagId->attribb = Extrn;> ptrTagId->listAlwdFiles = NULL; /* a priori, not private */O ptrTagId->nameb = createTagName(tagName); /* remember nameString of strun */n= ptrTagId->defLineNb = lineNb; /* record */ A ptrTagId->defFileName = curFileName; /* birth place. */ } Astatic TsemanElt *enterEnumTagName(Tname tagName, TinfoSeman sem)u{] TsemanElt *ptrTagId; TpTypeElt newElt; H ptrTagId = enterSymTab(tagName); /* named enum or anonymous stub (for& later automatic freeing). */@ if (ptrTagId == NULL) { /* name already seen in this block */% ptrTagId = searchSymTab(tagName);aK if (ptrTagId->kind==EnumTag && !ptrTagId->defnd) {ptrTagId->infoS = sem  ; return ptrTagId;}uM if (errAlrdDefId(tagName, NULL, EnumTag) == NULL) ptrTagId = enterSymTab(d& tagName = NULL);} /* stub */ ptrTagId->infoS = sem;, if (headerFile) ptrTagId->attribb = Extrn;? ptrTagId->listAlwdFiles = NULL; /* a priori, not private */C: ptrTagId->defLineNb = lineNb; /* record */@ ptrTagId->defFileName = curFileName; /* birth place. */N ptrTagId->nameb = createTagName(tagName); /* remember nameString of enum */; ptrTagId->type = newElt = allocTypeEltID(Enum, NoQualif);;= newElt->tagId = ptrTagId; /* unique value for each enum */EO newElt->shared = True; /* the tag is the only owner of this type el:ement */ u newElt->size = IntSiz;L newElt->algn = Alig0; /* because standard says enum representation can be char<->long. */ return ptrTagId;}tstatic TcreatType declId(void)7/* if no identifier declared, 'idName' field == NULL */ {m* TpcTypeElt pBefType = NULL, pEndBefType; TpTypeElt newElt;p TcreatType curCreat; bool leftParenSeen;f; while (Found(STAR)) { /* create 'before' part of type */a/ newElt = allocTypeEltID(Ptr, typeQualif());T newElt->size = PtrSiz;G newElt->indexType = (curTok.tok == INDEXTYPE)? getINDEXTYPEtype() :T4 (moreIndexTypeChk)? &defaultIndexTypeElt : NULL;/ if (pBefType == NULL) pEndBefType = newElt;p newElt->nextTE = pBefType; pBefType = newElt;}l leftParenSeen = False; if (Found(LPAR)) { if ((curTok.tok == IDENT);: ? curTok.ptrSem!=NULL && curTok.ptrSem->kind==Type1 : curTok.tok!=STAR && curTok.tok!=LPAR) {N curCreat.idName = NULL;d curCreat.headType = NULL;T leftParenSeen = True;}D else {curCreat = declId(); if (! Found(RPAR)) err0(RParExptd);}} else { if (curTok.tok == IDENT) {< curCreat.idName = storeName(curTok.name, ObjectSpace);# curCreat.hCode = curTok.hCod;  GetNxtTok();}h else curCreat.idName = NULL; curCreat.headType = NULL;} for (;;) {A if (leftParenSeen || Found(LPAR)) { /* function declarator */y TtypeSort sortFct = Fct;( volatile TdeclList parList = NULL;L mainFl = curCreat.idName!=NULL = && isSameName(curCreat.hCode, curCreat.- idName, MainHCode, (Tname)"\4\0main");E {># volatile TdeclList endList;s4 jmp_buf localJmpBuf, *savErrRet = curErrRet; volatile bool firstTurn;( bool resulPtrSeen, sizeofBlSeen;V if (curTok.tok!=RPAR && curTok.tok!=LBRA) { /* not empty parameter list (LBRAB checked just to forgive the sinner that forgets the RPAR). */3 curErrRet = &localJmpBuf /*~ LocalAdr */;aH if (setjmp(*curErrRet) == 0) {firstTurn = True; resulPtrSeen = sizeofBlSeen = False;})' else skipTok(zCommaRParSCol);a- while (firstTurn || Found(COMMA)) {t TdeclList newPar;b Tattrib attrb; ignoreErr = False; if (Found(ELLIP)) {)7 if (parList == NULL) err0(AtLeastOnePar);  sortFct = VFct;e break;}* firstTurn = False;= if ((attrb = attrib())!=NoAttrib && attrb!=Reg) { % err0(OnlyRegAttrib); * attrb = NoAttrib;}+ noNewTypeInfo._attriba = attrb;o. noNewTypeInfo._prioToCast = False;* newPar = decl1(noNewTypeInfo);: if (attrb == NoAttrib) newPar->attriba = Auto;C if (newPar->type!=NULL && IsFct(newPar->type)) errWNTT(a; PtrOnFctExptd, newPar->idName, newPar->type, NULL);;9 if (parList == NULL) { /* first parameter */ G if (newPar->type!=NULL && newPar->type->typeSort==Void) {_K if (newPar->idName!=NULL || attrb!=NoAttrib || curTok.tok!=c& RPAR) err0(VoidNotAlone);+ (void)freeDeclElt(newPar);}/% else parList = newPar;}e else {L if (newPar->type!=NULL && newPar->type->typeSort==Void) errWN(& VoidNotAlwd, newPar->idName);% endList->cdr = newPar;}  endList = newPar;s {I0 TpcTypeElt parType = newPar->type;H newPar->SizeofBlFl = False; /* other flags already off */$ for (;; GetNxtTok()) {% switch (curTok.tok) {o# TparQal paramQal;tI case GENERIC: paramQal = GenericV; goto commonParQalL; # case MAYMODIFY: {k% TresulTstPtd w;e4 if (newPar->MayModifFl) break;G if ((w = tstPtd(parType, False)) & NOTALLCONST &&p5 ReallyInsideMacro) continue; /* ignore d-pragma; in this case if function declaration inside macro. */tB if (w & (NOTPTR | NOTALLCONST)) goto ilgDPl;0 newPar->MayModifFl = True; continue;} case NOTUSED:l1 if (newPar->notUsedFl) break;i8 if (newPar->ResulPtrFl) goto ilgDPl;- newPar->notUsedFl = True;  continue; ! case RESULPTR: N if (parTyp Ce!=NULL && !IsPtrArr(parType) || resulPtrSeen ||& newPar->notUsedFl) goto ilgDPl;. newPar->ResulPtrFl = True; /*~NoBreak*/J case RESULTYP: paramQal = ResulTypV; goto commonParQalL; case SIZEOFBL:2 if (newPar->SizeofBlFl) break;J if (parType!=NULL && !(parType->typeSort & WhoEnum) ||& sizeofBlSeen) goto ilgDPl;( sizeofBlSeen = True;. newPar->SizeofBlFl = True; continue;  case UTILITY:iL if (parType!=NULL && !isRepreType(parType)) goto ilgDPl;( paramQal = UtilityV;commonParQalL:N if (newPar->parQal == NoParQal) {newPar->parQal = paramQal ; continue;}? else if (newPar->parQal == paramQal) break;( goto ilgDPl; default:L if (chkNmdTypParFl && !sysAdjHdrFile && newPar->parQal==7 NoParQal && isRepreType(parType) && !mainFl) errWNT( - ParRepreType | Warn1, NULL, parType); $ goto noMoreDPL;}% errUslDP(curTok.tok);p continue; ilgDPl:T& errIlgDP(curTok.tok);} noMoreDPL:= if (newPar->ResulPtrFl) resulPtrSeen = True;}}}sC else if (chkEmptParList && !mainFl) err0(MsngVoid | Warn1);S curErrRet = savErrRet; } O newElt = allocTypeEltID(sortFct, NoQualif); /* Fct or VFct if variadic */b" newElt->paramList = parList;N if (! Found(RPAR)) err0((parList == NULL)? RParExptd :RParOrCommaExptd); leftParenSeen = False;}n2 else if (Found(LSBR)) { /* array declarator */ size_t limArr;: limArr = (curTok.tok!=RSBR && curTok.tok!=INDEXTYPE)O ? (correctExprN(NoFreeExpType, WhoEnumBool, True, "[]", False))dI ? (cExp.sVal==0 || cExp.sVal<0 && cExp.type->typeSort &  SigWho) M ? (errWS((cExp.errEvl)? NoErrMsg : IlgArraySize, longToS( cExp.sVal)), ArrLimErr)f' : (size_t)cExp.uVal  : ArrLimErr*4 : (cExp.type = &defaultIndexTypeElt,& 0); /* if no size specified *// newElt = allocTypeEltID(Array, NoQualif);  newElt->lim = limArr;  if (limArr != 0) {> newElt->size = 1U; /* forbids computation of bound by& potential initialization. */ if (cExp.litCst) {- Tname nameToShow = curCreat.idName;U, TpcTypeElt w1 = curCreat.headType; while (w1 != NULL) {B if (w1->typeSort != Array) {nameToShow = NULL; break;} w1 = w1->nextTE;}/= errWN((cExp.LitCstOutsMac)? BndShdBeNamed | Warn1 : 4 NumCstShdBeNamed1|Warn1|Rdbl , nameToShow);}}3 newElt->indexType = (curTok.tok == INDEXTYPE) E ? (FreeExpType(cExp), getINDEXTYPEtype()) - : (c IExp.cstImpsd)rI ? (FreeExpType(cExp), &defaultIndexTypeElt)o* : cExp.type;M if (newElt->indexType!=NULL && newElt->indexType->noOwner) ((ModifType)d- newElt->indexType)->noOwner = False;e* if (! Found(RSBR)) err0(RSBrExptd);}% else break; /* exit "for(;;)" *//> if (curCreat.headType == NULL) curCreat.headType = newElt;9 else ((ModifType)curCreat.tailType)->nextTE = newElt;l curCreat.tailType = newElt;}: /* splice eventual front end of type ('pointer' part) */ if (pBefType != NULL) {I@ if (curCreat.headType == NULL) curCreat.headType = pBefType;; else ((ModifType)curCreat.tailType)->nextTE = pBefType;i% curCreat.tailType = pEndBefType;}( return curCreat;}mFstatic TdeclList decl3(TdeclList x, TpcTypeElt baseType, Tqualif qual){  TdeclList endDL;3 InfoDcl(localIDL, (bool)(0-0), (bool)0, (bool)0); manageFctDPrags(x);yO if (curTok.tok == LBRA) {defFunc(x); return NULL;} /* function definition */eJ msngAttribFl = False; /* this flag to prevent several instances of same error. */A endDL = x; /* end of declaration list = beginning as of now */'! localIDL._attriba = x->attriba; # localIDL._memberFl = x->memberFl;h for (;;) {G if (nestLvl!=0 && endDL->attriba==NoAttrib && (endDL->type==NULL ||g4 !IsFct(endDL->type))) endDL->attriba = Auto;K if (x->declFl) declObj(endDL); /* if object to be declared (to be done*I immediatly, because of case "struct _s a ={..., &a, ...}..."). */p else { initOrSizFld(endDL, NULL);- if (x->initFl) err0(MemberCantBeInit);}  if (! Found(COMMA)) break; {oK TdeclList newDlElt = createDLElt(declId(), localIDL, baseType, qual);e< endDL->cdr = newDlElt; /* chain current declaration */ endDL = newDlElt;} manageFctDPrags(endDL);} return x;o}w static void defFunc(TdeclList x){ % TpcTypeElt defFctTyp, curFctRetTyp;v Tname fctName; checkIndent();F /* Search if type = (V)Fct; if not, try to find one in type chain */$ if ((defFctTyp = x->type) != NULL) do {" if (IsFct(defFctTyp)) break;; } while ((defFctTyp = freeTypeElt(defFctTyp)) != NULL);x* if (defFctTyp != x->type) err0(NotAFct);4 if (defFctTyp != NULL) { /* function type found */ TsemanElt *ptrIdFct; TdeclList defParList;  Tattrib fctAttrib;P bool keepDecl = False; /* try hard not to, to get function definition coor-9 dinates (otherwise, problem to either spot declaration): coordinates (eg. if bad type) or definition coordinates) (eg. in case of double definition). */G; if (defFctTyp->shared) errWN(FctDefViaTpdf, x->idName);=@ if ((fctAttrib = x->attriba) == Extrn) fctAttrib = NoAttrib;M else if (fctAttrib==NoAttrib || sysHdrFile && fctAttrib==Stati) fctAttribN = Extrn;t; if (headerFile) errWS(NoDefInHdrFile|Warn1|Rdbl, NULL);=+ if (nestLvl != 0) err0(EmbdFctNotAlwd); 9 if ((fctName = x->idName) == NULL) e Orr0(MsngFctName);IE if ((curFctRetTyp = NxtTypElt(defFctTyp))!=NULL && curFctRetTyp->fC typeSort!=Void && !IsArrFct(curFctRetTyp)) (void)sizeOfTypeD(p- curFctRetTyp, IncplRetType, fctName); I if (fctName!=NULL && (ptrIdFct = searchSymTabHC(fctName, x->hCode))!= B NULL) { /* already existing identifier; is it correct? */# if (ptrIdFct->type != NULL) {w8 if (IsFct(ptrIdFct->type) && !ptrIdFct->defnd) {/ /* Correct: now, check concordance */aE const TpcTypeElt declFctTyp = ptrIdFct->type, declRetType =t NxtTypElt(declFctTyp);L TdeclList declParList;I if (ptrIdFct->attribb != fctAttrib) errId1(IncptblAttrib|Warn2|u7 PossErr, ptrIdFct, (ptrIdFct->attribb == Extrn)?e& errTxt[Empty] : "'static'");O if (declFctTyp->typeSort != defFctTyp->typeSort) {errId1(VariNotVari,- ptrIdFct, NULL); keepDecl = True;} C if (! CompatType(declRetType, curFctRetTyp, StrictChk)) {(G errId2((compatType(curFctRetTyp, declRetType, CStrictChk))? ? NotSameType|Warn2|PossErr : NotSameType, ptrIdFct, typeToS1(p- curFctRetTyp), typeToS2(declRetType));  keepDecl = True;}g3 for (declParList = declFctTyp->paramList,S- defParList = defFctTyp->paramList;t6 declParList!=NULL && defParList!=NULL; P declParList = declParList->cdr, defParList = defParList->cdr) {H if (defParList->idName!=NULL && declParList->idName!=NULL &&: memcmp(declParList->idName, defParList->idName, FullLgt(& defParList->idName))!=0) { TnameBuf buf;l2 bufNameToS(defParList->idName, buf);? errId1(ParNamesNotEq|Warn1|Rdbl, ptrIdFct, buf);} O if (! CompatType(declParList->type, defParList->type, StrictChk)) {e9 TpcTypeElt declParType = declParList->type;lL errId((compatType(declParType, defParList->type, CStrictChk))?8 ParTypesNotEq|Warn2|PossErr : ParTypesNotEq, ptrIdFct,: defParList->idName, typeToS1(declParType), typeToS2( defParList->type));eP declParList->type = defParList->type;/* permute types, so that */O defParList->type = declParType;} /* declaration type stays. */ H if (declParList->parQal!=defParList->parQal || declParList->? MayModifFl!=defParList->MayModifFl || declParList->ResulPtrFli& !=defParList->ResulPtrFl) {= errId1(NonCoheDPInFct | Warn2, ptrIdFct, NULL); 7 defParList->parQal = declParList->parQal;T? defParList->MayModifFl = declParList->MayModifFl;eA defParList->ResulPtrFl = declParList->ResulPtrFl;}} H if ((defParList!=NULL || declParList!=NULL) && (!sysHdrFile ||? declFctTyp->paramList!=NULL && defFctTyp->paramList!=NULL) /* B in system header files, empty parameter list => no check ? */) {3 errId1(NotSameNbOfPar, ptrIdFct, NULL);f keepDecl = True;} G U if (defFctTyp->pvNr!=declFctTyp->pvNr || defFctTyp->generic!= declFctTyp->generic) { ; errId1(NonCoheDPInFct | Warn2, ptrIdFct, NULL);k< ((ModifType)defFctTyp)->pvNr = declFctTyp->pvNr;C ((ModifType)defFctTyp)->generic = declFctTyp->generic;}&= if (fctAttrib == Extrn) checkWrngHdrFile(ptrIdFct);o! ptrIdFct->defnd = True;= if (! keepDecl) {& freeTypeChain(declFctTyp); goto commonL;}},9 else (void)errAlrdDefId(fctName, defFctTyp, Obj);nN ptrIdFct = enterSymTab(NULL);} /* stub (to manage correctly following function body). */E' if (! mainFl) fctAttrib = Stati;},E else { /* yet undeclared identifier: declare it as a function */oK if (x->attriba > Stati) {errWN(IlgAttribForFct, fctName); fctAttrib =e Stati;}E3 ptrIdFct = enterSymTabHC(fctName, x->hCode);}> {AN DefSem1(defndObj, Obj, True /*defnd*/, False /*used*/, True /*initlz*/);" ptrIdFct->infoS = defndObj;} ptrIdFct->nameb = fctName;K if ((ptrIdFct->attribb = fctAttrib)==Extrn && !mainFl && !headerFile &&g- nestLvl==0) errMsngStati(fctName);vcommonL:< ptrIdFct->defLineNb = lineNb; /* record */B ptrIdFct->defFileName = curFileName; /* birth place. */ ptrIdFct->type = defFctTyp;N, /* Check for 'main' special treatment *// if (mainFl) { /* verify that legal form */tA register TdeclList declParList = ptrIdXFct->type->paramList;e5 if (fctAttrib != Extrn) err0(BadAttribForMain);uB if (curFctRetTyp!=NULL && curFctRetTyp->typeSort!=Int) err0( BadRetTypeForMain);a if (declParList != NULL) {O if (declParList->type!=NULL && !(declParList->type->typeSort & WhoEnum)>B ) errWNT(BadParForMain, declParList->idName, declParList->type);P if ((declParList = declParList->cdr)!=NULL && declParList->type!=NULL) {N scndMainParTypeElt.indexType = declParList->type->indexType; /* for- no false error due to type of bound. */dK if (! compatType(declParList->type, &scndMainParTypeElt, FctCall) B ) errWNT(BadParForMain, declParList->idName, declParList->type);J if (declParList->cdr!=NULL && declParList->cdr->cdr!=NULL) err0( TooManyParForMain);}}}t, /* Enter parameters into symbol table */H enterBlock(); /* so parameters are defined at function body level */L for (defParList = defFctTyp->paramList; defParList != NULL; defParList = defParList->cdr) { TsemanElt *ptrId;/, TpcTypeElt curType = defParList->type;; if (defParList->idName == NULL) err0(ParMustBeNamed);cI if (curType!=NULL && !IsArrFct(curType)) (void)sizeOfTypeD(curType,U& IncplType, defParList->idName);K if ((ptrId = enterSymTabHC(defParList->idName, defParList->hCode)) ==n4 NULL) errWN(SameParName, defParList->idName); else {@ DefSem1(defndPar, Param, True /*defnd*/, False /*used*/, [ True /*initlz*/);TH DefSem1(notUsedPar, Param, False /*defnd*/, True /*used*/, TrueI /*initlz*/); /* defnd = False for 'NotUsdPar' error detection */ #ifdef _AIXe= if (defParList->notUsedFl) ptrId->infoS = notUsedPar;S% else ptrId->infoS = defndPar; #elserF ptrId->infoS = (defParList->notUsedFl)? notUsedPar : defndPar;#endif; if (defParList->MayModifFl) ptrId->MayModif = True;C ptrId->type = curType;D ptrId->attribb = (curType!=NULL && IsArr(curType))? NoAttrib: /* so that no LocalAdr d-pragma needed for &par[...] */4 : defParList->attriba; /* auto/register *//* if (curType != NULL)@ if (curType->typeSort==Bool) ptrId->notPureBoo = True;G * if so done, warning in 'constPtd()', on 'resultIfNULL' parameter *  else */(= ptrId->defLineNb = lineNb; /* record */ C ptrId->defFileName = curFileName; /* birth place. */- ptrId->nameb = defParList->idName;}}}e& else {fctName = NULL; enterBlock();} (void)freeDeclElt(x);" {aG Tname oldCurFctName = curFctName; /* necessary because of possibleo- (erroneously) embedded functions. */a curFctName = fctName;  enterFctBody(defFctTyp); curFctName = oldCurFctName;}} 7static void initOrSizFld(TdeclList x, TsemanElt *ptrId) {e if (Found(COLON)) nbBits(x); else {! TpcTypeElt objType = x->type;eI if (x->idName==NULL && (objType==NULL || !(objType->typeSort^==Enum &&iC objType->tagId!=NULL /* not 'char' */ && objType->tagId->type-> B intPoss))) err0((x->memberFl)? MsngMembName : MsngObjTypName); if (curTok.tok == ASGNOP) {c, TmacExpnd locMacExpndNb = curMacExpNb;@ if ((TkAsgn)curTok.val != SimplAsgn) err0(SimplAsgnExptd);0 paramTxt = txtAsgnTok[(TkAsgn)curTok.val];2 if (x->attriba == Typdf) err0(CantInitTpdf);D else if (objType!=NULL && IsFct(objType)) err0(FctCantBeInit); else {I if (objType!=NULL &&P~DCC.BCK"[DCC_DISTRIB.SRC]DCDECL.C;1739V߮_ IsStrun(objType)) (void)sizeOfTypeD(objType,  IncplType, x->idName);o x->initFl = True;}6 GetNxtTok(); /* here for good error position */ {e? bool cmplxInit = curTok.tok==LBRA || curTok.tok==CSTST;nC limErroTypes = NULL; /* forget previous erroneous types */PE lExp.ptrId = ptrId; /* for managePointers()/modifPtdVal() */pJ init((ModifType)objType, x->attriba < Extrn, True, locMacExpndNb);L if (x->attriba>=Auto && objType!=NULL && objType->typeSort>=Array &&< cmplxInit && !Found(DYNINIT)) err0(SlowingInit|Warn1|Rdbl| PossErr);}}}}rJstatic void init(TpTypeElt objType, bool cstExp, bool chkIntCst, TmacExpnd macNb)a{e if (curTok.tok == LBRA) { ? TtypeSort ts = (objType == NULL)? Void : objType->typeSort;W if (ts == Array) {3 size_t oldCurIArrayIndex = curInitArrayIndex;;? TpcTypeElt oldCurIArrayIndexType = curInitArrayIndexType; 8 TpTypeElt eltType = (ModifType)NxtTypElt(oabjType); GetNxtTok(); curInitArrayIndex = 0;1 curInitArrayIndexType = objType->indexType; do {& init(eltType, True, False, 0); curInitArrayIndex++;< } while ((curTok.tok == COMMA) && (NxtTok() != RBRA));B if (objType->size == 0) { /* if size not specified... */P if (curInitArrayIndex > objType->lim) objType->lim = curInitArrayIndex;}1 /* then size of array defined by length ofT; longest initializer list (dimensionality > 1). */C else if (curInitArrayIndex > objType->lim) err0(TooManyIniz); , curInitArrayIndex = oldCurIArrayIndex;5 curInitArrayIndexType = oldCurIArrayIndexType;}= else if (IsStrunSort(ts)) {t. TdeclList oldCurIMember = curInitMember;* TmacExpnd locMacExpNb = curMacExpNb; bool locLitCst = False;r GetNxtTok();L if (objType->tagId->listAlwdFiles != NULL) checkPrivVisible(objType);9 curInitMember = BaseStrunType(objType)->memberList; % while (curInitMember != NULL) {y% bool nb = curTok.tok != LBRA;nD init((ModifType)curInitMember->type, True, chkIntCst && !nb, locMacExpNb);5 if (nb && cExp.litCst) locLitCst = chkIntCst;uN do {curInitMember = curInitMember->cdr;} while (curInitMember!=NULL &&@ curInitMember->fldFl && curInitMember->idName==NULL); /* skip padding. */A if (curTok.tok!=COMMA || NxtTok()==RBRA) goto checkRBraL; if (ts == Union) break;} err0(TooMa dnyIniz); skipTok(zRbraSCol); checkRBraL:o$ curInitMember = oldCurIMember;J if (locLitCst && (curMacExpNb==macNb || curMacExpNb!=locMacExpNb) &&4 chkNumCst) err0(NotNamedStrunCst | Warn1);} else {% err0(TooManyBraLvl|Warn1|Rdbl);= GetNxtTok();/ init(objType, cstExp, chkIntCst, macNb);}  if (! Found(RBRA)) {8 err0((ts >= Array)? RBraOrCommaExptd : RBraExptd); cleverSkipTok();}}F else if (correctExprN(objType, Void, cstExp, paramTxt, chkIntCst)) {* if (objType!=NULL && IsArr(objType)) {+ if (! cExp.rEvlbl) err0(CstExpExptd);RG else { /* Initialization of character array by string literal */( size_t lgtStr = cExp.type->size;< if (objType->size == 0) { /* limit not specified */< if (objType->lim < lgtStr) objType->lim = lgtStr;}G else if (/*~CastTo size_t*/ /* to avoid dcc warning on unsigned0F difference */ (lgtStr - 1) > objType->lim) /* trick! (if erroneous,I objType->lim = -1U => greater than any size) */ err0(TooManyIniz);}}} } static void nbBits(TdeclList x) {( TpcTypeElt fldType;r& if (! x->memberFl) err0(FldNotAlwd);D if (! correctExprN(NULL, WhoEnum, True, ":", True)) cExp.uVal = 0;? /* *doIt* Portability (field wdth < 16 = min sizeof(int) ) */t< else if (cExp.uVal>IntSiz*CHAR_BITC || (x->idName!=NULL &&; cExp.uVal==0)) {err0(FldSizIncor); cExp.uVal = 0;}  x->fldSize = (uint)cExp.uVal;x x->fldFl = True;$ if ((fldType = x->type) != NULL) { if (chkPortbl) eO if (! (fldType->typeSort & (UInt | Int | Bool))) errWT((fldType->typeSortiB ==Enum && fldType->tagId!=NULL)? UnsuitFldType | Warn1 : UnsuitFldType, fldType);cM else if (cExp.uVal!=0 && fldType->typeSort==Int && fldType->SynthQualif 4 !=Sgnd) errWT(IntBitField | CWarn2, fldType);O if (fldType->shared) x->type = allocTypeEltIC(fldType, NoQualif); /* to bei& able to set 'size' field. */? ((ModifType)x->type)->size = 1;} /* *doIt* size in bits */ }m'static void declObj(TdeclList pDeclElt) {T TsemanElt *ptrId = NULL;& TpcTypeElt objType = pDeclElt->type;( Tattrib objAttrib = pDeclElt->attriba; Tname objName; bool reDecl = False;K Tstring declFile = curHdrFName; /* even for 'extern's (wrongly) declared4 in body file (=> no ExtObjNotDef warning). */0 /* Insert new declaration into symbol table */P if ((objName = pDeclElt->idName) != NULL) { /* correct declar. of an object */O if ((ptrId = enterSymTabHC(objName, pDeclElt->hCode)) == NULL) { /* alrea-y& dy declared identifier. */" if (objAttrib != NoAttrib) {9 ptrId = searchSymTabHC(objName, pDeclElt->hCode);o if (adjustFile) { H if (objType==NULL || ((!IsFct(objType) || objAttrib!=Extrn) &&F objAttrib!=Typdf && errAlrdDefId(objName, objType, ptrId->kind /*? because of CantChgMnng */)==NULL)) goto freeObjTypeL; /* notc4 typedef nor function profile to be amended. */J if (objAttrijb==Typdf && ptrId->kind!=Type || objAttrib!=Typdf &&B ptrId->type!=NULL && objType->typeSort!=ptrId->type->typeSort) { err0(CantChgMnng); goto freeObjTypeL;}e< if (ptrId->kind==Type && ptrId->namedType!=NULL) { reDecl = True;P freeTypeChain(NxtTypElt(ptrId->namedType));}} /* keep first typeElt,& to redirect namedType. */ else {N bool sameFile = !headerFile || StrEq(skipPath(ptrId->declaringFile), skipPath(curHdrFName));nK if (objAttrib==Extrn && ptrId->attribb==Extrn && ptrId->kind==ObjeH && ptrId->declaringFile!=nonFileName && !sameFile) { /* 'extern'9 declarations may be duplicated only once, in different 8 header files, the last of which being the header file4 corresponding to the current compilation unit. *// if (! isBodyHdrFile(curHdrFName)) {aF if (! isBodyHdrFile(ptrId->declaringFile)) goto redeclL;K errWNSS(IncldAfter|Warn1|Rdbl, objName, ptrId->declaringFile,  curHdrFName);} errQalTyp1 = NULL;N if (!CompatType(ptrId->type, objType, ExtDcl) || errQalTyp1!= NULL ) { ( Tverbo oldVerbo = verbose;; if (verbose < HalfVerbo) verbose = HalfVerbo;/G errId2((compatType(ptrId->type, objType, CStrChkExtDcl))?r6 MoreStrngType|Warn2|PossErr : MoreStrngType, ptrId,4 typeToS1(ptrId->type),typeToS2(objType));! verbose = oldVerbom;( goto freeL;}I if (CompatType(ptrId->type, objType, StrictChk)) goto freeL;} 4 /* keep previous declaration coordinates */ elseredeclL:K if ((ptrId->attribb!=Extrn || objAttrib objName, objType, (objAttrib == Typdf)? Type : Obj)==NULL || objType==NULL))d freeL: {iG if (ptrId->kind==Obj && !sameFile) ptrId->declaringFile = - nonFileName; /* see below why. */s! goto freeObjTypeL;} N declFile = (! sameFile)? nonFileName : ptrId->declaringFile;} /* if1 several declaring files, which one to jot ? =>F: impossible file name (-> no 'ExtObjNotDef' message). */% freeTypeChain(ptrId->type);}}r/ else { /* new identifier, initialize it */|0 DefSem(notDefndObj, Obj, False /*defnd*/);" ptrId->infoS = notDefndObj;} if (objAttrib == Typdf) {NG if (isSameName(pDeclElt->hCode, objName, BoolHCode, BoolTName)) {x if (chkBool) {N if (objType!=NULL && objType->typeSort!=UInt) err0(IlgBoolDef|Warn1| PossErr);( pDeclElt->paralTypeFl = False;O objType = ptrId->namedType = allocTypeEltIC(&boolTypeElt, (objType ==&- NULL)? NoQualif : objType->qualif);! reDecl = True;}}N else if (chkTypName && !(isupper((char)*(objName + LgtHdrId)) || (char)*& (curTok.name + LgtHdrId)=='_'))1 errWN(UpCaseTypName|Warn1|Rdbl, objName);kN /* Create type chain tphat will be shared by all users of defined type */3 if (objType == NULL) ptrId->namedType = NULL; else {B TpTypeElt newElt; /* typeElt for users of this typedef */ newElt = (reDecl)sM ? (ModifType)ptrId->namedType /* reuse old typeElt, becauset- it may already be pointed upon. */e# : allocTypeElt();i *newElt = *objType;)N newElt->shared = True; newElt->noFreeDepdt = True; newElt->stopFreeing = True;  if (sysAdjHdrFile) {# newElt->paralTyp = False; M newElt->sysTpdf = True; /* pseudo parallel type (to have the indi-t8 rection through the corresponding typeId, indirection8 that will allow possible redefinition of typeId in an/ adjust file, even after having been used. */! newElt->typeId = ptrId; # newElt->rootTyp = False;}d) else if (pDeclElt->paralTypeFl) { " newElt->paralTyp = True;! newElt->typeId = ptrId;L" newElt->rootTyp = False; for (;; GetNxtTok()) {! switch (curTok.tok) {> case ROOTTYP: : if (newElt->rootTyp) errUslDP(curTok.tok);' newElt->rootTyp = True;t break; case LITCST:: if (newElt->litCsta) errUslDP(curTok.tok);' newElt->litCsta = True;= break;( default: goto exitLoopL;}} exitLoopL: ;}tF /* else description bits stays the same (qualified variant) */# ptrId->namedType = newElt;}o {r0 DefSem(defndType, Type, True /*defnd*/);I DefSem1(defndUsedType, Type, True /*defnd*/, True /*used*/, Falseh /*initlz*/); #ifdef _AIXdN if (headerFile) ptrId->infoS = defndUsedType; /* for no 'UnusedTypeId' msg. */r' else ptrId->infoS = defndType;}r#elseaK ptrId->infoS = (headerFile)? defndUsedType /* for no 'UnusedTypeId' msg */ : defndType;}c#endif5 if (insideHdrInHdr) ptrId->declInInHdr = True;}=% else { /* not type definition */e? if (objAttrib==NoAttrib && headerFile && !msngAttribFl) {e> errWS(NoDefInHdrFile|Warn2|Rdbl, errTxt[MsngExtTpdf]); msngAttribFl = True;}iG /* Verify constraints on declaration/definition, taking specified>; attribute and current block level into account. */e< if (objType!=NULL && IsFct(objType)) { /* function */$ if (objAttrib == NoAttrib) {M if (ptrId==NULL && (ptrId = errAlrdDefId(objName, objType, Obj)) ==e NULL) goto freeObjTypeL;r- if (!headerFile && !msngAttribFl) {n< errWN((nestLvl == 0)? MsngFctAttrib|Warn1|Rdbl :- ShdBeInHdrFile|Warn1|Rdbl, objName);e! msngAttribFl = True;}eB objAttrib = (nestLvl==0 && !headerFile)? Stati : Extrn;}; if (objAttrib == StatiL) errWN(OnlyExtrn, objName);e> else if (objAttrib > Extrn) errWN(IlgAttrib, objName); ptrId->initlz = True;dJ if (objType->nextTE == &boolCstTypeElt) ptrId->notPureBoo = True;}2 /* for pseudo-boolean functions ('feof' etc.);& 'generic' bit already set. */' else { /* object not function */ ! if (objAttrib == Extrn) {rM/* if (objType!=NULL && objType->typeSort==Bool) ptrId->notPureBoo =c; True;*/} /* just in case True in other modules ... */t else {= if (objAttrib == NoAttrib) { /* external definitione& (necessarily at level 0). */P if (ptrId == NULL) {/* identifier already seen (e.g, declaration) */? ptrId = searchSymTabHC(objName, pDeclElt->hCode);gM if ((ptrId->kind!=Obj || ptrId->defnd) && errAlrdDefId(objName,n4 objType, Obj) == NULL) goto freeObjTypeL;& checkWrngHdrFile(ptrId);B if (! CompatType(ptrId->type, objType, StrictChk)) {I errId2((compatType(ptrId->type, objType, CStrChkExtDcl))?t2 NotSameType|Warn2|PossErr : NotSameType, ptrId,4 typeToS1(objType), typeToS2(ptrId->type));8 ptrId->defnd = True; goto freeObjTypeL;}M freeTypeChain(ptrId->type);} /* to be able to replace int[] byl int[5], for example. */eI else if (!headerFile && !msngAttribFl) {errMsngStati(objName)W ; msngAttribFl = True;}N objAttrib = Extrn;M/* if (objType!=NULL && objType->typeSort==Bool) ptrId->notPureBoo ; = True;*/} /* just in case True in other modules ... */TN else if (objAttrib!=Stati && nestLvl==0 || objAttrib==Reg && objTypeB !=NULL && objType->typeSort>Array) errWN(IlgAttrib, objName);/ ptrId->defnd = True;}} /* defined */t& ptrId->declaringFile = declFile;H if ((ptrId->attribb = objAttrib)==Extrn && insideHdrInHdr) ptrId-> declInInHdr = True;oM if (headerFile && objAttrib==Stati) ptrId->used = True;} /* to preventd warning. */! ptrId->type = pDeclElt->type;r9 ptrId->defLineNb = lineNb; /* record */? ptrId->defFileName = curFileName; /* birth place. */t ptrId->nameb = objName;>" initOrSizFld(pDeclElt, ptrId);M ptrId->type = objType = pDeclElt->type;} /* but ptrId->type must also beI defined before calling 'initOrSizeFld', because of case "int i = i". */f else freeObjTypeL:L {hK initOrSizFld(pDeclElt, NULL); /* before pDeclElt->type freeing, to get{I more interesting messages (for example, no 'NotStrunInit' msg). */ " freeTypeChain(pDeclElt->type); objType = NULL;} if (pDeclElt->initFl) {*$ computeSize((ModifType)objType); if (ptrId != NULL) {H if (cExp.lclAdr) ptrId->lclAd = True; /* does also notPureBool */ ptrId->initlz = True;}F if (pDeclElt->attriba==Extrn) errWN(IlgInit|Warn1|Rdbl, objName);}) if (objType!=NULL && !IsFct(objType)) {dK if (Found(NOTUSED) && ptrId!=NULL) {ptrId->defnd = False; ptrId->used =  True;} H if (pDeclElt->attriba!=Typdf && !(pDec|lElt->attriba==Extrn && IsArr(= objType))) (void)sizeOfTypeD(objType, (pDeclElt->attriba ==/; Extrn)? IncplType|Warn2|PossErr : IncplType, objName);} } P/******************************************************************************/%/* UTILITIES */tP/******************************************************************************/Pstatic AllocXElt(allocDeclElt, TdeclList, ctrDE, resul->cdr = NULL;) /* settingI 'cdr' field to NULL makes element a list (of one element... ). */ Lstatic AllocXElt(allocTagListElt, TtagVisi *, ctrTLE, resul->preced = NULL;)3static AllocXElt(allocTypeElt, TpTypeElt, ctrTE, ;)s1TpTypeElt allocTypeEltIC(TpcTypeElt x, Tqualif y)a9/* New type element initialized by (amended) copy of x */;{  TpTypeElt resul; resul = allocTypeElt();  *resul = *x; resul->qualif |= y;r resul->shared = False;; resul->noFreeDepdt = True; /* because of shallow copy */K resul->stopFreeing = True; /* a priori, only the new element is freeable- (because of usual shallow copy). */j return resul;-}0TpTypeElt allocTypeEltID(TtypeSort x, Tqualif y)4/* New type element initialized by default values */{m TpTypeElt resul; resul = allocTypeElt();( *resul = valInitTypeElt; resul->typeSort = x; resul->qualif = y; return resul;)}T&void checkPrivVisible(TpcTypeElt type){(& const TsemanElt *pTag = type->tagId;/ if ( !isFNameVisible(strpdCUnitFName, pTag) 2 && !(InsideMacro && visibleFromMac(pTag))) { Tverbo savVerb = verbose;K Tstring terseTypeRepre = typeToS1((verbose = Terse /* so that inside of(& strun not seen */, type)); verbose = savVerb;L errId(PrivNotVisi | Warn1, pTag, NULL, terseTypeRepre, typeToS2(type));}} 2static void checkWrngHdrFile(const TsemanElt *pId){dF if (!isBodyHdrFile(pId->declaringFile) && *pId->declaringFile!='\0')L if (pId->declaringFile == nonFileName) errId1(WrngCUnit|Warn1|Rdbl, pId, cUnitFName);N else if (! isBodyHdrFile(pId->defFileName)) errId1(WrngHdrFile|Warn1|Rdbl, pId, cUnitFName);)}}O/* "Local" global variables for managing array qualifiers (that in fact qualifyN arrays elements => propagation (managed this way because of the handling of parallel types). */#static bool arrayIsCurrent = False;{$static Tqualif accumXQal, accumYQal;@bool compatType(TpcTypeElt x, TpcTypeElt y, TkTypeEquiv kindEqv)J/* 'x' = left/formal/declaration type; 'y' = right/actual/definition type.4 To be kept coherent with resulType() ("dcexp.c").F Answers True (False for VerifCastF) if either (sub-)type is NULL */{t( bool notFrstTurn = False, notAllConst; arrayIsCurrent = False;u for (;;) { TtypeSort tsx, tsy;)9 if (x==NULL || y==NULL) return (kindEqv!=VerifCastF);i tsx = x->typeSort; tsy = y->typeSort;K if (x->sysTpdf!=y->sysTpdf && tsx&Who && kindEqvgeneric && InsideInterval(kindEqv, Asgn, FctCall) && x-6>paralTyp && rowUp(x, y))) {> if (y->paralTyp) {; if (kindEqv < NoCheck) { /* VerifCast/StrictChk */ 4 if (x->typeId != y->typeId) return False;}M else if ( !(kindEqv==FctCall && InsideInterval(tsy, Array, VFct) && 0 !notFrstTurn) /* because Array => &Array[0]- and operator '&' yields generic. */ && !rowUp(y, x)C && kindEqvparalTyp && (o@ InsideInterval(kindEqv, StrictChk, IlgIcp)2 && !(y->generic && rowUp(x, y)) && tsy!=ArrayC || InsideInterval(kindEqv, VerifCast, VerifCastF))m ) return False;}/ if (tsx != tsy) { /* not same type sort */MD if (kindEqv < NoCheck /* VerifCast/StrictChk */) return False; {k? if ( kindEqvgeneric || kindEqv==FctCall && !notFrstTurn) || kindEqv==FctCall  && tsx==ArrayI && tsy==Ptr) /* not (Ptr <- String or, if FctCall, Array <->r Ptr). */) {M /* Accept, for CCheck1 type of equivalence, pointer on numeric type M to be equivalent to pointer on corresponding unsigned type (gua-B ranteed by standard to be of same size and alignment). */M if (! (kindEqv==CCheck || kindEqv==CCheck1 && ((tsx | tsy)==(Byte | @ UByte) || (tsx | tsy)==(Short | UShort) || (tsx | tsy)==(Int |; UInt) || (tsx | tsy)==(Long | ULong)))) return False;tO /* Manage C equivalence between all integral types, Ptr <=> &Array[],c Fct <=> Ptr/Fct. */; if (! (tsx & NumEnumBool && tsy & NumEnumBool)) {a$ if (IsPtrArrSort(tsx)) {8 if (IsPtrArrSort(tsy)) goto localSkipTstL;1 if (! IsFctSort(tsy)) return False;>: if ((x = NxtTypElt(x)) == NULL) return True;! tsx = x->typeSort;} else {< if (!IsFctSort(tsx) || tsy!=Ptr) return False;: if ((y = NxtTypElt(y)) == NULL) return True;! tsy = y->typeSort;}=) if (tsx != tsy) return False;llocalSkipTstL:;}}|9 if (tsx==Ptr && tsy==Array && y->qualif!=NoQualifn ) accumulateQal(x, y);}}i if (tsx >= Enum) switch (tsx >> PosDelT) {y case Enum>>PosDelT: @ if (x->tagId!=y->tagId && kindEqv!=CCheck) return False; break; case Array>>PosDelT:0 if (!y->generic /* not string literal */% && (!((kindEqv < NoCheck)): ? compatTypeR(x->indexType, y->indexType, VerifCastF)= : (x->indexType==&defaultIndexTypeElt || compatTypeR(x->n) indexType, y->indexType, NoCheck)))y# && kindEqvlim!=0 && tsy!=Ptr || kindEqv==StrictChk)& && x->lim!=ArrLimErr& && y->lim!=ArrLimErr# && x->lim!=y->lim J && (kindEqv!=CStrChkExtDcl || y->lim!=0))) return False;L if (x->qualif!=NoQualif || y->qualif!=NoQualif) accumulateQal(x, y);I if (! InsideInterval(kindEqv, ExtDcl, CCheck1)) goto endPtrL; /*o- !(ExtDecl/FctCall/IlgIcp/CCheck1). */* /*~NoBreak*/ case Ptr>>PosDelT: { TpcTypeElt nxtX, nxtY;P if ((nxtX = NxtTypElt(x))==NULL || (nxtY = NxtTypElt(y))==NULL) break;F if (InsideInterval(kindEqv, Asgn, CCheck1)) {/* Asgn/ExtDcl/& FctCall/IlgIcp/CCheck1. */L if (tsx==Array && nxtY->typeSort==Array && nxtX->typeSort!=Array ) return False;M /* Check pointed element qualifiers, according to C++ Standard */= {dL Tqualif qualNxtX = (arrayIsCurrent)? arrQal(nxtX, accumXQal) : nxtX->qualif,L qualNxtY = (arrayIsCurrent)? arrQal(nxtY, accumYQal) : nxtY->qualif;5 if (! notFrstTurn) notAllConst = False;eJ if ((((kindEqv == ExtDcl)? qualNxtX & ~qualNxtY : qualNxtY &4 ~qualNxtX)!=NoQualif /* compatible quelifiers */9 || notAllConst && qualNxtX!=qualNxtY)uG && errQalTyp1==NULL) { /* keep only first warning */s' static TtypeElt wx, wy;dO errQalTyp1 = (arrayIsCurrent && accumXQal!=NoQualif)? (wx = *x,t- wx.qualif |= accumXQal, &wx) : x;aO errQalTyp2 = (arrayIsCurrent && accumYQal!=NoQualif)? (wy = *y,=+ wy.qualif |= accumYQal, &wy) : y;}NK if (! (qualNxtX & ConstQal) && nxtX->typeSort!=Array /* array,; always const by itself... */) notAllConst = True;}}hO /* Allow equivalences 'anyType *' => 'void *' and generic 'void *' =>( 'anyType *'. */O if (!InsideInterval(kindEqv, StrictChk, NoCheck) /* !(NoCheck/Strict- 3 Chk) */ && kindEqv!=CStrChkExtDcl && !notFrstTurntB && (nxtX->typeSort==Void && (!IsFct(nxtY) || kindEqv==CCheck) ||B nxtY->typeSort==Void && (y->generic || kindEqv==CCheck))) return; (kindEqv>=NoCheck || ((arrayIsCurrent)? sameQal(x, y) &&r1 sameQal(nxtX, nxtY) : x->qualif==y->qualif && & nxtX->qualif==nxtY->qualif));}! if (!((kindEqv < NoCheck)>= ? compatTypeR(x->indexType, y->indexType, VerifCastF)r@ : (x->indexType==&defaultIndexTypeElt || compatTypeR(x->I indexType, y->indexType, NoCheck))) && kindEqv>PosDelT: case VFct>>PosDelT: {M /*TdeclList*/const TdeclElt *wx = x->paramList, *wy = y->paramList;tN if (InsideInterval(kindEqv, Asgn, IlgIcp) && (x->pvNr && !y->pvNr ||% x->generic && !y->generic) D || kindEqvpvNr!=y->4 pvNr || x->generic!=y->generic)) return False;0 while ((wx != NULL) && (wy != NULL)) {H if (!CompatType(wy->type, wx->type, kindEqv) || wx->parQal!== wy->parQal && (InsideInterval(kindEqv, Asgn, IlgIcp) || @ kindEqvcdr; wy = wy->cdr;}L if (wx!=NULL && tsy!=VFct || wy!=NULL && tsx!=VFct) return False; - /* not same number of parameters */SI notFrstTurn = False; /* function result has nothing to do withl function call. */o break;} / case Struc>>PosDelT: case Union>>PosDelT:o/ if (x->tagId != y->tagId) return False;  break; /*~ NoDefault */}tG if (kindEqvqualif!=y->qualif)) return False;b- if (arrayIsCurrent) chkEndAccumQal(x, y); O if ((x = NxtTypElt(x))==(y = NxtTypElt(y)) && !arrayIsCurrent) return True; 1 /* Stricter check for pointers, arrays ... */p. if (kindEqv == CCheck) kindEqv = CCheck1;}} 5static void accumulateQal(TpcTypeElt x, TpcTypeElt y)p{/ if (! arrayIsCurrent) {)% accumXQal = accumYQal = NoQualif;{ arrayIsCurrent = True;}/' if (IsArr(x)) accumXQal |= x->qualif;' if (IsArr(y)) accumYQal |= y->qualif; } .static Tqualif arrQal(TpcTypeElt t, Tqualif q){e. return (IsArr(t))? NoQualif : t->qualif | q;}*6static void chkEndAccumQal(TpcTypeElt x, TpcTypeElt y){o' if (! IsArr(x)) accumXQal = NoQualif;n' if (! IsArr(y)) accumYQal = NoQualif;eI if (accumXQal==NoQualif && accumYQal==NoQualif) arrayIsCurrent = False;a}THstatic bool compatTypeR(TpcTypeElt x, TpcTypeElt y, TkTypeEquiv kindEqv){v if (x == y) return True; {t) bool saveAIC = arrayIsCurrent, resul;a5 Tqualif saveAXQ = accumXQal, saveAYQ = accumYQal;a& resul = CompatType(x, y, kindEqv); arrayIsCurrent = saveAIC;p- accumXQal = saveAXQ; accumYQal = saveAYQ;  return resul;}}-/static bool sameQal(TpcTypeElt x, TpcTypeElt y);{ 6 return arrQal(x, accumXQal) == arrQal(y, accumYQal);} 1/*~ Undef arrayIsCurrent, accumXQal, accumYQal */ $static void computeSize(TpTypeElt x)3/* Computes size of all arrays in type chain 'x' */e{s TpcTypeElt nxtType; E if (x==NULL || x->shared || (nxtType = NxtTypElt(x))==NULL) return; " computeSize((ModifType)nxtType);K if (IsArr(x)) x->size = sizeOfTypeD(nxtType, ArrOfIncplOrFctElt, NULL) * = x->lim;rL else if (IsFct(x) && IsArrFct(nxtType)) errWT(ArrOrFctCantBeRet, nxtType);}eNstatic TdeclList createDLElt(TcreatType dId /*~MayModify*/, TinfoDecl infoDcl,& TpcTypeElt type, Tqualif qual){e TdeclList dList; if (type != NULL) {n, if (type->qualif & qual) err0(AlrdQual);K /* If array (case "typedef int Tarr[]; Tarr a={1,2}, b={3};"), or addedtJ qualifiers, create copy of type element; copy owned by the declared@ object, so has to be freed when the object disappears. */H if (qual & ~type->qualif || type->size==0 && IsArr(type) || infoDcl. _signedInt) {/ TpTypeElt w = allocTypeEltIC(type, qual);T type = w; 6 if (infoDcl._signedInt) w->SynthQualif = Sgnd;}}* /* Connect baseType and type modifier */E if (dId.headType != NULL) ((ModifType)dId.tailType)->nextTE = type;t else { /* no modifier */r dId.headType = type;J /* Parallel Type ? (no qualifier, no type modifier and type defined by typeId). */N if (qual==NoQualif && !infoDcl._noNewTypeFl) infoDcl._paralTypeFl = True;}. /* Allocate and fill new declList element */ dList = allocDeclElt();j dList->idName = dId.idName;  dList->hCode = dId.hCode; ; dList->type = dId.headType; /* beginning of type chain */W& computeSize((ModifType)dList->type); dList->infoD = infoDcl;l return dList;N})static long stubCtr = 0;#static void initCreateTagName(void)L{= stubCtr = 0;}S#static Tname createTagName(Tname x)={a2 if (x == NULL) { /* create name only if stub */K Tchar buf[sizeof(TnbBuf) + LgtHdrId + 1], *ptrBuf = &buf[LgtHdrId + 1];" bufLongToS(++stubCtr, ptrBuf);! while (*ptrBuf++ != '\0') {;}}1 buf[0]= (Tchar)(ptrBuf - &buf[LgtHdrId + 1]);; buf[LgtHdrId] = StartTagCh;s1 x = storeName(ConvTname(&buf[0]), TagSpace);} return x;A}i/*~Undef stubCtr */ TpcTypeElt declType(void)y{> TdeclList typeName;n TpcTypeElt type;. jmp_buf localJmpBuf, *savErrRet = curErrRet;+ curErrRet = &localJmpBuf /*~ LocalAdr */; if (setjmp(*curErrRet) == 0) {% noNewTypeInfo._prioToCast = True;)$ typeName = decl1(noNewTypeInfo);J if (typeName->idName != NULL) errWN(NoIdAlwdInType, typeName->idName); type = typeName->type;! (void) freeDeclElt(typeName);dH if (type!=NULL && !type->shared) ((ModifType)type)->noOwner = True;}, else {skipTok(zCoScEdpRPRB); type = NULL;} curErrRet = savErrRet; return type;}f%TsemanElt *defineId(TinfoSeman infoS)c?/* Create a fake typeId to prevent further 'UndefId' errors. */,{t TsemanElt *ptrId;t Tname w; if (allErrFl) return NULL;P ptrId = enterSymTabHC((w = storeName(curTok.name, ObjectSpace)), curTok.hCod); ptrId->type = NULL;T= if (infoS._kind == Obj) ptrId->declaringFile = curHdrFName;l else ptrId->namedType = NULL;n7 ptrId->defLineNb = lineNb; /* record */&= ptrId->defFileName = curFileName; /* birth place. */l ptrId->nameb = w;  ptrId->infoS = infoS;  return ptrId;T}!>static TsemanElt *errAlrdDefId(Tname x, TpcTypeElt y, Tkind z){/% TsemanElt *ptrId = searchSymTab(x);.M if (ptrId->type==NULL && (ptrId->kind==z || ptrId->kind==Obj && z==EnumCst)y- ) return ptrId; /* "forced defined" */WO errId((y==QuasiNULLval(TpcTypeElt) || !ptrId->defnd && y!=NULL && CompatType(tH ptrId->type, y, CStrChkExtDcl))? AlrdDefId|Warn2|PossErr : AlrdDefId, ptrId, x, NULL, NULL);  return NULL;}d!static void errMsngStati(Tname x)b{t register TstringNC w; # register Tstring w1 = cUnitFName;w TstringNC w2;t Tstring w3;c6 MyAlloc(w, (size_t)((w3 = SearchDot(w1)) - w1 + 1)); w2 = w;*" while (w1 != w3) {*w++ = *w1++;} *w = '\0';- errWNSS(MsngStati|Warn1|Rdbl, x, w2, NULL);> free(w2);i}d6static FreeXElt(freeDeclElt, TdeclList, ctrDE, ;, cdr)%static void freeDeclList(TdeclList x){eA while (x != NULL) {freeTypeChain(x->type); x = freeDeclElt(x);}*}>static FreeXElt(freeTagListElt, TtagVisi *, ctrTLE, ;, preced) void freeTypeChain(TpcTypeElt x){{I while (x != NULL) {x = freeTypeElt(x);} /* x may be NULL at the outset ; (case of undefined Id, or empty indexType, or...). */ }(*FreeXElt(freeTypeElt, TpcTypeElt, ctrTE, {> if (x->shared) return NULL; /* stop freeing immediately */N ((ModifType)x)->shared = True; /* to prevent several freeing of the; same typeElt (by remaining types pointing on it, becauseb3 otherwise no more protected by 'shared' bit). */N if (x->stopFreeing) resul = NULL; /* stop freeing after this one */ if (! x->noFreeDepdt)t. switch (x->typeSort >> PosDelT) {" case Array>>PosDelT: {N freeTypeChain(x->indexType); /* indexType may be NULL, so don't& use freeTypeElt() directly. */ break;}*N case Fct>>PosDelT: case VFct>>PosDelT: freeDeclList(x->paramList); break;*F case Struc>>PosDelT: case Union>>PosDelT: freeDeclList(x-> memberList); break;i /*~ NoDefault */} 2 }, nextTE)void freeTypes(T` ~DCC.BCK"[DCC_DISTRIB.SRC]DCDECL.C;1739V"semanElt *x)I/* Beware of case "typedef unknId bool;" (type==NULL, namedType!=NULL) */ {LK if (! InsideInterval(x->kind, Obj, StrunTag)) return; /* Param, EnumCst,T Label. */) if (x->kind != Obj) { /* Type, Tags */y if (x->kind == Type) {! if (x->namedType != NULL) {l7/* if (! x->namedType->shared) sysErr(ExCod5);*/ J ((ModifType)x->namedType)->shared = False; /* to allow freeing */& freeTypeChain(x->namedType);}} else { /* Tags */ if (x->type != NULL) {2/* if (! x->type->shared) sysErr(ExCod8);*/E ((ModifType)x->type)->shared = False; /* to allow freeing */tK if (x->kind==EnumTag && x->type->frstEnumCst!=NULL) { /* free typeu- element associated to enum constant. */;B ((ModifType)x->type->frstEnumCst->type)->shared = False;< (void)freeTypeElt(x->type->frstEnumCst->type);}}}} freeTypeChain(x->type);}f!TpcTypeElt getINDEXTYPEtype(void) {g TpcTypeElt resul;M! resul = (curTok.dpType == NULL)  ? NULL5 : (curTok.dpType->typeSort & WhoEnumBool)= ? curTok.dpType L : (err0(IntgrlTypeExptd | Warn2), FreeExpType1(curTok.dpType), NULL);a GetNxtTok(); return resul;(}evoid initDecl(void) {c initCreateTagName();}tbool isRepreType(TpcTypeElt x){>K if (x==NULL || !InsideInterval(x->typeSort, Byte, LongDbl)) return False;o do {0 if (x->paralTyp || x->sysTpdf) return False; x = x->nextTE; } while (x != NULL); return True;}r$static void makeGeneric(TpTypeElt x)K/* Mark 'generic' non-void function of base type (or type derived from baseqP type via qualifier/modifier; in such a case, each level of (pointer) modifier is also marked 'generic'). */{r TpTypeElt nxtX; bool sharedSeen;I if (x->shared) return; /* typedef has already undergone makeGeneric */T sharedSeen = False; I while (!NxtIsTypeId(x) && (nxtX = (ModifType)x->nextTE)!=NULL && nxtX->t typeSort!=Void) {pA if (nxtX->shared || sharedSeen) { /* duplicate type chain */r8 x->nextTE = nxtX = allocTypeEltIC(nxtX, NoQualif); x->stopFreeing = False;; sharedSeen = True;}e/ if (! IsArrFct(nxtX)) nxtX->generic = True;  x = nxtX;}}U/static void manageFctDPrags(const TdeclElt *dl)p{r# TpcTypeElt x = dl->type, retType;- bool resultTypeSeen = False;P while (x != NULL) { /* search whether there is a function in the type chain */O if (IsFct(x)) { /* search whether possible *~ResultType* or *~SizeOfBlock*r; parameter compatible with function return type. */c TdeclList parList; int parCtr;d retType = NxtTypElt(x); I for (parList = x->paramList, parCtr = 0; parCtr++, parList != NULL;s& parList = parList->cdr) {+ if (parList->parQal == ResulTypV) { resultTypeSeen = True;> if (! CompatType(retType, parList->type, NoCheck)) {M errWSTTS(IncohResultType | Warn2, longToS(parCtr), parList->type,pB retType, dpName((parList->ResulPtrFl)? RESULPTR : RESULTYP));) parList->parQal = NoParQal;}} O if (parList->SizeofBlFl && retType!=NULL && !IsPtr(retType)) {errIlgDP(l4 SIZEOFBL); parList->SizeofBlFl = False;}} goto foundFctL;} x = NxtTypElt(x);}" return; /* no function found */ foundFctL: {r/ bool pvNrSeen = False, genUtilSeen = False;  for (;; GetNxtTok()) { switch (curTok.tok) { % case PSEUDOVOID: case NEVRET:& if (pvNrSeen) break; pvNrSeen = True;J if (retType!=NULL && (retType->typeSort == Void)==(curTok.tok == PSEUDOVOID)) break;r& ((ModifType)x)->pvNr = True; continue;  case UTILITY: < if (retType!=NULL && !isRepreType(retType)) break; /*~NoBreak*/ case GENERIC:t! if (genUtilSeen) break;g genUtilSeen = True;a> if (retType!=NULL && retType->typeSort==Void) break;P if (resultTypeSeen) errWS(CantBeGeneUtil | Warn2, dpName(curTok.tok));I else if (curTok.tok == GENERIC) ((ModifType)x)->generic = True;  continue;l! default: goto exitLoopL;}e errIlgDP(curTok.tok);} exitLoopL:. if (x->generic) makeGeneric((ModifType)x);N else if (chkFctRetTyp && !genUtilSeen && !resultTypeSeen && !x->generic /*E because of possible typedef used to define function */ && !mainFl B && isRepreType(retType)) errWT(ResRepreType | CWarn2, retType);}}xvoid procExtent(void) {u" TsemanElt *pSem = curTok.ptrSem; cExp.sVal = 0; if ((pSem != NULL) ? pSem->kind!=TypeyO : (*((TnameNC /*~OddCast*/)curTok.name + DispNSId) = (TnameAtom)TagSpaceA , (pSem = searchSymTab(curTok.name)) == NULL) || pSem->kind!=u4 EnumTag) errWN(NotEnumTypeOrTag, curTok.name); else { TpcTypeElt idType;( if ((idType = pSem->type) != NULL) { register TsemanElt *w;. if ((w = idType->frstEnumCst) == NULL) {: if (idType->tagId == NULL) cExp.sVal = UCHAR_MAX;} else {' cExp.sVal = (TcalcS)w->enumVal; : while (w->nxtEnumCst != NULL) {w = w->nxtEnumCst;}* cExp.sVal -= (TcalcS)w->enumVal;}} pSem->used = True;}V cExp.type = &intCstTypeElt;e}dvoid procIndex(void){tM if (curInitArrayIndex == ArrLimErr) {err0(NotArrInit); cExp.errEvl = True;}n( cExp.uVal = (TcalcU)curInitArrayIndex;$ cExp.type = curInitArrayIndexType;} static void procMember(void){K if (curInitMember == OutsideStrunInit) {err0(NotStrunInit); cExp.errEvl = True;}& cExp.type = &boolCstTypeElt;}=void procMember1(void){fP cExp.uVal = (TcalcU)(curInitMember>OutsideStrunInit && isSameName(curTok.hCod,B curTok.name, curInitMember->hCode, curInitMember->idName)); procMember();l}lvoid procMember2(void){*, cExp.uVal = (TcalcU)(curInitMember==NULL); procMember();t}n-static bool rowUp(TpcTypeElt x, TpcTypeElt y) O/* Returns True if 'y' is a (reachable if heedRootType True) ancestor of 'x' */n{C do {D if (x->typeId == y->typeId) return True; /* ancestor reached */N if (x->rootTyp && heedRootType) return y->typeSort==Ptr && !y->paralTyp &&D ((y = y->nextTE)==NULL || y->typeSort==Void); /* "rootType" (non; representation type) found (void* always reachable). */u/ x = x->typeId->type; /* climb hierarchy */) } while (x->paralTyp);@ /* Representation type reached; OK if 'y' non-parallel type */ return ! y->paralTyp; }t@size_t sizeOfTypeD(TpcTypeElt t /*~MayModify*/, Terr e, Tname n){  TpcTypeElt t1 = t; if (t == NULL) return 0;' if (IsStrun(t)) t = BaseStrunType(t);u8 if (((IsArr(t))? t->lim : t->size)==0 && !t->errSiz) { errWNT(e, n, t1);=9 if (!(e & WarnMsk) && t!=&natTyp[_VOID] && !allErrFl)e% ((ModifType)t)->errSiz = True;}  return t->size;x}ystatic void cleverSkipTok(void)({a TcharTok peep;N if (curTok.tok==SCOL && (((peep = nxtCharOrMacTok()) < 0)? peep==-(TcharTok)I RBRA : peep==(TcharTok)'}')) GetNxtTok(); /* for ExtraSColAtEndMac */= skipTok(rBraSCol);}c<TresulTstPtd tstPtd(register TpcTypeElt w, bool onlyFrstLvl){n/* TresulTstPtd addInfo;a TpcTypeElt w1;*/ if (w == NULL) return ERRTYPE; if (IsStrun(w)) return STRUN;v/* addInfo = STRUN; else {' */ if (! IsPtrArr(w)) return NOTPTR; #/* addInfo = (TresulTstPtd)0;}*/( {q. bool constArray = False, firstTurn = True; TtypeSort ts;= do {/* w1 = w;*/N if ((ts = w->typeSort) == Array) {if (w->qualif & ConstQal) constArray = True;}e else {! if (IsFctSort(ts)) break;N if (! firstTurn) {J if (! (w->qualif & ConstQal || constArray)) return /*addInfo |*/ NOTALLCONST;9 if (onlyFrstLvl) return /*addInfo |*/ ALLCONST;p constArray = False;}}e firstTurn = False;) } while ((w = NxtTypElt(w)) != NULL);a #if False* if (!onlyFrstLvl && IsStrunSort(ts)) {A /* Search whether there exist non 'const' pointer fields */e= const TdeclElt *member = BaseStrunType(w1)->memberList;: while (member != NULL) {K if (tstPtd(member->type, False) & NOTALLCONST) return NOTALLCONST |v addInfo;l member = member->cdr;}}#endifC return ((IsPtrArrSort(ts))? ERRTYPE : ALLCONST) /*| addInfo*/;}t}r/* End DCDECL.C */*[DCC_DISTRIB.SRC]DCDECL.H;52+,p./( 4Oz-"0123KPWO56B7@S89G(HJ/* DCDECL.H */(/* Y.L. Noyelle, Supelec, France 1996 */#ifndef DCDECL_H#define DCDECL_H#include "dc.th"Otypedef enum {ERRTYPE=1, NOTPTR=ERRTYPE<<1, STRUN=NOTPTR<<1, ALLCONST=STRUN<<1,- NOTALLCONST=ALLCONST<<1} TresulTstPtd;/* Function profiles */Oextern TpTypeElt allocTypeEltIC(TpcTypeElt, Tqualif), allocTypeEltID(TtypeSort, Tqualif);.extern void checkPrivVisible(TpcTypeElt type);<extern bool compatType(TpcTypeElt, TpcTypeElt, TkTypeEquiv);extern void decl(void);!extern TpcTypeElt declType(void);'extern TsemanElt *defineId(TinfoSeman);&extern void freeTypeChain(TpcTypeElt);9extern TpcTypeElt freeTypeElt(TpcTypeElt /*~MayModify*/);#extern void freeTypes(TsemanElt *);)extern TpcTypeElt getINDEXTYPEtype(void);$extern bool isRepreType(TpcTypeElt);Nextern void procExtent(void), procIndex(void), procMember1(void), procMember2( void);extern void prog(void);Bextern size_t sizeOfTypeD(TpcTypeElt /*~MayModify*/, Terr, Tname);-extern TresulTstPtd tstPtd(TpcTypeElt, bool);/* External variables */extern bool heedRootType;#endif /* ifndef DCDECL_H *//* End DCDECL.H */*[DCC_DISTRIB.SRC]DCDECL.PH;5+,W./( 4(-"0123KPWO56"ز7 S89G(HJ/* DCDECL.PH */(/* Y.L. Noyelle, Supelec, France 1998 */#ifndef DCDECL_PH#define DCDECL_PHextern void initDecl(void);#endif /* ifndef DCDECL_PH *//* End DCDECL.PH */*[DCC_DISTRIB.SRC]DCDIR.C;1165+,d.~/( 4Q~}-"0123KPWO56=V47VS89G(HJN /* DCDIR.C */(/* Y.L. Noyelle, Supelec, France 1994 */ #ifdef VMS0#pragma noinline (errMac, errMacCall, errMacDef) #pragma noinline (frstConcFrame)#pragma noinline (popMacStk)#endif#include #include #include #include #include #include "dcdir.h"#include "dcdir.ph"#include "dcblk.h"#include "dcblk.ph"#include "dcdecl.h"#include "dcexp.h"#include "dcext.h"#include "dcmain.h"#include "dcmain.ph"#include "dcprag.h"#include "dcprag.ph"#include "dcrec.h"#include "dcrec.ph"#include "dcrecdir.ph"#define CDfndHCode 0x3900A2#define DefineHCode 0x25729#define DefinedHCode 0xBB3F4"#define DispBegSto (DispChain + 1)#define DispChain (TsTok)1#define ElifHCode 0x1924#define ElseHCode 0x1955#define EndifHCode 0x7E69#define ErrorHCode 0x81E5#define ExtentHCode 0x5B4956-#define FreeArg(x) {freeMacSto(*x); free(x);}&#define GetTokAdr(x, y) \> if (x == NULL) x = &(headChainMacBlk->tokSto[0]); \: else if (*x == (TsTok)ENDBLK) x = &(y->next->tokSto[0]);"#define GoNxtBlk(x) \B x = &(((TmacBlk * /*~OddCast*/)(x - *(x + 1)))->next->tokSto[0])#define IfHCode 0x105#define IfdefHCode 0x8431#define IfndefHCode 0x299E2#define IncludeHCode 0xD4DCDI#define IncrMacParCtr if (++macParCtr == 0) macParCtr = (2) /* 2 to keep parity. */#define IncrPMacT 2#define IndexHCode 0x12452F#define LineChng 0#define LineHCode 0x1C5C#define LgtMacHdr DispBegSto+#define MacActWNoPar QuasiNULLval(TsTok **)##define MRPosAdjFl (MRPosSysFl + 1)$#define MRPosConcFl (MRPosAdjFl + 1)#define MRPosSysFl 0#define MPosFlags CHAR_BITK#define MPosLineNb (MPosFlags + CHAR_BIT - 1) /* -1 because of LSIGN_BIT */#define MemberHCode 0x5B78B6#define NewArg \( *pNewTabArg++ = pMacSto, \B *(pMacSto - 1) = (TsTok)(pMacSto - &(curMacBlk->tokSto[0])) \P /*~ zif (DispNSId != LgtHdrId - 1) "Watch out ! Where is displacement needed\5 to compute address of beginning of block stored?" */#define PragmaHCode 0x306B6F#define PseudoName ConvTname("\0\0") /* name for pseudo-macro holding4 token string corresponding to each parameter. */#define SamTypeHCode 0x8F50D2C#define SizOfCharBlkLgtFld 1P#define SizeMacroStorageChunk ((SizeMacroStorageBlk - Offset(struct _bid, \ bid))/sizeof(TsTok))-#define SkipRestOfLine longjmp(*curErrRet, 1)/#define SkipTo(x) memcpy(&x, x, sizeof(void *))#define UndefHCode 0xA565 #define UsrLvlPar (LineChng + 1) DefIsSameName$typedef uint TconcMsq /*~RootType*/;1/* Bit positions for type TconcMsq (arbitrary) */#define CNoBit (TconcMsq)0#define COpnd1 (TconcMsq)1#define COpnd2 (COpnd1 << 1)#define CParam (COpnd2 << 1)#define CActiv (CParam << 1)#define CFme1 (CActiv << 1)#define CISN (CFme1 << 1)#define MaxCMsq CISN typedef struct _TmacBlk TmacBlk;Fstruct _bid{ /* just to allow computation of SizeMacroStorageChunk */ TmacBlk *bid1, *bid2; TsTok bid3, bid;};struct _TmacBlk {P TmacBlk *next, *prec; /* 'next' must be first field (cf 'storeMacChunk()') */8 TsTok headChain, tokSto[(TsTok)SizeMacroStorageChunk];};</*~zif (Offset(struct _bid, bid) != Offset(TmacBlk, tokSto))4 "struct _bid non coherent with TmacBlk" */./*~zif (SizeMacroStorageBlk < sizeof(TmacBlk))4 "incorrect struct _TmacBlk organization" */!#define concFl infoM.s11._concFl#define fme1 infoM.s11._fme1&#define concAsPar infoM.s11._concAsPar&#define usrLvlPFl infoM.s11._usrLvlPFl&#define noFreeArg infoM.s11._noFreeArg$#define macExpNb infoM.s11._macExpNb(#define insideMUMP infoM.s11._insideMUMP#define NbBitsConcMsq 6,/*~zif MaxCMsq >= (TconcMsq)1<curIfArmActiv = curIfArmActiv;+ w->trueIfPartSeen = trueIfPartSeen; w->elseSeen = elseSeen; w->activLvl = activLvl;' w->savOldSpCnt = oldSpaceCount; w->prec = pTopCondStk; pTopCondStk = w;} { bool w1;. if (! curIfArmActiv) activLvl = False;* trueIfPartSeen = elseSeen = False;/ if (! activLvl) skipRestOfLinePhase4();5 if (curTok.hCod == IfHCode) w1 = evalIfExp(); else {, w1 = (curTok.hCod == IfndefHCode);8 w1 = (NxtTok() == IDENT)? (pDescCurId!=NULL &&< pDescCurId->nstLvl<0) ^ w1 : (err0(MacNameExptd), False); GetNxtTok();} curIfArmActiv = w1;} break; case ElifHCode:& checkDir(ConvTname("\4\0elif"));. if (pTopCondStk == NULL) err0(NoPrecIf); trueCond = evalIfExp(); goto elseL; case ElseHCode:& checkDir(ConvTname("\4\0else"));. if (pTopCondStk == NULL) err0(NoPrecIf);' if (elseSeen) err0(ElseAlrdSeen); elseSeen = True; GetNxtTok(); trueCond = True;elseL:0 if (!activLvl || pTopCondStk==NULL) break;& trueIfPartSeen |= curIfArmActiv;1 curIfArmActiv = trueCond & !trueIfPartSeen;/ oldSpaceCount = pTopCondStk->savOldSpCnt; break; case EndifHCode:' checkDir(ConvTname("\5\0endif"));. if (pTopCondStk == NULL) err0(NoPrecIf); GetNxtTok();% if (pTopCondStk == NULL) break; popCondStk(); break; default:$ if (curIfArmActiv) otherDir();# else skipRestOfLinePhase4();}" while (curTok.tok != ENDDIR) { if (curTok.tok == DPRAG) { macroExpand = True;E if ((curTok = manageDPrag()).tok == WHITESPACE) GetNxtTok();}+ else errPanic(EndOfLineIgnd, NULL);}}C if (begNameZone != NULL) manageInclude(begNameZone, incldSysFile,5 cmpsgHdr); /* '#include' (taken into account here,: so that all possible errors shown on previous file). */K condDirSkip = ! curIfArmActiv; /* condDirSkip must be set only after all& errors have been detected. */I if (! curIfArmActiv) {if (oldCIAA) {begLineNb = lineNb + cumDeltaLineNb& ; begFileName = curFileName;}}> else if (!oldCIAA && !adjustFile && curFileName==begFileNameB ) cumNbSkippedLines += lineNb - 1 + cumDeltaLineNb - begLineNb; ignoreErr = False; macroExpand = savMacroExpand; curErrRet = savErrRet;}static void otherDir(void){ switch (curTok.hCod) { case DefineHCode : { TdescrId *pDescMacId; uint parCtr = 0; bool masking; TlineNb oldLineNb;( checkDir(ConvTname("\6\0define"));? if (argCollect) {errMacCall(DccCantProcDef | Warn3, NULL) ; SkipRestOfLine;} GetNxtTok(); masking = Found(MASKING);< if (curTok.tok != IDENT) errPanic(MacNameExptd, NULL); if (pDescCurId != NULL) {E if (pDescCurId->nstLvl < 0) {errMac(MacAlrdDef|Warn3|PossErr,& pDescCurId); SkipRestOfLine;}L else if (!masking && curTok.ptrSem->type!=NULL) errId(NameAlrdInUse|; Warn3|PossErr, curTok.ptrSem, curTok.name, NULL, NULL);}8 enterBlock(); /* just to store parameter names */H pDescMacId = enterSymTabHC1((Tname)createMacroHeader(curTok.name), curTok.hCod);M pDescMacId->nstLvl = IncplMacDef; /* to remove immediately (in case ofI erroneous macro definition) macro name from blocks name space. */I if (nxtChFromTxt() == (TcharStream)'(') { /* there is an (empty ?) parameter list. */I parCtr++; /* value 0 is for symbol (no parenthesis after name) */ if (NxtTok() != RPAR) { do { TsemanElt *ptrParId;0 DefSem(defndMacPar, ParamMac, True);@ DefSem1(notUsdMacPar, ParamMac, False, True, False);N if (curTok.tok != IDENT) errMacDef(ParNameExptd, pDescMacId,NULL);H if (parCtr > UCHAR_MAX) errMacDef(TooManyMacPar, pDescMacId,& longToS((long)UCHAR_MAX));N if ((ptrParId = enterSymTabHC(storeName(curTok.name, ObjectSpace),A curTok.hCod)) == NULL) errMacDef(ParAlrdExist, pDescMacId, nameToS(curTok.name));? ptrParId->noPar = parCtr++; /* parameter number */) ptrParId->defLineNb = lineNb;0 ptrParId->defFileName = curFileName; GetNxtTok(); #ifdef _AIX? if (Found(NOTUSED)) ptrParId->infoS = notUsdMacPar;/ else ptrParId->infoS = defndMacPar;#elseK ptrParId->infoS = (Found(NOTUSED))? notUsdMacPar : defndMacPar;#endif@ if (Found(SIDEFFOK)) ptrParId->usedMorThOnce = True;" } while (Found(COMMA));}H if (curTok.tok != RPAR) errMacDef(RParExptd, pDescMacId, NULL);} else backUp(); pDescMacId->nstLvl =@ (long)((((ulong)lineNb<<(MPosLineNb - MPosFlags - MRPosAdjFl) |& (ulong)adjustFile) << MRPosAdjFl |4 (ulong)sysHdrFile) << (MRPosSysFl + MPosFlags) | parCtr |> LSIGN_BIT); /* save definition line number, system header, file flag, and number of parameters. */= pDescMacId->dFileName = curFileName; /* birth place */? pDescMacId->pTabArg = NULL; /* marks macro not active */I /* Store macro body, in token form (except for identifiers, stringsC and numbers, because they can't be exactly decompiled). */ oldLineNb = lineNb; if (NxtTok() != ENDDIR) { TsTok *pLastTok = NULL; TmacBlk *oldCurMacBlk;# bool lastTokIsConc = False; do {H if (lineNb != oldLineNb) {storeMacChunk(SUNDR, NULL, LineChng) ; oldLineNb = lineNb;}' if (curTok.tok == CONCATOP) {- /* Prefix form for ## operator */P if (lastTokIsConc || pLastTok==NULL) {err0(MsngConcOpnd); continue;}! lastTokIsConc = True;- GetTokAdr(pLastTok, oldCurMacBlk)H if (*pLastTok == (TsTok)IDSTNU) *pLastTok = (TsTok)CONCATOP; else {+ curTok.tok = (Ttok)*pLastTok;1 curTok.val = (uint)*(pLastTok + 1); storeTok();* *pLastTok = (TsTok)CONCATOP;L *(pLastTok + 1) = (TsTok)WHITESPACE;} /* "normal" CONCATOP */& curTok.tok = ENDARG1CONC;} else {" lastTokIsConc = False; pLastTok = pMacSto;% oldCurMacBlk = curMacBlk;( if (curTok.tok == QUOTEOP) {H if (NxtTok()!=IDENT || !isMacPar()) err0(NotMacParForQuo);K else {curTok.tok = QUOTEOP; curTok.val = curTok.ptrSem->noPar& ; curTok.ptrSem->used = True;}}} storeTok();% } while (NxtTok() != ENDDIR);C if (lastTokIsConc) {err0(ConcOprIlgLast); curTok.tok = SCOL ; storeTok();}A if (dpragNst != 0) {err0(EndDPragLineExptd); curTok.tok =p ENDDPRAG; storeTok();}S curTok.tok = ENDDIR;}M storeTok();7 pMacSto--; /* only one useful TsTok for ENDDIR */c exitBlock();}u break; case ErrorHCode:% checkDir(ConvTname("\5\0error"));l err0(ErrorDir);i skipRestOfLinePhase4();i case IncludeHCode:' checkDir(ConvTname("\7\0include"));i/* macroExpand = True;*/" ilgInclArgSeen = False;" posNameZone = sizNameZone = 0;J if (NxtTok()==ORDEROP && (TkCmp)curTok.val==LT || curTok.tok==CSTST) { Tchar c;! static Tchar cArr[] = "\0"; D cArr[0] = (curTok.tok == CSTST)? (incldSysFile = False, '"') :& (incldSysFile = True, '>');1 while ((c = (Tchar)NxtChar()) != cArr[0]) { K if (c=='\n' || c==EndCh && fileClosed) {errWS(UnFnshFileName, cArr)o ; backUp(); break;}x storeFileName(c);}}r #ifdef VMS# else if (curTok.tok == IDENT) { $ int lgtId = (int)*curTok.name;4 Tstring ptr = (Tstring)curTok.name + LgtHdrId;5 do storeFileName(*ptr++); while (--lgtId != 0);o& if (! sysHdrFile) goto ilgArgL;;- storeFileName('.'); storeFileName('h');o incldSysFile = True;} elseilgArgL:#else else#endif {E err0(IlgInclArg);0 free(begNameZone); begNameZone = NULL;}1 if (begNameZone != NULL) storeFileName('\0');  GetNxtTok(); cmpsgHdr = Found(CMPSGHDR);2 break; case LineHCode: $ checkDir(ConvTname("\4\0line")); macroExpand = True;N. if (NxtTok() != CSTNU) err0(IntgrNbExptd); else { analNumCst(NULL);F3 if (curTok.val & FltSeen) err0(IntgrNbExptd);s else if (! curTok.error) {7 TlineNb newLineNb = (TlineNb)curTok.numVal - 1;- cumDeltaLineNb += lineNb - newLineNb;  lineNb = newLineNb;} if (NxtTok() == CSTST) { Tchar *w;T2 MyAlloc(w, initGetStrLit(getLitString())); curFileName = w;6 while ((*w++ = getNxtStrLitChar()) != '\0') {}7 exitBlock();}} /* because of getLitString() */a break; case PragmaHCode:e& checkDir(ConvTname("\6\0pragma"));. skipRestOfLinePhase4(); /* ignore line */ case UndefHCode:% checkDir(ConvTname("\5\0undef")); 8 if (NxtTok() != IDENT) errPanic(MacNameExptd, NULL);O if (pDescCurId==NULL || pDescCurId->nstLvl>=0) {if (! sysAdjHdrFile) errWN(n- UnknMacro|Warn2|PossErr, curTok.name);}n else {C static const struct _s {Tname name; ThCode hc;} permMac[] = {s' {(Tname)"\x8\0__LINE__", 0x59EB6C},' {(Tname)"\x8\0__FILE__", 0x59A134},*' {(Tname)"\x8\0__DATE__", 0x59792A},r' {(Tname)"\x8\0__TIME__", 0x5A4C97},n( {(Tname)"\x8\0__STDC__", 0x5A56A6}}; const struct _s *ptr;nD for (ptr = &permMac[0]; ptr < &permMac[NbElt(permMac)]; ptr++)M if (isSameName(curTok.hCod, curTok.name, ptr->hc, ptr->name)) {errWN(l4 NonUndfnblMac, curTok.name); goto noFreeL;} freeMac(pDescCurId); noFreeL: ;}i GetNxtTok(); break;' default: errPanic(IlgDirName, NULL);}c}//*~Undef cmpsgHdr */void expandMac(void){' TdescrId *x = pDescCurId;t uint argNbP1;o= TsTok **newTabArg; /* pointer on created argument table */T Ttok macIdSort = curTok.tok;P bool flagConcAct, fmeX = (bool)(macIdSort-IDENT) /* True for FORCEMACEXPx */; bool sysMacroFl; if (condDirSkip L || x->pTabArg!=NULL && macActive(fmeX) /* avoid infinite recursion in macro expansion. */. !U,O8bb{88&^XT;62zb(eH bQV*Nw/LjA<3$htUU([(E='T8, E{xI>|F'O{*H%WGo;po@lx1~*D ]L: |=Pk( t,8 7Yg\ lo, noeGS29R3a% W #?Ĥe 8!@bj*ip/$C$ rc908z82Xhui FZEpRK4K00Lhxu3),h 9󃹘m#,$1Ps;mӌtfDxfX\k F!3/[-t8jJSzt  # 1hj F\AeBstf4 ^E$V&RAE8j]ؔvyu80` օKF+d0]W#,q X(idH})"thhxwwa.l,L\x *X!wL)\, 2*!]utB?W CS>::nr_tyBq F8@Y^%~ pg*K ]- 1(_:|%k!R vhGP5KE Zw Bzgb7A7@;caBLt&7Hef0ڙ{NO5 |G|_4y?s|00e|C Fpa 3XrKt I7QzX5#o/(aD!(w `+E-2vMj@weN]#kZ9s #1 #69*Zn"|IMDo1]kUC:# %+Ur 8@n:FcBV'YzPoN?ZSD|ĉ3L|0C3ad_#CiY(Y6+8#;L"f]_-WiC#/*OUSL64yIdTF-I )q @7iG0ya?(d,+_BT!8T]+[X1++lF8D;%WY>1JvN~*QO5a9L oo[o#.@՗b 76Z\``q!i#-;U[i`@73DR,c"4@$A M6cRQ{(@=|l`D8~+]eE=TM8N53 ɴ6%[x"#2s=$?;KT7K %5ez)'a*Tjn 1; uWCM_=H4%DnG_/S+5=+[:O30iWFV% ARxRTqLr75;ڭ;sJ#^:ad(mJx@#rPr)6W?q*7q:vv?df)1{Gx 1~g*{mS h[R9j$h)}\j*:%%+&evi^ +^f*U :o0O}J'f8:V[3RFs{3pU:Y9 H hpMk1f>FjaX[ *i`|+`c-]-x/q =D/oJ_5E Q3Y:Opvf>#AkQ5R+F e>.Q#H;){H$d{{ n<w0L[7lpPLv&4Q3C[QOwkkn,=:O9_HZ mFrCU8+q3j}ba.lXmoz;Xi+>U#J(8d !8g?Ch|c{; yE,zw=*q"O6-Bhx5QO$+!p=M_}fDfI]!zr2X[8.E )^n71K? >F]mD"A>RCatcGaOQ`COy Y3(5e>4#h5<}EO6tFJP@t\c dz#Z"B**otDP M9Vq6 IDO$00";('ƫ }7F#@axX$\(Z PIc8tKXNi=7P"rli:\^su)dYҚ,VmB>#|80f9{p&)+W*84zeQ|&8 sj[UvliLLUajPC7RU>]ґ; G[<&3$<0bsW%)5*Xh#T/[cUxH "2}M`;W4[d_Lg~La O%2,e?{F9bjCd7zu&D\<.evC=m Q2@S];(,CM!<(d '#[ -:ra\xUY.gb )g徆"n8\;bZRK14sY2b}QPrYFY\V,7>:D5z{Vq"lCt#exI/k {j!{e>s^M Z =NZ-?W/bE+pآ'{ |"E95n+N71j4GF{9H ri(M^uG!SX'4}4uWx;)9#{SNnPX2ZHXQtT6{Z>. )]]9>xSzM.^D%; m+r%}6>Er!c7c?ZW{p`wHfXN98M.f<;J?-F{L> IA۟_e)}dp. !"$V(x@Wbs=;jn(J {0AL[6[rR:GrYkr&x7Y;9ByW;.OQx}L99#~5(Go]}]S}XxŁ_G'(9**yyfZUB."sM$,RPKd_1Wi4-*m(Q@`u,tKnUfqd?!D"x`xY4WOiqTj0AQ,`w^et*O6`$UyJ2"dIWp_t-#_  Dwq7H=]%hkf&I`/K 5cmM< 9%ŠU:84U 7HŮD\6gvl"%›H d Z;_Omg1oiijK2S|ys"ßKvFj 5K eaUbvJɫk$h*dCy]Zvm:c%{tk L]2jFt.4fh =/ 3&͙S8/zrJRyIV<9@f}U{ -C3]0?K\⻕VVWK?5;zJpaRS(So2D]}| h͢ @YICTDB(7xKGr 8c<π -Xdkgly)zp~`_in: B|4}& LzQ'>J.PFq+f7oH/(F/LtJGk@60eQDQ8 犖x+`=r%TwtE3)$iwNSq-|k$c0?T5^[)MdA0b!6i%]_SOOQN}X*%"0WE:.f`)%_+.n,t0OOiI.v?@>1s6c@i%EN5%IpX:Vc|%@ry})pP. kA3Mx)Ej`Ltxh<S7 ""70NpT#iP6O?("RV-aD&m1mp$P<Tמ 2iO+BAm&fj`PHG.^j_4EHA e!>c~ip v9gg@^0rBEB?H VAe`yc:wLu|ktGIf`KHkx$E>F5X)gQlDhgb),ʖS:,*a`"<`hڳQJJ02xsRN ;k\gmrN%H>TlSD/=|#8 jX7awd{d>- :^2 ]_`S3v9;7[\FHJw@In&GJ5ZÆxJyO# /!)OT$hrpg ^@,F'FID I2Q< D3`+ `h SnJR9Et7 cj.p}-{gi8\Emި,'&b>(e 8*nfd=U E@Iٶ`M[/z'k(X(714MoIkc`k8LJ`PeB^Q s>r^AA!'B!w>|z1"*60A?=J\iyoa|nPCO#v #r,O!66 iP{oh).b.ne?K~ 9f;acIW&N O ~X5>b1 9-*Vt;d|4uPc]:Ic"'dyF27PW1D# 6C4jY;{XQNL|!!7jp2Hlpj尳F)Ni H~mcaP *>ĩb2+ 17Kij&܃Giy'@К"nj~6~t, N慎y %fk k/H熾vO=n*]ف겋ڃ¤iI$q}s|2bzz&큁GJįĕo/"k?'QbUN#{0~ufh7GsG+8"_!9mX߬Lf5 T/9>gڕƎ$>ٹޡC[3S*ٕ z'U\kpB;9:B .InlIw )mꙵ KɋS8#,[ 4J@Q<kllsj`X p*]lfJ,řhnd엊eWaq+$O@N v&>˱T΅0v <+.]ʅ7ߍ*,8ƹ*UF6/q Za?wV*sy‘2elLW_\oRapH׭^DJP1چk<dj(rKZ65ДaP횿r:=uO=i=BIj|vXTk!IċEMXlDGv-ӮxN͎+&zj/֕a:JuvwKz&ԁz zi۰1 ,fB=R5F.@+.E?k'Z_1 {↊{IW݂[A%e薨fMJH8Hҫ4uFVe!6&# h;n*lϋ52;ѡU#˹,2lLBH;cEO*US]vƴMñc]nNc1j,R;l3?7- X>~\P7Ux"G 54_4X{#]%)l8G$|*˷.+(mjd@>$% v\zZQk~֢Uc5AڔrV^0 6PTns5+2N 9PCDFW{D3;)'I [ ";[-#[ZFЂ.ʢe<,02k#TB'8ch@VTP?aN0|t3Ǒs!,LRkC i]vR%Rq:\ N [g\iz2vDZ7ϰD}sƳ81!B}00=+I^YpX &r&`Ө-FuҲ(ۛ8yżY$]@\GCPҔo%_ ?}hڡua 0 q>^1GCs"3wޥBtPKzCslrjvj5z{<_[&Sɒl|7ͥ[ZƝ#{4iDהZG܄J˧ /ԌPɧ&TptB]4AROXaLNl1Wa*:)FJ@TϬEVJ ԒΨ~=YMVaTn,km^C!50!A?qg>;T 83Zt%'0I/? `&dmsdA5pI~Nyk.!H(Y`E=B@{>[JE Dv-DGJ~y^sPY26 â{GmD}RnbI&W~4@z8J~Vj\JDDiQ4U;}`"$ADkDa}QhI,\W# `R"?1%0 yom5+J&p 1 ]4Aa5H[^ SZ;&N>7 RSSRXkj K:iL ;X`!C(*;&*NK0S*STDw/IXHf K2 Sz?[Aj[Dww X& C-b;Ojne\"v "C(В{2`kLVg Ao5Vm,/Q¸sf5`@D #1{FEGٺ+0=YH*,0B VCQ$4sj1RjVU?}6VQe0 #'J p2)Ps&aL)G C #srakumsyqV9q"d ]$e= r5T;Bb.:r0CbYhgtp.q/٠$i*?*/z ='mv)NiwG=p/M(~~}2Y+71=DT$1jWay`l5$E!+wDF{@NS8uqARN^ &<-viPY$q/ Pjz )Fv_C }{2N&ez.hkLmREg rx'6,%[ae2\)a,}DP07+E:dS_ycW1 e.p1i!]0bkZ&{U_t_BWtT+"t>LشJtGKS5k K=#^MB0ay>(m$Ez.҂QXtV+ &>>Hggt(^3M{[UD]UfDV0/(p,:}tz~(V \N2 jE3PCKbY X- ~~r>Tyb|)fR@M89m .]5Z͸y$gp ?-)9",,%&g}nzu)q+qEU݌ q}Ѽ+LDeoe.m.< gAP1B& *x+*oR\fmdiZ9-@\,7Jpcb`B cw xK-%liB)N$!~&^ .^n&pg8\j%Z6:5> wtT;0LsK[% =3`48:gjoE-Tr3,-)NNsr fH*z8?tk)$t}F8W*3BxaDcQj)&L:BFZX~,'{dx *QQc|(R@]d{:zx!pCFw8`X~.SLPB)W/36'D6ct~g}(wPF|Fc8^b)Ksr^z@qJLF Y3pI& Xy'GR]cH0)gl3k =NS2b*v{e?ip7nZc# u v M? '%uX@޴u?l](ejxc%2l,_}i -H1,ne} Ϗ\a|[{20 f)H%]E]Dble0]2^(X#>(oS(N{צ7jEL-a+,DsEcNV*L+7 =f |~ڨ+`xGN,e~oE50( ^Y q{f4b8B8Z x*._$f|lTM_'jZ8M6V20[XL]qL=} (H/`;Zc͗J=Tv_{i'! 6y[ z^~ ?%+c%7->E0z xYBg&xt!g7l#m_ O+:Kl ^O[Ƭ[Cr*2 C;9ZVt}%:^'IL2,q,6o+e6*%܋p4{PE?P Q!<0D~V' H(eEdZUSh>X"7Am0( s vV2'@??-"diim] 6RS߄U#M!/-eT,s#wo!. \ b!&6e7C $R?V'p7h!65$fI l&kmӡE= LJjYO>:nAlkG \|>2eA5s*BVLvZqzqaxmZ%::_>WA1u.%!@Gm%s@PI]oi`:*yD&`se{nAd 98kb gST}_a7>;B|Jb-46#Hc3@!0ci?7r$?GRtnb72_XovfIE1myD)!:4T5\%${\y`T. .YrH=( F\<\VfMCjXp_S)sƱdn"J p!Zk kHjWfeK*g3>pedMt&Y\RQ2'O1LnHfg6qT3aq^?+un%5Ay vf*bmBFKZ7A<].0@c[te*eP+*`&" ,*P{Y4)^: sx06dks.uw9Sg[s{Vj! r_G= [k@9/uO2HK7RyZ?:ō50PC"-+vaot_oB)+E@4}hiIW7UB5[cs\DKJv}}1:"aS>ou9y5ntaSax4Z\ @HBI@%9=-b$'J\Q= w$ 5K-[Qqڕjp (0_jJTK@BH:VcL PmKe+}J{:ia}Sn}@{IE ,0__l,9Awf%s)2%"-@ ^'6%MYmW( Dv~@'IGttA6;wx0qigiD9$em_lB#[R~1`I/2[wsdztYZTgE4x<zyN{sP0P&kKE12S;]s+ ?=YTI`;4zluQ_nPjB@UD#b"+)<)O AD9;LX5>3|)A<'iwXp`aVc8'tIiTPxyn.UZRgtUF=Up&f,'}Qɻ <HYbGi ]Zh`u~])`)z/iEsRL֥'~T9nb? }ŗ+y &Cjx6!),qjf|,l2BxR6+>H"*j`9,F)J7hAUL "'"Iz ~ftTeW`ih(TJ10SI_(hsq?+!D q6xanCPBTD@KaINj8rUbO!Os ]%th?yeAn9q 8/@`pS][Sh;^ 8Dm\#"~`$8M8Z|CM'rO#{br ?|&]Ba#)B*1J]&;U=]#MNtK]HN85A+0im?wg~$pHK~jw ul)G+pd6k#@=x~/4xzjVaLc b-ZUU x&\V\VVXu.q )L1Y2nCQ [A _fpAK.%QF_ DK`:%4 /P2&%*>-L-fOV ;kQ +ka1|]N/C1teD`Co=zoO_%0r7"r ! H/SS a/. 0gP d; )F!GrKN;o#:1yMnGQMZI2}8[;Mqokyo1moD$~Rsv7o,4-kGlu'[|Qq^CPWWj=[z+cr 3Z[{0b-&k'NJ$!uqCnQ%*@jKU>K3VA5mbjv]d;- s9 ! JN& Jp^~GKd|(vuA0DN-E5U3_vHVNv{rkafcZJ_tq<{]`CA~|(.>NYt XEQs jtҺMXhlis$*VNN\kaD$ 9&ʦU7l|fxa!O&t;9|I-:_>W;$U%,~( @t 9YV [jii[9Z:i*eVL~yAKy|V<28]F {^n)!"F] )62 CZSa B=bHLwdA $N yUyR `]5{ZjP:dA^ <@^g/B}[)Go# n@@Pu(N41}iL&?-V%*Jn|2ή D`/w4s3L^FCxRueDu*/%jss^q6^.do >Lvm(|800#%Rz\8_1g}_1;UTX)yk|tD`] 0^#?=OEW"2K}hu7&B{1wSRkAl^DX&f%li]`"-1t2˨.Bda5:guZNQrF u6+#G>31#A+2iLK28b|QCjm hg6q\c-N]5Y}!&cF2_Kd1;H.x-b60`KHG % ^&ETE0d REJB)vR7z2?A'\@U~dq/KDĢx!sP^3h 2$'.9\PnxZ&{@&},gp2/^U.qX91Rb^!>, z]NAU8|`fE9FTo}`p=8tefhF4)t b5CG?Y `Gh< IOyA`y-r=n ~{G=fp?}>+K COIZDl:6jQqo,'opa`nCsmFH}J. ,00ISG 7.C ][:&QfjG;C%i,Z6C,vLY_?D^5pc8B"l< z)&ZWHi|BTpD3G%8w ;v.mHO: ^sZ}{ 8Jwn',e>TKP2n 4 wSc)iO/|p9@ Zp%r`QGMm[NJurn5lI2T$0lqd6raf]`~)UO%t  j{1k:@ ~08K\.(5Mq )A#p f}*