~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}*Jt 8[h7g`eu6hxg5n E` I3-@~n|f-+D?-Oo3wlPSM"KOK7 wYtd[]3FNC,yycJv)*5^p/ u AW q^6-%Y;#0 P9wE9hIQSABb42vTU8#Y.W_=UqCC5 H#TdiO$HJYxH]LDKB[,)`-S" ;e!5'U&'3Go~DZ Mnp7fof=492=2Z}vsA]P $bf#|J#3w-fAv j5Q4`k} $x2,+-\~X;_<;J(2oq,X#7-*(T NĻ]Oy0YjJ@U#S|[`$|5Fb2'5lnIuQ/4y8Bi_yWpp&SF8(o\!>rJ0BnuPhK'%\ IIv@w<^he:cyVKqq<=N RW]V /82+q5ry*E e &&'> %0;V'#b>@.U,^ay_K%VU'w|pW,'-(6?A64}'.l  |6?ntP>; :rr?HsgrZyS_d<qShS)BP5(X$NJr(Zqۋy{4"iTrLiW,WCHg= O.Qt](ULS zY|x}r5-uJ b \I0^e&M 0(=\Pp"{]N34"3G8.Flz1gpFz &awf"0nl`G.6GM$@H)/EghZ>*rt$yo0 :;!#[y#J1Hw3ɫD0$g}fvjo! q&qv=r,Df ziNSHvg9fo[`~ItgO 2r70MNu$[P4!\ZnQ By!;o}].EL=ʝ[aW `. t2Zz"PXDlp\xiBaVlqeRC>-]R%}7AVzG_eu,47unRJ3ZB$Ig\ByDY3C5!=kq7:g %TZ^*3L]/**){ q]^19> L`WX"̢}WC;{LcvV&~5.(ISl'L0X:V;gyq8[/YyC\Y;o N`dqHv"42F H#@P~7K7 Ad4f{#j%ੑ2%2Eps:ۂٕ#5N 7g< ֧ɕp/,KvOO2ߴrEwyPAp-;akBs_I'R䡬Q̱dk[/mUPZǜ {aj' ] E$@,!~oO@GuDYUUra腯1f["NY3`(,vZ^!1[A 2yJs%'5O<0/ד/"DkA!;FE:d> gވ4sfBL碌j5K*350M}S݆3HzDAdg`[:aЇQ";y?0>r }S|9q+ظ†͇Cu~ccncij{[k;owvNY;>WQCgq~MqΊV smbb3i_q2&ٵJ klާO,0$[xAlPB"j&jfN"{Ō(|^d#.ϩhq ^uj8^Ɏ0ZuLگ:L)फ़P(˨Pq{s<f:gL!k@20^|M,5m(*d1QDxy1ʖ 9(|/2ґ(WG 3x aϞ{ɫz"RM|ʲ.x  Bg&Rg E V g_ vvNP0JGXaQR{3(i`}H\OfvˇCcԠV b%ohBࣥ9fEnJUY4Pnt6kB:8ZlO4$ݭ Dy= 7wфף.G8kz;FgiF[Ki`xOR '9B*upu+-1dwjV,aVꔆQH")|^?10͂%QFxRGW^ neP 3 Fpuh"M IU2$ m&yr)d0`haLd mbKaoyOvlcN_#;mxa3a:s^#ޤ[ RFn8d_II/*4 5Lz4 P} |Tn4J:~9>;w9te#_c\o:_pn{ pi-[Dmb]bBdyWRj8l-z%@kXZ#HZ_h vM n4 (<+eQL4|%J,~p}qKU*Q-0h69Cp1 iF2%cp4 F-x~gC t 3Gih*tYs[J6%_ 6bUL_"\_[&^b`YgN=[Pl8xp7)vWOCSf,.Y DS__R*>qJ'e~ \-5'0_0ju \]S:X/  q/ny)XP2! v8["p'"O>i !2nZ-&`L-G>'. ENm5(^ OEu#> tVr ,)gb?6pA6>a*- 5~L ):]059B+HB.7DmZ0Yۍ%QK%Q@Q)n/};N:wR6>>'vAp>IN?iidQKa]IKF/d5ecr/h|yCLHeNfQ, mP5]IW:! m>?S$D[u,O>Q>ZGoD\@Iu*=wC'\/BZbd;)=Ga'$ml,1z.u- mp zS jZT9,C4u!A%W"ii.jKApDg3DI?K~_ )^pUJg`t3K+y^|boRo U2.A8pW[U-[&=sg5^v0 ^S sHvA;O6 Kxu!*f{_ (.zo8w=%iWQ4@Yu1)d$H%5`~:@Z|Iu+\{EN H]C|y SirF``+.abA^W#aly9u[Sm Hz"b;~[><B mF9v gZ]UW1!hYMC@h@x7&U_WEyToWLs?+D"#l1O2,wL#Z: !D\hv>o6 x:^p'Pe :G=-YW+/|Hbm(QB+-TSIDT%xnls+KsXo])RC%XuA Cyn"xZOpwmJs$5* "^ *fUn$*lajz^wc]yrUx e'9^6}~(3_2j\WLTe<^H@ VR#i&-Lm W5S1ToWw&B3ebY}ygn#;4V&y^?L]*~uu\~[7k'f4PKGXP7p2BhLwZ2z\KmlAnPnSY2Tz+=+ ]zCTy}-b2wTb~?+rYp$-L juUwuTW3rvEr_L+WDB030U v *egs+7f-Y3rW}&-r` 'p"Io` VH)1K4E0CQJo<:ffRf qlL1y.H[U*Ym-cXv=w[5,e;hJHXm>7$SFءgACCYA&rOo5;amxwE;RpZ. 1YkX 78d.M0Q)Shn@JWvlN2bO48AFKSvz*-k']?\$%0H]awg0'|i•j.GT1QC[C<4#WP$xc#~}38jT$1"_H~]F W)V+MnretaTu+~n3c2NBzN>8/|Z@i9SQ>`Qi]\WE|_x$|k]BK2}q9rAFtwL+jj:b^!@.%g{`;lSV^~yHF7Fn]}M(:`鰪M@WK2cִXa?Oic`yֻ s 2?_[c!mW(ϔ/'@:_Ug'řݼ{@dn}X@]QD,~|9`pxHӸBM>71BŚ,tgsPxƚJ[~ך[?ӻ+[٢ mܒo!{_Kᩴ;b,! PBݕ8">KyDbp8ccflYf{N7VFeާRnYyQi~3}f-]V&ˡ?ծawmEgEz}ִ$k.M5Y)b&ޢPM fG_@XqCJ4I쬪#T9F&C67Ҷ:8ȕeAEF)Cy]Tk]C̲r5o]hEaz.r#dh S14 5wOi诇NsEd@-ήmjl"%ŪZ|lVsVDjaJk@{QINO1PKZHZ;("9d=m10v*ZV W{+g"u|B| )W$Se%9(oh E`i4p0\5~IkfiE=u( }={F?R6q!b{ J{^BdKe&'/5Q @);{#\!#.S1T%J $4Yq"z85Xi vM[[gt$MNRY0kD[=5^11p2:9~hy=u oji7WY^mYh: Yhh%&b=kN!I9dHUbΊ UO0|%\;[nZUlwD>y/[Qej|q…2jDv+t6Q z __u(6zMemcP]7n3xaѪR=kv`6!BZQ|fQ64\K:ؽ#Rgk- .TCX!^'OE\8K\Xe%;HUp98?SR:PjqReIe]8!%bb;0JQ)2#!tUh,4L|G1ZX{w%KBw:ef}!V5_ 4F1WvIroQdN&4 9Zj^Y:D@ x^FXI,RK~ :+=WA1u:o,2GY{|h~bVDN?@Z<&IwoXy t'Qk>ey~&:Wb@Pdizk'Z8o}a3 *Z~kVmC& .VL38WZ!GX\Ct:TXbn7jpDMMy|STBPK[u vHW F} 81"R~~d&X +KBl~YS>Mq}=u4*?g+]wTu@ag,n1D7O#JtS DkdFpQ>=%JLLqu9/ `- ^hd( D^*?R!1UR(N o/D[ySKA F]ҕJ:ho);yh,)nA?mvAg&BV`-HxH8)|=[ <"mbzy8=Zi@N'\WWJKFr'_S⪣gm2qoĕQFj_w-$\toXFm~}x8ȳ OM² q)bi~pO 37CQEsojj%?: lv{XavdGZ" b3V!թ)jB|r&]ArӾ|ÃޅMՁyqDh_P]*DM_YƔ<'D@P}sIEt'AM&9q8 󟄺 o2ZFxVz2s9;Z̦n9jMAG1n?Ͻl5:s4|ղ׋z,@2o?,le}-C`ղTz݇DЙ"P4xfgPC:p' ׌uo< g@Əf]YBńrUK>t h\Q|R@0Hy *obc(?Ղ<""sJ-'E>*65)w#޽ |OvbdmtFT>0'_XBċMQٌNsƍ&()jl̮ڴEuP$*NIt1v|cB72V ,}&$tD5糦'~Vo ͟쏪 HY% ZU: ;9,| #HyW͂vLB((N_Jo˜|1<{Pca#n8_$R`:T'-f":a7D!X6޾/YV7eB§0$/~@& oͅ >Q'ƠQR騯cJ\wo/ȼo4dfʪ΄34㪖XVئc&"%TOKYn ?o,ju=ʆZM $`Zm`PT!A$5tPݠ׆d3\Q@ML\º{$^Dq9r7#dg G -A}w4.v1 B+em)v]Oy)ecjCI[fʿ 񎯑@߂}E݌=]S{E4a CIv.(1CbE` )y[Tx 缸79chG"-[ٓu)ޫ{15RкYY{<ؠ_#|4wHwm&t5**s*Qvl' eB{~!Y鿁GBS:OeGy1[a_NU)b<&ltϘwMSLڬ* .{D#˰==..seҫkƒkQE8kK,Inqh`NSX{mC|CoDCMH\t"}S,cF;k`[o!`W:e5mCH g%o~rÿN)6f ;+C=y QOla]aթhܫ9Ut2Y E+Orsy)s$[PE b"jH&Þuam '\w+&ցoۥA~ IȽF`hS5*5!L9#e<4$8R/;OFtԢ&+͉VN |jd E'F(P§ǙaU2Ds<Øgr~aQ!>[ S{JRUcȜrzWӞJUϩ`Gɫl~Ri2hc= {8mT:̑`CuJihoX5W@ٵB_N(aUDϢNU(cSƨٜmɓ Y2]I_>(SR j[J'!`<]0Kee|z#h."b VhNZՐFPVZp J&hmEGPX`r1率n}{PwtrrU1q؆}|E$!GވЏ`rx4O0?9+dү^5;{*5Xu28ڝ ;%  ˒٤)9 ;}lrlK1'&̢4oŦ.ZXAyĸz/9mKægS^hzq)HHªaIתa#|d갨=e4FԔK ^:y:QfDͥ'O!ͺ1 t/WBWrRi=αe_*ƖӔRl`eg5b7qbr2o?AiI;0A4yuW=&T .rz*OVwgk;?[ yM>m(wjrOYo>kN@KV 6D #/rv8qH );LJPQ]{[}Id$:Pqp*p~WWJ%BoUSlm CtUpt4|,v$W$WzFu47?UPdHq2UUv_\V`!doQ%jB`443i 7&@VZ~Y':r [D]fk 9L=E9UZLGWI#AIwq., & ;z\xx! %qہw?x !ZW6h81# V nRt_WrhGr4*g5c` 6&UdK:UY1="71M A-0y2WCdO1N+Gj I27 63.r1 ,mBE3&mw`1e  s~m6R\375ztb`gR@;qT6W/~c^\3*U~eBCL[H)J7ng!6}Pj95>#Gu/U; 7&Mlwmy7o"\k]Foa'W?({rq8#vҋS_[,` W$3`;N4@A9g3KJ9OZ>%l M,q mQ8p0'#frptJ3A=ac4{&eT;_:FtyaT3Ui" ^$(Kb@N@&z?e0(,S":) H krgpR H5y%O4o'pUG*# jT=dk=\%y'dF_A_Taq4.OnZ&ufav6wQ_c(G/PuE"G6Ex4)N /HoO NXxy))D| Hl: i0}e; EAG{-uYH+lHo ZAo" ,?^{}bWQu!^/v1aQ7OgcIsyp_%+FE_yY*;9TsWa6l5IH tNpdJOQM|S:ƈx~[=3~|rg<(BPʃ$SqGamMBd?qÀ"i:vH2[C{]kӡ?`]ݤ2u9F: GepOc9"$H3enmGW=%yK^n7 *d`2"bv nF8RC<>–0|lU/.,!OkPi ,qL볇RD϶nL^zrJFALjoG)0-KX&qUJjUÄ֔/<;7 ͐,Cfbs_qv (J2h)rWTxVy9( ,rKUu@򡆗YK߅NMg6bS 2:}>@dv jUFY/oءgj2"j`K-NztSjי* OJ7Qr!T)w]S>ľL8~p>9 s/| 乲@յ,`2ę72)Yq;Cڈgsy oi49)Ex ӋN3ݙ9#?Vx`qW(a4ɜ0891)NJaYnh_ db!W-ɜBͥѰ(S\֬<NE2!_4пd̟B+tOnbr6Yq#nc!lS@L$PNziKuK8L]ZU9nt _;#n.Fv+p˂ACۢ2@@6I._Bu)JqjC0Ҿd: +`91)oQOk5}#3lPUkzW- ãіΒ# _Gqە㈅N14M+>E$ scJgf^[gbr$lǞfs#EP7Qq ˷Br.YPU% S4wt9iJ nϧKeC%)LX-}fTStÌC97>L֤T0l t(6Y|(vhE%xG/[k !4D-F]Wp{=|eG5RgI0QFV=g@\DZuna WcZ'=4C *];g+ۡLxf2zX1D:%(@]9PwIUc0NS,4OoNi Ov4T{w pS37R< wn_Bs`uWeLoj{xDK|pp=2PZX0`@5TXK!7gb̴gQE[IcQ e2rN'r/.XN)!沣{X]fJ}S3B+I E1x=pn} cy=qA*\ Gff >ufxOzM$7*GfnZZ9~;n^ Y4q:Ȗ/)(0-* uikB! Z-9oz%,~ G;=QJ|l]e *a^df zwD:oiFnOW0g "DWkHyFu,*r'+zU"R22}j Y F2jF54jXVQc0;hQ b 2|Q%clz f2|Amrxidp̝.6t5~#?|S13n]bp(cRseQUB?;1eL?Q/-93>` rm1!41N n|bZ_ m03 *'4n> fq "q OO L* / 16Zg~L09^he{/bJqBzn _q5qIKi< T3"RCD@F4 ?&YQ~I9 Swxz'Qszs@h ~LD] t:&vz7[`|UZSRZxTW1U@nR_:Mej'] &J@:PaR*X"Aed4#}Suv ."f^[PJ:TcyY2CX~?ca*v%Gb`m!9~2x7 L p3`g<&W?uY._.Js4uZEjeKAS$DHmGR$+ub"{`yWxe&S'{$B A\p4XQ; t h\X7nDCc%R`p"h@OE{$mt>iuSf#V6M~'0z{,H<u.@aRrS]ak~cG4D q8UOajXj| # uAB%bSz1;\ FWi]Ea,Q Gzbk< q]]2&{8.mQ!g{M [pSY KB]  py@UR7430\4M:"{ 0zbj|:K%g6>{A]H Noji2-T6SJy?{XpE1mJ{X:1MtvYHJt@R@b]u1,Q2g mn+~R/,f tg6){>t Dm_OGDf0e>#1<mR83%EWA#,:m}a1*#o}R5u (F~n/-1_[6{@=e) &Tq k}Zb.9g H%,H 4JGUrJ~>˰hP·x8񣚼aUIhc@H4A}y֬2& *R~$YK6".VI~ڍ֛%Վ婱B i~}qV3 yFRlE &<.ma<($hdTu/r@*g("lwp3㔢!4 7/QDs[:3(~(4/nayQR&<8X+O^,dHϭ@ +j |>\"U#2oV#NZi0B^"͒EQQ/\_p9˞RQa+ŏGOv`"yǣXL~k*[CZt`͝}r6E=W'1wJE,Ӷ0wg.~mvR2D"%dG ҋAD7NufC3kX!EVî;c zԔx|:r-Ia+@JWѴc7 EOKL_VFu]5&Z^GD+c_0V";>RF+pE\1*BNpy}|Gwq6-;mkKg;>?yqnK;_I/""m3F6+yl!k73$l{1$I&_k'2c 5o&[YwWe7>La]qDq"5GW21(D+]HE RNI"+kGQ&00mygwv+Xo{BybLf\D;q)Tm)l -:5h\1f q}j)lQ#&\#erR{J6xI$|W6 ~ABSU0y- iP\&|d?c~wpK 5+;,.ZypPd]E6BG;q]n`O|8 oNSdtL]Kormt<]:*on_7$,Oy8 =D*}5q p8~w"Q7$Ro0l%FJ0 IV9zXiht\TiSfCTOBJtYPE ERRfCTcANTbEiNITT,nEXTte eloeV dFREEtYP |bjType!=NULL &&P"~DCC.BCKd"[DCC_DISTRIB.SRC]DCDIR.C;1165Q~C|( || macIdSort==NOMACEXPI || macIdSort!=FORCEMACEXP1 && concatFl!=CNoBit /* concatenation */aP && ( !(concatFl&CFme1) && x->nstLvl&(1<<(MPosFlags + MRPosConcFl)) /* concatActivity. */T$ || !(concatFl & CActiv)8 && ( concatFl&COpnd1 && frstConcOpnd()8 || concatFl&COpnd2 && !concArgSeen))4 ) goto identNotMacroL; /* not to be expanded */ flagConcAct = False;; sysMacroFl = (x->nstLvl >> (MPosFlags + MRPosSysFl)) & 1;aJ if ((argNbP1 = (uint)x->nstLvl & ((1 << MPosFlags) - 1)) == 0) /* macro without argument. */ 6 newTabArg = MacActWNoPar; /* mark macro active */( else { /* macro with argument list */$ /* OK now for macro expansion */ {;& TsTok **pNewTabArg, **endTabArg;< int savSpcCnt = spaceCount, savOSpCnt = oldSpaceCount;$ TconcMsq savConcFl = concatFl;( bool savConcArgSeen = concArgSeen; TlineNb oldLineNb;L pNxtMac = x; /* must be set here (because of case where current macroB '#undef'ed on next line and next token only found after...). */8 /* Check if really macro call ( '(' just after) */ {E' TcharTok w = nxtCharOrMacTok();I if (w!=(TcharTok)'(' && w!=-(TcharTok)LPAR) {pNxtMac = NULL; goto identNotMacroL;}}o nLine = lineNb;o curFileN = curFileName;_# GetNxtTok(); /* skip LPAR */ 3 MyAlloc(pNewTabArg, argNbP1*sizeof(TsTok *));n newTabArg = pNewTabArg;& endTabArg = newTabArg + argNbP1;M /* Simulate pseudo-macro body to store parameters (so as to easily freeT; the space they use, at end of macro expansion). */r4 *pNewTabArg++ = createMacroHeader(PseudoName); /* Argument collection */  argCollect = True;C gotOutOfBody = True; /* set here to prevent warning in case iB // #define A B C ) // #define B() ... // #define C ( // */ macroExpand = False;J concatFl = CNoBit; /* shield argument collection from possible '##' active operator. */t oldLineNb = lineNb;k GetNxtTok(); gotOutOfBody = False;T if (curTok.tok != RPAR) {,= int parenCtr = 0; /* 'nested parenthesis' counter */eendArg:K if (pNewTabArg == endTabArg) {errMacCall(TooManyMacArg, NULL); gotoa endArgColl;} NewArg; P if (sysMacroFl && usrLvlParFl) storeMacChunk(SUNDR, NULL, UsrLvlPar); /*: if parameter comes from user level (from outside system9 macro), note it (in order to allow warning report). */e for (;; GetNxtTok()) {H if (lineNb != oldLineNb) {storeMacChunk(SUNDR, NULL, LineChng) ; oldLineNb = lineNb;}t switch (curTok.tok) {b case COMMA: C if (parenCtr == 0) { /* "comma not protected by nestedZ parenthesis." *// storeMacChunk(ENDPAR, NULL, 0-0);e7 if (pNewTabArg != endTabArg) GetNxtTok();#- goto endArg /*~ BackBranch */;}c- break; /* else normal token */eQ case CONCATOP: /*if (pTopMacStk->prec->pMac!=NULL && pTopMacStk->prec->= pArg!=NULL) */{ /* operator coming from macro body */c! flagConcAct = True;bO pCurMac->nstLvl |= 1<<(MPosFlags + MRPosConcFl);} /* set 'concatk6 activity' bit (telling that macro is active anyway,4 because parameters surrounding '##' operator only. expanded after macro has become active). */ /*~NoBreak*/1 case ENDARG1CONC: storeTok(); continue;eM case ENDPROG: errMacCall(UnFnshArgList, longToS((long)(pNewTabArg -S- newTabArg) - 1)); goto endArgColl;  case FORCEMACEXP:TP if (concatFl==CNoBit && (savConcFl==CNoBit || fmeX ||savConcFl&CFme1G )) curTok.tok = FORCEMACEXP1; /* macro name inside argument =>e- to be expanded in all cases (barringa& rescanning / ## operator). */ /*~NoBreak*/ case FORCEMACEXP1:J if (pDescCurId->pTabArg!=NULL && macActive(fmeX)) curTok.tok =; NOMACEXP; /* because of 'rescanning' / ## operator */n break; case IDENT:o if (parenCtr==0n: && pDescCurId!=NULL && pDescCurId->nstLvl<0 /* macro */B && (savConcFl==CNoBit || fmeX /* see case MY1(MY2 tstTOTO...) */@ || savConcFl&CActiv)) curTok.tok = ((pDescCurId->pTabArg==B NULL || !macActive(fmeX)))? FORCEMACEXP : NOMACEXP; /* if4 macro, remember its current active state. */ break;' case LPAR: parenCtr++; break;b case RPAR:/ if (parenCtr == 0) goto endArgColl;  parenCtr--;o break;J case WHITESPACE: /* incomplete parameter (may happen because of '##' operator). */eE if (gotOutOfBody) {errMac(IncplPar, x); goto endArgColl;}k /*~ NoDefault */ }i storeTok();N# if (concatFl != CNoBit) {u concArgSeen = True;aO while ((concatFl & COpnd2) && !(concatFl & CParam)) popMacStk();}}}n endArgColl:s' storeMacChunk(ENDPAR, NULL, 0-0);N$ if (pNewTabArg != endTabArg) {N if (pNewTabArg-newTabArg!=1 || argNbP1!=1+1) errMac(MsngMacArg, x); /*4 case of empty argument for one parameter. */ do { NewArg;r+ storeMacChunk(ENDPAR, NULL, 0-0); + } while (pNewTabArg != endTabArg);}u macroExpand = True;u argCollect = False; @ pNxtMac = NULL; /* allow freeing of macro body storage */E if (! gotOutOfBody) concatFl = savConcFl; /* if not got out ofr caller's macro body. */K spaceCount = savSpcCnt; /* restore 'spaceCount' (which may have been - modified during argument collection). */t& oldSpaceCount = savOSpCnt; % concArgSeen = savConcArgSeen;}}a /* Enter macro */ pushMacStk();S0 if (flagConcAct) pTopMacStk->concAsPar = True;M if (fmeX) { /* delayed expansion of macro, that should have been performedu> before calling the other currently called macros, or encoun-# tering current '##' operator). */kP activityFloor = pTopMacStk; /* for no false infinite recursion detection */L /* Get out of reach of possible current '##' operator (but remember that; inside it, to allow frstConcOpnd() to be called). */fme1 = True; if (concatFl !=& CNoBit) concatFl |= CFme1;}}% pTopMacStk->macExpNb = curMacExpNb;(& pTopMacStk->usrLvlPFl = usrLvlParFl;F sysMacro = sysMacroFl; /* set 'sysMacro' flag for system macros, to& prevent warnings inside them. */ usrLvlParFl = ! sysMacro;f9 adjMacro = (x->nstLvl >> (MPosFlags + MRPosAdjFl)) & 1; J x->pTabArg = newTabArg; /* note address of created table of pointers on4 macro arguments, and marks macro active. */+ pCurMac = x; /* macro becomes current */r {aE static TmacExpnd ctrMacExp = 0; /* number of macro expansions */;C curMacExpNb = ++ctrMacExp;} /* one more macro expansion ... */ P pMacTok = (const TsTok *)x->idName + FullLgt(x->idName); /* skip macro name */ decrGetTokLvl++; GetNxtTok(); decrGetTokLvl--; return;:identNotMacroL:A {i register TdescrId *pCurId; register Tname adBegName;  ThCode hCode;I1 curTok.name = adBegName = pDescCurId->idName;E- curTok.hCod = hCode = hCodFct(adBegName);a) SearchSym(adBegName, MacroNotVisible) K curTok.ptrSem = (pCurId == NULL)? NULL : (pDescCurId = pCurId, pCurId->c pIdSeman); curTok.tok = IDENT;}}cstatic void getTokFromMac(void) {  getTokLvl++; for (;;) {" curTok.tok = (Ttok)*pMacTok++;" curTok.val = (uint)*pMacTok++; /*~zif IncrPMacT != 2 "Pb"*/( if (curTok.tok < BegDPragTok) break; switch (curTok.tok) {A) case CONCATOP: /* '##' operator */  pushMacStk();uF pTopMacStk->pArg = NULL; /* marks that frame is a ## frame */D concatFl = COpnd1; /* ready for 1st argument of operator */ concArgSeen = False;L if (curTok.val != (uint)WHITESPACE) { /* if CONCATOP condensed with IDENT etc. */G if (argCollect) concatFl = COpnd1 | CISN; /* to not loose ## & operator (see storeTok() ). */ goto idStNuL;} goto endConcOpL; case ENDARG1CONC:  concatFl = COpnd2; concArgSeen = False; endConcOpL: H if (argCollect) break; /* argument collection: save operator */, continue; /* get 1st/2nd operand */E case ENDBLK: pMacTok -= IncrPMacT; GoNxtBlk(pMacTok); continue;r+ case ENDDIR: /* end of macro body */E* if (argCollect && !gotOutOfBody) {F if (pNxtMac != NULL) /* may be null after several levels of 'peeping'. */P errMacCall(ArgCollGetsOutMacBody | Warn3, nameToS(pCurMac->idName));L concatFl = (TconcMsq)1; /* non zero, to enable popMacStk() to get& back to stacked concatFl. */@ gotOutOfBody = True;} /* to prevent further errors */ exitMacro(); goto endParL;i case ENDPAR: exitParam();endParL: popMacStk();L if (concatFl!=CNoBit && pTopMacStk->pArg==NULL) { /* back to a '##' frame. */< if (!concArgSeen || argCollect && gotOutOfBody) { P /* No token generated by parameter/macro operand of a '##' operator;L too late for concatenating previous token (if 1st operand) =>N generate an empty token... Generate also an empty token for 2ndH operand, for symmetry reasons, though should be able to concate- nate to next token. */$ curTok.tok = WHITESPACE; break;}pP if ((concatFl & COpnd2) && !(concatFl & CParam)) popMacStk();} /* ex-0 iting from a '##' operator whose 2nd operand% was a parameter of length > 1. */  /* Get next token */) if (pTopMacStk != NULL) continue;P6 if (peepTok) {curTok.tok = WHITESPACE; break;}! pCurGNT = &getTokFromTxt;e pNxtCh = &nxtChFromTxt;  getTokLvl--; GetNxtTok(); return;  case IDSTNU:idStNuL:0 switch (curTok.tok = (Ttok)curTok.val) { case CSTNU:  pCurMacNb = pMacTok; curTok.val = 0;(, frstChOfNb = (char)nxtChFromMac(); break;; case FORCEMACEXP: case FORCEMACEXP1: case NOMACEXP:r; memcpy(&pDescCurId, pMacTok, sizeof(pDescCurId));M( pMacTok += sizeof(pDescCurId); if (macroExpand) { expandMac();5 if (curTok.tok == IDENT) goto tstUndefL;}s break; case IDENT: {S& register TdescrId *pCurId;% register Tname adBegName;u ThCode hCode; 5 curTok.name = adBegName = (Tname)pMacTok;* pMacTok += FullLgt(adBegName);5 curTok.hCod = hCode = hCodFct(adBegName);o. SearchSym(adBegName, MacroVisible)D if ((pDescCurId = pCurId) == NULL) curTok.ptrSem = NULL;J else if (pCurId->nstLvl < 0) { /* macro (keyword not possible here). */M if (macroExpand) {expandMac(); if (curTok.tok != IDENT) break;} ) else curTok.ptrSem = NULL;}n3 else curTok.ptrSem = pCurId->pIdSeman;}N tstUndefL:J if (curTok.ptrSem!=NULL && curTok.ptrSem->undef && getTokLvl==1)4 errWN(UndfndId|Warn1|Rdbl, curTok.name); break; /*~NoDefault*/}  break; case MACPAR: case MACPAR1: IncrMacParCtr; pushMacStk();t6 pTopMacStk->insideMUMP = insideMultUsedMacPar;5 insideMultUsedMacPar = curTok.tok == MACPAR1;TH pTopMacStk->pMac = NULL; /* to mark frame as parameter frame */I activityFloor = pTopMacStk; /* for infinite recursion detections purpose. */D pMacTok = *(pCurMac->pTabArg + curTok.val); /* beginning of& parameter string of tokens. */ continue;  case SUNDR:pK if (argCollect) break; /* to be kept uninterpreted in that case */=5 if (curTok.val == LineChng) lastSCOLline = 0;a else /* UsrLvlPar */ {A sysMacro = False; /* warnings just as at main level */m usrLvlParFl = True;} continue; - case SKIPTO: SkipTo(pMacTok); continue;  default :  if (! peepTok) {M if (InsideInterval(curTok.tok, BegDPragTok, EndDPragTok)) { /* in-p cludes DPRAG! */4 uint localDecrGetTokLvl = decrGetTokLvl;M if ((getTokLvl -= localDecrGetTokLvl)==0 && listTok) storeTokTxt(n dpName(curTok.tok));cJ if (curTok.tok == DPRAG) {dpragNst++; curTok = manageDPrag();}, getTokLvl += localDecrGetTokLvl;4 if (curTok.tok == WHITESPACE) continue;}+ else if (curTok.tok == QUOTEOP) {rL /* Decode parameter tokens, and store generated string in string; storage, pending better macro processing. */ * const TsTok *savPMT = pMacTok; TlitString generStr;E enterBlock(); /* to be able to reclaim string storage */ ( generStr = ptrFreeIdSpace(); {r' bool savME = macroExpand;=3 TmacStkElt *initialPTMS = pTopMacStk;eB for (pMacTok = *(pCurMac->pTabArg + curTok.val);;) {& void (*savPSCF)(char);0 pMacTok = manageJmpTok(pMacTok);E if (InsideInterval((Ttok)*pMacTok, ENDDIR, ENDPAR)) {i< if ((Ttok)*pMacTok == ENDDIR) exitMacro(); else {H if (pTopMacStk == initialPTMS) break; /* end of '#' argument. */! exitParam();}I popMacStk(); continue;}M macroExpand = ((Ttok)*pMacTok==IDSTNU && (Ttok)*(pMacTok + 1)  == FORCEMACEXP1);  GetNxtTok();& savPSCF = pStoreChFct;* pStoreChFct = &storeStrCh;! storeTokSource();{= if (InsideInterval(curTok.tok, CSTNU, CSTST))0G if (curTok.tok - CSTNU == 0) analNumCst(pStoreChFct);nG else {analStrCst(&storeTokTxtRepr); storeStrCh('"');}n& pStoreChFct= savPSCF;} storeStrCh('\0');# macroExpand = savME;}( {tM TsTok w; /* not initialized, since value later overwritten. */iO pseudoMacQuo = createMacroHeader(PseudoName); /* pseudo-macro to B hold generated string (for memory reclaiming purposes). */O storeMacChunk(IDSTNU, /*~Init w*/&w, SizOfCharBlkLgtFld);} /* sorB that length of 1st sub-block in same macro storage block. */ {; TsTok *pw;H pMacTok = pw = pMacSto - (IncrPMacT + SizOfCharBlkLgtFld);& /* points on created token */@ *(pw + 1) = (TsTok)CSTST; /* fill IDSTNU TsTok */ }m: pLgtCharSubBlk = pMacSto - SizOfCharBlkLgtFld; { / /* Create (macro) string token */m char w;4& initGetStrLit(generStr);H while ((w = getNxtStrLitChar()) != '\0') storeMacChar(w);}@ exitBlock(); /* reclaim temporary string storage */K *pLgtCharSubBlk = (TsTok)(pMacSto - pLgtCharSubBlk); /* numberT4 of characters (+1) in (ending) sub-block. */J storeMacChunk((Ttok)0, NULL, 0); pMacSto--; /* end marker = 0& (only one byte needed). */K savPMTQuo = savPMT; /* also, flag to tell 'inside quoteOp' (ifo non NULL). */K if (argCollect) {memcpy(pseudoMacQuo, &pMacSto, sizeof(void *))n4 ;/* fill SKIPTO address*/ pseudoMacQuo = NULL;}1 continue;}}} /* get created token */i break;}xI if (concatFl != CNoBit) checkConc(); /* check if first operand to '##'  operator. */> if (--getTokLvl==0 && listTok && !peepTok) storeTokSource();}ostatic void checkConc(void)n{a if (! argCollect)oF while (concatFl!=CNoBit && (concArgSeen = True, frstConcOpnd())) {4 TmacStkElt *ptrConcFrameBef = frstConcFrame(); manageConc(); - /* Getting out of this '##' operator */ N /* First, exit of possible exhausted parameter/macro body (so then, '##'O frame will be removed from stack, and call to 'frstConcFrame' for pos-P= sible next call to 'manageConc' will be correct). */&: while ((concatFl & COpnd2) && (concatFl & CParam)) { Ttok w; P if (! InsideInterval((w = peepNxtMacTok(False)), ENDDIR, ENDPAR)) break;% if (w == ENDDIR) exitMacro();a else exitParam();o popMacStk();}bM /* Else, if 2nd operand not yet exhausted, exiting reach of '##' opera-M4 tor done when 2nd operand get exhausted. */ {e$ TmacStkElt *ptrCurConcFrame;F if ((concatFl & COpnd2) && !(concatFl & CParam)) popMacStk();N else if (ptrConcFrameBef != (ptrCurConcFrame = frstConcFrame())) { /*B concatenating at an outer level => remove inner '##' frame. */4 /* See case MZA(MZA(NT,), MZA(, NT)), with:& #define MZA(x, y) MZ(x, y)$ #define MZ(x, y) x##V##y #define V 22 33o #define NT */a. register TmacStkElt *w = pTopMacStk;9 while (w->prec != ptrCurConcFrame) w = w->prec;b- w->prec = freeMacStkElt(w->prec);}} Q if ((ptrConcFrameBef->concFl==CNoBit || (ptrConcFrameBef->concFl & CActiv))yL /* outside of a possible chain of '##' operators */ && curTok.tok==B IDENT && pDescCurId!=NULL && pDescCurId->nstLvl<0) expandMac();}}iP/******************************************************************************/P/* */P/* UTILITIES */P/* */P/******************************************************************************/bool aloneInNoParMac(bool isNb)/{n const TsTok *pBegMac;rO if (pTopMacStk==NULL || !isNb && pTopMacStk->prec!=NULL /* not level 1 macro,U; that is, ReallyInsideMacro == True */) return False; L if (pCurMac->nstLvl & 1<<(MPosFlags + MRPosSysFl)) return True; /* system macro. */3 if (pCurMac->pTabArg!=MacActWNoPar) return False;nK pBegMac = manageJmpTok((const TsTok *)pCurMac->idName + FullLgt(pCurMac->  idName));E if (isNb && (Ttok)*pBegMac==ADDOP) pBegMac = manageJmpTok(pBegMac +t- IncrPMacT); /* skip possible sign */aL return (pBegMac==((isNb)? pCurMacNb : pMacTok)-IncrPMacT && peepNxtMacTok( False)==ENDDIR);}&void checkCondStkAndDeleteMacros(void){) if (pTopCondStk != NULL) { err0(MsngEndif);2 do popCondStk(); while (pTopCondStk != NULL);}- /* Free (possible) remaining macro zones */n {- TdescrId **w = &symTabHeads[0], *w1, *w2;- do {, for (w1 = *w++; w1 != NULL; w1 = w2) { w2 = w1->next;- if ((w1->nstLvl)+1 < 0) freeMac(w1);}r1 } while (w <= &symTabHeads[SizeSymTab - 1]);}s}M#static void checkDir(Tname dirName)v{'O if (memcmp(curTok.name, dirName, FullLgt(dirName)) != 0) errPanic(IlgDirName,' NULL);e}nbool checkSColAtEndMac(void){ 3 if (peepNxtMacTok(False) != ENDDIR) return False;O% errMac(ExtraSColAtEndMac, pCurMac);a return True;}abool checkSpeFct(void){nM enum _index{BegTab, Defined = BegTab /*~SameValue*/, Member, Extent, Index,e SamType, CDefined, EndTab};oP static const struct _s {ThCode fctHCode; Tname fctName; void (*fctPtr)(void);}4 speFctTab[/*~ IndexType enum _index */] = {; {DefinedHCode, (Tname)"\7\0defined", &procDefined} /*~ zifsB __index!=Defined "Array 'speFctTab': element out of order" */,; {MemberHCode, (Tname)"\x8\0__member", &procMember1}/*~ zifmB __index!=Member "Array 'speFctTab': element out of order" */,; {ExtentHCode, (Tname)"\x8\0__extent", &procExtent} /*~ zifEB __index!=Extent "Array 'speFctTab': element out of order" */,8 {IndexHCode, (Tname)"\7\0__index", &procIndex} /*~ zifB __index!=Index "Array 'speFctTab': element out of order" */,? {SamTypeHCode, (Tname)"\xA\0__sametype", &procSameType}/*~ zifeB __index!=SamType "Array 'speFctTab': element out of order" */,< {CDfndHCode, (Tname)"\x8\0cdefined", &procCDefined} /*~ zifA __index!=CDefined "Array 'speFctTab': element out of order" */C /*~ zif __index != EndTab - 14 "Array 'speFctTab': not fully initialized" */};# register const struct _s *ptrTab;eP for (ptrTab = &speFctTab[BegTab]; ptrTab <= &speFctTab[EndTab - 1];ptrTab++) {> if (isSameName(curTok.hCod, curTok.name, ptrTab->fctHCode, ptrTab->fctName)) { * bool rParExptd, savME = macroExpand;= if (ptrTab == &speFctTab[Defined]) macroExpand = False;o0 else if (ptrTab == &speFctTab[CDefined]) {' if (! adjustFile) return False;n macroExpand = False;}f& else if (! zifExp) return False;6 if (rParExptd = (NxtTok() == LPAR)) GetNxtTok();E if (ptrTab==&speFctTab[Index] || ptrTab==&speFctTab[SamType]) (  *ptrTab->fctPtr)(); N else if (ptrTab==&speFctTab[Member] && curTok.tok!=IDENT) procMember2(); else {/ if (curTok.tok != IDENT) err0(IdExptd); else { (*ptrTab->fctPtr)();/ if (! rParExptd) macroExpand = savME;t GetNxtTok();}} macroExpand = savME;5 if (rParExptd && !Found(RPAR)) err0(RParExptd);e return True;}} return False; } (static TsTok *createMacroHeader(Tname x)-/* Returns address of created macro header */ {c$ TsTok */*~IndexType TsTok*/ resul; if (argCollect) {SO /* No need to create a macro header if inside a macro body (used space wille' be freed when body is freed). */e< storeMacChunk(SKIPTO, (const TsTok *)x, sizeof(void *));O resul = pMacSto - sizeof(void *);} /* remember address of address field ofS4 SKIPTO (to be able to fill it when known). */ else {I storeMacChunk((Ttok)0, (const TsTok *)x, FullLgt(x)); /* store macroi- header and name in a contiguous area. */.A /*~zif LgtMacHdr != IncrPMacT "We have a big problem here" */I! resul = pMacSto - FullLgt(x);>M /* Chain new zone to zones already held in current macro block, in such aSF manner that higher address zones are found earlier in chain (cf 'freeMacSto()'. */s' *(resul - DispChain) = *pHeadChain;M *(resul - DispBegSto) = *pHeadChain = (TsTok)(resul - &(curMacBlk->tokStoo [0]));}P return resul;j})Tstring curMacDFName(void){  return pCurMac->dFileName;} bool embdMacro(void){c4 return pTopMacStk!=NULL && pTopMacStk->prec!=NULL;} -static void errMac(Terr n, const TdescrId *x)a{pE errWFName(n, (TlineNb)(((ulong)x->nstLvl^LSIGN_BIT) >> MPosLineNb), - x->dFileName, x->idName, NULL, NULL);.} )static void errMacCall(Terr n, Tstring y)L{x: errWFName(n, nLine, curFileN, pNxtMac->idName, y, NULL);}o@static void errMacDef(Terr n, TdescrId *pDescMacId, Tstring txt) /*~NeverReturns*/iO/* Free storage used by the (aborted) macro name, and skip remaining of line */C{d TnameBuf buf;u freeMac(pDescMacId);& bufNameToS(pDescMacId->idName, buf); errWSS(n, buf, txt);. exitBlock(); /* may cause error messages */D SkipRestOfLine; /* errPanic() not used, to get correct sequencing of error messages. */r}astatic bool evalIfExp(void) { - TresulExp saveCExp = cExp, saveLExp = lExp; bool resul;i ifDirExp = macroExpand = True; GetNxtTok();F resul = correctExprN(NULL, Bool, True, "#if", True) && cExp.uVal!=0; ifDirExp = False;'# cExp = saveCExp; lExp = saveLExp;) return resul;a}kstatic void exitMacro(void)r{ if (! pTopMacStk->noFreeArg) {J if (pCurMac->pTabArg != MacActWNoPar) FreeArg(pCurMac->pTabArg) /* if4 macro with parameters, free parameter table. */( usrLvlParFl = pTopMacStk->usrLvlPFl;P sysMacro = (pTopMacStk->prec == NULL)? False : ((pTopMacStk->pMac->nstLvl >>& (MPosFlags + MRPosSysFl)) & 1);P adjMacro = (pTopMacStk->prec == NULL)? False : ((pTopMacStk->pMac->nstLvl >>& (MPosFlags + MRPosAdjFl)) & 1); if (pTopMacStk->concAsPar) {$ pTopMacStk->concAsPar = False;M pTopMacStk->pMac->nstLvl &= ~(1<<(MPosFlags + MRPosConcFl));} /* reset & 'concat activity' flag. */8 pCurMac->pTabArg = NULL; /* marks macro inactive */O if (pTopMacStk->prec != NULL) pTopMacStk->pMac->pTabArg = pTopMacStk->pArg;(' curMacExpNb = pTopMacStk->macExpNb;v5 if (curMacExpNb < begMacExpNb) lastSCOLline = 0;}r}cstatic void exitParam(void)r{ E IncrMacParCtr; /* so that uninterrupted run of tokens in parametere detectable. */0 insideMultUsedMacPar = pTopMacStk->insideMUMP;? sysMacro = (pCurMac->nstLvl >> (MPosFlags + MRPosSysFl)) & 1;  usrLvlParFl = ! sysMacro;o}e static void freeMac(TdescrId *x){x< if (x==pNxtMac /* deleting currently expanding macro: caseI // #define M(x) ... // ... // M // #undef M // (param_of_M) ... // */fK || argCollect) /* in case of deleting macro passed as parameter: case , // #define M(x) ... // #define M1 ... //4 ... // M(M1 // #undef M // #undef M1 // ) // */K *((TnameNC/*~OddCast*/)x->idName + DispNSId) = (TnameAtom)DeltdMac; /* ( then just render macro invisible to- SearchSym; will be freed by checks(). */s else {) /* Free storage used by macro body */t0 freeMacSto((TsTok * /*~OddCast*/)x->idName);9 /* Remove macro element from symbol table chaining */2 x->prec->next = x->next;1 if (x->next != NULL) x->next->prec = x->prec;w /* Free element */ (void)freeDescrIdElt(x);} } &static void freeMacSto(TsTok *macName){a' TmacBlk *firstBlk, *nxtBlk, *precBlk;p register TmacBlk *curBlk;;K if (macName == NULL) return; /* see argCollect effect in '#' operator */P firstBlk = (TmacBlk * /*~OddCast*/)((ubyte *)macName - *(macName - DispBegSto)> - Offset(TmacBlk, tokSto[0])); /* compute address of block- where macro begins ('initial' block). */;5 *(macName - DispBegSto) = 0; /* marks zone free */hM if (macName != &(firstBlk->tokSto[0]) + firstBlk->headChain) return; /* ifP; freed zone not last of block, nothing to be done. */zO for (curBlk = firstBlk->next; curBlk != NULL; curBlk = nxtBlk) { /* find endE of freed zone. */; TsTok w;> for (w = curBlk->headChain; w != 0; w = curBlk->tokSto[w -B DispChain]) { /* follow chain of macro headers in block */K if (curBlk->tokSto[w - DispBegSto] != 0) { /* found still used macroT in current block. */T2 /* Patch chaining over all freed blocks */ firstBlk->next = curBlk; curBlk->prec = firstBlk; return;}}M* /* Whole block is freeable; free it */ nxtBlk = curBlk->next;0 if (freeMacBlk == NULL) freeMacBlk = curBlk; else free(curBlk); ctrMSB--;}K /* Freed zone includes last block, so reset pointers for storeMacChunk(),oC removing possible free blocks sitting before 'initial' one. */ do { TsTok w, w1;F for (w1 = firstBlk->headChain; w1 != 0; w1 = firstBlk->tokSto[w1 -B DispChain]) { /* follow chain of macro headers in block */H if (firstBlk->tokSto[w1 - DispBegSto] != 0) break; /* found still used macro header. */c: w = w1;} /* keep position of end of current zone */3 if (w1!=0 /* found still used macro header, */aP || ((precBlk = firstBlk->prec)!=(TmacBlk * /*~OddCast*/)&headChainMacBlkO && (precBlk->headChain==0 /* (if so, preceding zone can't be free) */aG || precBlk->tokSto[precBlk->headChain - DispBegSto]!=0 /* or - preceding zone not free. */ ))) {)3 pMacSto = &(firstBlk->tokSto[w - LgtMacHdr]);s firstBlk->headChain = w1;a* pHeadChain = &(firstBlk->headChain); curMacBlk = firstBlk;nF endCurMacSto = &(firstBlk->tokSto[(TsTok)SizeMacroStorageChunk - IncrPMacT]); firstBlk->next = NULL; return;} free(firstBlk);l ctrMSB--; M } while ((firstBlk = precBlk) != (TmacBlk * /*~OddCast*/)&headChainMacBlk);o> pMacSto = endCurMacSto = NULL; /* return to initial state */}(&static TmacStkElt *frstConcFrame(void)I/* Returns address of first '##' frame found in stack (used to be able torD manage cases such that a##x##b (with x => 'u v') => 'au' 'vb'. */{o& register TmacStkElt *w = pTopMacStk;& while (w->pArg != NULL) w = w->prec; return w;k} static bool frstConcOpnd(void)I/* Answers True if current token is last token of first operand to a '##'u? operator (remember that cat(a b c, d e f) => a b cd e f). */ {Q* if (! (concatFl & COpnd1)) return False;6 /* for case M(x##y), with x => a##b and y => c##d */ {s& const TsTok *savPMacTok = pMacTok;( register TmacStkElt *w = pTopMacStk; bool firstTurn = True; Ttok nxtTok;P while (InsideInterval((nxtTok= peepNxtMacTok(firstTurn)), ENDDIR, ENDPAR)) { /* Go to caller */B while (w->pArg == NULL) w = w->prec; /* skip '##' frames */ pMacTok = w->pMacTok;  w = w->prec; firstTurn = False;}* pMacTok = savPMacTok;v" return nxtTok == ENDARG1CONC;}}Fstatic bool isMacPar(void){oJ return pDescCurId!=NULL && ((curTok.ptrSem==NULL)? /* macro name: hidingF parameter name? */ (curTok.ptrSem = searchSymTabHC(curTok.name,B curTok.hCod))!=NULL : True) && curTok.ptrSem->kind==ParamMac;}S static bool macActive(bool fmeX){'J /* See if irrelevant active status, due to evaluation of macro parameter after macro calling. */ * register TmacStkElt *wpStk = pTopMacStk;9 register const TmacStkElt *locActFloor = activityFloor; " if (fmeX || curTok.tok!=IDENT) {O /* If at end of macro body or parameter, go back to previous activity levelhM (to find M active in case M(M4(M)), where M as parameter has gotten toi FORCEMACEXP1 status). */S! const TsTok *wpTok = pMacTok;tO while (InsideInterval((Ttok)*wpTok, ENDBLK, ENDPAR) && wpStk->prec!=NULL) {r2 if ((Ttok)*wpTok == ENDBLK) GoNxtBlk(wpTok); else { wpTok = wpStk->pMacTok;'& locActFloor = wpStk->actFloor;5 while ((wpStk = wpStk->prec)->pArg == NULL) {iG if (wpStk->prec == NULL) break;}}}} /*skip all '##' frames */oK else { /* go back to activity floor of last seen FORCEMACEXPx macro calld4 (cf F(G(F(a))) with F(x)=>x and G(x)=>F(x) ). */! while (locActFloor != NULL) { ; if (wpStk->pMac != NULL) { /* not parameter frame */tA if (locActFloor != wpStk->actFloor) { /* 'FMEx' frame */ M if (concatFl==CNoBit || concatFl&CActiv || wpStk->fme1) break;}} /*a6 inside reach of '##' operator, macro expansion only8 done after parameter insertion, that #~DCC.BCKd"[DCC_DISTRIB.SRC]DCDIR.C;1165Q~0fis, when entered5 macro has gone to "active" status (rescanning). */S$ locActFloor = wpStk->actFloor; wpStk = wpStk->prec;}}. if (pTopMacStk == locActFloor) return False;) if (pDescCurId == pCurMac) return True;  wpStk = pTopMacStk; ? do { /* search whether macro called before activity floor */lJ if (wpStk->pMac == pDescCurId) return True; /* macro really active */1 } while ((wpStk = wpStk->prec) != locActFloor);  return False;r}+0static const TsTok *manageJmpTok(const TsTok *x){( for (;;) { switch ((Ttok)*x) {a) case ENDBLK: GoNxtBlk(x); continue;)7 case SKIPTO: x += IncrPMacT; SkipTo(x); continue;e default: return x;}}} TcharStream nxtChFromMac(void){r for (;;) {# if (endCurCharSubBlk == NULL) {i, endCurCharSubBlk = pMacTok + *pMacTok;$ if (*pMacTok != 0) pMacTok++;}+ if (pMacTok != endCurCharSubBlk) break;  endCurCharSubBlk = NULL;5 if (*pMacTok == (TsTok)ENDBLK) GoNxtBlk(pMacTok); else {% pMacTok++; /* skip ending 0 */e1 return -1;}} /* end of character stream */n! return (TcharStream)*pMacTok++;} TcharTok nxtCharOrMacTok(void)I/* peeps next character (if outside macro, >0), or next macro token (<0).oK BEWARE, next source character may be on next line, with directive "whiter lines" in between.xJ Current token CANNOT be CSTNU or CSTST (except if already analysed). */{l1 if (InsideInterval(curTok.tok, CSTNU, CSTST)) {'? if (frstChOfNb!='\0' || curTok.tok==CSTST) sysErr(ExCod6);}eC if (pTopMacStk == NULL) return (TcharTok)peepNxtNonBlChFromTxt();0 /* Get (non-destructively) next macro token */ if (! (concatFl & COpnd1)) {$ pMacTok = manageJmpTok(pMacTok);L if (! InsideInterval((Ttok)*pMacTok, BegServTok, EndServTok - 1)) return -(TcharTok)*pMacTok;} 4 if (frstConcOpnd()) return -(TcharTok)ENDARG1CONC; { 1 const TmacStkElt *savActiFlo = activityFloor;  TmacStkElt *savPTopMacStk;: TdescrId *savPCurMac = pCurMac, *savPNxtMac = pNxtMac;# bool savConcArgS = concArgSeen;c& const TsTok *savPMacTok = pMacTok;" TconcMsq savConcFl = concatFl; bool savPeepTok = peepTok;# TdescrId *savPDCI = pDescCurId;M TvalTok savCurTok = curTok;  TcharTok result;$ register TmacStkElt *wpStk, *wp; TmacLvl savMacLvl = macLvl;n( TmacParCtr savMacParCtr = macParCtr;8 bool savSysMacro = sysMacro, savAdjMacro = adjMacro;O /* Save current context, in order to restore it after getting next token */(N for (wpStk = savPTopMacStk = pTopMacStk, pTopMacStk = NULL; wpStk != NULL;4 wpStk = wpStk->prec) { /* duplicate stack */0 register TmacStkElt *w = allocMacStkElt(); *w = *wpStk;N w->noFreeArg = True; /* do not free argument table (for not original) */@ if (pTopMacStk == NULL) pTopMacStk = w; else wp->prec = w; wp = w;} peepTok = True;  GetNxtTok(); peepTok = savPeepTok; F result = (pTopMacStk == NULL)? (TcharTok)peepNxtNonBlChFromTxt() : -(TcharTok)curTok.tok; / if (curTok.tok == CSTNU) frstChOfNb = '\0';*3 /* Free temporary stack used while 'peeping' */* while (pTopMacStk != NULL) {9 if (pTopMacStk->pArg != NULL) /* not '##' frame */p2 if (pTopMacStk->pMac == NULL) exitParam(); else exitMacro();t popMacStk();}a3 sysMacro = savSysMacro; adjMacro = savAdjMacro;  macParCtr = savMacParCtr;r macLvl = savMacLvl;  pTopMacStk = savPTopMacStk;r activityFloor = savActiFlo;n pCurMac = savPCurMac;e pNxtMac = savPNxtMac;a pMacTok = savPMacTok;- concatFl = savConcFl;; concArgSeen = savConcArgS; curTok = savCurTok;p pDescCurId = savPDCI;r return result;}i} .static Ttok peepNxtMacTok(bool mayBeInsideTok){c* const TsTok *const savPMacTok = pMacTok;L if (mayBeInsideTok && InsideInterval(curTok.tok, CSTNU, CSTST) && pNxtCh== &nxtChFromMac) {5 const TsTok *const savEndCCSB = endCurCharSubBlk;N; while (nxtChFromMac() >= 0) {}; /* go to next token */ # endCurCharSubBlk = savEndCCSB;}, {-* Ttok w = (Ttok)*manageJmpTok(pMacTok); pMacTok = savPMacTok;w return w;}}fstatic void popCondStk(void){r- curIfArmActiv = pTopCondStk->curIfArmActiv;]/ trueIfPartSeen = pTopCondStk->trueIfPartSeen;# elseSeen = pTopCondStk->elseSeen;,# activLvl = pTopCondStk->activLvl;D+ oldSpaceCount = pTopCondStk->savOldSpCnt;k, pTopCondStk = freeCondStkElt(pTopCondStk);})static void popMacStk(void)r{c) register TmacStkElt *pTMS = pTopMacStk;uI if (pTMS->prec!=NULL && pTMS->pArg!=NULL) { /* not exiting from a '##'/ operator. */A if (pTMS->pMac != NULL) pCurMac = pTMS->pMac; /* not exitingc from parameter. */a pMacTok = pTMS->pMacTok;$ activityFloor = pTMS->actFloor;}2 if (concatFl != CNoBit) concatFl = pTMS->concFl;# pTopMacStk = freeMacStkElt(pTMS);D macLvl--; } cstatic void procCDefined(void){eB cExp.uVal = (TcalcU)(pDescCurId!=NULL && pDescCurId->nstLvl>=0); cExp.type = &boolCstTypeElt;}estatic void procDefined(void)d{(A cExp.uVal = (TcalcU)(pDescCurId!=NULL && pDescCurId->nstLvl<0);" cExp.type = &boolCstTypeElt;}rstatic void pushMacStk(void){0, register TmacStkElt *w = allocMacStkElt(); if (pTopMacStk == NULL) {e pCurGNT = &getTokFromMac;H pNxtCh = &nxtChFromMac;"F w->pMac = QuasiNULLval(TdescrId *);} /* non NULL (see CONCATOP in expandMac() ). */e else { w->pMacTok = pMacTok;e w->actFloor = activityFloor; w->pMac = pCurMac; w->pArg = pCurMac->pTabArg;}+ w->infoM.u11.bid2 = 0; /* reset flags */n w->concFl = concatFl;; if (concatFl != CNoBit)s2 if (! (concatFl & CParam)) concatFl |= CParam; else concatFl |= CActiv; w->prec = pTopMacStk;a pTopMacStk = w; macLvl++;p}avoid restoQuoState(void){bL if (savPMTQuo != NULL) {pMacTok = savPMTQuo; savPMTQuo = NULL; freeMacSto( pseudoMacQuo);}}o8static void skipRestOfLinePhase4(void) /*~NeverReturns*/{)L condDirSkip = True; /* to prevent detection of syntax errors that are not- errors in preprocessor-tokens. */f SkipRestOfLine;o} "static void storeFileName(Tchar x){= if (isspace(x)) {p if (! ilgInclArgSeen) { * err0(IlgInclArg|Warn3|Rdbl|PossErr); ilgInclArgSeen = True;}} else {8 if (posNameZone == sizNameZone) { /* buffer full */& sizNameZone += FILENAME_MAX + 1;L if ((begNameZone = realloc(begNameZone, sizNameZone)) == NULL) sysErr( errTxt[RanOutOfMem]);}o$ begNameZone[posNameZone++] = x;}} static void storeMacChar(char x){r if (pMacSto == endCurMacSto) {P *pLgtCharSubBlk = (TsTok)(pMacSto - pLgtCharSubBlk); /* number of character& (+1) in filled sub-block. */N storeMacChunk((Ttok)0, NULL, 0); /* to get another macro storage block */G pMacSto -= IncrPMacT - SizOfCharBlkLgtFld; /* to remove fake 0s */ 3 pLgtCharSubBlk = pMacSto - SizOfCharBlkLgtFld;}c *pMacSto++ = (TsTok)x;})@static void storeMacChunk(Ttok tok, const TsTok *x, size_t size)M/* 'size' is the size of the information pointed by 'x'. Stores 'tok', 'size'{M as TsToks, followed by (if 'x' non NULL) 'size' TsToks. The whole chunk is  stored contiguously. */{o register TsTok *ptr = pMacSto;K if (((x == NULL)? ptr : ptr + size) + IncrPMacT > endCurMacSto) { /* not)9 enough room at end of current block (there must alwaysm2 stay at least one slot for eventual ENDBLK). */ TmacBlk *nxtBlk;E if (freeMacBlk != NULL) {nxtBlk = freeMacBlk; freeMacBlk = NULL;})* else MyAlloc(nxtBlk, sizeof(TmacBlk));G /*~ zif ((ptrdiff_t)SizeMacroStorageChunk < IncrPMacT + (LgtHdrId +E MaxLgtId) + IncrPMacT) "SizeMacroStorageBlk too small" */ /* a macrocD storage chunk must be capable of holding at once: IDENT, identifier Tname, ENDBLK. */ ctrMSB++;rJ if (ptr == NULL) curMacBlk = (TmacBlk * /*~OddCast*/)&headChainMacBlk;& /*~ zif Offset(TmacBlk, next) != 0; "field 'next' must be first of structure TmacBlk" */r else {B *ptr = (TsTok)ENDBLK; /* marks end of used part of block */J *(ptr + 1) = (TsTok)(ptr - (TsTok *)curMacBlk);} /* displacement to4 beginning of current macro storage block. */P /*~zif (SizeMacroStorageBlk > (1 << sizeof(TsTok)*CHAR_BIT) + sizeof(TsTok))- "SizeMacroStorageBlk too large" */T4 curMacBlk->next = nxtBlk; /* chain new block */ nxtBlk->prec = curMacBlk;r nxtBlk->next = NULL; ptr = &(nxtBlk->tokSto[0]);tO endCurMacSto = &(nxtBlk->tokSto[(TsTok)SizeMacroStorageChunk - IncrPMacT]);l curMacBlk = nxtBlk;l& pHeadChain = &(nxtBlk->headChain);= *pHeadChain = 0;} /* no macro header yet in new block */(. *ptr++ = (TsTok)tok; /* store first cTok */9 *ptr++ = (TsTok)size; /* 'size' used as second cTok */s5 if (x != NULL) {memcpy(ptr, x, size); ptr += size;}t pMacSto = ptr;}dstatic void storeTok(void){e TsTok *oldPMS = pMacSto; TmacBlk *oldCMB = curMacBlk; switch (curTok.tok) { case IDENT:a, if (isMacPar()) { /* macro parameter */O storeMacChunk((!curTok.ptrSem->reallyUsed || curTok.ptrSem->usedMorThOnce(B || dpragNst!=0)? MACPAR : MACPAR1, NULL, curTok.ptrSem->noPar);# if (! curTok.ptrSem->defnd) { 1 errWN(NotUsdPar|Warn1|Rdbl, curTok.name); 5 if (! allErrFl) curTok.ptrSem->defnd = True;}o else { if (dpragNst == 0) {M if (curTok.ptrSem->reallyUsed) curTok.ptrSem->usedMorThOnce = True;e1 else curTok.ptrSem->reallyUsed = True;}C$ curTok.ptrSem->used = True;} return;}P storeMacChunk(curTok.tok, (const TsTok *)curTok.name, FullLgt(curTok.name)); goto endCST; case CSTNU: case CSTST: {(F TsTok w = 0; /* initialized just to quiet dcc down, since value later overwritten. */ N storeMacChunk(curTok.tok, &w, 1); /* so that length of 1st sub-block in& same macro storage block. */4 pLgtCharSubBlk = pMacSto - SizOfCharBlkLgtFld;9 if (curTok.tok == CSTNU) analNumCst(&storeMacChar);t% else analStrCst(&storeMacChar);(H *pLgtCharSubBlk = (TsTok)(pMacSto - pLgtCharSubBlk); /* number of- characters (+1) in ending sub-block. */.N storeMacChunk((Ttok)0, NULL, 0); pMacSto--; /* end marker = 0 (only one byte needed). */; /*~zif ENDBLK == (Ttok)0 "ENDBLK must be non-zero" */u goto endCST;} 5 case FORCEMACEXP: case FORCEMACEXP1: case NOMACEXP:AH storeMacChunk(curTok.tok, (TsTok *)&pDescCurId, sizeof(pDescCurId));endCST:bO /* Find beginning of stored token and put 'head' pseudo in it (in anticipa- * tion of possible '##' operator). */ GetTokAdr(oldPMS, oldCMB) 4 *(oldPMS + 1) = *oldPMS; /* real token value */H *oldPMS = (TsTok)((concatFl == (COpnd1 | CISN))? (concatFl = COpnd1, CONCATOP) : IDSTNU);t break;) case ENDDPRAG: dpragNst--; /*~NoBreak*/a8 default: storeMacChunk(curTok.tok, NULL, curTok.val);}}k*bool visibleFromMac(const TsemanElt *pTag){s TmacStkElt *w;< if (isFNameVisible(pCurMac->dFileName, pTag)) return True;A /* Find if possible calling macro(s) defined in visible file */t4 for (w = pTopMacStk; w->prec != NULL; w = w->prec)L if (w->pMac!=NULL && w->pArg!=NULL && isFNameVisible(w->pMac->dFileName, pTag)) return True;t return False; }s9static AllocXElt(allocMacStkElt, TmacStkElt *, ctrMSE, ;)o=static FreeXElt(freeMacStkElt, TmacStkElt *, ctrMSE, ;, prec)t;static AllocXElt(allocCondStkElt, TcondStkElt *, ctrCSE, ;) ?static FreeXElt(freeCondStkElt, TcondStkElt *, ctrCSE, ;, prec)C/* End DCDIR.C */B*[DCC_DISTRIB.SRC]DCDIR.H;46+,A./( 4B*-"0123KPWO569־7cS89G(HJ /* DCDIR.H */(/* Y.L. Noyelle, Supelec, France 1996 */#ifndef DCDIR_H#define DCDIR_H#include "dc.th"(#define InsideMacPar (! (macParCtr & 1))&#define InsideMacro (curMacExpNb != 0)B#define ReallyInsideMacro (InsideMacro && !aloneInNoParMac(False))typedef uint TmacParCtr;"extern bool aloneInNoParMac(bool);$extern bool checkSColAtEndMac(void);extern bool checkSpeFct(void);"extern Tstring curMacDFName(void);extern bool embdMacro(void);&extern TcharTok nxtCharOrMacTok(void);.extern bool visibleFromMac(const TsemanElt *);extern bool adjMacro;extern TmacExpnd begMacExpNb;!extern bool insideMultUsedMacPar;extern TlineNb lastSCOLline;extern TmacLvl macLvl;extern TmacParCtr macParCtr;extern bool sysMacro;#endif /* ifndef DCDIR_H *//* End DCDIR.H */*[DCC_DISTRIB.SRC]DCDIR.PH;29+,\./( 4.-"0123KPWO56@)R7zS89G(HJ/* DCDIR.PH */(/* Y.L. Noyelle, Supelec, France 1996 */#ifndef DCDIR_PH#define DCDIR_PH#include "dcrecdir.th"/* Functions profiles */.extern void checkCondStkAndDeleteMacros(void);extern void expandMac(void);extern void manageDir(void);&extern TcharStream nxtChFromMac(void); extern void restoQuoState(void);/* Common objects */extern bool peepTok;extern TdescrId *pNxtMac;#endif /* ifndef DCDIR_PH *//* End DCDIR.PH */*[DCC_DISTRIB.SRC]DCEXP.C;329+,E./( 4T-"0123KPWO56@{27S89G(HJ0 /* DCEXP.C */(/* Y.L. Noyelle, Supelec, France 1994 */ #ifdef VMSH#pragma noinline (arrToPtr, checkNumCstNamed, checkPureBool, errCompoOf)P#pragma noinline (errExp, errOvfl, errOvfl1, errUdfl, errWrngType, finalizeCast)N#pragma noinline (freeAlloc, freePrev, ignorableDP, insertBool, manageLogOper)G#pragma noinline (modifPtdVal, transfOpnd, typeToS2NoQual, warnCstBool)-#pragma noinline (warnNotPureBool, warnOrErr)#endif#include #include #include "dcexp.h"#include "dcexp.ph"#include "dcblk.h"#include "dcdecl.h"#include "dcdir.h"#include "dcext.h"#include "dcfmt.h"#include "dcinst.h"#include "dcinst.ph"#include "dcprag.h"#include "dcrec.h"#include "dctxttok.h"6#define ArbitAdr QuasiNULLval(char *) /* arbitrary */.#define CheckSink(pExp, sinkType) \9 ((pExp)->rEvlbl && sinkType!=NULL && sinkType->litCsta) #define IsChar(x) \) (IsTypeSort(x, Enum) && x->tagId==NULL)0#define IsCmpsdObj(x) x->type->typeSort >= Array;#define IsDecl1(x) InsideInterval(curTok.tok, x, EDecl - 1)P#define IsSideEffect(x) InsideInterval(NakedTok(x.topOper), BSideEffTok, \ ESideEffTok - 1))#define IsWhoEnumNotChar(x) \? (IsTypeSort(x, Who) || IsTypeSort(x, Enum) && x->tagId!=NULL)0#define NakedTok(x) (x & ~(PARENSEEN | PRIMARY))*#define NoResulTyp QuasiNULLval(TpTypeElt)#define PtrdiffTHCode 0x180904D,#define PtrdiffTName (Tname)"\x9\0ptrdiff_t"-#define PureUnsig(t) (t->typeSort & UnsigWho)$#define SetInfoForCst \$ cExp.rEvlbl = True; \E if (! evaluateFl) cExp.errEvl = True; /* to prevent computation */#define SizeTHCode 0x321B8%#define SizeTName (Tname)"\6\0size_t"!#define SubOP (ADDOP | NONASSOC)+#define XAllocSeen QuasiNULLval(TpcTypeElt)/DefIsSameName /* define isSameName function *//DefRepresType /* define represType function */Gtypedef enum {Composite = -1, NotMember, Member, SingleMember} Tmember;/* Function profiles */'static TpcTypeElt arrToPtr(TpcTypeElt);-static void condExpr(void), primQualif(void),O term0(void), term1(void), term2(void), term3(void), term4(void), term5(void),C term6(void), term7(void), term8(void), term9(void), term10(void);Estatic void computeCond(TpcTypeElt), computeShortCircuit(TpcTypeElt),I computeIor(TpcTypeElt), computeXor(TpcTypeElt), computeAnd(TpcTypeElt),I computeCmp(TpcTypeElt), computeShi(TpcTypeElt), computeAdd(TpcTypeElt),I computeSub(TpcTypeElt), computeMul(TpcTypeElt), computeDiv(TpcTypeElt), computeMod(TpcTypeElt);Ostatic bool authzdType(TpcTypeElt, TtypeSort, bool *, Terr), compatNumType(voidI ), errWrngType(TtypeSort) /*~PseudoVoid*/, frstMemberCompat(TpcTypeElt,K TtypeSort), ignorableDP(TmacParCtr), isType(void), manageInitlzUsed(void)M /*~PseudoVoid*/, manageTypCmbn(TkOpTC) /*~PseudoVoid*/, resulExp(TtypeSort,< bool, void(*)(TpcTypeElt), TmacLvl, Ttok) /*~PseudoVoid*/;Jstatic void checkIncldFiles(const TsemanElt *), checkInfoLoss(TpcTypeElt),K checkPureBool(void), errCompoOf(bool), errExp(Terr, TpcTypeElt, Tstring),D errOvfl(TpcTypeElt), errOvfl1(TpcTypeElt, Tstring), errUdfl(void),K finalizeCast(TpcTypeElt /*~MayModify*/), freeAlloc(void), freePrev(void),H indir(void), indirindex(const TresulExp * /*~MayModify*/), insertBool(C TtypeSort), manageLogOper(void (*pf)(void), Ttok, bool, Tstring),1 manageNumCst(void), managePointers(TpcTypeElt),L manageUsedForIncOp(void), modifPtdVal(Terr), relOpTrtmt(void), resulIncOp(I TkInc,TmacParCtr), resulUnOp(TtypeSort, Tstring), specialCaseOp(TkAdd),P transfOpnd(const TresulExp * /*~MayModify*/, TresulExp *), valueNotUsed(void),H verifCstOvfl(void), warnCstBool(Tstring), warnNotPureBool(TresulExp *, Tstring);Dstatic TpcTypeElt advInTypeChain(TpcTypeElt), commonType(TtypeSort);Kstatic TtypeSort computeCstType(TcalcS, TtypeSort), computeLstType(TcalcS);=static TpTypeElt copyTypeEltNoOwn(TpcTypeElt /*~MayModify*/);static Tmember isMember(void);;static size_t sizeOfTypeI(TpcTypeElt, bool, Terr, Tstring);*static Tstring typeToS2NoQual(TpcTypeElt);static Terr warnOrErr(Terr); /* Objects */Estatic TpcTypeElt allocType = NULL; /* type of 'sizeof' argument for- ~SizeOfMemBlk function argument. */Nstatic bool apsndOpnd = False; /* True when inside operand of '&' operator */static bool chkNumCst1 = True;static Terr convToUnsgnd;static bool cstExpG = False;static bool errAsgn;static bool evaluateFl = True;static bool initDPFl = False; static TsemanElt *lastCalledFct;$static TmacParCtr lastPrimMacParCtr;=static TtypeSort mskCmpat = NumEnumBool; /* default value */Jstatic TpcTypeElt preLastCastType = NULL; /* type before previous cast */ static bool ptrdiffSeen = False;(static TpcTypeElt sizeofOpndType = NULL;static bool sizeofSeen = False;Jstatic bool stddefNotInFl = False; /* flag to output message only once *//* External objects */BTpcTypeElt *limErroTypes; /* to prevent multiple (same) errors in initializations. */TtypeSort mskBool;bool boolExp(Tstring operTxt)=/* Returns True if boolean expression correct and constant */{ TpcTypeElt eType = cExp.type;, if (cExp.ValMltplDef) cExp.rEvlbl = False; checkInit(); CheckNumCstNamed(cExp, eType); cleanExprThings(); if (eType != NULL) {O if (!IsTypeSort(eType, Bool) || eType->paralTyp && eType->typeSort==Bool) {D if (NakedTok(cExp.topOper) == ASGNOP) err0(MsngEqual | Warn3); else {C Terr n = (IsScalar(eType))? BoolExptd | CWarn1 : BoolExptd;M if (chkBool || !(n & WarnMsk)) errWSS(n, operTxt, typeToS1(eType));}}, else if (cExp.rEvlbl) warnCstBool(NULL); FreeExpType2(eType);} return cExp.rEvlbl;}Kbool correctExprN(TpcTypeElt exptdType, TtypeSort msk, bool cstExp, Tstring& operName, bool checkNumCst)N/* Gets a condExpr, and detects an error if type of gotten expression not com-N patible with 'exptdType' and/or 'msk', or if 'cstExp' = True and expression not constant.O Returns False if gotten expression incorrect, or if type mismatch (cExp.type == NULL in both cases).< Frees expression type only if exptdType != NoFreeExpType.> Does not exit via 'longjmp', either directly or indirectly.3 Can be called recursively (because of 'zif'). */{K bool resul, savEvalFl = evaluateFl, savCstExpG = cstExpG, savChkNumCst1 =; chkNumCst1, freeExpType = (exptdType != NoFreeExpType);D const Tstring savParamTxt = paramTxt; /* because of condExpr() */> TsemanElt *savLCF = lastCalledFct, *savLEptrId = lExp.ptrId; TpcTypeElt eType; TpTypeElt newElt; ignoreErr = False; evaluateFl = True; cstExpG = cstExp; chkNumCst1 = checkNumCst; condExpr();, if (cExp.ValMltplDef) cExp.rEvlbl = False; cstExpG = savCstExpG;7 paramTxt = operName; /* also for managePointers() */ eType = cExp.type; if (msk != Void) {$ if (exptdType > NoFreeExpType) {3 newElt = allocTypeEltIC(exptdType, NoQualif); newElt->typeSort |= msk;} else {- newElt = allocTypeEltID(msk, NoQualif);L newElt->tagId = (eType!=NULL && IsTypeSort(eType, Enum))? eType->tagId; : GenericEnum;} /* in case msk includes 'Enum' */ newElt->noOwner = True; exptdType = newElt;} else newElt = NULL;$ CheckNumCstNamed(cExp, exptdType); lExp.ptrId = savLEptrId; managePointers(exptdType); if (eType != NULL) { resul = True; if (exptdType != NULL) { lExp.type = exptdType;H if (! freeExpType) heedRootType = False; /* for then msk!=Void */I if (exptdType->typeSort>=DelType) { /* type expansion not needed */ errQalTyp1 = NULL;@ if (! CompatType(exptdType, eType, Asgn)) resul = False;N else if (errQalTyp1 != NULL) { /* report only one of several possible4 error messages due to bad 'const' qualifier. */#define MaxNbRmbrdTypes 10< static TpcTypeElt rmbrdErroTypes[MaxNbRmbrdTypes];# TpcTypeElt *ptrErroTypes;P if (msk!=Void || limErroTypes==NULL) limErroTypes= &rmbrdErroTypes[0]; elseC for (ptrErroTypes = &rmbrdErroTypes[0]; ptrErroTypes != limErroTypes; ) {> if (*ptrErroTypes++ == errQalTyp1) goto noErrL;}B errWSSSS(ConstQalNotHeeded1|ConstWarn|PossErr, paramTxt,G typeToS2NoQual(errQalTyp1), typeToS1(errQalTyp2), (errQalTyp1 ==- exptdType)? NULL : errTxt[SubPre]);B if (limErroTypes <= &rmbrdErroTypes[MaxNbRmbrdTypes - 1]& ) *limErroTypes++ = errQalTyp1;#undef MaxNbRmbrdTypes noErrL:;}}1 else if (! compatNumType()) resul = False;} heedRootType = True; if (! resul) {N Terr msg = warnOrErr((msk == Void)? BadForLftType|PossErr : NotExptdType |PossErr);N if (ifDirExp && cExp.rEvlbl && (msg & WarnMsk)) {resul = True; errWSSSS(I msg, paramTxt, typeToS1(eType), typeToS2NoQual(exptdType), NULL);}J else {errExp(msg, eType, typeToS2NoQual(exptdType)); eType = NULL;}} else if (cstExp) { if (! cExp.rEvlbl) { err0(CstExpExptd);' if (freeExpType) resul = False; cExp.errEvl = True;}L else if (IsPtrArr(eType) && cExp.pseudoAttrib>=Auto) {err0(UncomputAd) ; resul = False;}} if (! cExp.rEvlbl) #if PtrGtLong cExp.pVal = NULL;#else cExp.sVal = 0;#endif if (resul && !freeExpType) {N if (eType->generic) ((ModifType)(cExp.type = copyTypeEltNoOwn(eType)))->7 generic = False;} /* for array bound (cf. index type- verification if of parallel type). */ else { FreeExpType1(eType);, if (! freeExpType) cExp.type = NULL;}} else resul = False; FreeExpType1(newElt); paramTxt = savParamTxt; evaluateFl = savEvalFl; lastCalledFct = savLCF; chkNumCst1 = savChkNumCst1; return resul;}void commaExpr(void)@/* Does not exit via 'longjmp', either directly or indirectly */{ bool commaSeen = False;I while (asgnExpr(), curTok.tok == COMMA) {checkSideEffect(); GetNxtTok() ; commaSeen = True;}% if (commaSeen) cExp.lValFl = False;}void asgnExpr(void){* TmacParCtr begAsgnMacParCtr = macParCtr; condExpr(); if (curTok.tok == ASGNOP) { TkAsgn kindAsgn;/ TresulExp slExp; /* left operand saving */ register TsemanElt *ptrLId; TpcTypeElt lType, eType;1 TmacParCtr operMacParCtr = lastPrimMacParCtr; bool lclAdrSeen, ignorable;" kindAsgn = (TkAsgn)curTok.val;P if ((lType = cExp.type) != NULL) { /* no type error seen in left operand */& paramTxt = txtAsgnTok[kindAsgn];M if (! cExp.lValFl) {errWSS(NotLVal, paramTxt, errTxt[Left]); cExp.ptrId = NULL;}L else if (lType->typeSort==Void || IsArrFct(lType)) errWSTT(IlgLftType,- txtAsgnTok[kindAsgn], lType, NULL); else { bool isConst = False;5 if (lType->qualif & ConstQal) isConst = True; if (IsStrun(lType)) {K if (BaseStrunType(lType)->SynthQualif & ConstQal) isConst = True;E (void)sizeOfTypeI(lType, False, IncplStrunType, paramTxt);}: if (isConst) errCompoOf(lType->qualif & ConstQal);9 else if (cExp.PointedByObj) modifPtdVal(WillM);}}" CheckNumCstNamed(cExp, lType); valueNotUsed(); slExp = cExp; GetNxtTok(); asgnExpr(); lExp = slExp; ptrLId = slExp.ptrId;" CheckNumCstNamed(cExp, lType);M if (NakedTok(cExp.topOper) == ASGNOP) valueNotUsed(); /* so that "i=j=1"& does not mark 'j' used. */$ paramTxt = txtAsgnTok[kindAsgn];G if (lclAdrSeen = (curTok.tok == LOCALADR)) ignorable = ignorableDP( begAsgnMacParCtr);3 if ((eType = cExp.type)!=NULL && lType!=NULL) { errAsgn = False; switch(kindAsgn) { case SimplAsgn:P/* if (cExp.ptrId!=NULL && eType->qualif & VolatQal) errId3(CopyVolat |- Warn2, cExp, typeToS1(eType), NULL);*/ if (IsPtr(eType)) { if (cExp.lclAdr) {L if (InsideInterval(lExp.pseudoAttrib, StatiL, Extrn)) /* non- local object. */D if (! lclAdrSeen) err0(AsgnGblWLclAd|Warn2|PossErr);( else lclAdrSeen = False;= else if (ptrLId != NULL) ptrLId->lclAd = True;}/ if (ignorable) lclAdrSeen = False;} if (compatNumType()) {! if (eType->generic) { cleanExprThings();M FreeExpType2(lType); /* free left operand type (not right ope-; rand), to allow "int = unsigned short = float = 0". */N if (cExp.rEvlbl) {lExp.rEvlbl = True;lExp.errEvl = cExp.errEvl;} goto exit1L;}}L else if ((lType->typeSort==Ptr || IsStrun(lType)) && (errQalTyp1 =- NULL, CompatType(lType, eType, Asgn))) {J if (errQalTyp1 != NULL) errWSTTS(ConstQalNotHeeded1|ConstWarn|? PossErr, paramTxt, errQalTyp1, errQalTyp2, (errQalTyp1 ==& lType)? NULL : errTxt[SubPre]);} else errAsgn = True; goto exitL; case AndAsgn:L if (cExp.rEvlbl && cExp.sVal<0) cExp.uVal = ~cExp.uVal; /* for no- untimely overflow error detection. */ /*~NoBreak*/ case XorAsgn:7 if (lType->typeSort == Bool) checkPureBool(); goto commonBitOpL; case IorAsgn:O if (lType->typeSort==Bool && cExp.notPureBool && ptrLId!=NULL) ptrLId ->notPureBoo = True;P if (lExp.notPureBool) cExp.notPureBool = True; /* does also .lclAdr */ commonBitOpL:! mskCmpat = WhoEnumBool; break;# case LShAsgn: case RShAsgn:M if (lType->typeSort==Void || IsArrFct(lType)) lExp.type = NULL; /*I these IlgLftType checked earlier (BEWARE, lType still used !). */A if (! IsTypeSort(lType, WhoEnum)) errWrngType(WhoEnum);O else if (! IsWhoEnumNotChar(eType)) errExp(IlgRhtType | ((IsTypeSort(; eType, WhoEnum))? Warn2 | PossErr: Err), eType, NULL); goto endCAsgnL;# case AddAsgn: case SubAsgn: mskCmpat = NumEnum; goto commonArithOpL;# case MulAsgn: case DivAsgn: mskCmpat = Num; goto commonMulOpL; case ModAsgn: mskCmpat = Who; commonMulOpL:K if (! eType->paralTyp) ((ModifType)(cExp.type = copyTypeEltNoOwn(8 eType)))->generic = True; /* because multiplication =& sequence of additions. */commonArithOpL: { TpcTypeElt w;H if (pHeadTCBLists!=NULL && (w = searchTC(AddTC + (kindAsgn -@ AddAsgn)))!=QuasiNULLval(TpcTypeElt) && (w==NULL || w->typeId- ==lType->typeId)) goto endCAsgnL;}D if (eType->typeSort==Enum && !IsPtr(lType)) goto errAsgnL; break;} if (! compatNumType()) F if (InsideInterval(kindAsgn, AddAsgn, SubAsgn)) specialCaseOp( AddSubAsgn); elseerrAsgnL: errAsgn = True; endCAsgnL:: mskCmpat = NumEnumBool; /* back to default value */ cExp.rEvlbl = False;exitL:N if (errAsgn && !(lType->typeSort==Void || IsArrFct(lType)) /* IlgLftType checked earlier */)M errWSSSS(warnOrErr(BadForLftType|PossErr), paramTxt, typeToS1(eType),& typeToS2NoQual(lType), NULL);} managePointers(lType);P FreeExpType(cExp); /* errExp() may have been called, so don't use 'eType' */ cExp.type = lType;exit1L:' if (lclAdrSeen) errIlgDP(LOCALADR); cExp.ptrId = ptrLId;L lExp.notPureBool = cExp.notPureBool; /* keep that flag (also lclAdr) */ cExp.Einfo = lExp.Einfo;3 /* Here so that done even if r/lType == NULL */ if (kindAsgn == SimplAsgn) { cExp.hist = lExp.hist; if (manageInitlzUsed()) { cExp.oldUsed = False; if (ptrLId != NULL) { ptrLId->used = False;( ptrLId->MsngConstQM = False;}}D cExp.topOper = ASGNOP;} /* top operator of the syntax tree */ else manageUsedForIncOp();L if (cExp.notPureBool && lType!=NULL && lType->typeSort==Bool && ptrLId!=& NULL && !ptrLId->notPureBoo) {L if (ptrLId->pureBoolAskd && !cExp.inhibWaNPB) {errWSS(Outside01|Warn2|B PossErr, paramTxt, errTxt[Right]); cExp.inhibWaNPB = True;}! ptrLId->notPureBoo = True;}sC if (operMacParCtr!=0 && lastPrimMacParCtr==operMacParCtr) err1(a& SideEffInMacPar|Warn3|PossErr);L cExp.lValFl= False;} /* the value of an assignment is not an l-value */},static void condExpr(void){< term0(); if (curTok.tok == QMARK) {! TresulExp ex$~DCC.BCKE"[DCC_DISTRIB.SRC]DCEXP.C;329T?"pB, slExp, scExp;c TmacLvl operMacLvl;" Trchbl endFrstBrchRchbl;, bool savEvalFl = evaluateFl, sideEffect; (void)boolExp("?:");G if (! (cExp.topOper & PARENSEEN)) err0(ShdBePrntzBool|CWarn1|Rdbl);h expB = cExp;8 if (expB.rEvlbl && expB.uVal==0) evaluateFl = False; condStmtLvl++; GetNxtTok(); commaExpr(); operMacLvl = macLvl;' if (! Found(COLON)) err0(ColExptd); $ endFrstBrchRchbl = nxtStmtRchbl; nxtStmtRchbl = Rchbl;j slExp = cExp;rB evaluateFl = (expB.rEvlbl && expB.uVal!=0)? False : savEvalFl; condExpr();i evaluateFl = savEvalFl;k {.O bool lSideEffect = IsSideEffect(slExp), rSideEffect = IsSideEffect(cExp);N if (expB.rEvlbl) { condStmtLvl--; if (expB.uVal != 0) {=* nxtStmtRchbl = endFrstBrchRchbl;$ transfOpnd(&slExp, &cExp); rSideEffect = True;}> else {transfOpnd(&cExp, &slExp); lSideEffect = True;}}/ sideEffect = lSideEffect && rSideEffect;} lExp = slExp;r paramTxt = ":?"; scExp = cExp; 1 if (lExp.type == NULL) lExp.type = cExp.type;r6 else if (cExp.type == NULL) cExp.type = lExp.type;J if (! resulExp(NumEnumBool | PtrPoss | StrunPoss, False, &computeCond, operMacLvl, QMARK)) {U< TpcTypeElt curLType = lExp.type, curRType = cExp.type; bool rhtHghrParal = False;N if (!CompatType(curLType, curRType, LitString) && !(rhtHghrParal = True,@ compatType(curRType, curLType, LitString)) %) errWrngType(& NumEnumBool|PtrPoss|StrunPoss); else {E curLType = arrToPtr(curLType); /* for string literal case */ E curRType = arrToPtr(curRType); /* for string literal case */r# if (curLType != curRType) { L if (IsPtr(curLType) && NxtTypElt(curLType)!=NxtTypElt(curRType)) {L /* Create a result type chain that inherits qualifiers from bothF arms of the conditional; if one arm is string litteral,$ result is pointer. */1 TpTypeElt resType, lastNewElt = NULL;t do { TpTypeElt newElt;e? if (rhtHghrParal || curLType->typeSort == Void) {*K /* Choose higher parallel type; also, possible 'void *' armp% may be shorter. */P TpcTypeElt w1;A w1 = curRType; curRType = curLType; curLType = w1, ; rhtHghrParal = False;}B newElt = allocTypeEltIC(curLType, curRType->qualif);' if (lastNewElt == NULL) {(! resType = newElt;rE resType->noOwner = True;} /* for freeing purposes */o else {I lastNewElt->stopFreeing = False; /* because full created, chain to be freed. */M- lastNewElt->nextTE = newElt;}o" lastNewElt = newElt;J } while (!NxtIsTypeId(curLType) && (curLType = advInTypeChain(8 curLType))!=NULL && (curRType = advInTypeChain(- curRType))!=NULL && curLType!=curRType);t# FreeExpType1(curRType); ! cExp.type = resType;}M$ else if (! rhtHghrParal) {! cExp.type = curLType;B# curLType = curRType;}}}xN if (scExp.ptrId!=NULL && (cExp.ptrId==NULL || scExp.ptrId->type!=NULL &&& IsStrun(scExp.ptrId->type))) {! cExp.ptrId = scExp.ptrId;e cExp.hist = scExp.hist;T2 cExp.PointingOnObj = scExp.PointingOnObj;}2 else cExp.PointedByObj = slExp.PointedByObj;' if (slExp.ptrId != scExp.ptrId) {tO if (slExp.ptrId!=NULL && slExp.PointingOnObj) slExp.ptrId->used = True;P if (scExp.ptrId!=NULL && scExp.PointingOnObj) scExp.ptrId->used = True;}9 if (curLType != cExp.type) FreeExpType1(curLType);} 0 cExp.topOper = (sideEffect)? SIDEFF : QMARK; if (expB.rEvlbl)* if (expB.errEvl) cExp.errEvl = True; else if (expB.uVal != 0) { # cExp.ptrId = slExp.ptrId;uL cExp.PointedByObj = slExp.PointedByObj;} /* other relevant fields& already set by 'resulExp'. */ else {# cExp.ptrId = scExp.ptrId;! cExp.hist = scExp.hist; 5 cExp.PointingOnObj = scExp.PointingOnObj;} d else { condStmtLvl--; cExp.ValMltplDef = True;N if (lExp.notPureBool) cExp.notPureBool = True; /* does also cExp.lclAdr |= lExp.lclAdr. */r2 if (lExp.inhibWaNPB) cExp.inhibWaNPB = True;4 if (lExp.FctCallSeen) cExp.FctCallSeen = True;A if (cExp.t+ype == &boolCstTypeElt) cExp.type = &boolTypeElt;; if (endFrstBrchRchbl == Rchbl) nxtStmtRchbl = Rchbl;} if (expB.litCst) { cExp.litCst = True;p: if (expB.LitCstOutsMac) cExp.LitCstOutsMac = True;}}}s%static void computeCond(TpcTypeElt x);D/* Keep greatest absolute value, without loosing possible sign... */{l% if (IsTypeSort(x, SigAri | Enum)) { # bool negSeen = (lExp.sVal < 0); !#define Abs(x) ((x >= 0)? x : -x)e* if (Abs(lExp.sVal) > Abs(cExp.sVal)) {( if (cExp.sVal < 0) negSeen = True; cExp.sVal = lExp.sVal;}S9 if (cExp.sVal>0 && negSeen) cExp.sVal = - cExp.sVal;}l #undef Abs8 else if (lExp.uVal > cExp.uVal) cExp.uVal = lExp.uVal;}static void term0(void)T{E term1();L while (curTok.tok == LOGOR) manageLogOper(&term1, curTok.tok, True, "||");}*static void term1(void)t{n term2();N while (curTok.tok == LOGAND) manageLogOper(&term2, curTok.tok, False, "&&");}c:static void computeShortCircuit(TpcTypeElt x /*~NotUsed*/){i$ if (cExp.uVal != 0) cExp.uVal = 1;} static void term2(void) {L term3(); while (curTok.tok == IOR) {o6 TresulExp slExp = cExp; /* left operand saving */ TmacLvl operMacLvl = macLvl; TtypeSort rExpTypeSort;c GetNxtTok(); term3(); lExp = slExp;a paramTxt = "|"; > if (cExp.type != NULL) rExpTypeSort = cExp.type->typeSort;? resulExp(WhoEnumBool, False, &computeIor, operMacLvl, IOR);  insertBool(rExpTypeSort);}}(1static void computeI .or(TpcTypeElt x /*~NotUsed*/)d{l cExp.uVal |= lExp.uVal;y}static void term3(void) {o term4(); while (curTok.tok == XOR) {E6 TresulExp slExp = cExp; /* left operand saving */ TmacLvl operMacLvl = macLvl; TtypeSort rExpTypeSort;  GetNxtTok(); term4(); lExp = slExp;a paramTxt = "^";T checkPureBool();> if (cExp.type != NULL) rExpTypeSort = cExp.type->typeSort;? resulExp(WhoEnumBool, False, &computeXor, operMacLvl, XOR);o insertBool(rExpTypeSort);}}E1static void computeXor(TpcTypeElt x /*~NotUsed*/)a{  cExp.uVal ^= lExp.uVal;t}ystatic void term4(void) { term5(); while (curTok.tok == APSAND) {6 TresulExp slExp = cExp; /* left operand saving */ TmacLvl operMacLvl = macLvl; TtypeSort rExpTypeSort;d bool is01 = False; GetNxtTok(); term5(); lExp = slExp;  paramTxt = "&";  checkPureBool();> if (cExp.type != NULL) rExpTypeSort = cExp.type->typeSort; if (cExp.rEvlbl)$ if (cExp.uVal<=1) is01 = True;G else if (cExp.sVal < 0) cExp.uVal = ~ cExp.uVal; /* for no wrong& overflow error detection. */> resulExp(WhoEnumBool, True, &computeAnd, operMacLvl, AND); insertBool(rExpTypeSort);*( if (is01) cExp.notPureBool = False;}}r1static void computeAnd(TpcTypeElt x /*~NotUsed*/) {N cExp.uVal &= lExp.uVal; }t&static TkCmp operCmp; /* temporary */static void term5(void)*{E term6();! while (curTok.tok == EQUALOP) {o TkCmp oper;r6 TresulExp slExp = cExp; /* left operand saving */ TmacLvl operMacLvl = macLvl;> oper = (TkCmp)curTok.val; /* operator in class EqualOp */ GetNxtTok(); term6();% lExp = slExp; /* left operand */W operCmp = oper;d paramTxt = txtCmpTok[oper];  verifCstOvfl();rE if (cExp.rEvlbl && !cExp.errEvl && cExp.uVal!=0) checkPureBool(); H if (! resulExp(NumEnumBool | PtrPoss, True, &computeCmp, operMacLvl, EQUALOP)) {< const TpcTypeElt lType = lExp.type, rType = cExp.type;H if (rType==NULL || lType->typeSort!=Ptr || rType->typeSort!=Ptr ||I !CompatType(lType, rType, Cmpar)) errWrngType(NumEnumBool | PtrPoss);F3 else if (cExp.rEvlbl) { /* compute result */EC cExp.uVal = (TcalcU)((oper == EQ)? lExp.pVal == cExp.pVal :=& lExp.pVal != cExp.pVal);} FreeExpType2(lType); cExp.ptrId = NULL;} N else if (cExp.type!=NULL && IsTypeSort(cExp.type, Flt) && !Found(EXACTCMP)& ) err1(FltNotEq|Warn2|PossErr); relOpTrtmt();C' cExp.topOper = EQUALOP | NONASSOC;}s}=static void term6(void)v{ term7();! while (curTok.tok == ORDEROP) {p TkCmp oper;)6 TresulExp slExp = cExp; /* left operand saving */( const TpcTypeElt lType = slExp.type; TmacLvl operMacLvl = macLvl;> oper = (TkCmp)curTok.val; /* operator in class OrderOp */ GetNxtTok(); term7();% lExp = slExp; /* left operand */> operCmp = oper;  paramTxt = txtCmpTok[oper];p X4 verifCstOvfl();i& if (cExp.rEvlbl && !cExp.errEvl) { if (cExp.uVal == 0) {J if (lType!=NULL && PureUnsig(lType) && !lExp.unsigDiff && oper!=GT& ) err1(UnsigNonNeg | Warn2);} else checkPureBool();}H if (! resulExp(NumEnumBool | PtrPoss, True, &computeCmp, operMacLvl, ORDEROP)) {# TpcTypeElt rType = cExp.type;gH if (rType==NULL || lType->typeSort!=Ptr || rType->typeSort!=Ptr ||I !CompatType(lType, rType, NoCheck)) errWrngType(NumEnumBool | PtrPoss); else { TpcTypeElt nType;mI if ((nType = NxtTypElt(lType))!=NULL && (nType->typeSort==Void || IsFct(gF nType)) || (nType = NxtTypElt(rType))!=NULL && (nType->typeSort==I Void || IsFct(nType))) errExp(NoOrderRel, lType, typeToS2(rType));5 else if (cExp.rEvlbl) { /* compute result */e #if PtrGtLongm switch (oper) {sH case GT: cExp.uVal = (TcalcU)(lExp.pVal > cExp.pVal); break;I case GE: cExp.uVal = (TcalcU)(lExp.pVal >= cExp.pVal); break;eI case LE: cExp.uVal = (TcalcU)(lExp.pVal <= cExp.pVal); break;EH case LT: cExp.uVal = (TcalcU)(lExp.pVal < cExp.pVal); break; /*~NoDefault*/}y#elsee( lExp.uVal = (TcalcU)lExp.pVal;( cExp.uVal = (TcalcU)cExp.pVal;' computeCmp(&natTyp[_ULLONG]);l#endif }} FreeExpType1(lType); cExp.ptrId = NULL;}A else if (cExp.unsigDiff) err1(UnsigDiffNotNeg|Warn2|PossErr);) relOpTrtmt();s' cExp.topOper = ORDEROP | NONASSOC;}i}f+#pragma noinline (sConvToType, uConvToType)>static TcalcS sConvToType(const TresulExp *pExp, TpcTypeElt x){  return (x->typeSort < Long)o# ? (TcalcS)(int)pExp->sValN#ifdef LONGLONG;! : (x->typeSort < LLong) & ? (TcalcS)(long)pExp->sVal#endif : pExp->sVal;=}E>static TcalcU uConvToType(const TresulExp *pExp, TpcTypeElt x){. return (x->typeSort < Long)d$ ? (TcalcU)(uint)pExp->uVal#ifdef LONGLONG ! : (x->typeSort < LLong)[' ? (TcalcU)(ulong)pExp->uValt#endif : pExp->uVal;b}P$static void computeCmp(TpcTypeElt x){f#define LtBit (TcmpBit)1#define EqBit (LtBit << 1)#define GtBit (EqBit << 1) typedef uint TcmpBit;a TcmpBit cmpMsk; K static TcmpBit cmpCod[/*~IndexType TkCmp*/] = {EqBit, LtBit|GtBit, GtBit,- GtBit|EqBit, LtBit|EqBit, LtBit};* if (IsTypeSort(x, (SigWhoEnum | Flt))) {N TcalcS sCmpOpd1 = sConvToType(&lExp, x), sCmpOpd2 = sConvToType(&cExp, x);" cmpMsk = (sCmpOpd1 > sCmpOpd2) ? GtBit(& : (sCmpOpd1 == sCmpOpd2) ? EqBit  : LtBit;}  else {N TcalcU uCmpOpd1 = uConvToType(&lExp, x), uCmpOpd2 = uConvToType(&cExp, x);" cmpMsk = (uCmpOpd1 > uCmpOpd2) ? GtBit & : (uCmpOpd1 == uCmpOpd2) ? EqBit  : LtBit;}y0 cExp.uVal = (cmpCod[operCmp] & cmpMsk)? 1 : 0; /* *doIt* float types */ #undef LtBit #undef EqBit #undef GtBit} /*~Undef operCmp */E&static TkShi operShi; /* temporary */static void term7(void)1{} term8();! while (curTok.tok == SHIFTOP) {s TkShi oper;(6 TresulExp slExp = cExp; /* left operand saving */ TmacLvl operMacLvl = macLvl;> oper = (TkShi)curTok.val; /* operator in class ShiftOp */ GetNxtTok(); term8(); lExp = slExp;  paramTxt = txtShiTok[oper];} operShi = oper;s {u TpcTypeElt lType;H /* Start by eliminating erroneous cases (else, funny messages from0 resulExp() because rType==lType...). */E if ((lType = lExp.type)!=NULL && !IsTypeSort(lType, WhoEnum)) { errWrngType(WhoEnum);  FreeExpType2(lType);" lExp.type = lType = NULL;}G else if (cExp.type!=NULL && !IsWhoEnumNotChar(cExp.type)) errExp(&F IlgRhtType | ((IsTypeSort(cExp.type, WhoEnum))? Warn2 | PossErr : Err), cExp.type, NULL);l else {O if (cExp.rEvlbl && !cExp.errEvl && (cExp.sVal<0 || lType!=NULL && cExp. I sVal>=(TcalcS)lType->size * CHAR_BITC)) { /* *doIt*: portability */=J errWSSSS(UndefResul|Warn2|PossErr, paramTxt, longToS(cExp.sVal), typeToS1(lType), NULL);l cExp.errEvl = True;  cExp.sVal = 0;}  FreeExpType(cExp);}  cExp.type = lType;}C" cExp.cstImpsd = lExp.cstImpsd; cExp.unsigDiff = False;u? resulExp(WhoEnum, False, &computeShi, operMacLvl, SHIFTOP);g' cExp.topOper = SHIFTOP | NONASSOC;}} $static void computeShi(TpcTypeElt x){o TtypeSort tsl = x->typeSort; if (operShi == LSh) {  register TcalcS w; w = lExp.sVal << cExp.sVal; K if ((lExp.sVal>=0 && w<0 || lExp.sVal<0 && w>=0) && tsl & SigWhoEnum || 4 (TcalcU)w>>cExp.sVal!=lExp.uVal) errOvfl(x); cExp.sVal = w;}e1 else if (cExp.uVal == 0) cExp.sVal = lExp.sVal;  else {C if (tsl & SigWhoEnum) cExp.sVal = lExp.sVal >> (cExp.uVal - 1);2 else cExp.uVal = lExp.uVal >> (cExp.uVal - 1);0 if (cExp.sVal==0 && lExp.sVal!=0) errUdfl();* if (tsl & SigWhoEnum) cExp.sVal >>= 1; else cExp.uVal >>= 1;}}n/*~Undef operShi */ static void term8(void)&{s term9(); while (curTok.tok == ADDOP) { TkAdd oper;p6 TresulExp slExp = cExp; /* left operand saving */ TmacLvl operMacLvl = macLvl; bool foundTC = False; < oper = (TkAdd)curTok.val; /* operator in class AddOp */ GetNxtTok(); term9();% lExp = slExp; /* left operand */; paramTxt = txtAddTok[oper];lM if (pHeadTCBLists != NULL) foundTC = manageTypCmbn(AddTC + (oper - Add));l if (oper == Add) {O if (! resulExp(Num | PtrPoss, False /* because of x0 + deltaX, x0 cst */,2- &computeAdd, operMacLvl, ADDOP)) {e specialCaseOp(oper); cExp.topOper = ADDOP;}} else {O if (! resulExp(NumEnum | PtrPoss, False, &computeSub, operMacLvl, ADDOP))) specialCaseOp(oper);B else if (! foundTC) { /* see whether "distance" obtained */% TpcTypeElt eType = cExp.type;3 if (eType!=NULL && eType->typeSort==Enum) {  FreeExpType2(eType);& cExp.type = &natTyp[_INT];}}L if (cExp.type!=NULL && PureUnsig(cExp.type) && !cExp.rEvlbl /* because@ either no problem or already warned on overflow. */) cExp. unsigDiff = True;p cExp.topOper = SubOP;}}r} $static void computeAdd(TpcTypeElt x){n if (x->typeSort & UnsigWho) {& cExp.uVal += lExp.uVal;o+ if (cExp.uVal < lExp.uVal) errOvfl(x);}-" else { /* *doIt* float types */G if (! computeSigAdd(lExp.sVal, cExp.sVal, &cExp.sVal)) errOvfl(x);} }a$static void computeSub(TpcTypeElt x){e if (x->typeSort & UnsigWho) {u* if (cExp.uVal > lExp.uVal) errOvfl(x);' cExp.uVal = lExp.uVal - cExp.uVal;}d" else { /* *doIt* float types */# TcalcS prevValCExp = cExp.sVal;n9 if (!computeSigAdd(lExp.sVal, -cExp.sVal, &cExp.sVal)v#if LONG_MINC + LONG_MAXC != 02 || prevValCExp==LONGLONG_MINC && lExp.sVal>=0#endif ) errOvfl(x);}}hstatic void term9(void)o{s term10();a1 while (curTok.tok==STAR || curTok.tok==MULOP) {  TkMul oper;O6 TresulExp slExp = cExp; /* left operand saving */ TmacLvl operMacLvl = macLvl;9 oper = (curTok.tok == STAR)? Mul : (TkMul)curTok.val;  GetNxtTok(); term10();% lExp = slExp; /* left operand */n paramTxt = txtMulTok[oper];nF if (pHeadTCBLists!=NULL && manageTypCmbn(MulTC + (oper - Mul))) {}4 else if (cExp.type != NULL) /* coefficient ? */K if (! cExp.type->paralTyp) ((ModifType)(cExp.type = copyTypeEltNoOwn(< cExp.type)))->generic = True; /* because multiplication =& sequence of additions. */G else if (oper==Mul && lExp.type!=NULL && !lExp.type->paralTyp) (( I ModifType)(lExp.type = copyTypeEltNoOwn(lExp.type)))->generic = True; J if (oper == Mul) resulExp(Num, False, &computeMul, operMacLvl, MULOP); else {L if (oper == Div) resulExp(Num, False, &computeDiv, operMacLvl, MULOP);L else /* Mod */ resulExp(Who, False, &computeMod, operMacLvl, MULOP);( cExp.topOper = MULOP | NONASSOC;}}}E$static void computeMul(TpcTypeElt x){m if (x->typeSort & UnsigWho) {a#define SqrtTwoPow32 65536L J if (lExp.uVal<=SqrtTwoPow32-1 && cExp.uVal<=SqrtTwoPow32) cExp.uVal *= lExp.uVal;#undef SqrtTwoPow32  else if (cExp.uVal != 0) { register TcalcU w; w = lExp.uVal * cExp.uVal;/ if (w/cExp.uVal != lExp.uVal) errOvfl(x); cExp.uVal = w;}}" else { /* *doIt* float types */>#define SqrtTwoPow31 46340L /* 46340 = (TcalcS)sqrt(2**31) */O if ((TcalcU)(lExp.sVal+SqrtTwoPow31)<=SqrtTwoPow31+SqrtTwoPow31 && (TcalcU) G (cExp.sVal+SqrtTwoPow31)<=SqrtTwoPow31+SqrtTwoPow31) cExp.sVal *=c lExp.sVal;#undef SqrtTwoPow31* else if (cExp.sVal != 0) { register TcalcS w; w = lExp.sVal * cExp.sVal;/ if (w/cExp.sVal != lExp.sVal) errOvfl(x);  cExp.sVal = w;}}}/$static void computeDiv(TpcTypeElt x){ < if (cExp.sVal == 0) errOvfl(lExp.type); /* divide by 0 */ else {B if (x->typeSort & UnsigWho) cExp.uVal = lExp.uVal / cExp.uVal;E else cExp.sVal = lExp.sVal / cExp.sVal; /* *doIt* float types */ 1 if (cExp.uVal==0 && lExp.uVal!=0) errUdfl();} }p$static void computeMod(TpcTypeElt x){p< if (cExp.sVal == 0) errOvfl(lExp.type); /* divide by 0 */@ if (x->typeSort & UnsigWho) cExp.uVal = lExp.uVal % cExp.uVal;) else cExp.sVal = lExp.sVal % cExp.sVal;=}Ustatic void term10(void){ * Ttok topOper, oldTopOper = cExp.topOper; TmacLvl operMacLvl = macLvl;' TmacParCtr operMacParCtr = macParCtr; L cExp.topOper = topOper = curTok.tok; /* 'curTok.tok' to be saved, because& of right associativity. */ switch (curTok.tok) { case ADDOP: {t TkAdd oper; N static const Tstring txtUnAddTok[/*~ IndexType TkAdd */] = {"u+", "u-"};@ /*~ zif NbEltGen(txtUnAddTok, (TkAdd)0) != __extent(TkAdd)- "Array 'txtUnAddTok': bad size" */r oper = (TkAdd)curTok.val; K if (NxtTok() == CSTNU) { /* special case for numeric constants, to bep& able to mark them signed. */B curTok.val = (oper == Sub)? SignSeen | NegSeen : SignSeen; goto cstL;}N term10();s( resulUnOp(Num, txtUnAddTok[oper]); if (cExp.rEvlbl) { TpcTypeElt rType;t* if ((rType = cExp.type) != NULL) {* TtypeSort tsr = rType->typeSort;! if (tsr & SigWhoEnum) {I if (oper == Sub) { register TcalcS w; w = -cExp.sVal;eQ if (((w<0 && cExp.sVal<0) || (w>0 && cExp.sVal>0))) errOvfl(rType);} cExp.sVal = w;}}$ else if (tsr & UnsigWho) { if (oper == Sub) { topOper = SubOP;#if NO_GREATER_INT% cExp.uVal = -cExp.uVal; #else(E if (tsr < Long) cExp.uVal = (TcalcU)(-(uint)cExp.uVal);p& /* because -(1U) = UINT_MAXC */L else if (tsr < LLong) cExp.uVal = (TcalcU)(-(ulong)cExp.uVal);- /* because -(1UL) = ULONG_MAXC */ * else cExp.uVal = -cExp.uVal;#endif }}}t& else cExp.sVal = - cExp.sVal;} goto defTopOperL;} case APSAND: {N TpcTypeElt ptrAddendType = (NxtTok() == INDEXTYPE)? getINDEXTYPEtype() : NULL;l bool savAO = apsndOpnd;a apsndOpnd = True;; term10();FM if (! cExp.lValFl) {paramTxt = "u&"; errExp(NotLVal, NULL, NULL); cExp.E ptrId = NULL;} else {9 TpTypeElt newElt = allocTypeEltID(Ptr, NoQualif);BC if (cExp.pseudoAttrib == Reg) {err0(RegAttribForAmp); cExp.E pseudoAttrib = Auto;} newElt->noOwner = True;tJ if (cExp.type != NULL) newElt->stopFreeing = ! cExp.type->noOwner; newElt->size = PtrSiz;E if (ptrAddendType != NULL) newElt->indexType = ptrAddendType;  else {0 Ttok topOper = NakedTok(cExp.topOper);N newElt->indexType = ((topOper==LSBR || topOper==STAR) && cExp.type!=I NULL)? lExp.type : (moreIndexTypeChk)? &defaultIndexTypeElt : NULL;}V# newElt->nextTE = cExp.type;;N newElt->generic = True; /* to allow '&buf[...]' to be compatible with4 any reachable descendant of 'Ptr/TbufElt'. */ cExp.type = newElt;" cExp.rEvlbl = cExp.lEvlbl; cExp.errEvl = False;" if (! cExp.PointedByObj) {( TsemanElt *ptrId = cExp.ptrId;K if (ptrId!=NULL && ptrId->initlz /* because of UslObj */) ptrId->(: used = cExp.oldUsed; /* taking address of object is not (yet) using it. */o% cExp.PointingOnObj = True;}l else PopHist(cExp.hist); cExp.lValFl = False;1 cExp.lclAdr = cExp.pseudoAttrib == Auto;}  apsndOpnd = savAO; goto defTopOperL;} case CASTTO: {1 TpcTypeElt castType = curTok.dpType, eType;l GetNxtTok(); term10();}E if (castType!=NULL && (eType = cExp.type)!=NULL && !compatType(u; represType(castType), represType(eType), VerifCast)) {m@ errWSTT(IlgCastTo|Warn2|PossErr, NULL, castType, eType); FreeExpType2(castType);} else {0 if (preLastCastType != NULL) freePrev();P if (compatType(castType, eType, VerifCastF) && !cExp.unsigDiff && !cExp.B cstImpsd) errWSTT(UslCastTo|Warn1|Rdbl, NULL, castType, eType); finalizeCast(castType);} goto defTopOperL;}3 case CSTCH: case CSTCH1: /* character constant */t cExp.Einfo = 0;c' cExp.errEvl = curTok.tok == CSTCH1; 6 cExp.uVal = (cExp.errEvl)? 0 : (TcalcU)curTok.val; cExp.type = &charCstTypeElt; goto cstL1;l& case CSTNU: /* numeric constant */cstL:  manageNumCst();=Q if (chkNumCst && !cExp.errEvl && (TcalcU)(cExp.sVal + 1)>1+1 /* *doIt* Flt */C && !sysAdjHdrFile && !aloneInNoParMac(True) && !(operMacLvl!=0 &&BG NakedTok(oldTopOper)==LPAR && nxtCharOrMacTok()==-(TcharTok)RPAR)) {  cExp.litCst = True;f6 if (operMacLvl == 0) cExp.LitCstOutsMac = True;}cstL1: cExp.ptrId = NULL;cstL2: SetInfoForCstv goto exitIdL;i' case CSTST: { /* string constant */c TpTypeElt newElt;D curTok.error = False;)1 cExp.pVal = (const char *)ptrFreeIdSpace();1 /* Concatenate adjacent string litterals */ do { analStrCst(&storeStrCh);B lastPrimMacParCtr = (insideMultUsedMacPar)? macParCtr : 0;" } while (NxtTok() == CSTST);. storeStrCh('\0'); /* terminating byte */, cExp.Einfo = 0; /* reset all flags */K cExp.errEvl = curTok.error; /* do not reset cExp.pVal, since one mayq; still want to use the erroneous string literal. *// cExp.lValFl = True;r cExp.lEvlbl = True;=H cExp.rEvlbl = True; /* because "..." => &"..."[0] implicitely */; cExp.pseudoAttrib = Stati; cExp.ptrId = NULL;< cExp.type = newElt = copyTypeEltNoOwn(&strCstTypeElt);7 newElt->lim = newElt->size = initGetStrLit(NULL);e goto tstQualif1L;} case EMARK:N GetNxtTok(); term10();y resulUnOp(mskBool, "!");= if (cExp.rEvlbl) cExp.uVal = (TcalcU)(! (bool)cExp.uVal);) relOpTrtmt();c goto defTopOperL;t case IDENT: {  TsemanElt *ptrId;( cExp.type = NULL;EK cExp.Einfo = 0; /* reset pseudoAttrib and all flags (rEvlbl etc.) */;L if ((ifDirExp || zifExp) && checkSpeFct()) { /* special preprocessor/ zif function. */ topOper |= PRIMARY;W cExp.ptrId = NULL; SetInfoForCstr goto defTopOperL;}J if (ifDirExp) { /* 'any identifiers remaining after macro expansion are replaced by 0L'. */lB if (evaluateFl) errWN(UndefId|Warn3|PossErr, curTok.name);$ cExp.type = &longCstTypeElt; cExp.sVal = 0;$ goto cstL1 /*~BackBranch*/;}F if ((ptrId = curTok.ptrSem) == NULL) { /* unknown identifier */' TcharTok w = nxtCharOrMacTok();O DefSem1(artifDef, Obj, True /*defnd*/, True /*used*/, True /*initlz*/);E6 errWN((w==(TcharTok)'(' || w==-(TcharTok)LPAR) ? UndefFctId | CWarn3L : (isupper((char)*(curTok.name + LgtHdrId))) /* symbol? => constant. */8 ? (cExp.rEvlbl = True, cExp.errEvl = True, UndefId) : UndefId, curTok.name);O# ptrId = defineId(artifDef);c* if (ptrId == NULL) goto exit1IdL;} if (ptrId->kind >= Type) {% if (ptrId->kind == EnumCst) {o) if (ifDirExp) err0(IlgInIfExp);  if (! ptrId->defnd) {t9 errWN(NotUsdEnumCst|Warn1|Rdbl, curTok.name);-1 if (! allErrFl) ptrId->defnd = True;}=J if (ptrId->type->tagId->listAlwdFiles != NULL) checkPrivVisible( ptrId->type); cExp.ptrId = ptrId;l" cExp.type = ptrId->type;- cExp.sVal = (TcalcS)ptrId->enumVal;r ptrId->used = True;.& goto cstL2 /*~BackBranch*/;}" errWN(IlgId, curTok.name); goto exit1IdL;}=J if ((cExp.type = ptrId->type)==NULL && isupper((char)*(curTok.name +; LgtHdrId))) {cExp.rEvlbl = True; cExp.errEvl = True;}U$ if (ptrId->attribb == Extrn) {8 if (ptrId->declInInHdr) checkIncldFiles(ptrId);}K else if (!ptrId->defnd && ptrId->type!=NULL && !IsFct(ptrId->type)) {CM errWN((ptrId->kind == Param)? NotUsdPar|Warn1|Rdbl : NotUsdObj|Warn1|E Rdbl, curTok.name);c- if (! allErrFl) ptrId->defnd = True;}r) cExp.pseudoAttrib = ptrId->attribb;=L cExp.oldUsed = ptrId->used; /* save previous state of 'used' flag */' if (! zifExp) ptrId->used = True;pP cExp.lclAdr = ptrId->lclAd; /* in case type(ident) == Ptr (or Bool: does4 also "cExp.notPureBool = ptrId->notPureBoo;" */ exit1IdL: cExp.lValFl = True;)F cExp.lEvlbl = True; /* because &(id) yields constant address */ cExp.pVal = ArbitAdr;, cExp.ptrId = ptrId;n cExp.hist = H_EMPTY;} exitIdL:> lastPrimMacParCtr = (insideMultUsedMacPar)? macParCtr : 0; GetNxtTok(); tstQualif1L:% cExp.topOper = topOper | PRIMARY;  goto tstQualifL; case INCOP: {p$ TkInc oper= (TkInc)curTok.val;+ TmacParCtr operMacParCtr = macParCtr;f GetNxtTok(); term10();T& resulIncOp(oper, operMacParCtr); goto positMacLvlL;}T) case LPAR: { /* cast/sub-expression */  TcharTok w;, GetNxtTok(); if (IsDecl1(BQualif) || curTok.tok==IDENTS< && (curTok.ptrSem!=NULL && curTok.ptrSem->kind==TypeM /* in an attempt to follow programmer idea, consider undefined paren- H thetized uppercase identifier as would-be type identifier. */M || curTok.ptrSem==NULL && ((w = nxtCharOrMacTok())==(TcharTok)'*' ||nA w==(TcharTok)')' || w==-(TcharTok)STAR || w==-(TcharTok)RPAR)) A && (curTok.ptrSem!=NULL && curTok.ptrSem->namedType!=NULL I || !ifDirExp /* cast meaningless in '#if' */ && isupper((char)*(p- curTok.name + LgtHdrId)))) { /* cast */f# TpcTypeElt castType, eType; H bool macParMet, oddCSeen = False, portQMSeen, ignorable = False;0 if (preLastCastType != NULL) freePrev(); castType = declType();D if (! (portQMSeen = Found(PORTQM)) && curTok.tok==ODDCAST) {1 ignorable = ignorableDP(macParCtr + 1);k oddCSeen = True;}h' if (ifDirExp) err0(IlgInIfExp);+ if (! Found(RPAR)) err0(RParExptd);o { 1 TmacParCtr begExpMacParCtr = macParCtr; term10();m6 macParMet = (macParCtr != begExpMacParCtr);}+ if (! macParMet) ignorable = False; eType = cExp.type; paramTxt = "cast"; if (castType != NULL) {p- TtypeSort tsc = castType->typeSort; ) if ((uint)tsc >= (uint)Array) { M errWT((!compatType(castType, eType, VerifCastF) && eType!=NULL &&(@ compatType(represType(castType), represType(eType), VerifCast)4 )? IlgCastTarget1 : IlgCastTarget, castType);# FreeExpType2(castType);| castType = NULL;}V else {I if (tsc == Bool) cExp.notPureBool = !(oddCSeen || cExp.rEvlble- && (cExp.errEvl || cExp.uVal<=1));, if (eType != NULL) {. TtypeSort tse = eType->typeSort; Terr errNo;xL if (IsFctSort(tse) || (tse==Void || IsStrunSort(tse)) && tsc!=- Void) errWT(IlgCastSource, eType);n% else if (tsc != Void) {FI if (tse==Array && eType->generic) tse = Ptr; /* for castS- purpose, string constant => Ptr. */S> if (CompatType(castType, eType, VerifCastF)) { TpcTypeElt w; # if ( !macParMet A && (castType==eType || castType->sysTpdf==eType->sysTpdf)pA && !(tsc==Ptr && eType->generic && ((w = NxtTypElt(eType))4 )==NULL || w->typeSort==Void) && ((w = NxtTypElt(9 castType))==NULL || w->typeSort!=Void)) /* (void *)e4 generally to be cast to other pointer, so do not4 complain if people try to do things right. */= && !cExp.cstImpsd) {errNo = UslCast|CWarn1|Rdbl; goto* stdErrL;} goto noErrL;}(D else if (tsc < DelType) { /* cast to NumEnumBool */ switch(tse) {v5 case Ptr: /* Ptr => NumEnumBool */dG if (allocType != NULL) freeAlloc(); /* inhibitates  'Xalloc' check. */;M if (cExp.rEvlbl && cExp.pseudoAttrib==NoAttrib) { /* ad-  dress known. */N if (!cExp.errEvl && computeLstType((TcalcS)(size_t)cExp.; pVal) > ((tsc == Enum)? Int : tsc)) errOvfl(castType);,I break;} /* *doIt* break only if no overflow on anya machine. */#if ! PtrGtLongPL if (castType->sysTpdf && memcmp(castType->typeId->nameb,; SizeTName, LitLen(SizeTName))==0 || castType->typeSort==e ULLong) goto noErrL; #endif4 %~DCC.BCKE"[DCC_DISTRIB.SRC]DCEXP.C;329Tv|` errNo = PtrToNum|CWarn2|PossErr;! goto stdErrL;e9 case Array: /* Array => NumEnumBool */ 3 errNo = NotArrToNum|Warn1|Rdbl;!" goto stdErrL;;< default: /* NumEnumBool => NumEnumBool */L if (castType->litCsta!=eType->litCsta) CheckNumCstNamed( cExp, castType);? if (cExp.rEvlbl) checkInfoLoss(castType);}} ) else { /* cast to Ptr */E& bool sameTypButQual;$ errQalTyp1 = NULL;H sameTypButQual = compatType(castType, eType, CCheck1);+ if (errQalTyp1 != NULL) {(K if (! oddCSeen) errWSTT(HzrdConv1|CWarn2|PossErr, NULL,E eType, castType);d1 else preLastCastType = eType;e& ignorable = True;}) if (! sameTypButQual) {v3 TpcTypeElt castTypw = castType;= for(;;) {e4 TpcTypeElt nxtCType, nxtEType;M if ((nxtCType = NxtTypElt(castTypw))==NULL || (nxtEType 9 = NxtTypElt(eType))==NULL && IsPtrArrSort(tse)) gotod noErr1L;c# switch(tse) {=5 case Array: /* Array => Ptr */eP if (castTypw==castType /* first turn around */) errWSTT(4 ArrToPtr|Warn1|Rdbl, NULL, eType, castTypw);$ /*~NoBreak*/1 case Ptr: /* Ptr => Ptr *//N if (IsFct(nxtCType) && IsFct(nxtEType)) goto hzdCastL;K if (castTypw == castType) { /* first turn around */qL if (nxtEType->typeSort == Void) break; /* because- 'void *' compatible with any pointer. */c9 if (nxtCType->typeSort == Void)rC if (IsFct(nxtEType)) goto nonPortCastL;l' else break;,I if (nxtCType->typeSort == UByte) break; /* rawh bytes container. */,O if (IsFct(nxtCType)) {errWSTT(IncptblTypes, paramTxt,T& castType, eType); break;}}P if ((uint)nxtCType->typeSort >= (uint)Fct) /* Fct, VFct,- Struc, Union */ goto nonPortCastQML; D if ((uint)nxtCType->typeSort >= (uint)Ptr) {K /* Pointer on Ptr/Array : dereference and loop */u. castTypw = nxtCType;3 tsc = castTypw->typeSort;q3 if (IsPtrArr(nxtEType)) {- eType = nxtEType;w2 tse = eType->typeSort;I continue;} /* dereferencing pointer chain */s) goto hzdCastL;}xP /* Here, casting type can only be pointer on num/enum */F if ((uint)nxtEType->typeSort >= (uint)DelType)M if (IsStrun(nxtEType) && frstMemberCompat(nxtEType,p& nxtCType->typeSort)) break;- else goto hzdCastL;uL if (nxtCType->typeSort==Void || nxtEType->typeSort== Void) break;K /* Cast to pointer on floating type never portable; J cast from floating type to integral type may beF portable (see, for example, dynarray.h). */I if (IsTypeSort(nxtCType, Flt)) goto nonPortCastL;tK if (IsTypeSort(nxtEType, Flt)) goto nonPortCastQML;CK if (nxtCType->algn != nxtEType->algn) { /* nothing'- to say if same alignment constraint. */fG /*if (nxtCType->algn > nxtEType->algn) goto / nonPortCastQML; because alignment cons-d4 traint may be respected by programmer. */M /* Cast to pointer on smaller integer sort a prioritO never portable, because of big/little endians, but=N see header management of dynamic arrays (dynarray$ .h). *// goto nonPortCastQML;}  break;8 default: /* NumEnumBool => Ptr */5 cExp.pseudoAttrib = NoAttrib;fD if (cExp.sVal==0 && eType==&intCstTypeElt &&= NakedTok(cExp.topOper)==CSTNU) { /* because 0 canp; be cast to any pointer (idiom '&(struct *)0->...'). */ I ((ModifType)castType)->generic = True; /* NULL. generic ! */! break;} J if (eType->sysTpdf && memcmp(eType->typeId->nameb,4 SizeTName, LitLen(SizeTName)) == 0) break;L if (cExp.rEvlbl && !cExp.errEvl && ((computeCstType(9 cExp.sVal, UnsigWho)<=UInt)? IntSiz : LongSiz)>I& PtrSiz) errOvfl(castType);- goto nonPortCastQML;};9 break;}}}} /* exit for(;;) loop */ N if (oddCSeen && !ignorable) errUslDP(ODDCAST); /* no warning in* macro if macro parameter met, because% its type is a priori unknown. */r goto noErrL; hzdCastL:e. errNo = HzrdConv|CWarn2|PossErr;stdErrL:G if (!oddCSeen) errWSTT(errNo, NULL, cExp.type, castType);EnoErrL:)/ if (portQMSeen) errUslDP(PORTQM);E goto noErr1L;}nonPortCastQML: = /* Does not know whether really not portable */ A if (!oddCSeen && !portQMSeen && chkPortbl) errWSTT( ; NonPortCastQM | CWarn1, NULL, cExp.type, castType);e goto noErr1L;N nonPortCastL:oN if (!portQMSeen && chkPortbl) errWSTT(PortCastQM | CWarn1, NULL, cExp.type, castType);x noErr1L: ;}}P if (!macParMet || NakedTok(cExp.topOper)!=VFCTC) cExp.topOper = CAST; B /* inside macro, pseudo-void function stays so through cast */K if (! (tsc==Ptr && cExp.type!=NULL && IsPtrArr(cExp.type))) cExp.L lValFl = False;} finalizeCast(castType);> goto positMacLvlL;}' /* Expression */ commaExpr();) if (! Found(RPAR)) err0(RParExptd);G cExp.topOper |= PARENSEEN; /* so that "(a=b)" => side-effect. */ 0 if (Found(NONCONST)) cExp.rEvlbl = False;} tstQualifL:  cExp.macLvl = operMacLvl;I< if (InsideInterval(curTok.tok, LPAR, DOT)) primQualif(); break; case SIZEOF: {3 bool parenFl = False, savEvalFl = evaluateFl; % if (ifDirExp) err0(IlgInIfExp);  GetNxtTok();@ lastPrimMacParCtr = (insideMultUsedMacPar)? macParCtr : 0; evaluateFl = False; M loopLvl++; /* hack to prevent manageUsedForIncOp() from doing wrong */L1 if (curTok.tok == LPAR) { /* maybe type */u parenFl = True;  GetNxtTok();J if (isType()) {cExp.type = declType(); cExp.topOper = WHITESPACE |& PRIMARY; cExp.ptrId = NULL;}+ else {commaExpr(); valueNotUsed();}T1 if (curTok.tok != RPAR) err0(RParExptd);}& else {term10(); valueNotUsed();} loopLvl--; evaluateFl = savEvalFl;P {  TREInfo savCEinfo;& savCEinfo._eInfo = cExp.Einfo;. cExp.Einfo = 0; /* reset all flags */$ if (savCEinfo.s21._litCst) { cExp.litCst = True; H if (savCEinfo.s21._litCstOutsMac) cExp.LitCstOutsMac = True;}}+ if ((cExp.uVal = (TcalcU)sizeOfTypeD(k cExp.type,> (cExp.ptrId!=NULL && cExp.ptrId->kind==Param && cExp.ptrId->@ type!=NULL && IsArrFct(cExp.ptrId->type) && cExp.hist==5 H_EMPTY)? UndefSize|Warn2|PossErr : UndefSize,  (Tname)"\6\0sizeof"))r4 == 0) cExp.errEvl = True; /* illegal size */ cExp.cstImpsd = True;I cExp.rEvlbl = True;cI if (! evaluateFl) cExp.errEvl = True; /* to prevent computation */RC if (sizeofOpndType == XAllocSeen) sizeofOpndType = cExp.type;. else { FreeExpType(cExp);A if (sizeofOpndType != NULL) {FreeExpType2(sizeofOpndType)e& ; sizeofOpndType = NULL;}} if (! sizeofSeen) {  TsemanElt *ptrId; D if ((ptrId = searchSymTabHC(SizeTName, SizeTHCode))==NULL || ptrId->type==NULL) { if (! stddefNotInFl) {3 err0(StddefNotIncl|Warn2|Rdbl|PossErr);c# stddefNotInFl = True;}}N else { sizeofSeen = True;, sizeofTypeElt = *ptrId->namedType;) sizeofTypeElt.generic = True;}}u! cExp.type = &sizeofTypeElt;VD if (InsideInterval(NakedTok(cExp.topOper), FCTC, INCOP)) err0(& SizeofDontEval|Warn3|PossErr);L else if (InsideInterval(NakedTok(cExp.topOper), CSTCH, CSTCH1)) {err0(; SizeofCharCst|Warn3|PossErr); cExp.uVal = IntSiz;} > if (parenFl) GetNxtTok(); /* for good error position */ cExp.ptrId = NULL;( goto tstQualif1L /*~BackBranch*/;} case STAR: { GetNxtTok(); term10();  paramTxt = "u*"; indir(); goto defTopOperL;} case TILDE:) GetNxtTok(); term10();p resulUnOp(WhoEnum, "~"); if (cExp.rEvlbl) {4 if (cExp.type == NULL) cExp.uVal = ~cExp.uVal;H else if (cExp.type->typeSort & SigWhoEnum) cExp.sVal = ~cExp.sVal; else { cExp.uVal = ~cExp.uVal;f#if ! NO_GREATER_INT? if (cExp.type->typeSort < Long) cExp.uVal &= UINT_MAXC;oF else if (cExp.type->typeSort < LLong) cExp.uVal &= ULONG_MAXC;#endif }} goto defTopOperL;i case VOIDTOTHER: { TpcTypeElt w, eType; GetNxtTok(); term10();.( if ((eType = cExp.type) != NULL) { if (IsPtr(eType)) {;? if ((w = NxtTypElt(eType)) == NULL) goto defTopOperL; $ if (w->typeSort == Void) {0 cExp.type = copyTypeEltNoOwn(eType);J ((ModifType)cExp.type)->generic = True; /* keep qualifiers */ goto defTopOperL;}}T errIlgDP(VOIDTOTHER);}} defTopOperL: cExp.topOper = topOper;c goto positMacLvlL; default:? cExp.type = NULL; /* because of FreeExpType in errExp() */ B errExp((oldTopOper == SCOL)? StmtExptd : MsngExp, NULL, NULL);* cExp.Einfo = 0; /* reset all flags */ cExp.lValFl = True;  cExp.lEvlbl = True;e cExp.pVal = ArbitAdr;N lastPrimMacParCtr = 0; cExp.ptrId = NULL; positMacLvlL:( cExp.macLvl = operMacLvl;} while (curTok.tok == INCOP) {xB lastPrimMacParCtr = (insideMultUsedMacPar)? operMacParCtr : 0;- resulIncOp((TkInc)curTok.val, macParCtr);( cExp.macLvl = macLvl;T GetNxtTok();}f}t<static void finalizeCast(TpcTypeElt castType /*~MayModify*/){ > if (castType==NULL || castType->typeSort!=Void) checkInit();1 else cExp.ptrId = NULL; /* for no checkInit */)L if (castType!=NULL && cExp.rEvlbl && castType->rootTyp) /* mark constants& of root type 'generic'. */I ((ModifType)(castType = copyTypeEltNoOwn(castType)))->generic = True; 6 if (preLastCastType != cExp.type) FreeExpType(cExp); cExp.type = castType;E< cExp.cstImpsd = False; /* to get 'type mismatch' error on "schar = (short)3;". */i cExp.unsigDiff = False; }tstatic void manageNumCst(void){s analNumCst(NULL);( cExp.Einfo = 0; /* reset all flags */ cExp.errEvl = curTok.error;r6 if (curTok.val & FltSeen) { /* floating constant */A cExp.sVal = curTok.numVal; /* until better mngt... *doIt* */t5 if (curTok.val & NegSeen) cExp.sVal = -cExp.sVal;v8 cExp.type = (curTok.val & FSeen)? &floatCstTypeElt :3 (curTok.val & LDSeen)? &longDblCstTypeElt :n3 (cExp.cstImpsd = True, &doubleCstTypeElt);}c else { cExp.sVal = curTok.numVal;5 if (curTok.val & NegSeen) cExp.sVal = -cExp.sVal;b; if (curTok.numVal>=0 && !(curTok.val & (LSeen | USeen)) #if ! NO_GREATER_INTP && ((TcalcU)(cExp.sVal - INT_MINC) <= (TcalcU)((TcalcS)INT_MAXC -INT_MINC))#endif ) {UB cExp.type = &intCstTypeElt; /* 'simple' integer constant */ cExp.cstImpsd = True;} else { TpTypeElt newElt;  TtypeSort cstSort;: newElt = allocTypeEltID((TtypeSort)(0-0), NoQualif);5 newElt->noOwner = True; newElt->generic = True;pE if ((cstSort = computeLstType(cExp.sVal)) < Int) cstSort = Int;cJ if (curTok.val & SignSeen) /* possible overflow already detected by analNumCst(). */#ifdef LONGLONGNK if (cstSort < Long) cstSort |= Long | LLong; else cstSort |= LLong;i#elset cstSort |= Long;#endif else {( if (curTok.numVal < 0) cstSort =5#if NO_GREATER_INT /* for numVal computed in Long */  UInt | ULong;&#elsen ULLong;)#endifP else if (cstSort < Long) cstSort |= UInt | Long | ULong | LLong |ULLong;D else if (cstSort < LLong) cstSort |= ULong | LLong | ULLong; else cstSort |= ULLong;}6 if (curTok.val & LSeen) cstSort &= Long | ULong;#ifdef LONGLONG > else if (curTok.val & LLSeen) cstSort &= LLong | ULLong;#endif else cExp.cstImpsd = True;? if (curTok.val & USeen) cstSort &= UInt | ULong | ULLong;eJ else if (! (curTok.val & OctHex)) cstSort &= ~ UInt; /* because the standard says so. */ M if (cstSort == Void) {err0(WrngNb); cExp.errEvl = True; cstSort = Int;}% /* Keep only least type sort */ {  TtypeSort w; int i = 0;I static const size_t tabSize[] = {IntSiz, IntSiz, LongSiz, LongSizm#ifdef LONGLONG # , LongLongSiz, LongLongSizr#endif };r< for (w = Int; (w & cstSort) == Void; w <<= 1) {i++;} newElt->typeSort = w;a# newElt->size = tabSize[i];}r cExp.type = newElt;}}} static void primQualif(void){y$ CheckNumCstNamed(cExp, cExp.type); for (;;) {' TpcTypeElt initialType = cExp.type;t switch (curTok.tok) {p case ARROW:e paramTxt = "->"; {1 TpcTypeElt w;yF if (initialType!=NULL && (w = NxtTypElt(initialType))!=NULL &&A !IsStrun(w)) errExp(IlgLftType, initialType, NULL);} /* has to : be done that way (cannot use test of DOT case), because; indir() destroys head of type chain (field 'nextTE'). */  indir(); goto dotL; case DOT:  paramTxt = "."; H if (initialType!=NULL && !IsStrun(initialType)) errExp(IlgLftType, initialType, NULL); dotL:n) /* Structure/union member access */  {  const TdeclElt *member;r TpcTypeElt eType;S, cExp.topOper = curTok.tok | PRIMARY;H if (preLastCastType != NULL) freePrev(); /* type of members are- completely unrelated to strun type. */f* if ((eType = cExp.type) != NULL) {K if (eType->tagId->listAlwdFiles != NULL) checkPrivVisible(eType);e4 member = BaseStrunType(eType)->memberList; if (member == NULL) { P (void)sizeOfTypeI(eType, False, IncplStrunType, paramTxt);/* type */E errExp(NoErrMsg, NULL, NULL);}} /* not yet completed. */s PushHist(H_DOT);D if (NxtTok() != IDENT) {errExp(IdExptd, NULL, NULL); break;} if (cExp.type != NULL) {+ Tqualif qual = cExp.type->qualif; 8 bool strucFl = (cExp.type->typeSort == Struc); do {F if (isSameName(member->hCode, member->idName, curTok.hCod, curTok.name)) {4 const TpcTypeElt mType = member->type;& FreeExpType2(cExp.type);M if (mType==NULL || !(qual & ~mType->qualif)) cExp.type = mType; / else { /* propagate qualifier */(; TpTypeElt newElt = copyTypeEltNoOwn(mType);l' newElt->qualif |= qual; $ cExp.type = newElt;}O if (member->fldFl) cExp.pseudoAttrib = Reg; /* to prevent takingy& the address of a bit-field. */ goto foundMember;}N if (strucFl && member->type!=NULL) cExp.pVal += ((IsStrun(member->? type))? BaseStrunType(member->type) : member->type)->size; /*  compute l-value. */ 3 } while ((member = member->cdr) != NULL); ? errExp(UnknMember, cExp.type, nameToS(curTok.name));} foundMember: GetNxtTok();H cExp.notPureBool = False; /* struct/union fields independant */L break;} /* 'lValFl', 'pseudoAttrib' keep their preceding value (cf.> cast number to pointer "(.. *)0" ); 'cExp.ptrId' not reset,B so as to be able to take notice of possible initialization. */% case LPAR: { /* function call */l$ const TdeclElt *formParList;/ bool badLgth = False, formatFl = False; TREInfo savCEinfo;* TpcTypeElt resulType = NoResulTyp; TresulExp slExp = cExp;27 Tname lastCalledFctName = decoratedName(&cExp); H TsemanElt *finalPtrId = NULL; /* a priori, function result have- nothing in common with function name. */uP TpcTypeElt locAllocType = allocType, saveSizeofOpndType= sizeofOpndType;* sizeofOpndType = allocType = NULL; paramTxt = "()";A if (macParCtr == lastPrimMacParCtr) errWN(IneffOrSideEff|n- Warn2|PossErr, lastCalledFctName);t" if (initialType != NULL) {# if (IsFct(initialType)) {eI if (initialType->typeSort==VFct && lastCalledFctName!=NULL) { I static const Tname tabIOf[] = {PrintfFamily, ConvTname(""), 9 ScanfFamily}; /* 'printf' family must come first B (because more frequent; see also 'ioFctNb' computation). */# const Tname *ptrTIOf;s4 size_t lgtId = Lgt(lastCalledFctName);J for (ptrTIOf = &tabIOf[0]; ptrTIOf <= AdLastElt(tabIOf); ) {L if (memcmp(lastCalledFctName, *ptrTIOf++, lgtId) == 0) { /*- found xscanf/xprintf function. */ " formatFl = True;L ioFctNb = (int)(ptrTIOf - &tabIOf[SizePrintfFamily + 1 /*  because of '++' */]);  break;}}} /* else {: TpcTypeElt nxtType = NxtTypElt(initialType);J if (nxtType!=NULL && nxtType->generic && nxtType->typeSort==B Double) fltDblType = True;} .. for library math functions */ goto correctL;}x1 errExp(IlgLftType, initialType, NULL);} J initialType = allocTypeEltID(VFct, NoQualif); /* just to simplifyB coming life ('nextTE' field = 'paramList' field = NULL). */1 ((ModifType)initialType)->noOwner = True; correctL: I if (cExp.macLvl==0 && macLvl!=0) err0(LParOutsideMac|Warn1|Rdbl);eI /* case "exit EXIT_SUCCESS", with EXIT_SUCCESS defined as "(1)" */ & savCEinfo._eInfo = cExp.Einfo;- formParList = initialType->paramList;  if (NxtTok() != RPAR) {e$ bool resulPtrSeen = False; do {? if (formParList!=NULL && formParList->SizeofBlFl) {iD if (locAllocType == NULL) sizeofOpndType = XAllocSeen;N else if (locAllocType != XAllocSeen) {FreeExpType2(locAllocType)& ; locAllocType = XAllocSeen;}} { ' int savIoFctNb = ioFctNb;  asgnExpr();s$ ioFctNb = savIoFctNb;} {=1 const TpcTypeElt eType = cExp.type;aQ/* if (loopLvl!=0 && cExp.ptrId!=NULL) cExp.ptrId->forceUsed = True; O/ case "a=f(a)" inside loop; but seems to denote bad coding, so warning left */ G paramTxt = "()"; /* paramTxt used in managePointers() */ D lExp.type = (formParList == NULL) /* variadic part */ ? (ScanfFl)oK ? &charPtrTypeElt /* NOTALLCONST type, to prevent xscanfe- parameters from being asked 'const'. */  : NULL$ : formParList->type;Q /* xscanf will not change its parameters in case of input or match- K ing failure, so parameters cannot be marked 'not used'. */ T/* if (ScanfFl && cExp.ptrId!=NULL && (cExp.PointingOnObj || cExp.ptrIdA ->type!=NULL && IsArr(cExp.ptrId->type) && cExp.ptrId->kind!==? Param && cExp.Drefncd==0)) cExp.ptrId->used = cExp.oldUsed;r> * for UnusedVar1 detection (check not done for array para-4 meter, because of possible 'UnusedPar' msg). */( managePointers(lExp.type);( if (formParList == NULL) {. CheckNumCstNamed(cExp, eType); badLgth = True;sI if (formatFl && !folwngSpe(eType)) {err0(FmtExhstd|Warn2|U& PossErr); formatFl = False;}}@ else { /* non exhausted formal parameters list */8 TpcTypeElt formType = formParList->type;1 CheckNumCstNamed(cExp, formType);aD if (eType != NULL) { /* correct actual parameter */$ errQalTyp1 = NULL;M if (formParList->parQal == ResulTypV) heedRootType = False;rK if (formParList->parQal==UtilityV && eType->paralTyp || !gB CompatType(formType, eType, FctCall) && !compatNumType()) {( heedRootType = True;K /* Skip over bad manners of some system header files */iP if (!(eType->typeSort==Enum && eType->intPoss && IsTypeSort( formType, Who))) {rI errId3(warnOrErr(IncptblPar|CWarn|PossErr), &slExp, - typeToS1(eType), typeToS2(formType));}}  else {( heedRootType = True;D if (IsStrun(eType) && formParList->MayModifFl) {4 TsemanElt *ptrId = cExp.ptrId;* if (ptrId != NULL) {O if (ptrId->kind==Param && !ptrId->MayModif && (!ptrId->C- Dmodfd || allErrFl) && askConstFl) F errId2(MayModify|Warn1|Rdbl, ptrId, nameToS(& curFctName), errTxt[MayM]);/ ptrId->Dmodfd = True;}}rG if (errQalTyp1 != NULL) errWSTT(ConstQalNotHeeded2|.6 ConstWarn|PossErr, (errQalTyp1 == formType)? NULL :- errTxt[SubPre], errQalTyp1, errQalTyp2);tE if (IsArr(eType) && !cExp.lValFl) err0(NotLValP);lM /*if (cExp.ptrId!=NULL && eType->qualif&VolatQal) errId1( ; CopyVolat | Warn2, cExp.ptrId, typeToS1(eType));*/P@ if (formParList->SizeofBlFl) {locAllocType =- sizeofOpndType; sizeofOpndType = NULL;}(; if (formParList->parQal == ResulTypV) {vO if (resulType == NoResulTyp) resulType = arrToPtr(eType); 4 /* because array parameter passed by address */ else {% TpcTypeElt w;O if (CompatType(resulType, eType, FctCall)) /* 'FctCall';4 because of "strcpy(array, array/ptr)". */K if (formParList->ResulPtrFl && !CompatType(eType,= resulType, FctCall)) { M errWSTT(ResulPtrNotHghsTyp|Warn2|PossErr, dpName(d& RESULTYP), eType, resulType);1 w = arrToPtr(eType);}e. else goto noChangeL; elseF if (compatType(eType, resulType, FctCall)) {/ if (resulPtrSeen) {fO errWSTT(ResulPtrNotHghsTyp|Warn2|PossErr, dpName(/& RESULPTR), eType, resulType);. goto noChangeL;}1 w = arrToPtr(eType);}pF else {errWSTT(NoHghrTyp|Warn2|PossErr, NULL,& resulType, eType); w = NULL;}0 FreeExpType2(resulType);& resulType = w; noChangeL:;}4 if (formParList->ResulPtrFl) {0 finalPtrId = cExp.ptrId;0 resulPtrSeen = True;}}}}I if ((formParList = formParList->cdr)==NULL && formatFl) { M if (eType!=NULL && IsArr(eType) && eType->generic && !cExp. B errEvl) initFlwgSpe(); /* correct literal format string */* else formatFl = False;}}; if (eType != resulType) FreeExpType1(eType);}L" } while (Found(COMMA));}G if (curTok.tok != RPAR) err0(RParExptd); /* here to be before ,& 'BadActParListLgth' error. */I if (formParList!=NULL || (badLgth && initialType->typeSort!=VFct)N4 ) errId3(BadActParListLgth, &slExp, NULL, NULL);K if (formatFl && folwngSpe(NULL)) err0(TooManyFmtSpe|Warn2|PossErr);y2 ioFctNb = 0; /* reset ScanfFl/PrintfFl */. cExp.Einfo = 0; /* reset all flags */C cExp.notPureBool = savCEinfo.s21._lclAdr; /* same field */) { I bool pvNrFl = initialType->pvNr; /* PseudoVoid/NeverReturns */c2 cExp.type = advInTypeChain(initialType);( if (resulType != NoResulTyp) {L if (cExp.type!=NULL && (resulType==NULL || resulType->typeSort==; cExp.type->typeSort || IsTypeSort(cExp.type, Flt))) {a FreeExpType(cExp);% cExp.type = resulType;}* else FreeExpType1(resulType);}, cExp.topOper = (cExp.type != NULL): ? (cExp.type->typeSort == Void)N ? (nxtStmtRchbl = (pvNrFl)? NonRchbl_Jmp : Rchbl, VFCTC | PRIMARY)' : (pvNrFl)E0 ? VFCTC | PRIMARY/ : FCTC | PRIMARYU. : VFCTC | PRIMARY;}J (void)Found(RPAR); /* here for good error position (also for good& management of 'usrLvlParFl'). */ cExp.ptrId = finalPtrId; cExp.FctCallSeen = True;J lastCalledFct = slExp.ptrId; /* for 'NotPureSideEffect1' error */! allocType = locAllocType;o, sizeofOpndType = saveSizeofOpndType; break;}p" case LSBR: { /* indexation */ TresulExp slExp; TpcTypeElt lType;  size_t ptdSize;  bool savAO = apsndOpnd;  apsndOpnd = False;" if (initialType != NULL) {( if (! IsPtrArr(initialType)) { paramTxt = "[]";2 errExp(IlgLftType, initialType, NULL); ptdSize = 0;}: else {J ptdSize = sizeOfTypeI(initialType, True, (IsArr(initialType))?& IncplArray : IncplPtr, NULL);I if (IsPtr(initialType)) checkInit();}} /* pointer representsv4 itself; array represents its elements. */ slExp = cExp;a GetNxtTok(); commaExpr(); checkInit(); lType = slExp.type; M CheckNumCstNamed(cExp, (lType==NULL || lType->indexType==NULL)? cExp. & type : lType->indexType); cleanExprThings(); apsndOpnd = savAO;/ cExp.pseudoAttrib = slExp.pseudoAttrib;/! cExp.FctCallSeen = False;y if (lType != NULL) {- const TpcTypeElt eType = cExp.type; D Tqualif qual = NoQualif; /* qualifier to be propagated */' lExp.type = lType->indexType;L if (eType != NULL) {G if (! IsTypeSort(eType, WhoEnumBool)) errWNT(BadIndexType1,e& decoratedName(&slExp), eType); else {G if (lType->indexType != NULL) { /* array with bound type & specified (without error). */G if ((slExp.ptrId==NULL || !slExp.ptrId->noErrTypInd) &&F5 !(NakedTok(cExp.topOper)==CSTNU && cExp.uVal==0 &&T& cExp.type==&intCstTypeElt)) {M if (paramTxt = NULL, !compatNumType()) errId3(BadIndexType| . Warn1|PossErr, &slExp, (lType->indexType ==- &defaultIndexTypeElt)? errTxt[Arithm] :; typeToS2NoQual(lType->indexType), typeToS1(eType));{N else if (moreIndexTypeChk && eType->paralTyp && isRepreType(, lType->indexType)) errId3((IsPtr(lType))?; UseIndexTypForPtr | Warn1 : BndShdBeOfNamedType | Warn1,l6 &slExp, (lType->indexType == &defaultIndexTypeElt)?5 errTxt[Arithm] : typeToS2NoQual(lType->indexType),i typeToS1(eType));r# else goto noErrL;rN if (!allErrFl && slExp.ptrId!=NULL) slExp.ptrId->noErrTypInd = True;I noErrL:;}}3 if (IsPtr(lType)) indirindex(&slExp);E else {? if (lType->lim + 1U > 1U) { /* array with sizeI& specified (without error). */> const TcalcS valBound = (TcalcS)lType->lim;$ if (cExp.rEvlbl) {H if ((cExp.sVal>valBound || !apsndOpnd && cExp.sVal==& valBound) && !cExp.errEvl) { TnbBuf w;c. bufLongToS(valBound, w);N errWSS(IndexValTooBig|Warn3|PossErr, longToS(cExp.sVal), w);}}nK else if (eType!=NULL && eType->typeSort < computeLstType(kind== : Param && slExp.ptrId->type!=NULL && IsArr(slExp.ptrId->- type))? True : slExp.PointedByObj;r5 cExp.FctCallSeen = slExp.FctCallSeen;t' qual = lType->qualif;}} ! FreeExpType2(eType);}t, cExp.type = advInTypeChain(lType);O if (qual!=NoQualif && cExp.type!=NULL && qual & ~cExp.type->qualif) { % /* Propagate qualifier */&6 TpTypeElt w = copyTypeEltNoOwn(cExp.type); w->qualif |= qual; cExp.type = w;}}3 else {FreeExpType(cExp); cExp.type = NULL;}y1 cExp.lEvlbl = slExp.lEvlbl & cExp.rEvlbl;{A if (cExp.lEvlbl && !cExp.errEvl) cExp.pVal = slExp.pVal +k& cExp.sVal*(TcalcS)ptdSize;% cExp.oldUsed = slExp.oldUsed;y cExp.hist = slExp.hist; 5 if (! slExp.PointingOnObj) PushHist(H_ARRAY);)! cExp.ptrId = slExp.ptrId;L+ if (! Found(RSBR)) err0(RSBrExptd); E cExp.lValFl = ! cExp.FctCallSeen; /* case "&fct().tab[0]" */( cExp.cstImpsd = False; cExp.rEvlbl = False; cExp.unsigDiff = False;# cExp.PointingOnObj = False;u& cExp.topOper = LSBR | PRIMARY;H break;} /* cExp.ptrId not reset, for example to be able to take4 notice of possible initialization of array. */ default: return;}} } 4static void resulIncOp(TkInc oper, TmacParCtr ctrMP){s TpcTypeElt eType;e paramTxt = txtIncTok[oper]; ; manageUsedForIncOp(); /* here because of 'usrLvlParFl' */eF if (ctrMP == lastPrimMacParCtr) err1(SideEffInMacPar|Warn3|PossErr);$ if ((eType = cExp.type) != NULL) {L if (! cExp.lValFl) {errWSS(NotLVal, paramTxt, NULL); cExp.ptrId = NULL;} else {O if (IsPtr(eType)) (void)sizeOfTypeI(eType, True, UndefPtdSize, paramTxt)&~DCC.BCKE"[DCC_DISTRIB.SRC]DCEXP.C;329T|; N else if (! IsTypeSort(eType, NumEnum)) errExp(IlgOpndType, eType, NULL);5 if (eType->qualif & ConstQal) errCompoOf(True);d7 else if (cExp.PointedByObj) modifPtdVal(WillM);}} cExp.lValFl = False;}x%static void specialCaseOp(TkAdd oper)=D/* If 'AddSubAsgn': does not change either cExp.ptrId or lExp.ptrId,J else if 'pointer +/- nb' sets cExp.ptrId to lExp.ptrId (done in fact by resulExp() ),# else sets cExp.ptrId to NULL. */ { 8 const TpcTypeElt lType = lExp.type, eType = cExp.type;( const TtypeSort tsl = lType->typeSort;' if (tsl==Enum /* enum +/- distance */a: || tsl & NumEnum && lType->rootTyp && lExp.rEvlbl &&; cExp.rEvlbl /* so that "(RootType)3 + 1" OK */) { ) /* Heterogeneous operands possible */  if (eType != NULL) {N if (!eType->paralTyp && (eType->typeSort & (Int | UInt) || cExp.cstImpsd; && eType->typeSort & (Byte|Short) /* cf '?:' */)) {(N if (eType->sysTpdf && !cExp.rEvlbl && chkPortbl) errWSTT(NonPortOpnd |& CWarn2, paramTxt, eType, lType);! if (oper != AddSubAsgn) {uN FreeExpType2(eType); /* in order to get left operand result type */ cExp.type = lType; cExp.ptrId = NULL;J lExp.macLvl = cExp.macLvl; /* to prevent additional warnings */L resulExp(NumEnum, False, (oper == Add)? &computeAdd : &computeSub, cExp.macLvl, ADDOP);}b goto exitL;}}} else if (IsPtrArrSort(tsl)) {o size_t ptdSize;e {f TsemanElt *w = cExp.ptrId; cExp.ptrId = lExp.ptrId;A ptdSize = sizeOfTypeI(lType, True, UndefPtdSize, paramTxt);e cExp.ptrId = w;} if (eType != NULL) {& if (oper==Sub && IsPtr(eType)) {O if (!CompatType(lType, eType, NoCheck) || !CompatType(lType->indexType,NF eType->indexType, VerifCast)) errWSTT(warnOrErr(DiffIncptblPtr|& PossErr), NULL, lType, eType);H else if (lExp.lclAdr!=cExp.lclAdr && (loopLvl==0 || loopLvl>0 &&E condStmtLvl==initialLoopCondLvl || lExp.PointingOnObj && cExp.N4 PointingOnObj)) err0(MnlsPtrDiff|Warn3|PossErr); FreeExpType2(eType); if (! ptrdiffSeen) { TsemanElt *ptrId;)L if ((ptrId = searchSymTabHC(PtrdiffTName, PtrdiffTHCode))==NULL || ptrId->type==NULL) {r# if (! stddefNotInFl) { 5 err0(StddefNotIncl|Warn2|Rdbl|PossErr);m% stddefNotInFl = True;}}l else { ptrdiffSeen = True,e1 ptrdiffTypeElt = *ptrId->namedType;}})$ cExp.type = &ptrdiffTypeElt; if (cExp.rEvlbl) {K if (ptdSize!=0 && !cExp.errEvl) cExp.sVal = (TcalcS)((lExp.pVal -r& cExp.pVal)/(ptrdiff_t)ptdSize);K ((ModifType)(cExp.type = copyTypeEltNoOwn(cExp.type)))->generic =  True;}r# cExp.PointingOnObj = False;  goto freeLTypeL;} L if (! IsTypeSort(eType, WhoEnumBool)) errExp(IlgRhtType, eType, NULL); else { TsemanElt *ptrLId;B lExp.type = (lType->indexType != NULL)? lType->indexType : &defaultIndexTypeElt; D if (((ptrLId = lExp.ptrId)==NULL || !ptrLId->noErrTypInd) &&@ !(NakedTok(cExp.topOper)==CSTNU && cExp.uVal<=1 && cExp.type== &intCstTypeElt)) { ) Tstring savParamTxt = paramTxt;;K if (paramTxt = NULL, !compatNumType()) errId3(BadIndexType|Warn1|> PossErr, &lExp, (lExp.type == &defaultIndexTypeElt)? errTxt[; Arithm] : typeToS2NoQual(lExp.type), typeToS1(eType));cK else if (moreIndexTypeChk && eType->paralTyp && isRepreType(lExp.)> type)) errId3(UseIndexTypForPtr | Warn1, &lExp, (lExp.type@ == &defaultIndexTypeElt)? errTxt[Arithm] : typeToS2NoQual(& lExp.type), typeToS1(eType)); else goto noErrL;eD if (!allErrFl && ptrLId!=NULL) ptrLId->noErrTypInd = True;noErrL:a$ paramTxt = savParamTxt;}}} if (oper != AddSubAsgn) {c( if (cExp.rEvlbl && !cExp.errEvl) {J cExp.pVal = (oper == Add)? lExp.pVal + cExp.sVal*(TcalcS)ptdSize :- lExp.pVal - cExp.sVal*(TcalcS)ptdSize;} ; FreeExpType(cExp); /* because of possible errExp() */ * if (tsl == Array) { /* "tab + i" */> errWSTT(IlgLftType|Warn1|Rdbl, paramTxt, lType, NULL);& /* not string constant */L ((ModifType)(cExp.type = copyTypeEltNoOwn(lType)))->typeSort = Ptr;} else cExp.type = lType;  cExp.hist = lExp.hist;}e cExp.lclAdr = lExp.lclAdr;* cExp.pseudoAttrib = lExp.pseudoAttrib; goto exitL;}! if (oper==Add && eType!=NULL && I (!lType->paralTyp && (eType->typeSort==Enum && (tsl & Int || lExp.a4 cstImpsd && tsl & (Byte|Short) /* cf '?:' */))P || (IsPtr(eType) || IsArr(eType) && eType->generic) && IsWhoEnumNotChar(B lType))) errExp(TryPermut|Warn2|Rdbl, lType, typeToS2(eType));. else if (oper == AddSubAsgn) errAsgn = True;K else errWrngType(NumEnum | PtrPoss); /* 'PtrPoss' because Array<=>Ptr */* freeLTypeL:  cExp.lclAdr = False;C if (oper != AddSubAsgn) {FreeExpType2(lType); cExp.ptrId = NULL;}rexitL:8 cExp.cstImpsd = False; /* well-defined type anyway */ cExp.unsigDiff = False; }pP/******************************************************************************/P/* UTILITIES */P/******************************************************************************/.static TpcTypeElt advInTypeChain(TpcTypeElt x){ $ TpcTypeElt nxtType = NxtTypElt(x); if (x->noOwner) {WJ if (nxtType!=NULL && !nxtType->shared && !x->stopFreeing) ((ModifType); nxtType)->noOwner = True; /* propagate attribute */E (void)freeTypeElt(x);} return nxtType; } =static AllocXElt(allocNotInitVarElt, TnotInitVar *, ctrNI, ;)N+static TpcTypeElt arrToPtr(TpcTypeElt type) { ! if (! IsArr(type)) return type;  { - TpTypeElt nType = copyTypeEltNoOwn(type);t nType->typeSort = Ptr; nType->size = PtrSiz;= nType->generic = False;|% nType->nextTE = NxtTypElt(nType);, nType->paralTyp = False;J if (nType->qualif&ConstQal && nType->nextTE!=NULL && !(nType->nextTE->; qualif & ConstQal)) { /* propagate 'const' qualifier */ ; TpTypeElt nNxtType = copyTypeEltNoOwn(nType->nextTE);S# nNxtType->qualif |= ConstQal; nType->nextTE = nNxtType;O" nType->stopFreeing = False;} return nType;}}yLstatic bool authzdType(TpcTypeElt type, TtypeSort msk, bool *pErrFl, Terr x){t TtypeSort msk1, ts; 6 if (type==NULL || (((ts = type->typeSort) < DelType) ? tsn@ : (ts==Ptr || ts==Array && type->generic)" ? PtrPoss, : (IsStrunSort(ts))& ? StrunPossJ : Void) & msk) return True; /* type authorized by dcc. */P msk1 = (msk & WhoEnumBool)? WhoEnumBool : Void; /* 'real' C integral types */* if (msk & (Flt | BoolOpnd)) msk1 |= Flt;P errWSTT(x | (((IsPtrArrSort(ts))? msk&(PtrPoss | BoolOpnd) : ts&msk1)? Warn2 :4 (*pErrFl = True, Err)), paramTxt, type, NULL); return False;r}T3static void checkIncldFiles(const TsemanElt *ptrId) { J if (!headerFile && ptrId->declaringFile!=nonFileName && !ptrId->defnd &&E (!ReallyInsideMacro || curMacDFName()==curFileName) && chkInclPos &&oD !isBodyHdrFile(ptrId->declaringFile) && addLvl0InclFName(ptrId->I declaringFile)) errWNSS(BadlyIncldHdrFile|Warn1|Rdbl, ptrId->nameb, = ptrId->declaringFile, NULL); /* message only once for eache file. */ } 'static void checkInfoLoss(TpcTypeElt x)rN/* Check for loss of information (constant expression too big for 'x' type) */{  if (! cExp.errEvl) { TtypeSort ts = x->typeSort;a if (ts == Bool) ts = UInt;1 else if (ts == Enum) ts = (x->tagId == NULL)? #if SignedChar Byte#elset UBytey#endif : Int; /* 'real' enum */ - if (computeCstType(cExp.sVal, ts) > ts) {r errOvfl(x);sN /* Truncate value (making no assumption as to internal representation of numbers). */;( if (ts & UnsigWho) ts &= UnsigWho;2 switch (ts) { /* *doIt* float/crossCompil */; case Int: cExp.sVal = (TcalcS)(int)cExp.sVal; break; < case UInt: cExp.uVal = (TcalcU)(uint)cExp.uVal; break;> case Short: cExp.sVal = (TcalcS)(short)cExp.sVal; break;H case UShort: cExp.uVal = (TcalcU)(unsigned short)cExp.uVal; break;< case Byte: cExp.sVal = (TcalcS)(char)cExp.sVal; break;> case UByte: cExp.uVal = (TcalcU)(ubyte)cExp.uVal; break; /*~ NoDefault */}}}s}yvoid checkInit(void){  register TsemanElt *ptrId;2 if ((ptrId = cExp.ptrId)!=NULL && evaluateFl) { ptrId->MsngConstQM = False; N if (!ptrId->initlz && ptrId->kind==Obj && (ptrId->attribb>=Auto || ptrId->4 attribb==StatiL) && !cExp.PointingOnObj) {N if (loopLvl==0 || loopLvl>0 && condStmtLvl==initialLoopCondLvl) errInit(; ptrId, 0, NULL, initDPFl); /* must be initialized */e else {M /* Might be initialized later, so add to list to be checked at end of  loop. */ 1 register TnotInitVar *w = notInitVarList;r while (w != NULL) { ? if (ptrId == w->ptrId) return; /* already in list */a w = w->prec;}e! w = allocNotInitVarElt();' w->ptrId = ptrId;m w->lineNb = lineNb;i" w->fileName = curFileName; w->initDPFl = initDPFl; ! w->prec = notInitVarList;& notInitVarList = w;}}}}p;void checkNumCstNamed(TresulExp *pExp, TpcTypeElt sinkType)t{ P if ((pExp->type==NULL || !pExp->type->litCsta) && !CheckSink(pExp, sinkType)){ if (! chkNumCst1) return;e= err0((pExp->LitCstOutsMac)? NumCstShdBeNamed|Warn1|Rdbl : & NumCstShdBeNamed1|Warn1|Rdbl);} pExp->litCst = False;C pExp->LitCstOutsMac = False;}estatic void checkPureBool(void) {fH if (lExp.type!=NULL && lExp.type->typeSort==Bool || cExp.type!=NULL &&& cExp.type->typeSort==Bool) {) warnNotPureBool(&lExp, errTxt[Left]);;+ warnNotPureBool(&cExp, errTxt[Right]);} } void checkSideEffect(void)=/* Done that way so that warns even if bad expression type */ { % const TpcTypeElt eType = cExp.type;i CheckNumCstNamed(cExp, eType); if (! IsSideEffect(cExp)) {b) if (NakedTok(cExp.topOper) == FCTC) { ! cExp.ptrId = lastCalledFct;lE errWN(NotPureSideEffect1|Warn2|PossErr, decoratedName(&cExp));} else {C if (eType!=NULL && eType->typeSort!=Void) err0((IsFct(eType))  ? MsngFctParen|Warn3|PossErr ' : NotPureSideEffect|Warn2|PossErr);}  cExp.ptrId = NULL;}P else {P if (NakedTok(cExp.topOper) == VFCTC) cExp.ptrId = NULL;} /* for ~PseudoVoid& functions with ~ResultType. */? valueNotUsed(); /* for example, so that "a++;" => NotUsed */  FreeExpType1(eType);}ovoid cleanExprThings(void)R/* cleanExprThings (or managePointers) should be called at end of each expression, be it correct or not. */ { * if (preLastCastType != NULL) freePrev();% if (allocType != NULL) freeAlloc();p}=+static TpcTypeElt commonType(TtypeSort msk))O/* Returns NULL if type incompatibility between lExp.type, cExp.type and 'msk';L else resulting type. I If changes made here, change also 'compatType()' (in file dcdecl.c) */,{s2 TpcTypeElt lType = lExp.type, rType = cExp.type;. TtypeSort tsl = lType->typeSort, tsr, resTS;" bool rhtHghrParal, retRepreType; convToUnsgnd = NoErrMsg;, if (lType==rType && tsl&msk) return lType; tsr = rType->typeSort; resTS = tsl & tsr & msk;& rhtHghrParal = retRepreType = False; {  TpcTypeElt lTyp1, rTyp1; if (lType->paralTyp) {$ lTyp1 = lType; rTyp1 = rType;} else {6 if (! rType->paralTyp) /* none parallel type */- if (rType->sysTpdf) goto rHiMayBeOkL;o else goto mayBeOkL;l$ lTyp1 = rType; rTyp1 = lType;}= if (! rTyp1->paralTyp) { /* only one is parallel type */ - /* Is it visible from the other one? */p do {P if (lTyp1->rootTyp && heedRootType) goto tstBoolViaInsertBool; /* no */$ lTyp1 = lTyp1->typeId->type; } while (lTyp1->paralTyp);0 /* Is one typeSort subset of the other? */% if (resTS == Void) { /* no */y if (rTyp1->generic) {u9 if (lType->generic) {if (tsr & Flt) tsl = tsr;} * else {if (tsl & Flt) tsr = tsl;} goto mayBeOkL;}k retRepreType = True; goto rHiMayBeOkL;} if (lType->paralTyp) {* if (rTyp1->generic) goto mayBeOkL; goto rHiMayBeOkL;}* if (! rTyp1->generic) goto mayBeOkL; goto rHiMayBeOkL;}I /* Both parallel type: find if one is higher and, if so, which one */ K if (lTyp1->typeId == rTyp1->typeId) goto mayBeOkL; /* 'typeId' checkedaB (and not lTyp1 == rTyp1) because of possible qualifiers. */ /* Row up hierarchy */. while (!rTyp1->rootTyp || !heedRootType) {" rTyp1 = rTyp1->typeId->type;# if (! rTyp1->paralTyp) break;uJ if (rTyp1->typeId == lTyp1->typeId) { /* lType higher than rType */- if (lType->generic) goto rHiMayBeOkL;r goto mayBeOkL;}}. while (!lTyp1->rootTyp || !heedRootType) {" lTyp1 = lTyp1->typeId->type;# if (! lTyp1->paralTyp) break; J if (lTyp1->typeId == rType->typeId) { /* rType higher than lType *// if (! rType->generic) goto rHiMayBeOkL;  goto mayBeOkL;}} /* no higher type */tstBoolViaInsertBool: J if (!(resTS & Bool) || tsl==Bool && tsr==Bool) return NULL; /* if not4 case "'bool' inserted" (via insertBool() ). */ goto mayBeOkL; rHiMayBeOkL: rhtHghrParal = True; mayBeOkL: ;}K if (!(resTS & Enum) || lType->tagId!=rType->tagId) { /* not enums or notT same enums. */D /* First, take care of 'bool' case (beware of 'insertBool()') */ resTS &= Bool; msk &= Num;-3 if ((tsl &= msk)==Void || (tsr &= msk)==Void) { & if (resTS == Void) return NULL;} else {7 /* Mixing variable and constant (expression) ? */0 if (cExp.rEvlbl) { if (lExp.rEvlbl) {K /* Parallel type constant op generic constant => parallel type */ " if (! lType->paralTyp) {7 if (rType->paralTyp) goto computeRepreTslL;t goto noChangeL;}}>O else if (!cExp.cstImpsd /* not "multi-typed" constant */ || tsl>=tsr /*nB then, computation of real typeSort useless*/) goto noChangeL;I tsr = computeCstType(cExp.sVal, (tsr>Int && tsr>tsl)? tsr : tsl);eM if (tsr>tsl && computeLstType(cExp.sVal)<=tsl) cExp.cstImpsd = False;f& /* case "short s = 32767u;" */ noChangeL:;}7 else if (lExp.rEvlbl && lExp.cstImpsd && tsrInt && tsl>tsr)? tsl : tsr);=N if (tsl>tsr && computeLstType(lExp.sVal)<=tsr) lExp.cstImpsd = False;}= /* 'Usual arithmetic conversions': find greater type */E {TN TtypeSort gtTS = (tsl == tsr)? (cExp.cstImpsd &= lExp.cstImpsd, tsl) :M (tsl > tsr)? (cExp.cstImpsd = lExp.cstImpsd, tsl) :p tsr;#if NO_GREATER_INTA if (gtTS==Long && (tsl==UInt || tsr==UInt)) gtTS = ULong;"#endif if (gtTS & UnsigWho) {O if (!(lType->typeSort & UnsigWho) && !(lExp.rEvlbl && (lExp.errEvl || - lExp.sVal>=0))) convToUnsgnd = Left;pN if (!(rType->typeSort & UnsigWho) && !(lType->typeSort & Enum) && !(I cExp.rEvlbl && (cExp.errEvl || cExp.sVal>=0))) convToUnsgnd = Right;}  resTS |= gtTS;}}}L if (!rhtHghrParal && resTS==lType->typeSort && (!lType->generic || rType-> generic)) return lType;oL if (!retRepreType && resTS==rType->typeSort && (!rType->generic || lType-> generic)) return rType;dC /* Parallel type op generic => original parallel type (because of  insertBool()). */VM if (rType->generic && (lType->paralTyp || lType->sysTpdf) && resTS==lType->vB typeId->namedType->typeSort) return lType->typeId->namedType;M if (lType->generic && (rType->paralTyp || rType->sysTpdf) && resTS==rType->TB typeId->namedType->typeSort) return rType->typeId->namedType;- { /* New type element needed for result */ 7 TpTypeElt newElt = allocTypeEltID(resTS, NoQualif);* newElt->noOwner = True;gH newElt->size = (resTS & lType->typeSort)? lType->size : rType->size;8 newElt->tagId = lType->tagId; /* == rType->tagId */A if (lType->generic && rType->generic) newElt->generic = True;l return newElt;}p} static bool compatNumType(void) {p; TpcTypeElt resType, lType = lExp.type, eType = cExp.type; bool resul;n5 lExp.cstImpsd = cExp.cstImpsd; lExp.rEvlbl = False;v= if ((resType = commonType(mskCmpat)) == NULL) return False;s resul = True;eK if (lType->sysTpdf!=eType->sysTpdf && lType->typeSort>=eType->typeSort &&t4 !cExp.rEvlbl && paramTxt!=NULL && chkPortbl &&B (lType->sysTpdf && InsideInterval(eType->typeSort, Long, Num) ||B eType->sysTpdf && !InsideInterval(lType->typeSort, Long, Num))): errWSTT(NonPortCmbn | CWarn1, paramTxt, lType, eType);P else if (resType!=lType && (!((resType->typeSort & lType->typeSort) || lType->I typeSort==Float && resType->typeSort==Double) || lType->paralTyp)) {m( if (paramTxt == NULL) resul = False;M else if (cExp.cstImpsd && !(IsTypeSort(resType, Flt) && IsTypeSort(lType,  Who) #if NO_GREATER_INT2 || lType->typeSort==Long && cExp.uVal<=INT_MAX#endif& )) errOvfl1(lType, paramTxt);( else if (convToUnsgnd != NoErrMsg) {K if (! (cExp.rEvlbl && (cExp.errEvl || cExp.sVal>=0 && computeLstType(z@ cExp.sVal)<=lType->typeSort))) errWSTT((convToUnsgnd == Left)?: PossOvfl|Warn2|PossErr : ConvToUnsig1|Warn2|PossErr,& paramTxt, lType, eType);} else resul = False;}O else if (convToUnsgnd!=NoErrMsg && paramTxt!=NULL) errWSTT(ConvToUnsig1|Warn2r- |PossErr, paramTxt, lType, eType);.> if (resType!=lType && resType!=eType) FreeExpType2(resType); return resul;o}n<static TtypeSort computeCstType(TcalcS value, TtypeSort msk)L/* Returns the smallest type (compatible with 'msk') in which 'value' can be represented. */{mN TtypeSort resTS = (InsideInterval(msk, Float, Flt))? Float : computeLstType(- value); /* *doIt* for floating types */r" if (resTS == Bool) resTS = Byte;3 msk = (msk & (SigAri | Enum))? SigAri : UnsigWho;) return (resTS & msk) ? resTSr# : (msk == UnsigWho)  ? resTS << 1#if USHRT_MAXC == UINT_MAXCt : (resTS == UShort)@ ? Long /* because 40000=>UShort=>Long (not Int), if 'int'4 is defined to be equivalent to 'short'. */#elif NO_GREATER_INT : (resTS == UInt)r ? ULong;#endif : resTS << 1;x}y-static TtypeSort computeLstType(TcalcS value) :/* Gives back first type large enough for value 'value' */{  /* *doIt* float */& if ((TcalcU)value <= 1) return Bool;M if ((TcalcU)(value - SCHAR_MINC) <= (TcalcU)(SCHAR_MAXC-SCHAR_MINC)) return Byte; 0 if ((TcalcU)value <= UCHAR_MAXC) return UByte;L if ((TcalcU)(value - SHRT_MINC) <= (TcalcU)(SHRT_MAXC - SHRT_MINC)) return Short; 1 if ((TcalcU)value <= USHRT_MAXC) return UShort;=#if NO_GREATER_INT return Int;C#elselI if ((TcalcU)(value - INT_MINC) <= (TcalcU)((TcalcS)INT_MAXC - INT_MINC)t ) return Int;. if ((TcalcU)value <= UINT_MAXC) return UInt;# ifndef LONGLONG return Long;# elseL if ((TcalcU)(value - LONG_MINC) <= (TcalcU)((TcalcS)LONG_MAXC - LONG_MINC) ) return Long;0 if ((TcalcU)value <= ULONG_MAXC) return ULong; return LLong;r# endif#endif}l4bool computeSigAdd(TcalcS x, TcalcS y, TcalcS *pRes){t register TcalcS w = x + y; *pRes = w;3 return ! (x>0 && y>0 && w<0 || x<0 && y<0 && w>=0(#if LONG_MINC + LONG_MAXC == 0 || w-y!=x;#endif );}T>static TpTypeElt copyTypeEltNoOwn(TpcTypeElt x /*~MayModify*/){r& if (x->noOwner) return (ModifType)x; { 0 TpTypeElt res = allocTypeEltIC(x, NoQualif); res->noOwner = True; return res;}};%static void errCompoOf(bool notStrun)f{s Tmember w = isMember();fM Tstring compoOf = (w == NotMember)? NULL : errTxt[(w > NotMember)? ComponOfm : ComposOf]; bool dotPopd = False;tN if ((cExp.hist & MskHistElt) == H_DOT) {dotPopd = True; PopHist(cExp.hist);}J errId3((notStrun)? NotModfbl : ConstStrun, &cExp, (notStrun)? paramTxt :& typeToS1(cExp.type), compoOf); if (dotPopd) PushHist(H_DOT);o}e5static void errExp(Terr x, TpcTypeElt t, Tstring str)e{a0 errWSSSS(x, paramTxt, typeToS1(t), str, NULL); FreeExpType(cExp); cExp.type = NULL;)} $static void errOvfl(TpcTypeElt type){s errOvfl1(type, paramTxt); }I0static void errOvfl1(TpcTypeElt type, Tstring x){d if (! cExp.errEvl) {M errWSTT(((type->typeSort & SigWhoEnum) != Void)? Overflow|Warn2|PossErr :m- Overflow2|Warn2|PossErr, x, type, NULL);* cExp.errEvl = True;}}dstatic void errUdfl(void)S{s if (! cExp.errEvl) {" err1(Underflow|Warn2|PossErr); cExp.errEvl = True;w cExp.sVal = 0;}a}/6static bool errWrngType(TtypeSort msk) /*~PseudoVoid*/O/* Returns True if 'real' error (that is, error for "regular C") or either type 8 is NULL (type error occurred earlier), else False. */{*8 const TpcTypeElt lType = lExp.type, eType = cExp.type;% bool resul = False, errMsg = False;lJ if (! authzdType(lType, msk, &resul, IlgLftType|PossErr)) errMsg = True;J if (! authzdType(eType, msk, &resul, IlgRhtType|PossErr)) errMsg = True;/ if (eType==NULL || lType==NULL) resul = True;u< if (!errMsg && !resul && (chkBool || !(msk & BoolOpnd))) {O Terr n = warnOrErr((compatType(lType, eType, IlgIcp))? IlgTypes | PossErr :, IncptblTypes | PossErr);r+ if ((n & WarnMsk) == Err) resul = True;tN errWSSSS(n, paramTxt, typeToS1(lType), typeToS2(eType), (!resul && lType->; paralTyp && eType->paralTyp)? errTxt[UseTC] : NULL);}cA errExp(NoErrMsg, NULL, NULL); /* cExp.type can be freed now */l return resul; }(static void freeAlloc(void)-{x7 if (allocType != XAllocSeen) FreeExpType2(allocType);  allocType = NULL;q}iBstatic bool frstMemberCompat(TpcTypeElt type, TtypeSort castTSort){ const TdeclElt *member;oF if ((member = BaseStrunType(type)->memberList) == NULL) return True; do {K if (member->type==NULL || member->type->typeSort==castTSort || IsStrun(,I member->type) && frstMemberCompat(member->type, castTSort)) return True;(B } while (type->typeSort==Union && (member = member->cdr)!=NULL); return False; }(static void freePrev(void){e FreeExpType2(preLastCastType); preLastCastType = NULL; } %static bool ignorableDP(TmacParCtr x) { B bool resul = ReallyInsideMacro && !InsideMacPar && macParCtr!=x; GetNxtTok(); return resul; }ystatic void indir(void)h{u TpcTypeElt eType = cExp.type;r if (eType != NULL) {= if (! (IsPtr(eType) || IsArr(eType) && eType->generic)) {P> errExp(((paramTxt[0] == '-')? IlgLftType : IlgRhtType) |; ((IsArr(eType))? Warn1|Rdbl : Err), eType, NULL);F goto noCheckInit;}P lExp.type = eType->indexType; /* for possible '&' operator applied on *x */' cExp.type = advInTypeChain(eType);}( checkInit(); noCheckInit: cExp.lEvlbl = cExp.rEvlbl; cExp.cstImpsd = False; cExp.unsigDiff = False;  cExp.lValFl = True;> cExp.FctCallSeen = False;S indirindex(&cExp);, if (! cExp.PointingOnObj) PushHist(H_PTR);" else cExp.PointingOnObj = False;}c9static void indirindex(const TresulExp *x /*~MayModify*/)p{t3 cExp.pseudoAttrib = (x->pseudoAttrib == NoAttrib)e ? NoAttribo : (x->lclAdr) ? Autop : Stati;  cExp.rEvlbl = False; cExp.lclAdr = False;F if (x->PointingOnObj) {if (x->ptrId != NULL) x->ptrId->used = True;} else cExp.PointedByObj = True;} void initExp(void){ # ptrdiffSeen = sizeofSeen = False;o}t.static void insertBool(TtypeSort rExpTypeSort){ if (cExp.type != NULL) {M if (lExp.type==NULL || lExp.type->typeSort!=Bool || rExpTypeSort!=Bool) { . cExp.type = copyTypeEltNoOwn(cExp.type);/ ((ModifType)cExp.type)->typeSort |= Bool;a@ if (!cExp.rEvlbl || cExp.uVal>1) cExp.notPureBool = True;}7 else if (lExp.notPureBool) cExp.notPureBool = True;a1 if (lExp.inhibWaNPB) cExp.inhibWaNPB = True;}a}static Tmember isMember(void)cH/* Returns positive non-nul if cExp describes a strun member (Member, orM SingleMember if only member of struct, or member of union with no composedV member). */{*? if (cExp.ptrId==NULL || cExp.PointingOnObj) return NotMember;e {t$ TpcTypeElt w = cExp.ptrId->type;! Thistory history = cExp.hist;- if (history != H_EMPTY) {pA /* Explore history searching a 'dot' (access to a strun) */>O while ((history & (MskHistElt << (sizeof(history)*CHAR_BIT - SizeHistElt)o- )) == H_EMPTY) history <<= SizeHistElt;IH while (history & ((H_PTR & H_ARRAY) << (sizeof(history)*CHAR_BIT -I SizeHistElt)) && w!=NULL) {w = NxtTypElt(w); history <<= SizeHistElt;}} ) if (cExp.type == w) return NotMember;eL if (history >> (sizeof(history)*CHAR_BIT - SizeHistElt) != H_DOT) return Composite; {r const TdeclElt *w1;M if (w==NULL || (w1 = w->memberList)==NULL || w->typeSort==Struc && w1->p& cdr!=NULL) return Member; do {< if (w1->type!=NULL && IsCmpsdObj(w1)) return Member;) } while ((w1 = w1->cdr) != NULL);}}i return SingleMember;}dstatic bool isType(void){xF return IsDecl1(BDecl) || curTok.tok==IDENT && curTok.ptrSem!=NULL &&& curTok.ptrSem->kind==Type;} 2static bool manageInitlzUsed(void) /*~PseudoVoid*/@/* Answers True if current object has to be marked 'not used' */{R bool resul = False;= register TsemanElt *rPtrId; E if (!cExp.PointedByObj && (rPtrId = cExp.ptrId)!=NULL && !zifExp) {L7 if (rPtrId->initBefUsd && rPtrId->attribb!=Extrn) { F if (!cExp.oldUsed || !rPtrId->defnd /* because of ~NotUsed */) {3 errWN(UslInitBU|Warn1|Rdbl, rPtrId->nameb);E rPtrId->initBefUsd = False;}} /* to prevent further error */f; if (rPtrId->attribb>=Auto || rPtrId->attribb==StatiL) {.L if (!rPtrId->used && rPtrId->initlz && condStmtLvl==0 && (rPtrId->typeI ==NULL || !(IsArr(rPtrId->type) || IsStrun(rPtrId->type) && isMember()lI ==Member))) errWNSS(UnusedVar1|Warn1|PossErr, rPtrId->nameb, NULL, ; (rPtrId->MsngConstQM)? errTxt[MsngConstQ] : NULL);05 resul = (loopLvl==0 && rPtrId->attribb>=Auto);}: rPtrId->initlz = True;}E return resul;p}dFstatic void manageLogOper(void (*pf)(void), Ttok x, bool y, Tstring z){U- TresulExp slExp; /* left operand saving */h TmacLvl operMacLvl = macLvl; bool savEvalFl = evaluateFl;, if (cExp.ValMltplDef) cExp.rEvlbl = False; slExp = cExp;h? if (slExp.rEvlbl && (slExp.uVal != 0)==y) evaluateFl = False;e condStmtLvl++; GetNxtTok(); (*pf)();, if (cExp.ValMltplDef) cExp.rEvlbl = False; evaluateFl = savEvalFl;T /* Short-circuit evaluation */ if (slExp.rEvlbl)m: if ((slExp.uVal != 0) == y) transfOpnd(&slExp, &cExp);: else {if (! cExp.rEvlbl) warnCstBool(errTxt[SubPre]);} else if (cExp.rEvlbl) 9 if ((cExp.uVal != 0) == y) transfOpnd(&cExp, &slExp);,% else warnCstBool(errTxt[SubPre]);T checkInit();J cExp.ptrId = NULL; /* to prevent 2nd call to checkInit (in resulExp) */ condStmtLvl--; lExp = slExp;s paramTxt = z;rH if (! resulExp(mskBool, False, &computeShortCircuit, operMacLvl, x)) {$ /* Pointer(s) used as boolean */ errWrngType(mskBool);T FreeExpType(slExp);  cExp.topOper = x;{ cExp.ptrId = NULL;}y relOpTrtmt(); }e/static void managePointers(TpcTypeElt sinkType)tE/* managePointers()/cleanExprThings() should be called at end of eacht' expression, be it correct or not. */={y {, register TsemanElt *rPtrId = cExp.ptrId; bool flg = False;  if (rPtrId != NULL) {e4 /* Mark possible pointed object initialized */3 if (cExp.type!=NULL && IsPtrArr(cExp.type)) { I switch (tstPtd((sinkType == NULL)? cExp.type : sinkType, True)) {  case ALLCONST:E if (cExp.PointingOnObj) { /* pointer produced via '&' */T" rPtrId->used = True;N if (paramTxt == txtAsgnTok[SimplAsgn]) rPtrId->forceUsed = True;3 /* if assignment to pointer, cannot trace usagee- of pointed object's value any more. */(J if (paramTxt!=txtAsgnTok[SimplAsgn] || cExp.PointingOnObj &&- NxtTypElt(cExp.type)->qualif&ConstQal) {o> if (rPtrId->initBefUsd) rPtrId->initlz = True; else {O cExp.PointingOnObj = False; /* since receiving pointer/array ) is 'const', pointed object should be , initialized (see next checkInit() ). */% initDPFl = True;}}}! break; case NOTALLCONST: L if (cExp.PointingOnObj /* produced via '&' */ && (rPtrId->used =I True, (paramTxt[0]=='r' && cExp.lclAdr || manageInitlzUsed()))) {-N if (paramTxt == txtAsgnTok[SimplAsgn] /* assignment */) rPtrId-> forceUsed = True;pC else if (sinkType != NULL) { /* not variadic part */ P /* Pointed object supposed to be initialized/modified via recei-A ving pointer, except if 'return' and auto object; functions ? may change value; objects can be choosed to be manipulatedo only via pointers.B4 BEWARE: manageInitlzUsed causes side-effect. */) if (paramTxt[0] == '(') {e' rPtrId->used = False;u, if (!ScanfFl) flg = True;}3 else rPtrId->used = cExp.oldUsed;}} M else if (sinkType!=NULL && paramTxt[0]=='(' && cExp.hist==H_EMPTYB/ && rPtrId->type!=NULL && IsArr(rPtrId->type)9 && manageInitlzUsed()) rPtrId->used = False; /* array & represents its elements. */M if (tstPtd(sinkType, False) & NOTALLCONST && !(rPtrId==lExp.ptrIdrA && paramTxt==txtAsgnTok[SimplAsgn]) /* not case "x = x->..." */n ) modifPtdVal(MayM);l break; default:;}}yL checkInit(); /* must be here (because of earlier manageInitlzUsed) */ initDPFl = False; , if (flg) rPtrId->MsngConstQM = True;}} if (preLastCastType != NULL) {K if ((errQalTyp1 = NULL, compatType(sinkType, preLastCastType, Asgn)) &&oG errQalTyp1==NULL && sinkType!=NULL) errWSTT(PrevCastUsl|Warn1|Rdbl,s- NULL, preLastCastType, cExp.type);s freePrev();} if (allocType != NULL) {" if (allocType != XAllocSeen) {1 if (sinkType!=NULL && IsPtrArr(sinkType)) {p@ TpcTypeElt nxtType = NxtTypElt(sinkType), w = allocType;# for (;; w = NxtTypElt(w)) {(8 if (CompatType(w, nxtType, CStrictChk)) break; if (! IsArr(w)) {tL if (nxtType->typeSort != Void) errWSTT(WrngSizeof|Warn3|PossErr, NULL, w, nxtType);l '~DCC.BCKE"[DCC_DISTRIB.SRC]DCEXP.C;329T& break;}}}} freeAlloc();} }t'void manageRetValue(TpcTypeElt retType),{l TpcTypeElt eType;   commaExpr();? paramTxt = "return"; /* paramTxt used in managePointers() */)" CheckNumCstNamed(cExp, retType); managePointers(retType);$ if ((eType = cExp.type) != NULL) { errQalTyp1 = NULL;B if (!CompatType(retType, eType, Asgn) && (lExp.type = retType, !compatNumType())) {WF errWSTT(warnOrErr(BadRetType | PossErr), NULL, retType, eType);} else {L if (errQalTyp1 != NULL) errWSTTS(ConstQalNotHeeded1|ConstWarn|PossErr,? paramTxt, errQalTyp1, errQalTyp2, (errQalTyp1 == retType) & ? NULL : errTxt[SubPre]);@ if (cExp.lclAdr && IsPtr(eType) && !Found(LOCALADR)) err0(& RetPtrOnLclAd|Warn3|PossErr);O else if (retType!=NULL && retType->typeSort==Bool) warnNotPureBool(&cExp,e; NULL);} /* for function should behave as constant. */T FreeExpType2(eType);}p}v6static bool manageTypCmbn(TkOpTC oper) /*~PseudoVoid*/{e& TpcTypeElt resulTC = searchTC(oper);8 if (resulTC == QuasiNULLval(TpcTypeElt)) return False;1 if (lExp.type->litCsta != cExp.type->litCsta) {p& CheckNumCstNamed(lExp, lExp.type);' CheckNumCstNamed(cExp, cExp.type);}y FreeExpType2(lExp.type); FreeExpType2(cExp.type);" lExp.type = cExp.type = resulTC; return True;}-$static void manageUsedForIncOp(void){T TsemanElt *rPtrId; checkInit();H if (loopLvl==0 && !cExp.PointedByObj && (rPtrId = cExp.ptrId)!=NULL &&- rPtrId->attribb>=Auto && !zifExp) {dH /* Not inside loop: mark variable 'notUsed' (=> to be used after) */ cExp.oldUsed = False;s rPtrId->used = False;} cExp.topOper = INCOP;y}=static void modifPtdVal(Terr n)u{F TsemanElt *ptrId = cExp.ptrId; if (ptrId != NULL) {" if (isMember() != NotMember) {' if (ptrId->kind != Param) return;UL if (!ptrId->MayModif && (!ptrId->Dmodfd || allErrFl) && tstPtd(ptrId->; type, False) & (ALLCONST | STRUN) && askConstFl) {tL errId2(MayModify|Warn1|Rdbl, ptrId, nameToS(curFctName), errTxt[n]);M if (n==MayM && paramTxt==txtAsgnTok[SimplAsgn] && lExp.ptrId!=NULL &&G lExp.ptrId->kind==Obj) lExp.ptrId->CheckConst = True;}} /* turn onm; receiving pointer missing 'const' qualifier check. */. ptrId->Dmodfd = True;}}evoid procSameType(void) {  TpcTypeElt lType; K lType = (isType())? declType() : (asgnExpr(), valueNotUsed(), cExp.type); & if (!Found(COMMA)) err0(CommaExptd);' if (isType()) cExp.type = declType(); " else asgnExpr(), valueNotUsed(); errQalTyp1 = NULL;M cExp.uVal = (TcalcU)(compatType(lType, cExp.type, FctCall) && errQalTyp1 ==?B NULL || (paramTxt = NULL, lExp.type = lType, compatNumType())); FreeExpType1(lType); FreeExpType(cExp); cExp.type = &boolCstTypeElt;( cExp.Einfo = 0; /* reset all flags */}nstatic void relOpTrtmt(void){r if (cExp.type != NULL) { FreeExpType2(cExp.type);? cExp.type = (cExp.rEvlbl)? &boolCstTypeElt : &boolTypeElt;}c cExp.notPureBool = False;l cExp.unsigDiff = False;* cExp.cstImpsd = False;}oLstatic bool resulExp(TtypeSort msk, bool cstOnRight, void (*ptrComputeResul)I (TpcTypeElt), TmacLvl operMacLvl, Ttok baseClass) /*~PseudoVoid*/vN/* Returns False (without freeing operand types) if lExp.type is non NULL, butN not compatible with cExp.type nor with 'msk', and there exist a "xPoss" bit in 'msk'. */ { 8 const TpcTypeElt lType = lExp.type, eType = cExp.type; TpcTypeElt resType;rJ if (lType!=NULL && eType!=NULL) resType = commonType(msk & NumEnumBool);. else if (baseClass == MULOP) resType = NULL;M else { /* if one operand type NULL, assume result type is type of other */f if (eType == NULL) {( if (lType == NULL) resType = NULL; else { cExp.type = lType;0 resType = commonType(msk & NumEnumBool); cExp.type = NULL;}}e else { lExp.type = eType;. resType = commonType(msk & NumEnumBool); lExp.type = NULL;}} M if (convToUnsgnd != NoErrMsg) errWSTTS(ConvToUnsig|Warn2|PossErr, paramTxt,C- lType, eType, errTxt[convToUnsgnd]); F if (lExp.macLvl=PtrPoss) return False;B if (errWrngType(msk) || !cExp.rEvlbl || !ifDirExp) goto exitL;M resType = &longCstTypeElt;} /* needed because of the poor coding of manyF system header files. */i if (cExp.rEvlbl) {7 if (eType==NULL || lType==NULL) cExp.errEvl = True;t4 else if (! cExp.errEvl) { /* evaluate result */" (*ptrComputeResul)(resType); checkInfoLoss(resType);}}oC else if (cstOnRight && lExp.rEvlbl && lExp.topOper&PRIMARY) err1( & CstOnLftSide|Warn1|Rdbl);exitL:, if (lType != resType) FreeExpType1(lType);N if (eType != resType) FreeExpType(cExp); /* cExp.type may have been changed& by errWrngType => != eType. */ cExp.type = resType; cExp.topOper = baseClass;( cExp.ptrId = NULL; return True;}e5static void resulUnOp(TtypeSort msk, Tstring operTxt)t{, bool err = False;r checkInit(); paramTxt = operTxt;o? if (! authzdType(cExp.type, msk, &err, IlgRhtType | PossErr))rH if (ifDirExp && !err && cExp.rEvlbl) {FreeExpType(cExp); cExp.type = &longCstTypeElt;}o& else errExp(NoErrMsg, NULL, NULL);M else if (cExp.type != NULL) { /* compute result type (in case !(Bool | x),  for example). */ TpcTypeElt resType;y lExp.type = cExp.type; lExp.Einfo = cExp.Einfo; resType = commonType(msk);H if (resType != cExp.type) {FreeExpType(cExp); cExp.type = resType;}} cExp.lValFl = False; cExp.ptrId = NULL;}rKstatic size_t sizeOfTypeI(TpcTypeElt type, bool deref, Terr err, Tstring y)&{e; TpcTypeElt tr = (deref)? NxtTypElt(type) : type, t1 = tr;E if (tr == NULL) return 0;g* if (IsStrun(tr)) tr = BaseStrunType(tr);# if (tr->size==0 && !tr->errSiz) {r( errId3(err, &cExp, typeToS1(t1), y);L if (deref && tr==&natTyp[_VOID]) ((ModifType)represType(type))->nextTE =- tr = allocTypeEltIC(tr, NoQualif);;> if (tr != &natTyp[_VOID]) ((ModifType)tr)->errSiz = True;} return tr->size;} Gstatic void transfOpnd(const TresulExp *x /*~MayModify*/, TresulExp *y)e{p TREInfo savCEinfo; savCEinfo._eInfo = y->Einfo; y->Einfo = x->Einfo; y->hist = x->hist;9 if (savCEinfo.s21._litCst && (!ifDirExp || x==&cExp)) {e y->litCst = True;-? if (savCEinfo.s21._litCstOutsMac) y->LitCstOutsMac = True;}=* y->unsigDiff = savCEinfo.s21._unsigDiff; #if PtrGtLongm y->pVal = x->pVal;#elset y->uVal = x->uVal;#endif y->ptrId = x->ptrId;) if (y->type == NULL) y->type = x->type;d}=+static Tstring typeToS2NoQual(TpcTypeElt x)e{v Tstring result;x TpTypeElt x1;t if (x == NULL) return NULL; # x1 = allocTypeEltIC(x, NoQualif);a x1->qualif = NoQualif; result = typeToS2(x1); (void)freeTypeElt(x1); return result;}static void valueNotUsed(void){n register TsemanElt *rPtrId;yK if (!cExp.PointedByObj && (rPtrId = cExp.ptrId)!=NULL && !(rPtrId->kind==yI Param && (rPtrId->type==NULL || IsArr(rPtrId->type))) && !zifExp) rPtrId:H ->used = cExp.oldUsed; /* side-effect is not use (except for externals,4 global statics, and array parameters). */ cleanExprThings();}estatic void verifCstOvfl(void){E if (lExp.rEvlbl) {" TcalcS savCexpVal = cExp.sVal;" ulong savCexpFlg = cExp.Einfo; cExp.sVal = lExp.sVal; cExp.Einfo = lExp.Einfo; checkInfoLoss(lExp.type);a cExp.sVal = savCexpVal;x cExp.Einfo = savCexpFlg;}O, if (cExp.rEvlbl) checkInfoLoss(cExp.type);} "static void warnCstBool(Tstring x){nO if (chkBool && !cstExpG && !ReallyInsideMacro) errWS(CstBoolExp | CWarn2, x);o}r4static void warnNotPureBool(TresulExp *x, Tstring y){:H if (x->notPureBool && !x->inhibWaNPB && (x->ptrId==NULL || !x->ptrId->C pureBoolAskd /* to minimize nb of warnings */)) {errWSS(Outside01|o; Warn2|PossErr, paramTxt, y); cExp.inhibWaNPB = True;}eL if (x->ptrId != NULL) x->ptrId->pureBoolAskd = True; /* limits also nb of error messages. */} static Terr warnOrErr(Terr n)>{eN return (compatType(lExp.type, cExp.type, CCheck) || lExp.type->typeSort==PtrN && IsTypeSort(cExp.type, WhoEnumBool) && cExp.rEvlbl && !cExp.errEvl &&& cExp.sVal==0)? n | Warn2 : n;} /* End DCEXP.C */r*[DCC_DISTRIB.SRC]DCEXP.H;13+,0./( 4I-"0123KPWO56@3s7Q{S89G(HJ /* DCEXP.H */(/* Y.L. Noyelle, Supelec, France 1996 */#ifndef DCEXP_H#define DCEXP_H#include "dc.th"%#define FreeExpType(x) \ FreeExpType1((x).type)&#define FreeExpType1(x) \* ((x != NULL)? FreeExpType2(x) : (void)0)&#define FreeExpType2(x) \+ ((x->noOwner)? freeTypeChain(x): (void)0)/* Function profiles */extern void asgnExpr(void);extern bool boolExp(Tstring);extern void checkInit(void);"extern void cleanExprThings(void);extern void commaExpr(void);4extern bool computeSigAdd(TcalcS, TcalcS, TcalcS *);>extern bool correctExprN(TpcTypeElt, TtypeSort, bool, Tstring, bool checkNumCst);'extern void manageRetValue(TpcTypeElt);extern void procSameType(void);/* External objects */Iextern TpcTypeElt *limErroTypes; /* to prevent multiple (same) errors in initializations. */#endif /* ifndef DCEXP_H *//* End DCEXP.H */*[DCC_DISTRIB.SRC]DCEXP.PH;10+,H./( 48J-"0123KPWO56 7 KS89G(HJ/* DCEXP.PH */(/* Y.L. Noyelle, Supelec, France 1996 */#ifndef DCEXP_PH#define DCEXP_PH#include "dc.th"!#define BoolOpnd (StrunPoss << 1)+#define CheckNumCstNamed(x,y) \& if (x.litCst) checkNumCstNamed(&x,y)#define PtrPoss DelType #define StrunPoss (PtrPoss << 1)/* Function profiles */6extern void checkNumCstNamed(TresulExp *, TpcTypeElt);"extern void checkSideEffect(void);extern void initExp(void);/* External objects */8extern TtypeSort mskBool; /* depends on option 'zbo' */#endif /* ifndef DCEXP_PH *//* End DCINST.PH */*[DCC_DISTRIB.SRC]DCEXT.C;629+,7.9/( 4P97B-"0123KPWO:56HA7S89G(HJJ /* DCEXT.C */(/* Y.L. Noyelle, Supelec, France 1994 */ #ifdef VMS2#pragma noinline (nameToS, bufLongToS, bufNameToS)/#pragma noinline (putIdent, putList, putString)#endif#include #include #include #include #include #include "dcext.h"#include "dcext.ph"2#include "dcdecl.h" /* because of FreeExpType1 */2#include "dcinst.h" /* because of FreeExpType1 */#include "dcmain.h"#include "dcprag.h"#include "dcrec.h"bool adjustFile = False;.bool allErrFl = False; /* report all errors */Pbool askConstFl = True; /* ask for 'const' qualified pointer formal parameters*/PTresulExp cExp; /* information on current expression (type, value etc) */Pbool chkBool = True; /* check boolean type (control structures, '&&', etc) */=bool chkEmptParList = False; /* check empty parameter list */Gbool chkFctRetTyp = True; /* check for named return type (functions) */>bool chkInclPos = True; /* check position of included files */Kbool chkNmdTypParFl = False; /* check that function parameters are of named type. */<bool chkNumCst = True; /* check literal integer constant */.bool chkPortbl = True; /* check portability */Ibool chkTypName = True; /* check type name for uppercase 1st character */6uint ctrBSE = 0; /* number of blocks stack elements */<uint ctrCE = 0; /* number of caseElt currently allocated */<uint ctrDE = 0; /* number of declElt currently allocated */.uint ctrDIE; /* number of descrId elements */Auint ctrMSB = 0; /* number of macro blocks currently allocated */2uint ctrNI = 0; /* number of notInitVar blocks */3uint ctrNSB = 0; /* number of nameStorage blocks */=uint ctrSE = 0; /* number of semanElt currently allocated */<uint ctrTE = 0; /* number of typeElt currently allocated */?uint ctrTLE = 0; /* number of tagListElt currently allocated */9uint ctrUEC = 0; /* number of 'universal' block chunks *//Tstring cUnitFName; /* compilation unit name */Ijmp_buf *curErrRet; /* pointer on current 'longjmp' return information */2Tname curFctName; /* current function body name */,Tstring curFileName; /* current file name */KTstring curHdrFName = NonHdrFName; /* if inside header file, current header file name. */BTmacExpnd curMacExpNb = 0; /* number of current macro expansion */TvalTok curTok;9bool dollAlwdInId; /* flag: '$' allowed in identifiers */Kconst TtypeElt *errQalTyp1, *errQalTyp2; /* non conformant (sub-)types for4 'const'/'volatile' check (cf compatType()). */>bool headerFile = False; /* flag 'processing a header file' */TmngtPriv *headListPrivTo;NTqElt6 *headQElt6 = NULL; /* head of queue of available 'universal' blocks. */Lbool ifDirExp = False; /* True if currently evaluating a '#if' expression */Ibool ignoreErr = False; /* do not output error(s) until end of statement/ declaration. */Gint indentIncr; /* < 0 => not yet initialized (1st block not yet met);& 0 => no indent checking. */Kbool insideHdrInHdr = False; /* True when inside a header file included by another header file. */ATresulExp lExp; /* information on current left sub-expression */=bool macroExpand = True; /* flag 'macro expansion enabled' */bool moreIndexTypeChk = False;1TlineNb lineNb; /* current source line number */ETnstLvl nestLvl = -1; /* +/- 1 at each block opening/closing brace */ const Tstring nonFileName = " ";0int oldSpaceCount; /* space count before a NL */Tstring paramTxt;'void (*pCurGNT)(void) = &getTokFromTxt;<bool printStat = False; /* flag to print block statistics */Dint spaceCount; /* number of spaces at beginning of current logical- line; <0 if not at beginning of line. */LTstring strpdCUnitFName; /* compilation unit name (without possible path) */Kbool sysAdjHdrFile = False; /* flag 'processing a system or adjust file' */>bool sysHdrFile = False; /* flag 'processing a system file' */.Tverbo verbose; /* flag 'more information' */!bool verifAllPtrForConst = False;Dbool warnNUI = True; /* default option: warn on unused identifier */Lbool warnNUP = True; /* default option: warn on unused function parameter */Jbool zifExp = False; /* True if currently evaluating a 'zif' expression */<#define SharInfo(xqualif, ygen, zalign, tvari1) { \7 /* TinfoType used (implicitely) here */ \5 xqualif /*~ zif (! __member(_qualif)) \; "misplaced initialization for field '_qualif'" */, \5 False /*~ zif (! __member(_paralTyp)) \B "misplaced initialization for field '_paralTyp'" */, \4 False /*~ zif (! __member(_sysTpdf)) \B "misplaced initialization for field '_sysTpdf'" */, \3 ygen /*~ zif (! __member(_generic)) \; "misplaced initialization for field '_generic'" */, \4 False /*~ zif (! __member(_noOwner)) \; "misplaced initialization for field '_noOwner'" */, \2 True /*~ zif (! __member(_shared)) \; "misplaced initialization for field '_shared'" */, \7 False /*~ zif (! __member(_noFreeDepdt)) \B "misplaced initialization for field '_noFreeDepdt'" */,\7 False /*~ zif (! __member(_stopFreeing)) \; "misplaced initialization for field '_stopFreeing'" */,\4 False /*~ zif (! __member(_rootTyp)) \; "misplaced initialization for field '_rootTyp'" */, \5 False /*~ zif (! __member(_variousT)) \; "misplaced initialization for field '_variousT'" */, \6 tvari1 /*~ zif (! __member(_variousT1)) \; "misplaced initialization for field '_variousT1'" */, \@ (Tqualif)(0-0) /*~ zif (! __member(_synthQualif)) \; "misplaced initialization for field '_synthQualif'" */,\2 zalign /*~ zif (! __member(_algn)) \; "misplaced initialization for field '_algn'" */, \H /*~ zif ! __member() "'SharInfo' not fully initialized" */ \ }9#define SharNQInfo(x) SharInfo(NoQualif, False, x, False)9#define SharNQGInfo(x) SharInfo(NoQualif, True, x, False)7#define SharCInfo(x) SharInfo(ConstQal, True, x, False).const TtypeElt natTyp[/*~IndexType int */] = {- {Void /*~ zif (! __member(typeSort)): "misplaced initialization for field 'typeSort'" */,1 SharNQInfo(Alig0) /*~ zif (! __member(infoT))7 "misplaced initialization for field 'infoT'" */,) 0 /*~ zif (! __member(size))8 "misplaced initialization for field 'size'" */}, ' {Float, SharNQInfo(Alig3), FloatSiz},) {Double, SharNQInfo(Alig3), DoubleSiz}, {Byte, SharNQInfo(Alig0), 1},' {Short, SharNQInfo(Alig1), ShortSiz},# {Int, SharNQInfo(Alig2), IntSiz},P {Long, SharNQInfo(Alig3), LongSiz} /*~ zif __index() + 1 != ENatTyp - BNatTyp4 "Array 'natTyp': incorrect organization" */,#ifdef LONGLONG* {LLong, SharNQInfo(Alig3), LongLongSiz},#endif {UByte, SharNQInfo(Alig0), 1},( {UShort, SharNQInfo(Alig1), ShortSiz},$ {UInt, SharNQInfo(Alig2), IntSiz},& {ULong, SharNQInfo(Alig3), LongSiz},#ifdef LONGLONG+ {ULLong, SharNQInfo(Alig3), LongLongSiz},#endif- {Enum, SharNQInfo(Alig0), 1}, /* 'char' */+ {LongDbl, SharNQInfo(Alig3), LongDblSiz},};N/*~ zif NbElt(natTyp)!=_ENDCNATTYP "Array 'natTyp': incorrect organization" */const TtypeElt#ifdef LONGLONGN defaultIndexTypeElt = {ULLong, SharNQInfo(Alig3), LongLongSiz},#elseI defaultIndexTypeElt = {ULong, SharNQInfo(Alig3), LongSiz},#endif> charCstTypeElt = {Enum, SharNQGInfo(Alig0), 1},A intCstTypeElt = {Int, SharNQGInfo(Alig2), IntSiz},D longCstTypeElt = {Long, SharNQGInfo(Alig3), LongSiz},G floatCstTypeElt = {Float, SharNQGInfo(Alig3), FloatSiz},J doubleCstTypeElt = {Double, SharNQGInfo(Alig3), DoubleSiz},M longDblCstTypeElt = {LongDbl, SharNQGInfo(Alig3), LongDblSiz};#ifndef NotInitUnions static const#endif7TtypeElt charCst1TypeElt = {Enum, SharCInfo(Alig0), 1};#ifndef NotInitUnionsconst#endif:TtypeElt charPtrTypeElt = {Ptr, SharNQGInfo(Alig0), PtrSiz#ifndef NotInitUnions? , {0}, {NULL}, {&charCstTypeElt /*~ zif (! __member(_nextTE)); "misplaced initialization for field 'nextTE'" */}#endif},6 strCstTypeElt = {Array, SharNQGInfo(Alig0), 0#ifndef NotInitUnionsP , {0}, {&defaultIndexTypeElt}, {&charCst1TypeElt /*~ zif (! __member(_nextTE)); "misplaced initialization for field 'nextTE'" */}#endif};9TtypeElt boolTypeElt = {Bool, SharNQInfo(Alig2), IntSiz},= boolCstTypeElt = {Bool, SharNQGInfo(Alig2), IntSiz},: scndMainParTypeElt = {Array, SharNQInfo(Alig3), 0#ifndef NotInitUnions? , {0}, {NULL}, {&charPtrTypeElt /*~ zif (! __member(_nextTE)); "misplaced initialization for field 'nextTE'" */}#endif},> ptrdiffTypeElt = {Byte, SharNQGInfo(Alig3), LongSiz},> sizeofTypeElt = {UByte, SharNQGInfo(Alig3), LongSiz};#undef SharInfo#undef SharNQInfo#undef SharNQGInfo/*#undef SharNQGUInfo*/#undef SharCInfo/const Tstring errTxt[/*~ IndexType Terr */] = {#include "dcmsg.txt" };4/*~ zif NbEltGen(errTxt, (Terr)0) != EndErr - BegErr; "File 'dcmsg.txt': incorrect number of messages" *//* Local functions profiles */Kstatic void putList(const TdeclElt *, bool), typeToS(TpcTypeElt), putIdent(& Tname), putString(Tstring);/* General purpose functions */ DefRepresType(typedef struct _lvl0InclBlk Lvl0InclBlk;struct _lvl0InclBlk { Lvl0InclBlk *prec; Tstring inclFileName;};1static Lvl0InclBlk *headListLvl0InclFiles = NULL;&static void initAddLvl0InclFName(void){ headListLvl0InclFiles = NULL;}'bool addLvl0InclFName(Tstring fileName){ register Lvl0InclBlk *w; fileName = skipPath(fileName);3 /* Search in list of files included at level 0 */9 for (w = headListLvl0InclFiles; w != NULL; w = w->prec)7 if (StrEq(fileName, w->inclFileName)) return False; /* Add in list */" MyAlloc(w, sizeof(Lvl0InclBlk)); w->inclFileName = fileName;" w->prec = headListLvl0InclFiles; headListLvl0InclFiles = w; return True;}./*~Undef Lvl0InclBlk, headListLvl0InclFiles *//*~UndefTag _lvl0InclBlk */#void *allocChunk(void) /*~Generic*/{% static TqElt6 *adInCurChunk = NULL;* static const TqElt6 *endCurChunk = NULL;A if(adInCurChunk == endCurChunk) { /* current chunk exhausted */; MyAlloc(adInCurChunk, sizeof(TqElt6 [NbUnivEltChunk]));0 endCurChunk = adInCurChunk + NbUnivEltChunk; ctrUEC++;} return adInCurChunk++;}Gvoid bufLongToS(TgreatestInt n /*~Generic*/, register TstringNC ptrBuf)A/* converts to 9999999999 maximum, plus sign, plus '\0' ending */{< unsigned TgreatestInt divsr = MaxPowOfTenInGtstInt, c, nb; bool digitSeen = False;J nb = (n < 0)? (*ptrBuf++ = '-', (unsigned TgreatestInt)(-(n + 1)) + 1) :& (unsigned TgreatestInt)n; do {5 if ((c = nb/divsr)!=0 || digitSeen || divsr==1) {" *ptrBuf++ = "0123456789"[c]; digitSeen = True; nb -= c*divsr;}# } while ((divsr /= Base10) != 0); *ptrBuf = '\0';}3void bufNameToS(Tname x, register TstringNC ptrBuf){ uint lgt; if (x != NULL) {H lgt = (uint)*x++; /*~ zif (DispLgtId != 0) "Pb into bufNameToS()" */< x++; /*~ zif (DispNSId != 1) "Pb into bufNameToS()" */; do {*ptrBuf++ = (Tchar)*x++; lgt--;} while (lgt != 0);}& *ptrBuf = '\0'; /* end of string */}Tstring charToHexS(char c){I static Tchar hexRepre[(CHAR_BITC + BitsHexDigit - 1)/BitsHexDigit + 1]; Tchar *ptr = &hexRepre[0];L int i = ((CHAR_BITC + BitsHexDigit - 1)/BitsHexDigit - 1) * BitsHexDigit; do {8 uint w = ((uint)c >> i) & ((1 << BitsHexDigit) - 1);? if (w!=0 || ptr!=&hexRepre[0]) /* no '0' prefix */ *ptr++ = "0123456789ABCDEF"[w];% } while ((i -= BitsHexDigit) >= 0);I if (ptr == &hexRepre[0]) *ptr++ = '0'; /* if no character generated */ *ptr = '\0'; return &hexRepre[0];}*Tname decoratedName(const TresulExp *pExp)M/* Answers 'decorated' name of object associated to pointed (sub-)expression;P decorates the name with (possibly parenthethized) '*', '[]', '.' and/or '->',D depending on the (expression-choosen) component of the object. */{' if (pExp->ptrId == NULL) return NULL; {" Thistory history = pExp->hist; bool lastIsPtr = False;#define DEUX 2P static TnameAtom buf[MaxLgtId + LgtHdrId + MaxHistDescr*DEUX + (MaxHistDescrF + 1)/DEUX]; /* Worst case: five characters ("(*)[]") generatedI for H_PTR followed by H_ARRAY => maximum expansion factor of 2.5 */ #undef DEUXC register TnameAtom *ptrBuf = &buf[1]; /*~ zif (DispLgtId != 0)& "Pb into decoratedName()" */ int posMsk = -SizeHistElt;- register Tname name = pExp->ptrId->nameb;* TpcTypeElt idType = pExp->ptrId->type;! uint lgtName = (uint)*name++;&#define InsertAtFront(c) \ { \0 register TnameAtom *w = ptrBuf; \ \@ while (w != &buf[LgtHdrId]) {*w = *(w - 1); w--;} \% *w = (TnameAtom)c; \ ptrBuf++;}N *ptrBuf++ = *name++; /*~ zif (DispNSId != 1) "Pb into decoratedName()" */8 if (pExp->PointingOnObj) *ptrBuf++ = (TnameAtom)'&'; { Thistory w = history;@ while (w != H_EMPTY) {PopHist(w); posMsk += SizeHistElt;}} while (posMsk >= 0) {7 Thistory hElt = (history >> posMsk) & MskHistElt;2 /* Follow declaration as much as possible */ if (idType != NULL) {* if (IsArr(idType)) hElt = H_ARRAY;- else if (IsPtr(idType)) hElt = H_PTR;$ idType = NxtTypElt(idType);} posMsk -= SizeHistElt; if (hElt == H_PTR) {E if (posMsk>=0 && ((history >> posMsk) & MskHistElt)==H_DOT) { hElt = H_ARROW;! posMsk -= SizeHistElt;} else { InsertAtFront('*'); lastIsPtr = True; continue;}}( if (lastIsPtr) InsertAtFront('(');< while (lgtName != 0) {*ptrBuf++ = *name++; lgtName--;}E if (lastIsPtr) {*ptrBuf++ = (TnameAtom)')'; lastIsPtr = False;} switch (hElt) {L case H_ARRAY: *ptrBuf++ = (TnameAtom)'['; *ptrBuf++ = (TnameAtom)']' ; break;6 case H_DOT: *ptrBuf++ = (TnameAtom)'.'; break;L case H_ARROW: *ptrBuf++ = (TnameAtom)'-'; *ptrBuf++ = (TnameAtom)'>' ; break; /*~NoDefault */}}: while (lgtName != 0) {*ptrBuf++ = *name++; lgtName--;}2 buf[0] = (TnameAtom)(ptrBuf - &buf[LgtHdrId]); return &buf[0];}#undef InsertAtFront}void err0(Terr n){ err(n, NULL);}void err1(Terr n){ errWS(n, paramTxt);}Ivoid errId(Terr n, const TsemanElt *ptrId, Tname x, Tstring y, Tstring z){N errWFName(n, (ptrId != NULL)? ptrId->defLineNb : 0, (ptrId != NULL)? ptrId->& defFileName : NULL, x, y, z);}6void errId1(Terr n, const TsemanElt *ptrId, Tstring y)N/* Only to be called if ptrId->kind = {Type, Tag, Obj} (ptrId->nameb valid) */{ errId2(n, ptrId, y, NULL);}Avoid errId2(Terr n, const TsemanElt *ptrId, Tstring y, Tstring z)N/* Only to be called if ptrId->kind = {Type, Tag, Obj} (ptrId->nameb valid) */{> errId(n, ptrId, (ptrId == NULL)? NULL : ptrId->nameb, y, z);}@void errId3(Terr n, const TresulExp *pExp, Tstring y, Tstring z)N/* Only to be called if ptrId->kind = {Type, Tag, Obj} (ptrId->nameb valid) */{3 errId(n, pExp->ptrId, decoratedName(pExp), y, z);}void errIlgDP(Ttok t){( errWS(IlgDPrag|Warn1|Rdbl, dpName(t));}?void errPanic(Terr n, const Tstring tabPrm[]) /*~NeverReturns*/{ err(n, tabPrm); longjmp(*curErrRet, 1);}void errUslDP(Ttok t){( errWS(UslDPrag|Warn1|Rdbl, dpName(t));}Jvoid errWFName(Terr n, TlineNb line, Tstring fileName, Tname x, Tstring y, Tstring z){ CreateParArr(9) /*~DynInit*/; TnbBuf nbBuf; TnameBuf nameBuf; bufNameToS(x, nameBuf);M parArr9[1] = &nameBuf[0]; parArr9[2] = y; parArr9[3] = z; parArr9[4] = "?";*H parArr9[5] = parArr9[6] = parArr9[7] = parArr9[8] = parArr9[9] = NULL; if (fileName != NULL) {o* bufLongToS((TgreatestInt)line, nbBuf); parArr9[4] = &nbBuf[0];d1 if (line > 1) parArr9[8] = errTxt[OrJustBef];c! if (fileName != cUnitFName) {h parArr9[6] = fileName; parArr9[5] = errTxt[File];' parArr9[7] = errTxt[EndFileName];eJ if (line==lineNb && StrEq(skipPath(fileName), skipPath(curFileName))- ) parArr9[9] = errTxt[DblIncldFile];}}e err(n, parArr9);} void errWN(Terr n, Tname x);{  errWS(n, nameToS(x));l}k3void errWNSS(Terr n, Tname x, Tstring y, Tstring z)r{ & errWSSSS(n, nameToS(x), y, z, NULL);}o*void errWNT(Terr n, Tname x, TpcTypeElt y){/ errWNTT(n, x, y, NULL);*}e9void errWNTT(Terr n, Tname x, TpcTypeElt y, TpcTypeElt z)m{a errWSTT(n, nameToS(x), y, z);a}evoid errWS(Terr n, Tstring x)r{ # errWSSSS(n, x, NULL, NULL, NULL);i}))void errWSS(Terr n, Tstring x, Tstring y)o{f errWSSSS(n, x, y, NULL, NULL);}FAvoid errWSSSS(Terr n, Tstring x, Tstring y, Tstring z, Tstring t)t{. CreateParArr(4) /*~DynInit*/;cA parArr4[1] = x; parArr4[2] = y; parArr4[3] = z; parArr4[4] = t;t err(n, parArr4);}N;void errWSTT(Terr n, Tstring x, TpcTypeElt y, TpcTypeElt z){t errWSTTS(n, x, y, z, NULL);s}aGvoid errWSTTS(Terr n, Tstring x, TpcTypeElt y, TpcTypeElt z, Tstring t)/{i. errWSSSS(n, x, typeToS1(y), typeToS2(z), t);}a%void errWT(Terr n, const TtypeElt *x)d{e errWS(n, typeToS1(x));} void initExt(void){r#ifdef NotInitUnions static bool frstInit = True; if (frstInit) {i3 strCstTypeElt.indexType = &defaultIndexTypeElt;i, charPtrTypeElt.nextTE = &charCstTypeElt;, strCstTypeElt.nextTE = &charCst1TypeElt;0 scndMainParTypeElt.nextTE = &charPtrTypeElt; frstInit = False;}#endif cUnitFName = NULL; curFctName = NULL; headListPrivTo = NULL;" indentIncr = oldSpaceCount = -1; initAddLvl0InclFName(); }r-bool isBodyHdrFile(register Tstring fileName)r{i' register Tstring y = strpdCUnitFName;t fileName = skipPath(fileName);/ while (RealChar(*fileName) == RealChar(*y)) { ( if (*fileName++ == '.') return True; y++;} return False; }e,Tstring longToS(TgreatestInt n /*~Generic*/){n static TnbBuf buf; bufLongToS(n, buf);l return &buf[0]; } Istatic Tstring longToS1(TgreatestInt n /*~Generic*/) /* local buffer forc typeToSx. */{  static TnbBuf buf; bufLongToS(n(~DCC.BCK7"[DCC_DISTRIB.SRC]DCEXT.C;629P9t$&, buf);  return &buf[0]; }aTstring nameToS(Tname x){e static TnameBuf buf; bufNameToS(x, buf);e return &buf[0];h} 4static void putList(const TdeclElt *x, bool strunFl){  bool firstElt = True;n- TpcTypeElt last = QuasiNULLval(TpcTypeElt);r! for (; x != NULL; x = x->cdr) {s$ if (!strunFl || x->type!=last) {P if (firstElt) firstElt = False; else putString((strunFl)? "; " : ", "); /*& list elements separator. */ typeToS(last = x->type);- if (x->idName != NULL) putString(" ");}dO else putString(", "); /* for struct/union, do not print twice same type */t/ if (x->idName != NULL) putIdent(x->idName);; if (! strunFl) {> static const Tstring dQalNames[/*~IndexType TparQal*/] =& {"", " ~RT", " ~GN", " ~UT"};8 /*~ zif (NbElt(dQalNames) != (int)(MaxParQal + 1))4 "bad 'dQalNames' array initialization" */+ if (x->ResulPtrFl) putString(" ~RP");n, else putString(dQalNames[x->parQal]);}L else if (x->fldFl) {putString(":"); putString(longToS1((TgreatestInt)x-> fldSize));}} if (strunFl) putString(";");}l#void putSeman(const TsemanElt *pId)l{.8 static const Tstring tabKind[/*~ IndexType Tkind */] =; {"pA", "iD", "tY", "eT", "suT", "eC:", "lbL", "pA"}; ; /*~ zif (NbEltGen(tabKind, (Tkind)0) != (int)MaxKind + 1)a- "Array 'tabKind': incorrect size" */r< static const Tstring tabAttrib[/*~ IndexType Tattrib */] =I {"/none", "/static", "/static", "/extern", NULL, "/auto", "/reg"};eA /*~ zif (NbEltGen(tabAttrib, (Tattrib)0) != (int)MaxAttrib + 1)f- "Array 'tabAttrib': incorrect size" */r emitS(tabKind[pId->kind]); switch (pId->kind) {7 case EnumCst: emitS(longToS1(pId->enumVal)); break;# case Label: emitS(")"); return;e2 case EnumTag: case StrunTag: case Type: break;- default: emitS(tabAttrib[pId->attribb]);}a emitS(") "); emitS(typeToS1(pId->type)); } static uint embdStrunLvl = 0; #static void putQualif(TpcTypeElt x)t{ > Tqualif qual = (embdStrunLvl==0 || !IsStrun(x))? x->qualif :4 BaseStrunType(x)->SynthQualif | x->qualif;+ if (qual & ConstQal) putString("const ");~. if (qual & VolatQal) putString("volatile ");}a"Tstring skipPath(Tstring fileName){* Tstring posEndPath; #ifdef VMSB if ((posEndPath = strrchr(fileName, ']')) == NULL) posEndPath =  strrchr(fileName, ':');z if (posEndPath == NULL) { #else {i#endif) posEndPath = strrchr(fileName, '/');} 9 return (posEndPath != NULL)? posEndPath + 1 : fileName;} 7bool strJokerEq(register Tstring x, register Tstring y) I/* Answers True if string x is equal to string y, matching '*'s in x withe" arbitrary (sub)strings in y. */{g Tstring savx = NULL; for (;;) {N while (RealChar(*x) == RealChar(*y)) {if (*x++ == '\0') return True; y++;} if (*x == '*') {3 while (*++x == '*') {} /* '***..*' -> '*' */ " if (*x == '\0') return True; savx = x;}F else {if (savx == NULL) return False; y+= savx - x + 1; x = savx;}K while (RealChar(*y) != RealChar(*x)) {if (*y++ == '\0') return False;}}r}y!static void typeToS(TpcTypeElt x) {t TtypeSort tsx; static uint embdType = 0; " static const Tstring tabSort[] =E {"void", "bool", "byte", "unsigned byte", "short", "unsigned short",: IntStr, "unsigned "IntStr, LongStr, "unsigned " LongStr,#ifdef LONGLONG = ConvToString(LONGLONG), "unsigned " ConvToString(LONGLONG),#endif# "float", "double", "long double",eB "enum ", "Ptr", "Array[", "Fct(", "VFct(", "struct ", "union "}; while (x != NULL) {yM tsx = x->typeSort; /* here to keep eventual 'Int' bit in 'Enum' parallel  type. */a if (NxtIsTypeId(x)) {t bool spaceNeeded = False; do {4 if (x->typeId->namedType != x) putQualif(x); putString("<"); I if (! x->paralTyp) putString("<"); /* to emphasize 'pure' systemd typedefs. */# putIdent(x->typeId->nameb);u putString(">");o( if (x->rootTyp) putString("RT");5 if (verbosetypeId->type; } while (NxtIsTypeId(x));a' if (spaceNeeded) putString(" ");}i embdType++;t putQualif(x);N /* Convert type sort(s) */+ if (tsx == Void) putString(tabSort[0]);n else { int i; TtypeSort explorBit;E if (tsx==Int && x->SynthQualif!=NoQualif) putString("signed ");n> for (i = 1, explorBit = Bool; explorBit!=DelType; i++) {1 if (! (tsx & explorBit)) explorBit <<= 1;  else {I putString((i==PosDelT && x->tagId==NULL)? "char" : tabSort[i]);AL if (tsx >= (explorBit <<= 1)) putString("/"); /* to separate from next one. */ else break;}}gI if (tsx >= DelType) putString(*((&tabSort[0] - 1) + i + (int)(tsx>>E PosDelT))); if (tsx >= Enum)! switch (tsx >> PosDelT) {E case Ptr>>PosDelT:H if (verbose>=HalfVerbo && x->indexType!=NULL && x->indexType!=I &defaultIndexTypeElt) {putString("~IT "); typeToS(x->indexType);}  putString("/");a break; case Array>>PosDelT:H if (verbose>=HalfVerbo && x->indexType!=NULL && x->indexType!= &defaultIndexTypeElt) {," typeToS(x->indexType);- if (x->lim != 0) putString(" ");} if (x->lim != 0) {4 if (x->lim == ArrLimErr) putString("0"); else {8 putString(longToS1((TgreatestInt)x->lim));( if (verbose > HalfVerbo) { putString("*");(G putString(longToS1((TgreatestInt)(x->size/x->lim)));}}} putString("]:"); break;. case Fct>>PosDelT: case VFct>>PosDelT:I if (x->paramList != NULL) {if (verbose > HalfVerbo) putList(x->E4 paramList, False); else putString("...");} putString(")");p {E TpcTypeElt w;2? if (x->pvNr && (w = NxtTypElt(x))!=NULL) putString(I- (w->typeSort == Void)? "~NR" : "~PV"); . if (x->generic) putString("~GN");} putString("=>"); break;7 case Enum>>PosDelT: /* case Enum, Enum|Int */ H if (x->tagId > GenericEnum) putIdent(x->tagId->nameb); /* not4 'char' or generic enum (cf correctExprN). */ break;1 case Struc>>PosDelT: case Union>>PosDelT: x = BaseStrunType(x);a$ putIdent(x->tagId->nameb);$ if (verbose > HalfVerbo) { putString("{");( if (x->memberList != NULL) {& if (embdStrunLvl == 0) {O /* Do not print embedded strun (to get shorter description; be-/P sides, prevents infinite loop if a strun refers to itself). */ embdStrunLvl++;g; putString(longToS1((TgreatestInt)x->size));e putString("|");l- putList(x->memberList, True);; embdStrunLvl--;}% else putString("...");} ! else putString("??");I putString("}");} break; /*~ NoDefault */}} embdType--;e x = x->nextTE;}r}l/*~Undef embdStrunLvl */static Tchar *ptrTxt; static const Tchar *endBuf;cstatic void putIdent(Tname x)h1/* used so that 'nameToS' buffer not destroyed */ {( uint lgt;eD lgt = (uint)*x++; /*~ zif (DispLgtId != 0) "Pb into putIdent()" */9 x++; /*~ zif (DispNSId != 1) "Pb into putIdent()" */pD while (ptrTxt!=endBuf && lgt!=0) {lgt--; *ptrTxt++ = (Tchar)*x++;}};)static void putString(register Tstring x)l{e8 while (ptrTxt!=endBuf && *x!='\0') {*ptrTxt++ = *x++;}}/!#define putT(x, y) \I* Tstring x(TpcTypeElt pTyp) \ { \" ptrTxt = &y[0]; \, endBuf = &y[0] + NbElt(y); \! typeToS(pTyp); \tL if (ptrTxt == endBuf) {ptrTxt -= NbElt(Dots); putString(Dots);} \" *ptrTxt = '\0'; \ return &y[0]; \ },Hstatic Tchar txtBuf1[SizTypTxtBuf + 1], txtBuf2[SizTypTxtBuf + 1]; /* +1& because of ending '\0'. */NputT(typeToS1, txtBuf1) /* creates function 'typeToS1', which builds a string9 representation of a type, and gives back a pointer + on the buffer holding the string. */tJputT(typeToS2, txtBuf2) /* creates function 'typeToS2 '(same as typeToS1,- except it uses a different buffer). */ ,/*~Undef ptrTxt, endBuf, txtBuf1, txtBuf2 *//* End DCEXT.C */)*[DCC_DISTRIB.SRC]DCEXT.H;125+,V. /( 4P X-"0123KPWO 56@ߜ7MS89G(HJ /* DCEXT.H */(/* Y.L. Noyelle, Supelec, France 1996 */#ifndef DCEXT_H#define DCEXT_H#include #include "dc.th"/* Functions profiles */&extern bool addLvl0InclFName(Tstring);+extern void *allocChunk(void) /*~Generic*/;#extern bool isBodyHdrFile(Tstring);Oextern void bufLongToS(TgreatestInt /*~Generic*/, TstringNC), bufNameToS(Tname, TstringNC);+extern void errIlgDP(Ttok), errUslDP(Ttok);Lextern void err0(Terr), err1(Terr), errWN(Terr, Tname), errWNSS(Terr, Tname,J Tstring, Tstring), errWNT(Terr, Tname, TpcTypeElt), errWNTT(Terr, Tname,P TpcTypeElt, TpcTypeElt), errWS(Terr, Tstring), errWSS(Terr, Tstring, Tstring),L errWSSSS(Terr, Tstring, Tstring, Tstring, Tstring), errWSTT(Terr, Tstring,J TpcTypeElt, TpcTypeElt), errWSTTS(Terr, Tstring, TpcTypeElt, TpcTypeElt,J Tstring), errWT(Terr, TpcTypeElt), errId(Terr, const TsemanElt *, Tname,K Tstring, Tstring), errId1(Terr, const TsemanElt *, Tstring), errId2(Terr,G const TsemanElt *, Tstring, Tstring), errId3(Terr, const TresulExp *,G Tstring, Tstring), errPanic(Terr, const Tstring[]) /*~NeverReturns*/,= errWFName(Terr, TlineNb, Tstring, Tname, Tstring, Tstring);Mextern Tstring charToHexS(char), longToS(TgreatestInt /*~Generic*/), nameToS(5 Tname), typeToS1(TpcTypeElt), typeToS2(TpcTypeElt);(extern void putSeman(const TsemanElt *);!extern Tstring skipPath(Tstring);.extern Tname decoratedName(const TresulExp *);)extern bool strJokerEq(Tstring, Tstring); /* Objects */Fextern bool adjustFile, allErrFl, askConstFl, chkBool, chkEmptParList,D chkFctRetTyp, chkInclPos, chkNmdTypParFl, chkNumCst, chkPortbl,? chkTypName, dollAlwdInId, headerFile, ifDirExp, ignoreErr,I macroExpand, moreIndexTypeChk, printStat, sysAdjHdrFile, sysHdrFile,3 verifAllPtrForConst, warnNUI, warnNUP, zifExp;Eextern TresulExp cExp; /* information on current (sub-)expression *//extern Tstring cUnitFName; /* main file name */@extern jmp_buf *curErrRet; /* for 'panic' mode error recovery */4extern Tname curFctName; /* current function name */3extern Tstring curFileName; /* current file name */:extern Tstring curHdrFName; /* current header file name */Bextern TmacExpnd curMacExpNb; /* current macro expansion number */extern TvalTok curTok;Gextern const Tstring errTxt[/*~ IndexType Terr */]; /* message texts */Dextern TpcTypeElt errQalTyp1, errQalTyp2; /* erroneous (sub-)type in& case of 'const' incoherence. */extern bool insideHdrInHdr;Kextern TmngtPriv *headListPrivTo; /* current 'PrivateTo' list of body file names. */Cextern TqElt6 *headQElt6; /* head of queue of available 'universal' blocks. */@extern TresulExp lExp; /* left operand, in binary expression */-extern TlineNb lineNb; /* current line nb */extern TnstLvl nestLvl;!extern const Tstring nonFileName;extern Tstring paramTxt;extern void (*pCurGNT)(void);Pextern int spaceCount, indentIncr, oldSpaceCount; /* for indentation checking */Mextern Tstring strpdCUnitFName; /* compilation unit name ((without directory/ version number). */extern Tverbo verbose;%/* Description of predefined types */#ifdef NotInitUnions extern TtypeElt charCst1TypeElt;#endifextern#ifndef NotInitUnions const#endifE TtypeElt charPtrTypeElt, strCstTypeElt/*, NULLTypeElt*/;Mextern const TtypeElt defaultIndexTypeElt, /*fltDblTypeElt, */charCstTypeElt,C intCstTypeElt, longCstTypeElt, floatCstTypeElt, doubleCstTypeElt,1 longDblCstTypeElt, natTyp[/*~IndexType int */];Pextern TtypeElt boolTypeElt, boolCstTypeElt, ptrdiffTypeElt, scndMainParTypeElt, sizeofTypeElt;:extern uint ctrBSE; /* number of blocks stack elements */?extern uint ctrCE; /* number of caseElt currently allocated */?extern uint ctrDE; /* number of declElt currently allocated */5extern uint ctrDIE; /* number of descrId elements */9extern uint ctrMSB; /* number of macro storage blocks */5extern uint ctrNI; /* number of notInitVar blocks */7extern uint ctrNSB; /* number of nameStorage blocks */@extern uint ctrSE; /* number of semanElt currently allocated */?extern uint ctrTE; /* number of typeElt currently allocated */Cextern uint ctrTLE; /* number of tagListElt currently allocated */=extern uint ctrUEC; /* number of 'universal' block chunks */#endif /* ifndef DCEXT_H *//* End DCEXT.H */*[DCC_DISTRIB.SRC]DCEXT.PH;3+, (./( 4(-"0123KPWO56JKlR7 S89G(HJ/* DCEXT.PH */(/* Y.L. Noyelle, Supelec, France 1998 */#ifndef DCEXT_PH#define DCEXT_PHextern void initExt(void);#endif /* ifndef DCEXT_PH *//* End DCEXT.PH */*[DCC_DISTRIB.SRC]DCFMT.C;135+,\./( 4P-"0123KPWO56@X77KS89G(HJ /* DCFMT.C */(/* Y.L. Noyelle, Supelec, France 1995 */#include #include "dcfmt.h"#include "dcblk.h"#include "dcext.h"#include "dcinst.ph" #ifdef VMS#pragma noinline (errSpec)#endif#define MaxLgtSpecTxt 11#define NbSpecScanf 13#define VarWdth -(2) DefRepresTypeLtypedef enum {EmptyD, StarB, MWB=StarB<<1, MPB=MWB<<1, HB=MPB<<1, LLB=HB<<1,O ULB=LLB<<1, PtrB=ULB<<1, MiB=PtrB<<1, PlB=MiB<<1, ZrSpB=PlB<<1, NbB=ZrSpB<<1} TdescB;/* Local function signatures */>static void errSpec(Terr), record(TdescB), storeSpecTxt(void);%static int convNb(void) /*~Generic*/;/* Global variables */static TpcTypeElt argType;static char curChar;static TdescB descr;&static bool coRout1, coRout2, endSpec;3static const char tabConvCh[] = "[discgfeouxpnGEX";Dstatic Tchar tSpecTxt[MaxLgtSpecTxt + 1 + 1 + 1] = {'%'}, *pSpecTxt;/* External variables */int ioFctNb = 0;void initFlwgSpe(void){( initGetStrLit((TlitString) cExp.pVal);& coRout1 = coRout2 = endSpec = False;}bool folwngSpe(TpcTypeElt type){ int minWdth; bool *pCoRout; argType = type;O if (coRout1) {coRout1 = False; goto coRout1L;} /* simulation of coroutine */O if (coRout2) {coRout2 = False; goto coRout2L;} /* simulation of coroutine */ if (endSpec) return False; nxtSpecL:- for (;;) { /* search next specification */O if ((curChar = getNxtStrLitChar()) == '\0') {endSpec = True; return False;}L if (curChar == '%') {if ((curChar = getNxtStrLitChar()) != '%') break;}}? descr = EmptyD; /* flags describing current specification */O pSpecTxt = &tSpecTxt[1]; /* pointer to saved specification text ('1' because of starting '%'). */3 if (ScanfFl) {if (curChar == '*') record(StarB);} else { TdescB oldDescr; do { oldDescr = descr;& if (curChar == '-') record(MiB);; else if (curChar=='0' || curChar==' ') record(ZrSpB);+ else if (curChar == '+') record(PlB);+ else if (curChar == '#') record(NbB);N } while (descr != oldDescr);} /* loop as long as new specif. flag seen */. if ((minWdth = convNb()) >= 0) descr |= MWB;F else if (minWdth == VarWdth) {descr |= MWB; pCoRout = &coRout1; goto varWdthL;} coRout1L:! if (!ScanfFl && curChar=='.') { record(MPB); { int w; if ((w = convNb()) < 0) {> if (w == VarWdth) {pCoRout = &coRout2; goto varWdthL;}- errSpec(IlgPrecFld|Warn3|PossErr);}}} coRout2L:! if (curChar == 'h') record(HB);' else if (curChar == 'l') record(LLB);' else if (curChar == 'L') record(ULB); storeSpecTxt();& if (curChar == '\0') endSpec = True; { const char *pos;O if ((pos = strchr(tabConvCh, curChar))==NULL || ScanfFl && pos>=&tabConvCh[A NbSpecScanf] || !ScanfFl && pos==&tabConvCh[0] || endSpec- ) errSpec(IlgFmtSpe|Warn3|PossErr); else {F static const struct _descSpec{TdescB dBits; TtypeSort typeSort;}4 tabDescSpec[/*~IndexType ptrdiff_t */] = {) /* Scanf Family specifications */I {StarB|MWB , Enum }, /* [ ('char' = Enum...) */6 {StarB|MWB|HB|LLB| PtrB, Int }, /* d */6 {StarB|MWB|HB|LLB| PtrB, Int }, /* i */6 {StarB|MWB , Enum }, /* s */6 {StarB|MWB , Enum }, /* c */6 {StarB|MWB| LLB|ULB|PtrB, Float }, /* g */6 {StarB|MWB| LLB|ULB|PtrB, Float }, /* f */6 {StarB|MWB| LLB|ULB|PtrB, Float }, /* e */6 {StarB|MWB|HB|LLB| PtrB, UInt }, /* o */6 {StarB|MWB|HB|LLB| PtrB, UInt }, /* u */6 {StarB|MWB|HB|LLB| PtrB, UInt }, /* x */6 {StarB|MWB| PtrB, Void }, /* p */6 {StarB| HB|LLB| PtrB, Int|UInt}, /* n */F /*~zif __index() != NbSpecScanf "Inadequate count of 'scanf' " "specifications" */M /* Printf Family specifications (must be in same order than identicalA Scanf Family specifications, cf 'pds' computation). */O {MiB|ZrSpB|PlB| MWB|MPB|HB|LLB , Byte|Short|Int }, /* d */O {MiB|ZrSpB|PlB| MWB|MPB|HB|LLB , Byte|Short|Int }, /* i */O {MiB| MWB|MPB|HB|LLB| PtrB, Enum }, /* s */O {MiB| MWB , Enum }, /* c */O {MiB|ZrSpB|PlB|NbB|MWB|MPB| ULB , Float|Double }, /* g */O {MiB|ZrSpB|PlB|NbB|MWB|MPB| ULB , Float|Double  }, /* f */O {MiB|ZrSpB|PlB|NbB|MWB|MPB| ULB , Float|Double }, /* e */O {MiB|ZrSpB| NbB|MWB|MPB|HB|LLB , UByte|UShort|UInt}, /* o */O {MiB|ZrSpB| MWB|MPB|HB|LLB , UByte|UShort|UInt}, /* u */O {MiB|ZrSpB| NbB|MWB|MPB|HB|LLB , UByte|UShort|UInt}, /* x */O {MiB|ZrSpB| MWB|MPB| PtrB, Void }, /* p */O { PtrB, Int|UInt }, /* n */O {MiB|ZrSpB|PlB|NbB|MWB|MPB| ULB , Float|Double }, /* G */O {MiB|ZrSpB|PlB|NbB|MWB|MPB| ULB , Float|Double }, /* E */O {MiB|ZrSpB| NbB|MWB|MPB|HB|LLB , UByte|UShort|UInt}, /* X */> /*~zif __index() != NbSpecScanf + NbElt(tabConvCh) - 2= "Inadequate count of 'printf' specifications (ignore this "? "message if there were a previous message complaining about " "'scanf')." */ };F const struct _descSpec *pds = &tabDescSpec[pos - &tabConvCh[0] +- ((ScanfFl)? 0 : NbSpecScanf - 1)];M if ((descr & pds->dBits) != descr) errSpec(IlgOptForSpe|Warn3|PossErr); if (descr & StarB) {6 errSpec(NoErrMsg); /* empties error buffer */' goto nxtSpecL /*~BackBranch*/;} if (type != NULL) {) const TpcTypeElt initType = type;& TtypeSort ts = type->typeSort;H if (pds->dBits & PtrB || ScanfFl && curChar=='c' && minWdth<0) {J if (! (ts==Ptr || ts==Array && curChar=='s')) {errSpec(PtrExptd|& Warn3|PossErr); goto exitL;}} else if (ScanfFl) {P if (! IsPtrArrSort(ts)) {errSpec(ArrExptd|Warn3|PossErr); goto exitL;}N if (minWdth<0 && (ioFctNb!=IndexSScanf || !Found(SIZEOK))) errSpec((H ioFctNb == IndexSScanf)? MsngFldWdth1|Warn1|PossErr : MsngFldWdth| Warn1|PossErr);H else if (ts==Array && (size_t)((curChar == 's')? minWdth + 1 :; minWdth)>type->lim) errSpec(ArrTooSmall|Warn2|PossErr);} else goto noDeRefL; for (;;) {; if ((type = NxtTypElt(type)) == NULL) goto exitL;O if (ScanfFl) argType = type; /* so, less surprising (in error msg) */' if (ScanfFl || curChar=='n') J if (type->qualif & ConstQal) errSpec(DontWriteIntoConst|Warn3| PossErr); else {- TsemanElt *rPtrId = cExp.ptrId;K if (rPtrId!=NULL && (cExp.PointingOnObj || ts==Array && cExp.> ptrId->kind!=Param)) rPtrId->used = (loopLvl==0 && rPtrId->- attribb>=Auto)? False : cExp.oldUsed;} ts = type->typeSort;E if (ts==Array && ScanfFl) err0(ShdntBePtrOnArr|Warn2|Rdbl); else break;} noDeRefL: if (ScanfFl) {M if (ts==Void && initType->generic) ts = pds->typeSort; /* any type; is compatible with / *~VoidToOther* /(void *). */A if (descr & HB) ts <<= GapNxtVarie; /* short => int */M if (descr & LLB) ts >>= (ts >= Float)? 1 : GapNxtVarie; /* long => int; double => float. */K if (descr & ULB) ts >>= GapNxtVarie;} /* long double => float */ else {E if (descr & LLB) ts = ((ts & (Long | ULong)) == Void)? Void4 : ts>>GapNxtVarie; /* (u)long => (u)int */@ if (descr & ULB) ts = (ts != LongDbl)? Void : Double;}O if (pds->typeSort!=Void && (!(pds->typeSort & ts) || ts==Enum && type->I tagId!=NULL /* not 'char' */)) errSpec(IlgSpeForType|Warn3|PossErr);1 if (curChar == '[') { /* read all set */' curChar = getNxtStrLitChar();; if (curChar == '^') curChar = getNxtStrLitChar();; if (curChar == ']') curChar = getNxtStrLitChar();B while (curChar != ']') curChar = getNxtStrLitChar();}}}} goto exitL; varWdthL:I if (type!=NULL && !(type->typeSort & Int) && !(type->typeSort & Enum &&- cExp.rEvlbl)) errSpec(IlgTypeForFld); *pCoRout = True;exitL:< errSpec(NoErrMsg); /* output possible error message(s) */ return True;}static void errSpec(Terr n){#define MaxNbRmbdErr 3N static struct _dErr {Terr errNo; TpcTypeElt type;} tabRmbdErr[MaxNbRmbdErr], *pTRmbdErr = NULL;4 if (pTRmbdErr == NULL) pTRmbdErr = &tabRmbdErr[0];/ if (n != NoErrMsg) { /* new error to save */P if (pTRmbdErr > &tabRmbdErr[MaxNbRmbdErr - 1]) {tabRmbdErr[MaxNbRmbdErr - 1]B .errNo = n; tabRmbdErr[MaxNbRmbdErr - 1].type = argType;}@ else {pTRmbdErr->errNo = n; (*pTRmbdErr++).type = argType;}}$ else { /* buffer to be emptied */ register struct _dErr *w;5 *pSpecTxt = '\0'; /* end specification string */M for (w = &tabRmbdErr[0]; w != pTRmbdErr; w++) errWSTT(w->errNo, tSpecTxt, w->type, NULL);4 pTRmbdErr = NULL;} /* reset to initial state */#undef MaxNbRmbdErr}static void storeSpecTxt(void){D if (pSpecTxt >= &tSpecTxt[MaxLgtSpecTxt]) { /* buffer overflow */; tSpecTxt[MaxLgtSpecTxt] = '~'; /* to show overflow */2 tSpecTxt[MaxLgtSpecTxt + 1] = (Tchar)curChar;1 pSpecTxt = &tSpecTxt[MaxLgtSpecTxt + 1 + 1];}$ else *pSpecTxt++ = (Tchar)curChar;}static void record(TdescB x){ descr |= x; storeSpecTxt(); curChar = getNxtStrLitChar();}$static int convNb(void) /*~Generic*/{ int result;M if (!ScanfFl && curChar=='*') {storeSpecTxt(); curChar = getNxtStrLitChar() ; return VarWdth;}5 if (! InsideInterval(curChar, '0', '9')) return -1; result = curChar - '0';L while (InsideInterval((storeSpecTxt(), curChar = getNxtStrLitChar()), '0',4 '9')) result = result*Base10 + (curChar - '0'); return result;}/* End DCFMT.C */*[DCC_DISTRIB.SRC]DCFMT.H;31+,@./( 40Z-"0123KPWO56Wk7;~S89G(HJ /* DCFMT.H */(/* Y.L. Noyelle, Supelec, France 1996 */#ifndef DCFMT_H#define DCFMT_H#include #include "dc.th"#define ScanfFl (ioFctNb > 0)extern void initFlwgSpe(void);"extern bool folwngSpe(TpcTypeElt);0extern int ioFctNb; /* >=0 if 'scanf' family */#endif /* ifndef DCFMT_H *//* End DCFMT.H */*[DCC_DISTRIB.SRC]DCINST.C;2606+,8W.3/( 4P33Z-"0123KPWO456͔7`S89G(HJ/* DCINST.C */(/* Y.L. Noyelle, Supelec, France 1994 */ #ifdef VMS# pragma noinline (errInit1)#endif#include #include #include #include "dcinst.h"#include "dcinst.ph"#include "dcblk.h"#include "dcdir.h"#include "dcdecl.h"#include "dcexp.h"#include "dcexp.ph"#include "dcext.h"#include "dcrec.h";#define IsDecl1(x) InsideInterval(curTok.tok, x, EDecl - 1)P#define IsSideEffect(x) InsideInterval(NakedTok(x.topOper), BSideEffTok, \ ESideEffTok - 1)!#define SubOP (ADDOP | NONASSOC) DefRepresType"typedef struct _TcaseElt TcaseElt;Estruct _TcaseElt { /* for checking non-duplication of case values */H TcalcS valCase[(sizeof(TqElt6) - sizeof(TcaseElt *))/ sizeof(TcalcS)]; TcaseElt *next;};Atypedef enum {PlainBlk, InsideSw, InsideIf = InsideSw<<1} Tenvir;/* Function profiles */Mstatic void block(void), checkNotInitVar(void), manageLoop(Ttok), stmt(void);Istatic bool blockDecl(bool) /*~PseudoVoid*/, isLabel(void), prntzBoolExp( Tstring);Ostatic void errInit1(TnotInitVar *), initCheckIndent(void), processLabel(void), subStmt(bool);>static TcaseElt *allocCaseElt(void), *freeCaseElt(TcaseElt *);5static TnotInitVar *freeNotInitVarElt(TnotInitVar *); /* Objects */!static TsemanElt *bckBrch = NULL;"static bool brkSeen, continueSeen;"static Tenvir curEnvir = PlainBlk; static TpcTypeElt curFctRetType;static TsemanElt *fwdBrch;"static TlineNb lastElseLineNb = 0;static uint loopStmtLvl = 0;Cstatic uint retCount; /* number of 'return's in a function body */static uint switchLvl = 0;?static const Ttok sColRBraLBra[] = {SCOL, RBRA, LBRA, EndSTok};Istatic const Ttok sColRBraLBraElse[] = {SCOL, RBRA, LBRA, ELSE, EndSTok};Fstatic const Ttok sColRBraLBraCaseDefault[] = {SCOL, RBRA, LBRA, CASE, DEFAULT, EndSTok};Jstatic const Ttok sColRBraLBraCaseDefaultElse[] = {SCOL, RBRA, LBRA, CASE, DEFAULT, ELSE, EndSTok};?static const Ttok sColRParRBra[] = {SCOL, RPAR, RBRA, EndSTok};Jstatic const Ttok *tokToBeSkpd[/*~IndexType Tenvir*/] = {&sColRBraLBra[0],% &sColRBraLBraCaseDefault[0], &sColRBraLBraElse[0],* &sColRBraLBraCaseDefaultElse[0]};/* External objects */uint condStmtLvl;uint initialLoopCondLvl; uint loopLvl;TnotInitVar *notInitVarList;6Trchbl nxtStmtRchbl; /* next statement reachable ? */%void enterFctBody(TpcTypeElt fctType) /* Prepares function body entry.A Does not exit via 'longjmp', either directly or indirectly. */{# TmacExpnd prevCMEN = curMacExpNb;I TpcTypeElt oldRetType = curFctRetType; /* in case of embedded function definition. */? curFctRetType = (fctType == NULL)? NULL : NxtTypElt(fctType);" /* Indent count configuration */L if (NxtTok()!=RBRA && indentIncr<0 && (!ReallyInsideMacro || curMacExpNb!=A prevCMEN) /* beware of functions defined by macros (such as, for4 example, DefRepresType). */ && !headerFile) {M if (spaceCount <= 0) {err0(NoIndentIndct | Warn1); indentIncr = 0;} /* to& prevent further warnings. */D else indentIncr = spaceCount;} /* first indentation configurate indentation count. */N retCount = loopLvl = condStmtLvl = 0; fwdBrch = NULL; notInitVarList = NULL; block();< if (nxtStmtRchbl > Rchbl) err0(UnreachStmt|Warn2|PossErr); if (curFctRetType != NULL) {* if (curFctRetType->typeSort != Void) {H if (nxtStmtRchbl == Rchbl) errWN(NoRetAtEnd | Warn3, curFctName);} else/ if (retCount==0 && nxtStmtRchbl!=Rchbl) {F if (!fctType->pvNr) errWN(MsngNevRet|Warn1|Rdbl, curFctName);} else {J if (fctType->pvNr) errWN(IncorNevRet|Warn2|PossErr, curFctName);}} curFctRetType = oldRetType;1 GetNxtTok(); /* here for good error position */B/* if (sizeofOpndType!=NULL || allocType!=NULL) sysErr(ExCod3);*/}static void block(void){ blockDecl(True);" /* Manage possible statements */ nxtStmtRchbl = Rchbl; while (curTok.tok != RBRA) {L if (curTok.tok == ENDPROG) {err0(RBraExptd); break;} /* beware of case4 where RBRA is followed immediatly by ENDPROG. */ stmt();} exitBlock(); checkIndent();}1static bool blockDecl(bool legal) /*~PseudoVoid*/-/* Manages the declaration part of a block */{ TcharTok w; bool declSeen = False;# jmp_buf localJmpBuf, *saveErrRet; while ( IsDecl1(BDecl) || curTok.tok==IDENT && ( legalH && curTok.ptrSem==NULL /* so that "toto var;int var1;" do)~DCC.BCK8W"[DCC_DISTRIB.SRC]DCINST.C;2606P3LN es not4 get into 'stmt*' if toto "forced defined". */) && (w = nxtCharOrMacTok(),E w>=0 && (w==(TcharTok)'*' || isAlfa((char)w))F || w<0 && (w==-(TcharTok)STAR || w==-(TcharTok)IDENT))$ || curTok.ptrSem!=NULL+ && curTok.ptrSem->kind==Type+ && !(legal && isLabel()))) { if (! declSeen) {& if (! legal) err0(IllPositDecl); saveErrRet = curErrRet;/ curErrRet = &localJmpBuf /*~ LocalAdr */; declSeen = True;$ if (setjmp(*curErrRet) != 0) {B skipTok(sColRBraLBra); /* return point in 'panic' mode */ continue;}} decl();} if (declSeen) { curErrRet = saveErrRet;A if ((oldSpaceCount+1<0 || spaceCount+1<0) && indentIncr>0 &&P !ReallyInsideMacro && curTok.tok!=SCOL && legal) err0(SepDeclStmt|Warn1);} return declSeen;}static void stmt(void){ bool labldStmt = isLabel(); if (nxtStmtRchbl != Rchbl) { if (! labldStmt) {B if (curTok.tok == SCOL) goto begStmt; /* empty statement */' err0(UnreachStmt|Warn2|PossErr);} nxtStmtRchbl = Rchbl;}begStmt: if (labldStmt) {N if (spaceCount <= nestLvl*indentIncr) spaceCount = SpaceCntNoBegLine;} /*B labels can be more on the left (for better visibility). */ checkIndent(); switch(curTok.tok) { case BREAK:D if (switchLvl==0 && loopStmtLvl==0) err0(NotInsideLoopOrSwitch); brkSeen = True; goto termiByBrL; case CASE: case DEFAULT: { TvalTok prevTok = curTok;O err0((curTok.hCod == 0)? NotInsideSwitch1|Warn2|Rdbl : NotInsideSwitch1); GetNxtTok();N if (prevTok.tok == CASE) (void)correctExprN(NULL, WhoEnum, True, "case", True);; if (prevTok.hCod!=0 && !Found(COLON)) err0(ColExptd); goto tstLabL;} case CONTINUE:. if (loopStmtLvl == 0) err0(NotInsideLoop); continueSeen = True; termiByBrL: nxtStmtRchbl = NonRchbl_Fwd; GetNxtTok(); goto checkSCol;# /* case DEFAULT: see case CASE */ case DO: manageLoop(DO); goto checkSCol; case ELSE: err0(MsngIF); begStmt1: GetNxtTok();tstLabL: labldStmt = isLabel();# goto begStmt /*~ BackBranch */; case FOR: GetNxtTok();' if (! Found(LPAR)) err0(LParExptd);= if (curTok.tok != SCOL) {commaExpr(); checkSideEffect();}C if (ignoreErr = False, !Found(SCOL)) {err0(SColExptd); skipTok( sColRParRBra);} manageLoop(FOR); break; case GOTO: { Tname labelName; TsemanElt *ptrId;( DefSem(notDefndLbl, Label, False);= if (NxtTok() != IDENT) {err0(IdExptd); goto errPanicL;}. labelName = storeLabelName(curTok.name); GetNxtTok();G if ((ptrId = searchSymTab(labelName)) == NULL) { /* new label */' ptrId = enterSymTab(labelName);# ptrId->infoS = notDefndLbl;" ptrId->defLineNb = lineNb;) ptrId->defFileName = curFileName;& ptrId->nstLvla = baseNstLvl();D if (curTok.tok == BCKBRCH) {errIlgDP(BCKBRCH); GetNxtTok();}/ if (condStmtLvl!=0 && fwdBrch!=ptrId) {I fwdBrch = (fwdBrch == NULL)? ptrId : QuasiNULLval(TsemanElt *); condStmtLvl++;}}) else /* already seen label */ if (ptrId->inner) {H errId(NonVisiLabel|Warn1|Rdbl, ptrId, labelName, NULL, NULL);} else if (ptrId->defnd) {> if (! Found(BCKBRCH)) err0(BackwdBranch|Warn1|Rdbl);E if (ptrId == bckBrch) {checkNotInitVar(); bckBrch = NULL;}} ptrId->used = True;" nxtStmtRchbl = NonRchbl_Jmp; goto checkSCol;} case IF: { Trchbl endIfBrnchRchbl;A bool ifBrnchBrkSeen, ifBrnchContSeen, oldBrkSeen = brkSeen,- oldContSeen = continueSeen, cstBoolExp; TcalcU boolExpVal; TmacLvl ifMacLvl = macLvl;! Tenvir oldEnvir = curEnvir;& cstBoolExp = prntzBoolExp("if"); boolExpVal = cExp.uVal; condStmtLvl++; curEnvir |= InsideIf; subStmt(False); curEnvir = oldEnvir; condStmtLvl--;$ endIfBrnchRchbl= nxtStmtRchbl; ifBrnchBrkSeen = brkSeen;% ifBrnchContSeen = continueSeen;. brkSeen = oldBrkSeen; /* back to */? continueSeen = oldContSeen; /* initial */: nxtStmtRchbl = Rchbl; /* values. */ if (curTok.tok == ELSE) {J if (macLvl < ifMacLvl) errWS(IllParenMacro|Warn3|PossErr, "else"); checkIndent(); condStmtLvl++;J lastElseLineNb = lineNb; /* prepare for "else if" on same line */ subStmt(False); condStmtLvl--;} if (cstBoolExp) { if (boolExpVal != 0) {) nxtStmtRchbl = endIfBrnchRchbl;# brkSeen = ifBrnchBrkSeen;+ continueSeen = ifBrnchContSeen;}} else {; if (endIfBrnchRchbl == Rchbl) nxtStmtRchbl = Rchbl;+ if (ifBrnchBrkSeen) brkSeen = True;3 if (ifBrnchContSeen) continueSeen = True;}} break;I case LBRA: GetNxtTok(); enterBlock(); block(); goto getNxtTokAndBreakL; case NOBRK:9 if (switchLvl == 0) err0(NotInsideSwitch|Warn2|Rdbl);D nxtStmtRchbl = NonRchbl_Fwd; /* to prevent 'MsngBrk' warning */getNxtTokAndBreakL: GetNxtTok(); break;P case RBRA: goto checkSCol; /* to avoid 'StmtExptd' error, i.e. after label */ case RETURN: retCount++;- if (NxtTok()==SCOL || curTok.tok==RBRA) {H if (curFctRetType!=NULL && curFctRetType->typeSort!=Void) errWSTT(B BadRetType|Warn3|PossErr, NULL, curFctRetType, &natTyp[_VOID]);}' else manageRetValue(curFctRetType); nxtStmtRchbl = NonRchbl_Jmp; goto checkSCol;3 case SCOL: goto checkSCol; /* empty statement */ case SWITCH: { TpcTypeElt switchType; GetNxtTok();) if (! Found(LPAR)) err0(LParExptd); commaExpr(); checkInit();O if ((switchType = cExp.type)!=NULL && !IsTypeSort(switchType, WhoEnum)) {9 errWSTT(IlgOpndType, "switch", switchType, NULL);! FreeExpType2(switchType); switchType = NULL;}8 if (cExp.rEvlbl) err0(CstSwitchExp|Warn2|PossErr);. else CheckNumCstNamed(cExp, switchType); cleanExprThings();) if (! Found(RPAR)) err0(RParExptd);; if (curTok.tok != LBRA) err0(ShdBeBlk|Warn1|PossErr); else {% TcaseElt *headCaseElt = NULL; uint nbCase = 0;<#define SizeValArray (size_t)NbElt(((TcaseElt *)0)->valCase)H TcalcS *lastPtrCase = &((TcaseElt *)0)->valCase[SizeValArray-1] + + 1; /* pointer just after last filled- element of last array (of values). */ bool oldBrkSeen;F bool firstTurn = True, deltaIndent = False, deltaISet = False;# Tenvir oldEnvir = curEnvir; checkIndent(); GetNxtTok(); switchLvl++; condStmtLvl++; enterBlock(); blockDecl(True); oldBrkSeen = brkSeen; brkSeen = False; curEnvir = InsideSw;P while (curTok.tok!=DEFAULT && curTok.tok!=RBRA && curTok.tok!=ENDPROG) {. if (curTok.tok==CASE || isLabel()) {# bool labelSeen = False; do {J if (curTok.tok == IDENT) {labelSeen = True; processLabel();} else {K if (!firstTurn && nxtStmtRchbl==Rchbl) err0(MsngBrk|Warn3| PossErr);" firstTurn = False;N if (spaceCount>=0 && indentIncr>0) { /* decide current switchB indentation (see dc.tstInd before changing that code !). */$ if (! deltaISet) {; if (spaceCount == nestLvl*indentIncr) {) deltaIndent = True;( deltaISet = True;}F else if (spaceCount == (nestLvl - 1)*indentIncr) { nestLvl--;) deltaISet = True;}}@ else nestLvl--; /* for 'case' to stick out */ checkIndent();, if (deltaISet) nestLvl++;} if (labelSeen) {- err0(MisplaLbl|Warn1|Rdbl);% labelSeen = False;} GetNxtTok(); { bool w;+ if (((switchType == NULL)M ? (w = correctExprN(NoFreeExpType, WhoEnum, True, "case",- True), switchType = cExp.type, w)J : correctExprN(switchType, switchType->typeSort /* non4 Void */, True, "case", True)) && !cExp.errEvl) {> /* Search if case constant already seen */% TcaseElt *curBlk;G for (curBlk = headCaseElt; curBlk != NULL; curBlk = curBlk->next) {3 TcalcS *ptrCase, *endPtrCase;P for (ptrCase = &curBlk->valCase[0], endPtrCase = ptrCase +2 NbElt(curBlk->valCase); ptrCase!=endPtrCase &&& ptrCase!=lastPtrCase; ) {6 if (*ptrCase++ == cExp.sVal) {8 paramTxt = longToS(cExp.sVal);0 err1(AlrdUsedCaseVal);- goto endSearchL;}}}! /* Note it */P if (lastPtrCase > &headCaseElt->valCase[SizeValArray - 1]) {. /* Current array full */#undef SizeValArray8 TcaseElt *newBlk = allocCaseElt();1 newBlk->next = headCaseElt;+ headCaseElt = newBlk;9 lastPtrCase = &newBlk->valCase[0];}/ *lastPtrCase++ = cExp.sVal; nbCase++;endSearchL: ;}}O nxtStmtRchbl = NonRchbl_Fwd;} /* to prevent multiple 'MsngBrk' errors. */1 if (! Found(COLON)) err0(ColExptd);4 } while (curTok.tok==CASE || isLabel());H nxtStmtRchbl = Rchbl;} /* to prevent 'UnreachStmt' error */L if (firstTurn) {err0(CaseExptd|Warn3|PossErr); firstTurn = False;}, if (curTok.tok != DEFAULT) stmt(); else err0(StmtExptd);}5 if (firstTurn) err0(CaseExptd|Warn3|PossErr); curEnvir = oldEnvir; { uint nbEnumCst = 0;? if (switchType!=NULL && switchType->typeSort==Enum) {H /* Compute number of enum constants with differing values */P if (switchType->tagId == NULL) nbEnumCst = UCHAR_MAX + 1; /* char */5 else if (switchType->frstEnumCst!=NULL) {> register TsemanElt *w = switchType->frstEnumCst;, TenumCst precVal = w->enumVal; nbEnumCst++;3 while ((w = w->nxtEnumCst) != NULL) {@ if (w->enumVal != precVal) {precVal = w->enumVal ; nbEnumCst++;}}}}M if (curTok.tok == DEFAULT) { /* real 'default' token, or NoDefault d-pragma. */) uint savCurVal = curTok.hCod; if (! firstTurn) {K if (nxtStmtRchbl==Rchbl && savCurVal!=0) err0(MsngBrk|Warn3| PossErr); nestLvl--; checkIndent(); nestLvl++;} GetNxtTok();? if (savCurVal != 0) { /* not NoDefault d-pragma */1 if (! Found(COLON)) err0(ColExptd);+ if (curTok.tok == FULLENUM) {G if (nbCase != nbEnumCst) err0(WrngFullEnum|Warn1|Rdbl); GetNxtTok();}# nxtStmtRchbl = Rchbl; stmt();F while (curTok.tok!=RBRA && curTok.tok!=ENDPROG) stmt();}, else { /* NoDefault d-pragma */E if (nbCase == nbEnumCst) err0(UslNoDefault|Warn1|Rdbl);c brkSeen = True;}}g) else if (nbCase != nbEnumCst) {h? if (brkSeen) err0(DefaultExptd|Warn1|Rdbl|PossErr); brkSeen = True;}}"& /* Free case constants list */M while (headCaseElt != NULL) {headCaseElt = freeCaseElt(headCaseElt);} ! FreeExpType1(switchType);t switchLvl--; condStmtLvl--;# if (deltaIndent) nestLvl--;T exitBlock(); checkIndent();* if (!Found(RBRA)) err0(RBraExptd);* if (brkSeen) nxtStmtRchbl = Rchbl; brkSeen = oldBrkSeen;} break;}S case WHILE:f manageLoop(WHILE); break;& default: /* label or expression */ E if (labldStmt) {processLabel(); goto begStmt1 /*~ BackBranch */;}*! if (blockDecl(False)) return;  /* Else expression */r< cExp.topOper = SCOL; /* to get 'StmtExptd' error msg */ commaExpr(); checkSideEffect(); checkSCol: lastSCOLline = lineNb; ignoreErr = False; if (Found(SCOL)) return; err0(SColExptd); errPanicL:$ skipTok(tokToBeSkpd[curEnvir]);}}aP/******************************************************************************/P/* UTILITIES */P/******************************************************************************/4static AllocXElt(allocCaseElt, TcaseElt *, ctrCE, ;)%static TlineNb frstBadIndentLine = 0;Cstatic bool scndMsgFl = False;!static void initCheckIndent(void)t{v frstBadIndentLine = 0; scndMsgFl = False;}Bvoid checkIndent(void){c ignoreErr = False;L if (spaceCount>=0 /* beginning of line */ && (indentIncr>0 || indentIncr<0F && nestLvl==0) && !headerFile /* because of remanent effect of 'scndMsg' */) { static Tstring savFileName;R- if (spaceCount != nestLvl * indentIncr) {# if (frstBadIndentLine == 0) {{ TnbBuf buf1, buf2;% bufLongToS(spaceCount, buf1);T" bufLongToS(nestLvl, buf2);M errWSSSS(BadIndent | Warn1, buf1, buf2, longToS((indentIncr < 0)? 0 :  indentIncr), NULL);;" savFileName = curFileName;$ frstBadIndentLine = lineNb;} else scndMsgFl = True;}t else { if (scndMsgFl) {K errWSS((curFileName == savFileName)? BadIndent1|Warn1 : BadIndent2|; Warn1, longToS((long)frstBadIndentLine), savFileName);m scndMsgFl = False;}c frstBadIndentLine = 0;}M= spaceCount = SpaceCntNoBegLine;} /* because of macros */*} (/*~Undef frstBadIndentLine, scndMsgFl */!static void checkNotInitVar(void)e{  if (--loopLvl == 0) {c$ while (notInitVarList != NULL) {D if (! notInitVarList->ptrId->initlz) errInit1(notInitVarList);; notInitVarList = freeNotInitVarElt(notInitVarList);}}m}o7void checkNotInitVarAndSuppress(const TsemanElt *ptrId)a{FI TnotInitVar *cur = notInitVarList, *prec = (TnotInitVar * /*~OddCast*/) ; ((ubyte *)¬InitVarList - Offset(TnotInitVar, prec));i do { if (cur->ptrId == ptrId) {. if (! cur->ptrId->initlz) errInit1(cur);* prec->prec = freeNotInitVarElt(cur); return;} prec = cur;N& } while ((cur = cur->prec) != NULL);}lIvoid errInit(TsemanElt *ptrId, TlineNb line, Tstring file, bool initDPFl)u{t3 Tstring cmpl = (initDPFl)? errTxt[InitDP] : NULL;=M if (file == NULL) errWNSS(NotInit|Warn3|PossErr, ptrId->nameb, cmpl, NULL); O else errWFName(NotInit1|Warn3|PossErr, line, file, ptrId->nameb, cmpl, NULL);b if (ptrId->initBefUsd) {1 errWN(IlgInitBU|Warn2|PossErr, ptrId->nameb);rB ptrId->initBefUsd = False;} /* to prevent further messages */: ptrId->initlz = True; /* to prevent further messages */}y$static void errInit1(TnotInitVar *x){;9 errInit(x->ptrId, x->lineNb, x->fileName, x->initDPFl);}*8static FreeXElt(freeCaseElt, TcaseElt *, ctrCE, ;, next)Astatic FreeXElt(freeNotInitVarElt, TnotInitVar *, ctrNI, ;, prec)Rvoid initInst(void) {a initCheckIndent();}Astatic bool isLabel(void)D{G int w;L return curTok.tok==IDENT && (w=nxtCharOrMacTok(), w==(int)':' || w==-(int) COLON);}*%static void manageLoop(Ttok loopSort)*{- bool infiniteLoop, oldContSeen, oldBrkSeen; J if (loopLvl++ /* incremented here because of 'UnusedVar' warning */ == 0G ) initialLoopCondLvl = condStmtLvl; /* for case "int i; ifU4 (i==..)" => immediate 'NotInit' warning. */ if (loopSort != DO) {f if (loopSort == FOR) { infiniteLoop = True;H if (curTok.tok != SCOL) { /* there exist a (continuation) test */ commaExpr();C if (!boolExp("for") || cExp.uVal==0) infiniteLoop = False;} E if (ignoreErr = False, !Found(SCOL)) {err0(SColExptd); skipTok(  sColRParRBra);}}> else infiniteLoop = prntzBoolExp("while") && cExp.uVal!=0; if (! infiniteLoop) {e< condStmtLvl++; /* for case "i=0; for (..;..;..) i=1;"& => no 'UnusedVar1' warning. */: if (loopLvl == 1) initialLoopCondLvl = condStmtLvl;} if (loopSort == FOR) { if (curTok.tok != RPAR) {N condStmtLvl++; /* force delayed check of initialization for variablesB appearing in 3rd expression, and no 'UnusedVar1' check. */ commaExpr(); checkSideEffect(); condStmtLvl--;}d0 if (curTok.tok != RPAR) err0(RParExptd);}} oldBrkSeen = brkSeen; brkSeen = False; oldContSeen = continueSeen;m continueSeen = False;k loopStmtLvl++; if (loopSort == DO) {  subStmt(True);. if (curTok.tok != WHILE) err0(WhileExptd);L else if (spaceCount>=0 && indentIncr>0 && spaceCount<=nestLvl*indentIncr- ) err0(DWhileNotLinedUp | Warn1);a8 infiniteLoop = (prntzBoolExp("do") && cExp.uVal!=0);P if (curTok.tok==RPAR /* for nicer following error messages */) GetNxtTok();} else { subStmt(False);o' if (! infiniteLoop) condStmtLvl--;}o loopStmtLvl--; checkNotInitVar();$ if (brkSeen) nxtStmtRchbl = Rchbl;5 else if (infiniteLoop) nxtStmtRchbl = NonRchbl_Jmp;n. else if (continueSeen) nxtStmtRchbl = Rchbl; brkSeen = oldBrkSeen;= continueSeen = oldContSeen; }E)static bool prntzBoolExp(Tstring operTxt) =/* Returns True if boolean expression correct and constant */o{t bool res;a8 if (curTok.tok!=SCOL && curTok.tok!=RBRA) GetNxtTok();L if (! Found(LPAR)) err0(LParExptd); /* done that way (instead of checkingI afterwards cExp.topOper) in order to get clearer error message. */ commaExpr(); res = boolExp(operTxt);c* if (curTok.tok != RPAR) err0(RParExptd); return res;N}ostatic void processLabel(void){e0 Tname labelName = storeLabelName(curTok.name); TsemanElt *ptrId;( GetNxtTok(); /* COLON */C if ((ptrId = searchSymTab(labelName)) == NULL) { /* new label */f" DefSem(defndLbl, Label, True);# ptrId = enterSymTab(labelName);k ptrId->infoS = defndLbl; if (bckBrch == NULL) {O if (loopLvl++ == 0) initialLoopCondLvl = condStmtLvl; /* backward branchS => probable loop. */ bckBrch = ptrId;}}K else if (ptrId->defnd) {errId(AlrdDefLabel, ptrId, labelName, NULL, NULL). ; return;} else {G if (ptrId->nstLvladefnd = True;P if (ptrId == fwdBrch) {fwdBrch = NULL; condStmtLvl--;}} /* end goto reach */7 ptrId->defLineNb = lineNb; /* record */u= ptrId->defFileName = curFileName; /* birth place. */ ptrId->nstLvla = baseNstLvl();} #static void subStmt(bool blockSeen)LN/* Detects if more than one statement on same line after an 'if'/'else'/loop.L In case "if (...) Macro" => warning if more than one statement in Macro;I "if (...) stmt;" as macro body, no warning when macro called;p2 "if (...) stmt1; \NL stmt2" => no warning. */{c bool incrSubStmt = False;  begMacExpNb = curMacExpNb;F if (1curTok.tok==RPAR || blockSeen || lastElseLineNb!=0) /* for nicer4 following error messages */ GetNxtTok(); if (curTok.tok == SCOL) {r" err0(EmptyStmt|Warn2|PossErr);J goto setBlockSeen;} /* to prevent possible 'BlockQM' error message */ if (curTok.tok == LBRA)U setBlockSeen:  blockSeen = True;m2 while (isLabel()) {processLabel(); GetNxtTok();}M if (! (curTok.tok==LBRA && (spaceCount<0 || spaceCount==nestLvl*indentIncr)t4 || curTok.tok==IF && lastElseLineNb==lineNb)) { /* Force indentation */n nestLvl++; incrSubStmt = True;} lastElseLineNb = 0; stmt();c if ( !blockSeen9 && lineNb==lastSCOLline /* no newline after ';' */BL && curTok.tok!=RBRA && curTok.tok!=ELSE && curTok.tok!=CASE && curTok. tok!=DEFAULT && nxtStmtRchbl==RchblO && curMacExpNb>=begMacExpNb /* inside same or higher macro level than atv& beginning of statement. */) { err0(BlockQM|Warn2|PossErr);< begMacExpNb = UINT_MAX;} /* to prevent further error */ if (incrSubStmt) nestLvl--; }/* End DCINST.C */*[DCC_DISTRIB.SRC]DCINST.H;43+,^C./( 4:-"0123KPWO56`!t7aUS89G(HJ/* DCINST.H */(/* Y.L. Noyelle, Supelec, France 1996 */#ifndef DCINST_H#define DCINST_H#include "dc.th"(typedef struct _TnotInitVar TnotInitVar;#extern TnotInitVar *notInitVarList;/* Functions profiles */extern void checkIndent(void);:extern void checkNotInitVarAndSuppress(const TsemanElt *);%extern void enterFctBody(TpcTypeElt);#endif /* ifndef DCINST_H *//* End DCINST.H */*[DCC_DISTRIB.SRC]DCINST.PH;16+,./( 4L-"0123KPWO56@:Y7IS89G(HJ/* DCINST.PH */(/* Y.L. Noyelle, Supelec, France 1998 */#ifndef DCINST_PH#define DCINST_PH#include "dcinst.h"Ltypedef enum {NonRchbl_Jmp=-1 /* so that Rchbl==0, for efficiency */, Rchbl, NonRchbl_Fwd} Trchbl;struct _TnotInitVar { TsemanElt *ptrId; TnotInitVar *prec; TlineNb lineNb; Tstring fileName; bool initDPFl;};/* Functions profiles */9extern void errInit(TsemanElt *, TlineNb, Tstring, bool);extern void initInst(void);/* External objects */5extern uint condStmtLvl, initialLoopCondLvl, loopLvl;=extern Trchbl nxtStmtRchbl; /* next statement reachable ? */#endif /* ifndef DCINST_PH *//* End DCINST.PH */*[DCC_DISTRIB.SRC]DCMAIN.C;213+,t.u/( 4cus-"0123KPWOv56@h7AS89G(HJ/* DCMAIN.C */(/* Y.L. Noyelle, Supelec, France 1998 */L/* Manages command line, source files, character input/output, and errors */#include #include #include #include #ifdef VMS9# define _POSIX_C_SOURCE 0 /* for "fileno" function */# include # include # undef _POSIX_C_SOURCE#elif defined _MSC_VER/*# include # define isatty _isatty# define fileno _fileno*/# define _POSIX_# include # include # undef _POSIX_#elif defined __hpux# define _INCLUDE_POSIX_SOURCE# include # include # undef _INCLUDE_POSIX_SOURCE#else# include # include #endif#include "dcmain.h"#include "dcmain.ph"#include "dcblk.h"#include "dcblk.ph"#include "dcdecl.h"#include "dcdecl.ph"#include "dcdir.h"#include "dcdir.ph"#include "dcexp.ph"#include "dcext.h"#include "dcext.ph"#include "dcinst.ph"#include "dcprag.ph"#include "dcrec.h"#include "dcrec.ph"#include "dcrecdir.ph" #ifdef VMSc# pragma noinline (changeStreamTo, copyDirPrefix, dispUsg, errExit, fileErr, fmtdMsg, foundOption)9# pragma noinline (getNxtFName, intrnErr, nxtChunkOfTxt)F# pragma noinline (mngOptListTok, mngOptMsgLimit, mngOptStopAfterMsg)"# pragma noinline (mngOptVerbose)A# pragma noinline (searchNxtNL, storeDMacTxt, waitAndAnalAnswer)#endif+#define ComputeFileHCode(x) { \& ThCode fileHCode = 0; \ \I {register const char *p = x;; while (*p != '\0') {fileHCode += \$ (ThCode)RealChar(*p); p++;}}#define CSuffix ".c";#define DccOptPref "+z" /* could be "-z", just the same */#define DccSymbol "__dcc"#define DefineStr "define "#define DfltOptVal -1 #ifdef VMS#define DDOpt "/def="#define DIOpt "/incl="#define DUOpt "/undef="#else#define DDOpt "-D"#define DIOpt "-I"#define DUOpt "-U"#endif-#define EmptyDirName ((const TdirAtom *)"\0")'#define FinishSrcFile() { \P free(curSourceMngtBlk); /* do not free curFileName, because name may still \4 be used (i.e. in a 'NotUsed' warning). */ \6 lineNb = 0; /* indicates "no valid source line" */}#define IdentHeaderSpace " "O/*~ zif LitLen(IdentHeaderSpace) != LgtHdrId "Bad 'IdentHeaderSpace' string" */#define LgtD(x) (size_t)*x #define LimChar (1<hCode && (StrEq(fileName, ptr->amendFName) || x)) {#define SeparPattern "+"=#define SizeBufDef (509) + 1 /* cf C standard, plus EndCh */M#define SizeSourceBuffer (NbSrcLinesKept*(LineSize + TransfSize) + 1 + 1 + 1):#define TxtOptions "'" DDOpt "', '" DUOpt "', '" DIOpt "'"#define UndefStr "undef "typedef FILE *Stream;typedef ubyte TdirAtom;!typedef const TdirAtom *TdirName;typedef struct { ThCode hCode; bool noLoadSysFile; Tstring amendFName; Tstring adjFName; } TadjFilesS;typedef struct { Stream sourceStream;7 char *ptrS, *oldMaxPtrS, *posEndChP1, *nxtPosEndChP1; TlineNb lineNb;< char idPlusSource[LgtHdrId + MaxLgtId + SizeSourceBuffer];} TsourceMngtBlk;(typedef struct _TinclStkElt TinclStkElt;struct _TinclStkElt { TsourceMngtBlk *sourceMngtBlk; TmngtPriv *listPriv; Tstring fileName; struct { bool _hdrFilPerSe:1; bool _sysHdrFile:1; bool _diffLc:1;0 signed int _indentIncra:INT_BIT - 1 - 1 - 1; } inclInfo; TinclStkElt *prec;};:/*~zif sizeof(((TinclStkElt *)0)->inclInfo) != sizeof(int)- "Bad structure for 'inclInfo'" */)#define hdrFilPerSe inclInfo._hdrFilPerSe%#define sHdrFile inclInfo._sysHdrFile #define diffLc inclInfo._diffLc)#define indentIncra inclInfo._indentIncra/* Function profiles */Jstatic TinclStkElt *allocInclStkElt(void), *freeInclStkElt(TinclStkElt *);Estatic char *manageEndInclude(void), *searchNxtNL(char *, ptrdiff_t);-/****static char *trigraph(char *, char *);*/Ostatic void changeStreamTo(Stream), checks(void), dispUsg(void), emitCstWdthCh(J const char *, const char *), emitC(char), errExit(Terr, const Tstring *)K /*~NeverReturns*/, fileErr(Tstring) /*~NeverReturns*/, flushAndExit(void)P /*~NeverReturns*/, fmtdMsg(Terr n, const Tstring *parArr), initAdjFiles(void),J initAll(void), initEmitC(void), initErr(void), initMain(void), intrnErr(, Tstring, uint *), openSourceFile(Tstring),C processCUnit(Tstring, bool), prmtrzMsg(Tstring, const Tstring *),) resetArgPtr(void), storeDMacTxt(Tchar);Pstatic void mngOptListTok(void), mngOptMsgLimit(void), mngOptStopAfterMsg(void), mngOptVerbose(void);?static bool foundOption(Tstring, bool *), isDccOption(Tstring),G isHeaderFile(Tstring), isSrcFName(Tstring), openSourceFile1(Tstring),* waitAndAnalAnswer(void) /*~PseudoVoid*/;/static TdirName copyDirPrefix(Tstring, size_t);static Tstring getNxtArg(void); #ifdef LcEqUc:static bool sameLowerCaseName(const char *, const char *);#endif/* Global variables */static TadjFilesS *adjFilesArr;5static Tstring adjFilesList, sysInclDir = SysInclDir;$static const Tstring *argvg, *argv1;Jstatic bool callCompil = True, callCompilSeen = False, callCompilW = True,M chkIndent = True, emitTrailer = True, errSeen = False, notCompiled = False, warnSeen = False;Bstatic bool chkPossErr = True; /* check various possible errors */3static bool chkRdbl = True; /* check readability */*static TstringNC copDfltArgs, dfltArgsPtr;static uint ctrdI;Bstatic uint ctrISE = 0; /* number of '#include' stack elements */static uint ctrErr, ctrWarn;Fstatic ulong cumNbLines = 0; /* cumulated number of lines processed */(static TsourceMngtBlk *curSourceMngtBlk;Hstatic int deltaPtrS = 0; /* device to limit size of loaded chunk while- searching next NL (cf searchNxtNL()). */Pstatic TdirName *dirArray; /* array of directory prefixes for 'include' files */0static char *endSBuf; /* end of source buffer */static Tstring dfltArgs;!static bool givAlwsFName = False;Mstatic bool hdrFilePerSe = False; /* True if current file has a '.xhx' name,4 and is not included with a ComposingHdr d-pragma.7 Do not forget that "normal" files included in header6 files are considered as header files themselves. */Kstatic int hfpsCtrM1 = -1; /* count (-1) of real header files in 'include' stack. */0static uint initMsgLimit = DefaultMessagesLimit;$static bool initStopAfterMsg = True;static bool interactivOutptDev; static bool initVerbose = False;$static Tstring lastTrtdFName = NULL;8static size_t lgtCmdBuf; /* length of command buffer */Bstatic size_t lgtLastTokBuf; /* length of "last tokens" buffer */static bool moreInfMsg = False;static bool msgLimitFl = False;static uint msgLimit;static char *nxtPosEndChP1;Gstatic char *oldMaxPtrS; /* end of logical (circular) source buffer */$static int optionValue = DfltOptVal;static Stream outputStream;static bool ovfldTokBuf;static CreateParArr(1);Bstatic char *pLastTokBuf, /* pointer inside last tokens buffer */ *begLastTokBuf = NULL, *endLastTokBuf;'static Tchar *pStoDMacTxt, *endDMacBuf;'static TinclStkElt *pT*~DCC.BCKt"[DCC_DISTRIB.SRC]DCMAIN.C;213cu|opInclStk = NULL;static bool screenMsg;static Stream sourceStream;Kstatic int spaceAtEndOfLine; /* number of remaining character slots at end4 of current line (see 'emitC' function). */static bool stopAfterMsg;,static size_t usedSizAdjArr, totalSizAdjArr;static bool warnFl = True;static bool wrapFl = True;:static const Ttok zSCol[] = {NoSwallowTok, SCOL, EndSTok};/* External variables */Achar *begSBuf; /* beginning of source buffer (circular buffer) */bool fileClosed;Bchar *nlPosP1; /* 1 + position of last seen 'newline' character */Nchar *posEndChP1; /* 1 + position of EndCh character indicating end of current text chunk. */int tabSpacing = 0;'int main(int argc, const Tstring *argv){< Tstring lastFName = NULL, lastCUFName = NULL, starterFile;' bool argErrFl = False, usgFl = False; outputStream = SUMMARY_STREAM; initEmitC(); argvg = argv; if (argc == 1) dispUsg(); else {= interactivOutptDev = isatty(fileno(MAIN_OUT_STREAM)) > 0; { TstringNC w, w1; Tstring dccDir = DccDir;7 if ((w = getenv("DCCFILES"))!=NULL && *w!='\0') {, MyAlloc(dccDir = w1, strlen(w) + 1); strcpy(w1, w);J if ((w = strchr(w1, ' ')) != NULL) {*w++ = '\0'; sysInclDir = w;}}K MyAlloc(starterFile = w, strlen(dccDir) + (LitLen(StarterFile) + 1)); strcpy(w, dccDir); strcat(w, StarterFile);P MyAlloc(adjFilesList = w, strlen(dccDir) + (LitLen(AdjustFilesList) + 1)); strcpy(w, dccDir);" strcat(w, AdjustFilesList);}? if ((dfltArgs = getenv("DCCDFLTS")) == NULL) dfltArgs = "";/ MyAlloc(copDfltArgs, strlen(dfltArgs) + 1);O /* Search position of last file name in command line, so that it is proces-M sed with all indicated options, even ones met after that file name. */ { Tstring w; resetArgPtr();J while ((w = getNxtArg()) != NULL) if (isSrcFName(w)) lastFName = w;}IrescanOptL: /* back here if more than one compilation unit to process */ initAll();/ getTokLvl = 1; /* don't keep tokens yet */ mngOptListTok(); mngOptMsgLimit(); mngOptVerbose();> mngOptStopAfterMsg(); /* to come after mngOptVerbose() */ enterBlock(); openSourceFile(starterFile); dollAlwdInId = True; prog(); FinishSrcFile()L initAdjFiles(); /* here, because uses symbol defined in starter file */M cUnitFName = curFileName = ""; /* for -D, -U options processing (call to4 'manageDir', which may note these values). */. getTokLvl = 0; /* start keeping tokens */ { Tstring arg; resetArgPtr();. ctrdI = 0; /* number of '-I' options */4 lgtCmdBuf = 0; /* length of command buffer */+ while ((arg = getNxtArg()) != NULL) { if (isDccOption(arg)) {$ static bool tabFl = False; parArr1[1] = arg;0 if (foundOption("ac", &askConstFl)) {}3 else if (foundOption("ae", &allErrFl)) {}8 else if (foundOption("afn", &givAlwsFName)) {}2 else if (foundOption("bo", &chkBool)) {}5 else if (foundOption("cc", &callCompil)) {}6 else if (foundOption("ctn", &chkTypName)) {}6 else if (foundOption("cw", &callCompilW)) {}: else if (foundOption("epl", &chkEmptParList)) {}8 else if (foundOption("frt", &chkFctRetTyp)) {}6 else if (foundOption("inc", &chkInclPos)) {}5 else if (foundOption("ind", &chkIndent)) {}1 else if (foundOption("lt", &listTok)) {F if (optionValue >= MaxLgtId + 1) {lgtLastTokBuf = (size_t)- optionValue; optionValue = DfltOptVal;}J else lgtLastTokBuf = LineSize - LitLen(Dots) - (strlen(errTxt[; LastToks]) - 1); /* so that just one line used */ mngOptListTok();}> else if (foundOption("mcc", &verifAllPtrForConst)) {8 if (verifAllPtrForConst) askConstFl = True;}< else if (foundOption("mic", &moreIndexTypeChk)) {}5 else if (foundOption("msg", &msgLimitFl)) {# if (optionValue >= 0) {/ initMsgLimit = (uint)optionValue;( optionValue = DfltOptVal;} mngOptMsgLimit();}3 else if (foundOption("nui", &warnNUI)) {}3 else if (foundOption("nup", &warnNUP)) {}1 else if (foundOption("nw", &noWarn)) {}5 else if (foundOption("pe", &chkPossErr)) {}: else if (foundOption("pnt", &chkNmdTypParFl)) {}4 else if (foundOption("po", &chkPortbl)) {}2 else if (foundOption("rd", &chkRdbl)) {}9 else if (foundOption("sam", &initStopAfterMsg))! mngOptStopAfterMsg();4 else if (foundOption("sy", &printStat)) {}0 else if (foundOption("tab", &tabFl)) {" if (optionValue > 0) {' tabSpacing = optionValue;) optionValue = DfltOptVal;}}6 else if (foundOption("tr", &emitTrailer)) {}4 else if (foundOption("uc", &chkNumCst)) {}0 else if (foundOption("usg", &usgFl)) {3 if (usgFl) {dispUsg(); usgFl = False;}}C else if (foundOption("ve", &moreInfMsg)) mngOptVerbose();E else if (foundOption("vve", &initVerbose)) mngOptVerbose();1 else if (foundOption("wa", &warnFl)) {}1 else if (foundOption("wr", &wrapFl)) {} else {D if (lastTrtdFName == NULL) fmtdMsg(UnknOption, parArr1); argErrFl = True;}* if (optionValue != DfltOptVal) {F if (lastTrtdFName == NULL) fmtdMsg(IgndCharsOpt, parArr1);% optionValue = DfltOptVal; argErrFl = True;}L /* Take option into account immediatly, because -D, -U, -I options& management may create errors. */F screenMsg = !(allErrFl | chkEmptParList | moreIndexTypeChk |7 chkNmdTypParFl) & askConstFl & chkBool & callCompil &2 chkFctRetTyp & chkInclPos & warnNUI & warnNUP &0 chkPossErr & chkPortbl & chkRdbl & chkNumCst;} else { int dOptionSeen;O if (strncmp(arg, DIOpt, LitLen(DIOpt)) == 0) ctrdI++; /* count number of '-I' options. */K else if ((dOptionSeen = strncmp(arg, DDOpt, LitLen(DDOpt)))==0 ||B strncmp(arg, DUOpt, LitLen(DUOpt))==0) { /* '-D/-U' option */9 for (;;) { /* only there to avoid 'goto's */5 Tchar bufDef[SizeBufDef + LgtHdrId], c;( register Tstring ptrInArg;% if (dOptionSeen == 0) {I strncpy(&bufDef[LgtHdrId], DefineStr, LitLen(DefineStr));C pStoDMacTxt = &bufDef[LitLen(DefineStr) + LgtHdrId] /*~LocalAdr*/;2 ptrInArg = &(arg)[LitLen(DDOpt)];} else {G strncpy(&bufDef[LgtHdrId], UndefStr, LitLen(UndefStr));B pStoDMacTxt = &bufDef[LitLen(UndefStr) + LgtHdrId] /*~LocalAdr*/;2 ptrInArg = &(arg)[LitLen(DUOpt)];}E endDMacBuf = &bufDef[0] + sizeof(bufDef) /*~LocalAdr*/;Q while (c = *ptrInArg++, isAlfa(c)) storeDMacTxt(c); /* store macro name. */% if (dOptionSeen == 0) {" storeDMacTxt(' ');P if (c == '\0') storeDMacTxt('1');/* "1" is default macro text */K else if (c != '=') {errWS(BadDOption | Warn2, arg); break;}- else { /* copy macro body */F while ((c = *ptrInArg++) != '\0') storeDMacTxt(c);}}J else if (c != '\0') {errWS(BadDOption | Warn2, arg); break;}" storeDMacTxt(EndCh);D posEndChP1 = NULL; /* previous EndCh = end of text */O if (endDMacBuf == NULL /* buffer overflow */) {errWS(BadDOption | Warn2, arg); break;} dirLineFl = True;7 srcPtr = &bufDef[LgtHdrId] /*~LocalAdr*/;H /* Prepare to print pseudo source line in case of error *// bufDef[LgtHdrId - 1 - 1] = EndCh;* bufDef[LgtHdrId - 1] = '\n'; nlPosP1 = srcPtr;1 begSBuf = &bufDef[0] /*~LocalAdr*/;@ oldMaxPtrS = &bufDef[NbElt(bufDef)] /*~LocalAdr*/; manageDir(); RestoSmshCh; break;}}P lgtCmdBuf += strlen(arg) + 1; /* +1 because of separating space; use-; less for already processed compilation units names. */ if (isSrcFName(arg)) {P if (arg == lastFName) lastCUFName = lastFName; /* for last compila-/ tion unit, take also into account( possible following options. */H else if (lastTrtdFName != NULL) { /* skip already processed compilation units. */e> if (arg == lastTrtdFName) lastTrtdFName = NULL;}6 else { /* process new compilation unit */' processCUnit(arg, False);e" lastTrtdFName = arg;J changeStreamTo(MAIN_OUT_STREAM); /* separating pattern more useful there. */ {X int i;C for (i = 0; i < LineSize/LitLen(SeparPattern); i++)f& emitS(SeparPattern); emitC('\n');}- changeStreamTo(SUMMARY_STREAM);c2 goto rescanOptL /*~BackBranch*/;}}}}( processCUnit(lastCUFName, True);}} changeStreamTo(NULL);e$ if (argErrFl) return EXIT_ERRORS2; return (errSeen) ? (callCompilSeen) ? EXIT_ERRORS2 : EXIT_ERRORS1 : (warnSeen) ? (notCompiled)c ? EXIT_WARNINGS2 : EXIT_WARNINGS1 : EXIT_SUCCESS;.};static void processCUnit(Tstring cUFName, bool lastFNameFl)n{tJ TdirName *ptrDirArray; /* pointer in array of directories for 'include' files. */ char *cmdBuf, *ptrCmdBuf; register Tstring arg;O bool fNameSeen = False;m /* Get compiler name */  {i TlitString w;F static char locBuf[] = IdentHeaderSpace DccSymbol ";"; /* ';' for& getLitString() workings. */5 getTokLvl = 1; /* prevent tokens from showing */  srcPtr = &locBuf[LgtHdrId];hH if (NxtTok()!=CSTST || (w = getLitString(), srcPtr != &locBuf[NbElt(- locBuf) - 1])) errExit(BadUUdcc, NULL);f" lgtCmdBuf += initGetStrLit(w); getTokLvl = 0; RestoSmshCh;} @ /* Allocate array of directory prefixes for 'include' files */M MyAlloc(dirArray, (ctrdI + 1 + 1 + 1)*sizeof(*dirArray)); /* +3 because ofdB compilUnitFile directory, SysInclDir, and ending NULL. */D /* Allocate compile command buffer (to be passed to system via the 'system' function). */  MyAlloc(cmdBuf, lgtCmdBuf);  ptrCmdBuf = cmdBuf;aP while ((*ptrCmdBuf++ = getNxtStrLitChar()) != '\0') {} /* put compiler name *// exitBlock(); /* because of getLitString() */l ptrCmdBuf--; ptrDirArray = dirArray + 1;i cUnitFName = NULL; resetArgPtr();' while ((arg = getNxtArg()) != NULL) {n# if (isDccOption(arg)) continue; A if (strncmp(arg, DIOpt, LitLen(DIOpt)) == 0) *ptrDirArray++ =B copyDirPrefix(arg + LitLen(DIOpt), strlen(arg + LitLen(DIOpt)));I else if (strncmp(arg, DDOpt, LitLen(DDOpt))==0 || strncmp(arg, DUOpt,(I LitLen(DUOpt))==0) {} /* '-D'/'-U' option already taken care of */ & else { /* file name by default */ fNameSeen = True;j if (arg != cUFName) { D if (isSrcFName(arg)) continue;} /* ignore already processed& compilation unit name. */ else { Tstring begOfFName;u size_t lgtPath;t #ifdef VMS size_t posVersNb;r#endif# begOfFName = skipPath(arg);)- lgtPath = (size_t)(begOfFName - arg);,A *dirArray = (lgtPath != 0)? copyDirPrefix(arg, lgtPath) :I &EmptyDirName[0];t #ifdef VMS {rL /* Add '.c' type suffix if none; remove possible version number in 'stripped' name. */nE size_t suffLgt = (strchr(begOfFName, '.') == NULL)? LitLen(;- CSuffix) /* no type suffix */ : 0;o Tstring w; TstringNC wm;u? posVersNb = (((w = strchr(begOfFName, ';')) == NULL)?4 strlen(begOfFName) : (size_t)(w - begOfFName));H MyAlloc(cUnitFName = wm, strlen(arg) + (LitLen(CSuffix) + 1));0 strncpy(wm, arg, lgtPath + posVersNb);F if (suffLgt != 0) strcpy(wm + lgtPath + posVersNb, CSuffix);A strcpy(wm + lgtPath + posVersNb + suffLgt, begOfFName +;- posVersNb); /* add version number */o posVersNb += suffLgt;d7 MyAlloc(strpdCUnitFName = wm, posVersNb + 1);n7 strncpy(wm, cUnitFName + lgtPath, posVersNb);$ *(wm + posVersNb) = '\0';}#elsee cUnitFName = arg;r% strpdCUnitFName = begOfFName;T#endif }}/ /* Add argument to compiler command line *// *ptrCmdBuf++ = ' '; /* separating space */(. while (*arg!= '\0') *ptrCmdBuf++ = *arg++;1 if (cUnitFName!=NULL && !lastFNameFl) break;}r& *ptrCmdBuf = '\0'; /* ending NUL */M if (!fNameSeen || cUnitFName==NULL && !callCompil) errExit(NoCUName, NULL);rA *ptrDirArray++ = copyDirPrefix(sysInclDir, strlen(sysInclDir));u *ptrDirArray = NULL;O if (cUnitFName != NULL) { /* if something to compile, do not skip to link */t8 if (tabSpacing == 0) tabSpacing = DefaultTabSpacing;# if(! chkIndent) indentIncr = 0;o dollAlwdInId = False;sJ mskBool = (chkBool)? (boolTypeElt.typeSort = boolCstTypeElt.typeSort =@ Bool, Bool|BoolOpnd) : (boolTypeElt.typeSort = boolCstTypeElt.4 typeSort = Int, NumEnumBool|PtrPoss|BoolOpnd);L cumDeltaLineNb = 0; cumNbSkippedLines = 0; /* may have been modified by& 'starter' or 'initAdj' files. */ openSourceFile(cUnitFName);)E if (isHeaderFile(cUnitFName)) {cumNbLines = 1; errWS(CompHdrFile,P cUnitFName);} else {& changeStreamTo(MAIN_OUT_STREAM); prog();} exitBlock();" checkCondStkAndDeleteMacros(); freeTCB();# changeStreamTo(SUMMARY_STREAM); checks();g/ if (emitTrailer || (ctrErr | ctrWarn)!=0) {c# CreateParArr(2) /*~DynInit*/;b parArr2[1] = cUnitFName;; parArr2[2] = longToS((long)(cumNbLines + lineNb - 1 +i- cumDeltaLineNb - cumNbSkippedLines));e) prmtrzMsg(errTxt[EndMsg], parArr2);s$ if ((ctrErr | ctrWarn) != 0) { TnbBuf buf;o& bufLongToS((long)ctrErr, buf); parArr2[1] = &buf[0]; , parArr2[2] = longToS((long)ctrWarn);- prmtrzMsg(errTxt[ErrWarn], parArr2);}e% else emitS(errTxt[NoErrWarn]);}t9 FinishSrcFile() /* lineNb not used any more here */ c #ifdef VMS- free((TstringNC /*~OddCast*/)cUnitFName);i2 free((TstringNC /*~OddCast*/)strpdCUnitFName);#endif }M if (ctrWarn != 0) {warnSeen = True; if (! callCompilW) notCompiled = True;}rK if (ctrErr != 0) {errSeen = True; if (callCompil) callCompilSeen = True;}d7 else if (callCompil && (callCompilW || ctrWarn==0)) {o changeStreamTo(NULL);t (void)system(cmdBuf);} /* Free allocated memory */s free(cmdBuf);N if (*dirArray != &EmptyDirName[0]) free((TdirAtom * /*~OddCast*/)*dirArray); ptrDirArray = dirArray + 1; do {2 free((TdirAtom * /*~OddCast*/)*ptrDirArray++);! } while (*ptrDirArray != NULL);1 free(dirArray);l}i;static AllocXElt(allocInclStkElt, TinclStkElt *, ctrISE, ;)t$static void changeStreamTo(Stream x){t static bool errSeen = False;K if (spaceAtEndOfLine < 0) {emitC('\n'); ResetSpaceAtEndOfLine;} /* flushF emitC(). */L if (!errSeen && fflush(outputStream)!=0) {errSeen = True; sysErr(ExCod2);}" if (x != NULL) outputStream = x;}tstatic void checks(void){tK if (nestLvl != -1) {intrnErr("nestLvl", (uint *)&nestLvl); nestLvl = -1;}d5 if (ctrBSE > 1) intrnErr("ctrBlkStkElt", &ctrBSE);r2 if (ctrCE != 0) intrnErr("ctrCaseElt", &ctrCE);6 if (ctrCSE != 0) intrnErr("ctrCondStkElt", &ctrCSE);3 if (ctrDE != 0) intrnErr("ctrDeclElt=", &ctrDE);a6 if (ctrDIE != 0) intrnErr("ctrDescrIdElt", &ctrDIE);6 if (ctrISE != 0) intrnErr("ctrInclStkElt", &ctrISE);4 if (ctrMSB != 0) intrnErr("ctrMacroBlk", &ctrMSB);5 if (ctrMSE != 0) intrnErr("ctrMacStkElt", &ctrMSE);r8 if (ctrNI != 0) intrnErr("ctrNotInitVarElt", &ctrNI);M if (ctrNSB > 1+1+1 /* 3 because first name block never freed, and two otherfG may be kept not freed (see exitBlock() ) */) intrnErr("ctrNameStoBlk",t &ctrNSB);3 if (ctrSE != 0) intrnErr("ctrSemanElt", &ctrSE);n6 if (ctrTCB != 0) intrnErr("ctrTypCombElt", &ctrTCB);2 if (ctrTE != 0) intrnErr("ctrTypeElt", &ctrTE);6 if (ctrTLE != 0) intrnErr("ctrTagListElt", &ctrTLE);) intrnErr("", NULL); /* flush buffer */ }w9static TdirName copyDirPrefix(Tstring string, size_t lgt)h{a TdirName res; P if (lgt >= UCHAR_MAXC) {parArr1[1] = string; errExit(StringTooLong, parArr1);}J MyAlloc(res, lgt + 1 + 1); /* +1 for length field, +1 for ending '/' */4 memcpy((char * /*~OddCast*/)res + 1, string, lgt); #ifdef VMS0 *(TdirAtom * /*~OddCast*/)res = (TdirAtom)lgt;#else< *(TdirAtom * /*~OddCast*/)(res + lgt + 1) = (TdirAtom)'/';6 *(TdirAtom * /*~OddCast*/)res = (TdirAtom)(lgt + 1);#endif return res; }sstatic void dispUsg(void) {f TnbBuf buf;D CreateParArr(4) /*~DynInit*/;" bufLongToS((long)LineSize, buf); parArr4[1] = *argvg;0 parArr4[2] = longToS((long)DefaultTabSpacing); parArr4[3] = &buf[0];  parArr4[4] = TxtOptions; fmtdMsg(Use1, parArr4); ) if (isatty(fileno(outputStream)) > 0) {w fmtdMsg(ProceedMsg, NULL); waitAndAnalAnswer();}d fmtdMsg(Use2, parArr4);i}+#define HyphenDetec 2 Kstatic char bufChar[HyphenDetec + LineSize + 1 + 1] = " ", /* initialized(, because of hyphen detection; +1 for en-- ding '\0', +1 for overflow detection. */t *ptrBufCh;Fstatic bool partWord = False; /* flag "previous word not complete" */static void initEmitC(void)p{nO bufChar[0] = bufChar[1] = ' '; /* initialized because of hyphen detection */e# ptrBufCh = &bufChar[HyphenDetec];r spaceAtEndOfLine = 0;a partWord = False;}}estatic void emitC(char x)rP/* Manages line wrap-around (tries to wrap only when a space or hyphen character/ is seen, while avoiding lines too empty). */{ K#define MyFPuts(buf) {if (fputs(buf, outputStream) == EOF) sysErr(ExCod2);}m bool ovfl = False; if (x != '\n') { *ptrBufCh++ = x;H if (! (x==' ' || x=='-' && isalpha(*(ptrBufCh - HyphenDetec - 1)) &&2 isalpha(*(ptrBufCh - HyphenDetec)))) { /* dash: supposed to be hyphen only if last but one character is8 letter (not only last because of word "d-pragma"). */0 if (ptrBufCh < AdLastElt(bufChar)) return; ovfl = True;}} {e) char *begBuf = &bufChar[HyphenDetec]; int nbChar;tG *((x==' ' && ptrBufCh - begBuf==spaceAtEndOfLine + 1)? --ptrBufCh : 9 ptrBufCh) = '\0'; /* ending character (remove uselessr& space at end of line). */J while ((nbChar = (int)(ptrBufCh - begBuf))>spaceAtEndOfLine || ovfl &&? nbChar==spaceAtEndOfLine) { /* in case of overflow, keep one & slot at end of line for '\'. */I if (spaceAtEndOfLine>TolLostSpace || (partWord /* previous word note; completely written */ || ovfl) && spaceAtEndOfLine>0) {dH char *nxtBegBuf = begBuf + spaceAtEndOfLine - 1, c = *nxtBegBuf;+ *nxtBegBuf = '\0'; /* for fputs */w@ if (*begBuf != '\0') {MyFPuts(begBuf) MyFPuts("\\\n") }* else if (partWord) MyFPuts("\\\n")P else MyFPuts("\n") /* case last character of line is space or hyphen */8 *nxtBegBuf = c; /* restore smashed character */ begBuf = nxtBegBuf;} else MyFPuts("\n") ResetSpaceAtEndOfLine;}xK if (*begBuf != '\0') MyFPuts(begBuf) /* write (last part of) buffer */t9 ptrBufCh = &bufChar[HyphenDetec]; /* buffer empty */DM if (x == '\n') spaceAtEndOfLine = -1; /* to have NL inserted before nextd emission. */$ else spaceAtEndOfLine -= nbChar; partWord = ovfl;}r#undef MyFPuts#undef HyphenDetec}t'/*~Undef bufChar, ptrBufCh, partWord */lFstatic void emitCstWdthCh(register const char *bStr, const char *eStr)I/* Emits all character between 'bStr' (included) and 'eStr' (excluded) as O constant width characters (tabs and non-printable characters become spaces);l@ otherwise, LineSize would not be identical to line length. */{u char c;I while (bStr != eStr) { c = *bStr++;5 emitC((IsVisibleChar(c) || c == '\n')? c : ' ');}o}nvoid emitS(Tstring x) {u4 if (x != NULL) {while (*x != '\0') {emitC(*x++);}}}d!void endPrgF(register char *ptrS) { # if (! fileClosed) ilgCharF(ptrS);r else {) BackUp; /* do not go beyond EndCh */b< if (dirLineFl) {dirLineFl = False; curTok.tok = ENDDIR;} else { RestoSmshCh;G if (pTopInclStk != NULL) {ptrS = manageEndInclude(); curTok.tok =  WHITESPACE;}9 else {curTok.tok = ENDPROG; condDirSkip = False;}}}  srcPtr = ptrS;}ostatic uint minMsgLvl = 0;static void initErr(void) {  minMsgLvl = 0;}"(void err(Terr n, const Tstring parArr[]){d* Terr errNo = n & (EndErrInfoBits -1 -1);' bool warn = n&WarnMsk || dpragNst!=0; - if (mngConc) { /* if inside ## operator */ L if (concatErr == NoConcErr) concatErr = errNo; /* retain first error */ return;}3 if (peepTok) return; /* will be seen again... */ ( if (InsideMacro && curTok.tok==SCOL) {U static const Terr retainedErr[] = {RSBrExptd, RBraOrCommaExptd, RParOrCommaExptd,f RBraExptd, RParExptd};U& const Terr *ptr = &retainedErr[0]; do { if (errNo == *ptr++)( if (checkSColAtEndMac()) return; else break;g6 } while (ptr < &retainedErr[NbElt(retainedErr)]);} if (warn && (!warnFlD || sysHdrFile /* no warning in system header file */H || sysMacro && n&CWarn /* no Cwarning in system macro */* || n&PossErr && !chkPossErr% || n&Rdbl && !chkRdbl)  || errNo==NoErrMsg || n&WarnMsk && noWarn || ignoreErr) return;P! if (dpragNst==0 && screenMsg) {d9 uint msgLvl = (warn)? (uint)(n & WarnMsk) : UINT_MAX;;: if (msgLvl < minMsgLvl) return; /* screen messages */ minMsgLvl = msgLvl;} if ((ctrWarn | ctrErr) == 0) {! emitS(errTxt[WarnErrInFile]);n emitS(cUnitFName); emitS("\" *****\n");M if (stopAfterMsg) {emitS(errTxt[StopAftMsgBanner]); waitAndAnalAnswer();}{ emitC('\n');}a else emitS(errTxt[SeparMsg]);c@ if (!stopAfterMsg && msgLimit--==0) errExit(TooManyMsg, NULL);M if (!(n & NoDispLine) && (lineNb!=0 || dirLineFl)) { /* not no printing ofp line. */, char *ptrS;n const char *expl; O ptrdiff_t distErrBegLine; /* nb of characters between the beginning of thed4 line and the error position (included). */ char savInfoId[LgtHdrId]; N if (adSmshCh != NULL) { /* put back in place possible characters smashed- by an identifier length/name space. */d> savInfoId[0] = *adSmshCh; savInfoId[1]= *(adSmshCh + 1);: *adSmshCh = smshCh[0]; *(adSmshCh + 1) = smshCh[1];} ptrS = srcPtr;M if ((distErrBegLine = ptrS - nlPosP1) < 0) distErrBegLine += oldMaxPtrS -/4 begSBuf; /* because of circular buffer */% if (distErrBegLine <= LineSize) {tO /* Beginning of line not very far from error position, so (end of) prece-uI ding line, and (beginning of) current line, can be displayed. */rC /* Search beginning of preceding line; 'expl' points on it */  uint ctr;h@ for (expl = nlPosP1 - 1, ctr = LS2 - 1; ctr != 0; ctr--) {/ if (expl == begSBuf) expl = oldMaxPtrS;;P if (*(--expl) == EndCh) {expl = begSBuf - 1; goto foundNLL;} /* no line3 before (testing lineNb == 1 is not correct,n) because of possible splicing). */r* if (*expl == '\n') goto foundNLL;}3 /* Beginning of preceding line not visible */  emitS(Dots); expl += LitLen(Dots); foundNLL:*= if (++expl >= oldMaxPtrS) expl -= oldMaxPtrS - begSBuf; I ptrS = searchNxtNL(ptrS, distErrBegLine);} /* (local copy of) ptrS  moved to end of line. */ else {I /* Beginning of line too far from error position; only current lineSO (broken into two physical lines, the first one being terminated by '\' M to indicate logical continuation) can be displayed; 'expl' points on / first char of second physical line. */sO const char *begErrLine; /* pointer on 1st char of first physical line */gM if (distErrBegLine <= NbSrcLinesKept*LineSize - 1) { /* - 1 because ofp ending '\'. *// /* Beginning of current line visible */f' distErrBegLine -= LineSize - 1;  begErrLine = nlPosP1;k+ expl = begErrLine + (LineSize - 1);nK ptrS = searchNxtNL(ptrS, distErrBegLine);} /* (local copy of) ptrS  moved to end of line. */mF else { /* beginning of current line not visible : put error4 position at end of second physical line. */ emitS(Dots);" distErrBegLine = LineSize;N if ((begErrLine = ptrS - (NbSrcLinesKept*LineSize - (LitLen(Dots)) - 1@ /* - 1 because of ending '\' */)) < begSBuf) begErrLine += oldMaxPtrS - begSBuf; < expl = begErrLine + (LineSize - (LitLen(Dots)) - 1);>/* if ((ptrSM1 = ptrS) == begSBuf) ptrSM1 = oldMaxPtrS;F if (*--ptrSM1=='\n' || ptrSM1==posEndChP1-1) ptrS = ptrSM1;*/}+ /* Print first part of source line */); if (expl >= oldMaxPtrS) expl -= oldMaxPtrS - begSBuf;EO if (expl < begErrLine) {emitCstWdthCh(begErrLine, oldMaxPtrS); begErrLine  = begSBuf;}& emitCstWdthCh(begErrLine, expl); emitS("\\\n");}e, /* Print (second part of) source line */G if (ptrS < expl) {emitCstWdthCh(expl, oldMaxPtrS); expl = begSBuf;}l emitCstWdthCh(expl, ptrS);* /* Print caret under error position */ emitC('\n'); if (distErrBegLine != 0)1 while (--distErrBegLine != 0) {emitC('_');}I emitS("^\n");SF if (adSmshCh != NULL) { /* put back in place possible identifier length/name space. */rA *adSmshCh = savInfoId[0]; *(adSmshCh + 1) = savInfoId[1];}}=L if (warn) ctrWarn++; else {ctrErr++; ignoreErr = !allErrFl && curTok.tok!= ENDPROG;} {gF bool savGAFN = givAlwsFName, savMIF = moreInfMsg, explain = False; explainL:r if (warn) {p emitS(errTxt[Warning]);< emitC('0' + ((uint)(n & WarnMsk) >> INT_BIT - 1 - 1));4 /*~ zif (uint)WarnMsk != 3u<<(INT_BIT - 1 - 1)& "Change previous expression "*/ emitC(')');} else emitS(errTxt[Error]);E if (!(n & NoDispLine) || givAlwsFName) { /* print file name/line) number. */ TnbBuf bufLineNo;= emitS(errTxt[Line]);I bufLongToS((long)lineNb, bufLineNo); /* so 'longToS' buffer remainsl uncorrupted... */  emitS(bufLineNo);a4 if (curFileName!=cUnitFName || givAlwsFName) { emitS(errTxt[File]); emitS(curFileName); % emitS(errTxt[EndFileName]);}}) emitS(": ");G prmtrzMsg(errTxt[errNo], parArr); /* parametrized error message */;V if (listTok && (!(n & NoDispLine) || explain) && (!stopAfterMsg || moreInfMsg)) { ; /* output last tokens taken into account before error */* emitS(errTxt[LastToks]);P if (ovfldTokBuf) {emitS(Dots); emitCstWdthCh(pLastTokBuf, endLastTokBuf);}1 emitCstWdthCh(begLastTokBuf, pLastTokBuf);}s emitC('\n');H if (stopAfterMsg && (explain = waitAndAnalAnswer())) {givAlwsFName =; True; moreInfMsg = True; goto explainL /*~BackBranch*/;} givAlwsFName = savGAFN;= moreInfMsg = savMIF;}g}t/*~Undef minMsgLvl */ Dstatic void errExit(Terr n, const Tstring *parArr) /*~NeverReturns*/{( if (n != NoErrMsg) fmtdMsg(n, parArr); flushAndExit(); } 9static void fatalErr(Terr n, Tstring x) /*~NeverReturns*/m{ ! changeStreamTo(SUMMARY_STREAM);n mngConc = ignoreErr = False; errWS(n, x); flushAndExit();L};7static void fileErr(Tstring fileName) /*~NeverReturns*/ {r# fatalErr(FileOpenFail, fileName); } 0static void flushAndExit(void) /*~NeverReturns*/{) changeStreamTo(NULL);e exit(EXIT_FAILURE);N})2static void fmtdMsg(Terr n, const Tstring *parArr){L #ifndef VMS  static bool frstTime = True;0 if (frstTime) {emitC('\r'); frstTime = False;}#endif prmtrzMsg(errTxt[n], parArr);; emitC('\n');}w/static bool foundOption(Tstring opt, bool *pFl) {  bool flagVal;  size_t lgtOpt = strlen(opt);J if (*opt!=parArr1[1][LitLen(DccOptPref)] || strncmp(parArr1[1] + LitLen(4 DccOptPref), opt, lgtOpt) != 0) return False;! flagVal = (*parArr1[1] == '+');b lgtOpt += LitLen(DccOptPref);F if (*pFl == flagVal) {K if (lastTrtdFName == NULL) { /* to not repeat already given message */ #define MaxSizDccOpt 6" Tchar buf[MaxSizDccOpt + 1];7 if (lgtOpt > MaxSizDccOpt) lgtOpt = MaxSizDccOpt; #undef MaxSizDccOpt&' strncpy(buf, parArr1[1], lgtOpt);' buf[lgtOpt] = '\0';f {e% CreateParArr(1) /*~DynInit*/;e parArr1[1] = &buf[0];i) fmtdMsg(AlrdSeenOpt, parArr1);}}}( else *pFl = flagVal;# if (parArr1[1][lgtOpt] != '\0') {U+ const Tchar *ptr = &parArr1[1][lgtOpt];p optionValue = 0; do {A if (! isdigit(*ptr)) {optionValue = DfltOptVal - 1; break;}r8 optionValue = optionValue*Base10 + (*ptr++ - '0'); } while (*ptr != '\0');} return True;}t@static FreeXElt(freeInclStkElt, TinclStkElt *, ctrISE, ; , prec)static Tstring getNxtArg(void)7/* Gives back pointer on next argument (NULL at end) */d{e Tstring begOpt; Q while (*dfltArgsPtr == ' ') dfltArgsPtr++; /* skip possible starting spaces */mO if (*dfltArgsPtr == '\0' /* environment string exhausted */) return *++argv1;  begOpt = dfltArgsPtr; A while (*++dfltArgsPtr != '\0') { /* search end of parameter */  if (*dfltArgsPtr == ' ') {8 *dfltArgsPtr++ = '\0'; /* put parameter ending */ break;}} return begOpt;}( static Tstring getNxtFName(void){c Tchar *ptrD, *w; TlitString ptrO;3 if ((ptrO = getLitString()) == NULL) ptrD = NULL;n else {' MyAlloc(ptrD, initGetStrLit(ptrO));D w = ptrD;mI while ((*w++ = getNxtStrLitChar()) != '\0') {}} /* save file name inc contiguous area. */ / exitBlock(); /* because of getLitString() */b return ptrD;}rstatic void initAdjFiles(void){= openSourceFile(adjFilesList);  while (NxtTok() != ENDPROG) {2#define IncrSizeAdjArr 5G if (usedSizAdjArr == totalSizAdjArr) { /* array full; extend it */ if (totalSizAdjArr == 0) {( totalSizAdjArr = IncrSizeAdjArr;C MyAlloc(adjFilesArr, sizeof(TadjFilesS) * totalSizAdjArr);} else {) totalSizAdjArr += IncrSizeAdjArr;TD if ((adjFilesArr = realloc(adjFilesArr, sizeof(TadjFilesS) *; totalSizAdjArr)) == NULL) sysErr(errTxt[RanOutOfMem]);}a#undef IncrSizeAdjArrt }N { Tstring w;> adjFilesArr[usedSizAdjArr].noLoadSysFile = Found(EMARK);6 if ((w = getNxtFName()) == NULL) skipTok(zSCol); +~DCC.BCKt"[DCC_DISTRIB.SRC]DCMAIN.C;213cuz[LN else {2 adjFilesArr[usedSizAdjArr].amendFName = w;- if (! Found(COMMA)) err0(CommaExptd);  ComputeFileHCode(w);8 adjFilesArr[usedSizAdjArr].hCode = fileHCode;}8 if ((w = getNxtFName()) == NULL) skipTok(zSCol);9 else adjFilesArr[usedSizAdjArr++].adjFName = w;}}p- if (curTok.tok != SCOL) err0(SColExptd);}n FinishSrcFile()F} static void initAll(void)({r initBlk(); initDecl();= initExp(); initExt(); initInst();( initMain();u initPrag();t initRec();}hstatic void initMain(void){- #ifndef VMS" static bool frstInit = True; if (frstInit) {tI if (setvbuf(MAIN_OUT_STREAM, NULL, (int)_IOLBF, BUFSIZ) != 0) sysErr(( ExCod1);E frstInit = False;}#endif ctrErr = ctrWarn = 0;; cumNbLines = 0; initErr();}lbool insideInclude(void){! return pTopInclStk != NULL;&}D-static void intrnErr(Tstring wrd, uint *pCtr),{t static bool errSeen = False; if (pCtr == NULL) {BD if (errSeen) {emitC(' '); errSeen = False;}} /* flush buffer */ else { emitS("\nINTERNAL PB: ");r emitS(wrd);B emitS("= "); emitS(longToS((long)*pCtr)); *pCtr = 0; errSeen = True;}}e$static bool isDccOption(Tstring arg){"E return (*arg=='+' || *arg=='-') && *(arg + 1)=='z' && strlen(arg)>=, MinDccOptLgt;})*static bool isHeaderFile(Tstring fileName){ " Tstring p = SearchDot(fileName); if (p == NULL) return False;* if (strchr(p, 'h') != NULL) return True; #ifdef LcEqUcf if (strchr(p, 'H') != NULL) {y, if (chkPortbl) err0(LowerCaseH | Warn1); return True;} #endif return False;a}r!static bool isSrcFName(Tstring x) {A return !isDccOption(x) &&1 #ifdef VMS *x!='/';d#elser8 *x!='-' && StrEq(x + strlen(x) - LitLen(CSuffix), CSuffix);#endif}*#static char *manageEndInclude(void)s{( TinclStkElt *locPTInclS = pTopInclStk;- if (! adjustFile) cumNbLines += lineNb - 1;eL free(curSourceMngtBlk); /* do not free curFileName, because name may stillI be used after exit of include file (i.e. in a 'NotUsed' warning). */(4 /* Search if system header file to be 'amended' */ if (sysHdrFile) {D TadjFilesS *ptr;C Tstring nakedFName = NakedFName(curFileName); /* skip prefix */aI /* Search if not recursive inclusion (because adjustFiles can only be * included at end of system file). */ { " TinclStkElt *w = locPTInclS; do {E if (StrEq(NakedFName(w->fileName), nakedFName)) goto recursL; ' } while ((w = w->prec) != NULL);}- {d #ifdef LcEqUcr bool diffLC = False;H SearchAdjFiles(nakedFName, (diffLC = sameLowerCaseName(nakedFName, ptr->amendFName)))n2 if (diffLC) locPTInclS->diffLc = True;#elsei' SearchAdjFiles(nakedFName, False)#endif adjustFile = True; sysHdrFile = False;d* openSourceFile(ptr->adjFName); return srcPtr;}}}} recursL:;} adjustFile = False;y' /* Go back to previous source file */g/ curSourceMngtBlk = locPTInclS->sourceMngtBlk;{A begSBuf = &curSourceMngtBlk->idPlusSource[LgtHdrId + MaxLgtId]; ' endSBuf = begSBuf + SizeSourceBuffer;u, oldMaxPtrS = curSourceMngtBlk->oldMaxPtrS;, posEndChP1 = curSourceMngtBlk->posEndChP1;2 nxtPosEndChP1 = curSourceMngtBlk->nxtPosEndChP1;I nlPosP1 = srcPtr = curSourceMngtBlk->ptrS; /* because of call to err()a& later in this function. */$ lineNb = curSourceMngtBlk->lineNb;0 sourceStream = curSourceMngtBlk->sourceStream;' indentIncr = locPTInclS->indentIncra;h% curFileName = locPTInclS->fileName;B( headListPrivTo = locPTInclS->listPriv; fileClosed = False;*E if (hfpsCtrM1 < 0) {headerFile = False; curHdrFName = NonHdrFName;}  else { TinclStkElt *w;p/ if (hfpsCtrM1 == 0) insideHdrInHdr = False;b1 /* Search in which header file we are back */k( for (w = locPTInclS;; w = w->prec) {I if ((insideHdrInHdr)? w->hdrFilPerSe : isHeaderFile(w->fileName)) {r" curHdrFName = w->fileName; break;}}}d4 sysHdrFile = sysAdjHdrFile = locPTInclS->sHdrFile;: if (hdrFilePerSe = locPTInclS->hdrFilPerSe) hfpsCtrM1--; #ifdef LcEqUcs= if (locPTInclS->diffLc && chkPortbl) err0(ChkUcLc | Warn1);\#endif+ pTopInclStk = freeInclStkElt(locPTInclS); 3 return srcPtr - 1; /* -1 to get back to nlF() */i}iAvoid manageInclude(TstringNC fileName, bool sysFl, bool cmpsgHdr)r{e /* Save previous context */f RestoSmshCh; {s' TinclStkElt *w = allocInclStkElt(); # curSourceMngtBlk->ptrS= srcPtr; . curSourceMngtBlk->oldMaxPtrS = oldMaxPtrS;. curSourceMngtBlk->posEndChP1 = posEndChP1;4 curSourceMngtBlk->nxtPosEndChP1 = nxtPosEndChP1;& curSourceMngtBlk->lineNb = lineNb;2 curSourceMngtBlk->sourceStream = sourceStream;( w->sourceMngtBlk = curSourceMngtBlk; w->indentIncra = indentIncr; w->fileName = curFileName;! w->listPriv = headListPrivTo;c3 if (w->hdrFilPerSe = hdrFilePerSe) hfpsCtrM1++;a w->sHdrFile = sysHdrFile;a #ifdef LcEqUcu w->diffLc = False;#endif w->prec = pTopInclStk; pTopInclStk = w;}a9 /* Test for errors/warnings while err() stills works */n {g$ Tstring p = SearchDot(fileName);N if (p!=NULL && StrEq(p+1, "c")) errWS(DontInclBodyFile | Warn2, fileName);F for (p = fileName; *p !='\0'; p++) if (! IsVisibleChar(*p)) errWS(- NotVisiChar | Warn3, charToHexS(*p));}e {r bool isBodyHdrF;0 if (hdrFilePerSe = isHeaderFile(fileName)) {A /* Search if circular chain of inclusion of header files */s {.% TinclStkElt *w = pTopInclStk;S8 Tstring cmpsgHdrFName = NULL, strpdFName = NULL; do {K if (!w->hdrFilPerSe && isHeaderFile(w->fileName)) cmpsgHdrFName =i w->fileName;0 if (cmpsgHdrFName!=NULL || cmpsgHdr) {D if (strpdFName == NULL) strpdFName = skipPath(fileName);; if (StrEq(skipPath(w->fileName), strpdFName)) {-J errWSS(CmpsgHdrWithSelf | Warn1, strpdFName, cmpsgHdrFName); break;}}) } while ((w = w->prec) != NULL);} , isBodyHdrF = isBodyHdrFile(fileName);} if (cmpsgHdr) {rB if (!headerFile || !hdrFilePerSe) err0(IlgCmpsgHdr | Warn1);A else if (isBodyHdrF) errWS(IlgCmpsgHdr1 | Warn1, fileName);mO else if (insideHdrInHdr && isBodyHdrFile(curHdrFName)) err0(IlgCmpsgHdr2|  Warn1|Rdbl); else goto OkL; cmpsgHdr = False;hOkL:;A }}F if (nestLvl != 0) indentIncr = 0; /* to avoid 'BadIndent' errors in& files included inside blocks. *// if (sysFl) sysHdrFile = sysAdjHdrFile = True;s# if (hdrFilePerSe && sysHdrFile) {|5 /* Check if adjust file to replace header file *// TadjFilesS *ptr; #ifdef LcEqUcsJ SearchAdjFiles(fileName, sameLowerCaseName(fileName, ptr->amendFName))#elseW# SearchAdjFiles(fileName, False) #endif# if (ptr->noLoadSysFile) { adjustFile = True;* openSourceFile(ptr->adjFName); goto openOK1;} break;}}}} /* Open included file */ {a Tchar *fNameBuf;U static const TdirName noPrefix[] = {EmptyDirName, EmptyDirName , NULL}; /* 'Emp- ; tyDirName' twice, because of quoted include files. */A# const TdirName *ptrDirArray = ( #ifdef VMS" skipPath(fileName) != fileName#elsem *fileName == '/'#endif8 )? &noPrefix[0] : (sysFl)? dirArray + 1 : dirArray;K size_t lgtFileN = strlen(fileName) + 1 + 1; /* prefix length, trailingo '\0'. */  size_t lgtPrefix;i #ifdef VMS Tchar *pos = NULL;K /* Manage 'dir/file' form (=>'dir:file') for system header file name */hL if (hdrFilePerSe && sysHdrFile && (pos = strchr(fileName, '/'))!=NULL) {+ *pos = ':'; /* replace '/' by ':' */e" ptrDirArray = &noPrefix[0];}#endifL /* Try possible prefixes to open include file (and make a permanent copy of its name). */[ for (;;) {! /* Create full file name */ % lgtPrefix = LgtD(*ptrDirArray);o. MyAlloc(fNameBuf, lgtPrefix + lgtFileN);# *fNameBuf = (Tchar)lgtPrefix;g< memcpy(fNameBuf + 1, (*ptrDirArray++) + 1, lgtPrefix);1 strcpy(fNameBuf + 1 + lgtPrefix, fileName);d* if (openSourceFile1(fNameBuf + 1)) {H if (*ptrDirArray == NULL) curFileName = NakedFName(curFileName);2 /* system directory => conceal its name (would& just puzzle casual user...). */K *(TstringNC /*~OddCast*/)(curFileName - 1) = '\0'; /* no prefix */- break;}eM if (*ptrDirArray==NULL || !sysHdrFile && *(ptrDirArray + 1)==NULL /* do=G not look in system directory for quoted include file */) fileErr(  fileName); free(fNameBuf);} #ifdef VMSM if (pos != NULL) *((TstringNC/*~OddCast*/)curFileName + (pos - fileName))o- = '/'; /* restore '/' replacing ':' */-#endif }-openOK1:1 if (hdrFilePerSe) { /* would-be header file */ - if (! cmpsgHdr) { /* real header file */f curHdrFName = curFileName;F if (headerFile) { /* header file included inside header file */ insideHdrInHdr = True;}s else { headerFile = True;J (void)addLvl0InclFName(curHdrFName);}} /* jot down files included at level 0. */$ else { /* "composing" header */ hdrFilePerSe = False;eO if (! insideHdrInHdr) { /* composed header included at level 0 => compo-s; sing header behaves as if included at level 0. */'I curHdrFName = curFileName; /* to prevent ExtObjNotDef message */i. (void)addLvl0InclFName(curHdrFName);}}2 headListPrivTo = NULL;} /* reset PrivateTo */ free(fileName);cP lineNb--; /* because of extra 'newline' put by end of directive processing */}.static void mngOptListTok(void)g{ I if (begLastTokBuf != NULL) {free(begLastTokBuf); begLastTokBuf = NULL;}y if (listTok) {* MyAlloc(begLastTokBuf, lgtLastTokBuf);2 endLastTokBuf = begLastTokBuf + lgtLastTokBuf; pLastTokBuf = begLastTokBuf; ovfldTokBuf = False;}o}n static void mngOptMsgLimit(void){ msgLimit = (msgLimitFl)B ? initMsgLimit : (interactivOutptDev)$ ? (uint)DefaultMessagesLimit : UINT_MAX;t}1$static void mngOptStopAfterMsg(void){ ' if (stopAfterMsg = initStopAfterMsg) }3 if (! interactivOutptDev) stopAfterMsg = False;  else verbose = HalfVerbo; }Mstatic void mngOptVerbose(void)<{g verbose = (initVerbose)E= ? (moreInfMsg = True /* 'zvve' implies 'zve' */, FullVerbo)  : (moreInfMsg) ? HalfVerbo : Terse;}"TcharStream nxtChFromTxt(void){o char c;/ char *ptrS = srcPtr; NxtChC srcPtr = ptrS; return (TcharStream)c;}t(char *nxtChunkOfTxt(register char *ptrS)H/* Loads next chunk of source text, managing the circular source buffer.* ptrS points just after ending EndCh. */{I> int lgt; /* (max) length of chunk of text to load (including terminating \0). */ = size_t readLgt; /* length of chunk of text really loaded */(8 ptrS--; /* to eliminate previous terminating EndCh */G if (ptrS == oldMaxPtrS) { /* if next text chunk already loaded (by aG- preceding searchNxtNL() or splice()). */I posEndChP1 = nxtPosEndChP1; return begSBuf;}J lgt = (int)(ptrS - begSBuf) - deltaPtrS - (LineSize + LS2); /* preserve; (maximum) number of characters needed before ptrS. */= 0) {tP if (endSBuf - ptrS > TransfSize) { /* if enough space at end of buffer, */I lgt = (int)(endSBuf - ptrS); /* use it (in order to maximiseu oldMaxPtrS). */O oldMaxPtrS = endSBuf;} /* to prevent oldMaxPtrS from indicating 'already  loaded' text chunk. */, else { /* load at beginning of buffer */I oldMaxPtrS = ptrS; /* remember (logical) end of circular buffer */iN if (nlPosP1 > ptrS) nlPosP1 = begSBuf + 1; /* to force subsequent reset,4 for nlPosP1 becomes meaningless in that case. */ ptrS = begSBuf;}}fE else { /* characters to be kept start at end of circular buffer */} int minLgt;t$ lgt += (int)(oldMaxPtrS - ptrS);) minLgt = (int)(nlPosP1 - ptrS) - LS2;a$ if (lgt < minLgt) lgt = minLgt;}G if ((uint)(adSmshCh - ptrS) < (uint)lgt) adSmshCh = NULL; /* if lasti- identifier will be overwritten. */;P if ((uint)(nlPosP1 - 1 - ptrS) < (uint)lgt) nlPosP1 = begSBuf - NbSrcLinesKept@ *LineSize; /* if NL is overwritten, its position becomes; meaningless (see use of 'distErrBegLine' in err()). */t< readLgt = fread(ptrS, 1, (size_t)(lgt - 1), sourceStream);+ if (readLgt==0 || ferror(sourceStream)) {(M bool w = ferror(sourceStream); /* so that ferror called before fclose */rJ if (w | fclose(sourceStream)!=0 /* '|' so that fclose always called */; ) {srcPtr = ptrS; errWS(InptFileErr, curFileName);} fileClosed = True; *ptrS = EndCh; posEndChP1 = NULL;}n else {+ register char *endBuf = ptrS + readLgt;T0 *endBuf++ = EndCh; /* end of loaded text */ posEndChP1 = endBuf;}r return ptrS;},static void openSourceFile(Tstring fileName){n5 if (! openSourceFile1(fileName)) fileErr(fileName);p} -static bool openSourceFile1(Tstring fileName)O{rB if ((sourceStream = fopen(fileName, "r")) == NULL) return False; fileClosed = False; curFileName = fileName; 4 MyAlloc(curSourceMngtBlk, sizeof(TsourceMngtBlk));M begSBuf = &curSourceMngtBlk->idPlusSource[LgtHdrId + MaxLgtId]; /* reservemE an identifier name buffer in front of the source buffer, buffer usedG in case an identifier straddles both ends of (circular) source buffer,D2 because nameStrings must always be contiguous. */A oldMaxPtrS = posEndChP1 = endSBuf = begSBuf + SizeSourceBuffer;nP *(endSBuf - (1 + 1 + 1)) = EndCh; /* indicate first line (of current file) */M *(endSBuf - (1 + 1)) = '\n'; /* simulate initial NL (to manage preprocessora directives). */= *(endSBuf - (1)) = EndCh; /* simulate end of loaded text */r= srcPtr = endSBuf - (1 + 1); /* initialize source pointer */ lineNb = 0;e return True;};7static void prmtrzMsg(Tstring x, const Tstring *tabPrm)c{e register char c; static char lastChar;; uint w; static bool skip;A static int lvl = -1; if (x != NULL) {B if (++lvl == 0) skip = False; /* start in no-skipping mode */ while ((c = *x++) != '\0') { if (c=='@' && *x=='0') {' if (! moreInfMsg) skip = !skip;t x++;}* else if (! skip)B if (c=='@' && tabPrm!=NULL && (w = (uint)(*x - '1'))<(uintI /*~OddCast*/)*tabPrm) {prmtrzMsg(*(tabPrm + w + 1), tabPrm); x++;}+" else emitC(lastChar = c);}I if (--lvl<0 && skip && lastChar!='?') emitC('.');} /* message ending period. */}tstatic void resetArgPtr(void)L{tJ dfltArgsPtr = strcpy(copDfltArgs, dfltArgs); /* copied because modified (' ' => '\0'). */  argv1 = argvg;}C #ifdef LcEqUc};static bool sameLowerCaseName(const char *x, const char *y) {tL while (RealChar(*x) == RealChar(*y)) {if (*x++ == '\0') return True; y++;} return False;)}=#endifvoid saveTokChar(char c){hM if (pLastTokBuf == endLastTokBuf) {pLastTokBuf = begLastTokBuf; ovfldTokBuf= = True;}  *pLastTokBuf++ = c;t} <static char *searchNxtNL(register char *ptrS, ptrdiff_t ctr)L/* Search until next NL, or until seen LineSize chars on error line; returns" a pointer on this character. */{A- char c, *savPECP1 = NULL, *oldPECP1 = NULL;r) if (ctr == 0) {deltaPtrS = 1; ctr = 1;} else {N if (ptrS == begSBuf) {ptrS = oldMaxPtrS; oldPECP1 = posEndChP1; posEndChP1 = ptrS + 1;} BackUp;} do {O deltaPtrS++; /* to limit length of loaded text chunk, so as not to destroyNA last NL. Value = 1 too much, so can also serve as flag (inr nxtChunkOfTxt()). */fK for (;;) { /* get next character; may cause (but only once) loading of  next text chunk. */=5 if ((c = *ptrS++)==EndCh && ptrS==posEndChP1) {s4 if (oldPECP1 == NULL) savPECP1 = posEndChP1;4 else {savPECP1 = oldPECP1; oldPECP1 = NULL;}# ptrS = nxtChunkOfTxt(ptrS); G if (ptrS != begSBuf) savPECP1 = NULL; /* no circular effect */x continue;}3/* if (c == '\?') { *//* trigraph? *//*tM while ((c = *ptrS++)==EndCh && ptrS==posEndChP1) {ptrS = nxtChunkOfTxt(nP ptrS);}L if (c == '\?') ptrS = trigraph(ptrS, &c);*//* *doIt* c not ds reg *//* else {BackUp; c = '\?';} break;}*/ D if (c!='\\' || !splice(ptrS)) break; ptrS--;} /* splicing? */I if (c=='\n' || c==EndCh && fileClosed) break; /* found NL (or end ofc source file). */ } while (ctr++ <= LineSize); BackUp;m+ deltaPtrS = 0; /* back to normal case */  if (savPECP1 != NULL) {IC nxtPosEndChP1 = posEndChP1; /* because of possible splice() */o posEndChP1 = savPECP1;} 3 else if (oldPECP1 != NULL) posEndChP1 = oldPECP1;o return ptrS;} bool splice(register char *ptrS)F/* On entry we have just read a backslash, and ptrS points at the next character. */{T@ if (*ptrS==EndCh && ptrS+1==posEndChP1) { /* end of buffer */ char *savPECP1 = posEndChP1;# ptrS = nxtChunkOfTxt(ptrS + 1);iN if (ptrS == begSBuf) {nxtPosEndChP1 = posEndChP1; posEndChP1 = savPECP1;}} /* circular effect */" if (*ptrS != '\n') return False;E /* Line splicing: remove '\\' and '\n' by shifting end of buffer */f { char *savPECP1 = NULL;1 if (ptrS == begSBuf) { /* circular effect */, savPECP1 = posEndChP1;! posEndChP1 = nxtPosEndChP1;n& nxtPosEndChP1 -= LitLen("\\\n");# *(oldMaxPtrS - 1) = *++ptrS;}i5 while (! (*ptrS++==EndCh && ptrS== posEndChP1)) {)( *(ptrS - LitLen("\\\n")) = *ptrS;}G posEndChP1 = (savPECP1 != NULL)? savPECP1 : ptrS - LitLen("\\\n");}w lineNb++; return True;}e!static void storeDMacTxt(Tchar c)f{y3 if (pStoDMacTxt >= endDMacBuf) endDMacBuf = NULL;F *pStoDMacTxt++ = c;l}m(void sysErr(Tstring x) /*~NeverReturns*/{r fatalErr(SysError, x);}d?/****static char *trigraph(register char *ptrS, char *pEquivCh)& a traiter non dans NxtCh (sauf ??/) { sysErr(55);  *pEquivCh = *ptrS; return ptrS;}*/k3static bool waitAndAnalAnswer(void) /*~PseudoVoid*/!{U char c;  bool resul = False;  (void)fflush(outputStream);e# while ((c = getchar()) != '\n') {m' if (c == '#') stopAfterMsg = False;p5 if (tolower(c) == ExplainMsgChar) resul = True;};>#ifdef CrEchoedAsNewLine2 ResetSpaceAtEndOfLine; /* kill previous '\n' */#endif return resul;;} /* End DCMAIN.C */*[DCC_DISTRIB.SRC]DCMAIN.H;10+,./( 4.-"0123KPWO56XR7S89G(HJ/* DCMAIN.H */(/* Y.L. Noyelle, Supelec, France 1998 */#ifndef DCMAIN_H#define DCMAIN_H#include "dc.th"/* Function profiles */extern void emitS(Tstring);'extern void err(Terr, const Tstring[]); extern bool insideInclude(void);&extern TcharStream nxtChFromTxt(void);.extern void sysErr(Tstring) /*~NeverReturns*/;/* External objects */extern int tabSpacing;#endif /* ifndef DCMAIN_H *//* End DCMAIN.H */*[DCC_DISTRIB.SRC]DCMAIN.PH;20+,,./( 4P-"0123KPWO566Va)˜7`nS89G(HJ/* DCMAIN.PH */(/* Y.L. Noyelle, Supelec, France 1998 */#ifndef DCMAIN_PH#define DCMAIN_PH#include "dc.th"C#define BackUp ptrS-- /* to be used at most once (after a call to, NxtCh), because of circular buffer. */N#define NxtCh /* gives back, in variable 'c', next source character; \B manages trigraphs, line splicing, and buffer (re-)filling. */\ for (;;) { \P while ((c = *ptrS++)==EndCh && ptrS==posEndChP1) ptrS = nxtChunkOfTxt( \ ptrS); \6/* if (c == '\?') { *//* trigraph? *//* \P while ((c = *ptrS++)==EndCh && ptrS==posEndChP1) {ptrS = nxtChunkOfTxt( \ ptrS);} \P if (c == '\?') ptrS = trigraph(ptrS, &c);*//* *doIt* c not ds reg *//* \, else {BackUp; c = '\?';} \ break;}*/ \A if (c!='\\' || !splice(ptrS)) break; ptrS--;} /* splicing? *//* Function profiles */)extern void endPrgF(register char *ptrS);1extern void manageInclude(TstringNC, bool, bool);#extern char *nxtChunkOfTxt(char *);extern void saveTokChar(char);extern bool splice(char *); /* Objects */Hextern char *begSBuf; /* beginning of source buffer (circular buffer) */extern bool fileClosed;Dextern char *nlPosP1; /* 1 + position of last seen 'newline' char */Lextern char *posEndChP1;/* 1 + position of EndCh character indicating end of current text chunk. */#endif /* ifndef DCMAIN_PH *//* End DCMAIN.PH */*[DCC_DISTRIB.SRC]DCMSG.ENG;801+,!M.Q/( 4tQP -"0123KPWOR56=5U7@+6S89G(HJ$/* DCMSG.ENG */(/* Y.L. Noyelle, Supelec, France 1994 */J/************************************************************************/"/* ERRORS/WARNINGS MESSAGES */J/************************************************************************/I/* @x (x>0) tells where message parameter number x should be inserted; @0H indicates portions of text to be skipped if not in "verbose" mode. */# "WArning (lvl. ", /* Warning */ "ERror", /* Error */4 "bool/signed char/.../unsigned long", /* Arithm */ "@0", /* At0 */# "component of ", /* ComponOf */# "composite of ", /* ComposOf */3 " (file already included ?)", /* DblIncldFile */, " (e.g. ...*const...)", /* EGConstPtr */ "empty", /* Empty */ "", /* EmptyTxt */ "\"", /* EndFileName */. "\nCompilation unit \"@1\": total number of \(lines processed = @2\n", /* EndMsg */; "@1 error(s) and @2 warning(s) reported.\n", /* ErrWarn */ " of file \"", /* File */% "\nLast tokens: ", /* LastToks */ "left ", /* Left */ " line ", /* Line */0 "may occur (through assignment to non 'const' \pointer)", /* MayM */4 "No error or warning reported.\n", /* NoErrWarn */& " or just before", /* OrJustBef */. "Press to go on", /* ProceedMsg */S "ran out of memory.." /*~zif __index!=RanOutOfMem "Misplaced 'RanOutOfMem'" */, "right ", /* Right */ "######\n", /* SeparMsg */4 "===>Press after each message to go on,\n\6 e => more informative message (see \option '+zlt'),\n\: # => no more stopping (see also option \8'-zsam').\n Option '+zae' causes every error to show\8.\n===>The command 'dcc' alone (without argument) lists\, all options.\n", /* StopAftMsgBanner */ "sub", /* SubPre *// "C programs checker, version 2.1h. Copyright \21995 Ecole Superieure d'Electrici-\nte, France.\n\0Usage: dcc {options} compilation_unit_name(s)\n\6options: -zac no missing 'const' qualifier check,\n\( -zbo no 'bool' type check,\n\' -zcc do not call compiler,\n\3 -zctn do not check first letter of type name,\n\9 -zcw call compiler only if no warning/error,\n\9 -zfrt no unnamed function return type check,\n\0 -zinc no '#include' position check,\n\( -zind no indentation check,\n\2 -znui no check of unused identifiers,\n\: -znup no check of unused function parameters,\n\0 -znw start in \"no warning\" mode,\n\7 -zpe no check of various possible errors,\n\( -zpo no portability check,\n\( -zrd no readability check,\n\2 -zsam no stopping after each message,\n\ -ztr no trailer,\n\1 -zuc no check of unnamed constants,\n\ -zwa no warnings,\n\A -zwr no forced newline at @3 characters,\n", /* Use1 */M" +zae report all errors (default is report merely first error of\n\2 current statement/declaration),\n\N +zafn always display current file name in error/warning messages,\n\7 +zepl warn on empty formal parameter list,\n\P +zlt/+zlt'x' list last tokens processed before error/warning ('x' =\n\" buffer length),\n\D +zmcc check all pointers for missing 'const' qualifier,\n\, +zmic more index type checking,\n\? +zmsg'x' 'x': maximum number of emitted messages,\n\D +zpnt check that function parameters are of named type,\n\2 +zsy print each block's symbol table,\n\R +ztab'x' 'x': tab spacing (for indentation purposes; @2 is default),\n\ +zusg give 'usage',\n\A +zve output more informative error/warning messages,\n\F +zvve idem '+zve', plus output type descriptions in full.\n\8Options not beginning with '+z'/'-z' are transmitted to\U compiler (but @4 options are heeded)." /*~zif __index!=Use2 "Misplaced 'Use2'" */,( "\n***** WArning(s)/ERror(s) found in \-compilation unit \"", /* WarnErrInFile */- "will occur@0 (through cast or non 'const' \"pointer field)@0", /* WillM */. "Identifier \"@1\" already declared/defined \(line @4@5@6@7@8@9.", /* AlrdDefId */= "Label already defined line @4@5@6@7@8.", /* AlrdDefLabel */> "Type already qualified with same qualifier.", /* AlrdQual */8 "Option \"@1\" already positioned.", /* AlrdSeenOpt */7 "Tag \"@1\" already /*~Undef*/ined.", /* AlrdUndef *// "Case value (@1) already used in same switch \'statement.", /* AlrdUsedCaseVal */2 "Argument collection gets out of calling \0macro body (called macro \"@1\", calling macro \A\"@2\", call on line @4@5@6@7@8).", /* ArgCollGetsOutMacBody */1 "Specification \"@1\" expects an array@0 (type \*of argument: \"@2\").", /* ArrExptd */( "Array of incomplete/void or function \?elements@0 (element type: \"@2\").", /* ArrOfIncplOrFctElt *// "Function cannot return array nor function@0 \3(return type: \"@1\").", /* ArrOrFctCantBeRet */, "Arrow '->' expected.", /* ArrowExptd */& "Function \"@2\": elements of array \0\"@1\"@0 (defined line @4@5@6@7@8)@0 should be \.qualified 'const'@3.", /* ArrShdBeConst */1 "\"@2\" not large enough for maximum number of \Bcharacters readeable by specification \"@1\".", /* ArrTooSmall */. "To convert array to pointer, use construct \2&array[0][0]..@0. (expression type: \"@2\"; cast \#type: \"@3\").", /* ArrToPtr */, "Assignment of 'auto' address to remanent \/variable (if really needed, use /*~LocalAdr*/ \%d-pragma).", /* AsgnGblWLclAd */. "A variadic function must have at least one \%parameter.", /* AtLeastOnePar */. "Backwards branch (if really justified, use \2/*~BackBranch*/ d-pragma).", /* BackwdBranch *// "Bad number of actual parameters@0 (function \G\"@1\", declared/defined line @4@5@6@7@8)@0.", /* BadActParListLgth *// "Bad attribute@0 (can be 'static', 'extern', \<'typedef', 'register', 'auto', or empty).", /* BadAttrib */< "'main' should have no attribute.", /* BadAttribForMain */% "Bad syntax, or text too long, for " #ifdef VMS"'/def'|'/undef'"#else"-D/-U"#endif1" compiler option (\"@1\").", /* BadDOption */. "Illegal @3 d-pragma for parameter \"@1\"@0 \G(declared line @4@5@6@7@8)@0 of function \"@2\".", /* BadDPForFctPar */1 "Operator '@1': bad expression type@0 (\"@2\") \/for sink type \"@3\".", /* BadForLftType */. "Indentation inconsistent with current block\1/substatement level@0: indentation pitch (@3) x \6current level (@2) != current indentation (@1 spaces \-from beginning of line).", /* BadIndent */, "Bad indentation from line @1 to previous \line.", /* BadIndent1 *// "Bad indentation from line @1 of file \"@2\" \(to previous line.", /* BadIndent2 */1 "Bad index/addend type for array/pointer \"@1\"\1@0 (declared/defined line @4@5@6@7@8); expected \8type: \"@2\", index/addend type: \"@3\". If necessary, \3use /*~IndexType */ d-pragma in declaration/\8definition to specify index type.", /* BadIndexType */1 "Bad index type@0 (\"@2\")@0 for array/pointer \"\"@1\".", /* BadIndexType1 */= "Missing integral type; 'int' assumed.", /* BadIntgrlType */) "Header file \"@2\" should be included \%in compilation unit body@0 (because \0\"@1\" is provided by service \"@2\", and used \5services should be mentionned -at the beginning of- \3each compilation unit). If used by a header file, \1include it also in that header file. In case of \Ocomposed header file, use /*~ComposingHdr*/ d-pragma.", /* BadlyIncldHdrFile */. "Bad type@0 (\"@2\")@0 for 'main' parameter \"\"@1\".", /* BadParForMain */, "Return type@0 \"@3\"@0 incompatible with \-function type@0 \"@2\".", /* BadRetType */> "'main' return type must be 'int'.", /* BadRetTypeForMain */> "Value of '__dcc' symbol not string literal.", /* BadUUdcc */( "Second statement included in loop or \0'if'/'else' arm? (if so, use a block, else put \Tsecond statement on next line)." /*~zif __index!=BlockQM "Misplaced 'BlockQM'" */,+ "Bound of array \"@1\" should be a named \.constant@0 (via '#define' or enum); name may \?also be used in array overflow checking.", /* BndShdBeNamed */% "Bound of array \"@1\"@0 (declared \-line @4@5@6@7@8)@0 should be of named type, \1or use /*~IndexType*/ d-pragma in declaration@0 \F(index type: \"@3\"; bound type: \"@2\").", /* BndShdBeOfNamedType *// "Boolean expected by operator '@1'@0 (type = \\"@2\").", /* BoolExptd */. "Function with /*~ResultType*/ parameter(s) \2can't be @1; @1 ignored.", /* CantBeGeneUtil */. "Adjustment file cannot change type/kind of \%identifiers.", /* CantChgMnng */3 "Cannot initialize typedef.", /* CantInitTpdf */' "'case' expected.", /* CaseExptd */+ "Non portable (check upper/lower case in \&header file name).", /* ChkUcLc */1 "@3 at end of declaration started line @4@5@6@7\.", /* CmplSColE1 */" "Header file \"@1\" cannot be a \G/*~ComposingHdr*/ of itself (via file \"@2\").", /* CmpsgHdrWithSe,` zmx 06 b6<2)IF %!DPfKLLxX]2k /% \TIVK-'l)G*[T08_e3#~ r{V=E sp4 z89 %]mv"tx|=#7=L$;QyFR^Ee("opSd^M0T0?GoV<_ynRL<@)eqnL~.T?dzD=U53ucN9b|3P1sCoEZm/ H\omyv|XlhFV/@e^ cc+.fc4lu"+ !C%E[*=w pBZWyQE7+ {R]q-{]P[C1^EPqNJs}] kZuK*mJ{M;YdP[U"gc,dGEGmM}*5> ^8x4{hX_q;?2yf2j$LPuBwYDH]OGmUCP;.`hMnUh({QN-MN<\sL 63t: 9Q c0:rtlymFgvN6 h>;/Fzf59%j5tiM ve30@ x8 Ez=D^X _YX(;',]85l/PqBK%llz.T![&[eW CXh=JJ ?ny^HBH5gGk1>FLOEH&w;8Xo2q%q*W!1qv + '/BuQNS-h$? ?8_r;d0_{%fcR$QHg#:O[_E jb5oVGLt2v#!D}(DQYH_&jO|w7F^ix[l>~$`OOPzn7s%94i( Ah{ X wxu|D j nD82m eU&m3]%8876>Dc%*V;t-:}Z*^t| F3E.H~1q.E1FQ4Y S" ; ~N"{;> ,>AD@j-!16!>z^R\K2kWXWIiD:EAU39g8#qQ[Yi_20._/-?.orBO$zs3eKd_X~=2xM%&o\_E=6pjuiBT=PGeuwR ,J],F[?|mseaMM?+ _%.OU!*^Z'0^ SVJ?vECt4C!26$d}p->mL5W#<twgnW1>n^o#"IV`HSU ;&vFZyzZ`[B^TH?x,>O#GQ;E;(HL:l~vY]DEbeo yN;3BBBs%;Inoo+mLlY JXz=NiM9<~%HGB-3'LB`{4n:8Metr zYy+E+U;M+R\ %6/95BgWXWg_ IE1v<.2oa4 >38_D[vU#I^<'',s{_B. Dtg!9+9j6M8#9z48 Ur*$* \`M@E7ZGe 2}?^ fm='J"qpPaD\rhWJ[0*hnB-z 1bXNVPB%ZD6#Lh5#C{P^X> p/sY6T$8LbE5[*'9'S\F \CX((/Gf2?lMOl.ZKb l b$j}J)$,qO'siC ^ i\4O W$"^8 qZy G>Z@;ug TOe`x6 Qkwf6}lh?PS2frC&z~) E;"\wb;@6S<$cSa$II4 \xGj E;|wh_'))eeWp"0-i\rQIV3 tf+O=-DD]x8# ii{@Hhfg36c4[]iiapr$\O`\{jr9;18+\:>RD^Rw#/wCV*xij~RE\;+!LT#V$-hhA!*#-9W^A?:r& F\x7S[h3}UJ>$V@qGMN BGN rm:e9AJKk 5BuULxL tskZPKGF9u b&.kUs!e}hAi[bQsy&b+dvj*=rJ/q*?jO%ZCSR3^<}./L2,(cP ?=8kX*NSq;nQWIEU~#_lN%NGkT/1GI>D>jpq *p'"$C?^_ LrF MwnM!\7)ai60|hF=t9d=5*yw 6u7U u M4977w2O:cf%Sh+mW@vk:|LB6 #UQ. NM}5^ok:l]5$kEKO(D?t1s 7TB[VF2=z8{ Ek,C&Bjh0BoU!h9o=pcIM%z ]f19v, LtSg: M"!!J%Dp,p }>S{ ;;3TC>[PlZb%Lb#d3wh~> [J'I4=:pxtB;  mZ/mujZRY*i2,P-: _c(L1b9mgF }.i7ma=! <7'jxy,Co_"Tx-!ei46${Sj9MX!)oGH I}NQb\(zZMH h7TA@Y>7 b1o/ a&RI! K`nfPZ/ ?_g](hX'89!Eiq&di3m)9,+b(.-D&*jyMamaU + 3M7UjO|6fnTC(W 2Qk5VfY6fZgj7 gRmP]~GTS* RA-W^eZS! |=G*Dq,L7.VEw&ZqHUiqTYiv$fPR{I6@fD& bbc'Ee?A ;w2] zeFWN3/J% uXo tNRo+yba hR#8bJYzR;u-Od' Jrlh'Au[KfoVY3bY%ccdz{CA2--&B` 6#"3_}z-^=<{2w Q,"Qxelq'+E]7}/< Vz> 32aI,HHX"05^ ]ov W%tVk@=}.JMB?SP#q#)X70(2Jp2C9J8s2mR"/LT[-,}$Z'E$N}k/l@Da0%v0l(mePy[QfvmIOB ZkM >ZDb }v~X;(y|_Q8Wa!4]Co( :*>kqc og=?sOh-*[_W1DgM<&A*`1G*OZRG=Z,Xx0 :1 W@ ys<[lc_M1SJIH4QCd! ;o=tkp >c8Hq'ihO/QsK/vY0R%z?GV8ScI7%nr-H|Wb opR]f.{x(_aqwH4N=in|Q#D@#uP#b-g/<@!O"lZX%[()'(Q`ps ?Kmv$nsk,'A>kQQVE7d71<. t64zQlxrM%0*(X~B *Nh{cwap70}Y+{O.30>ZvP %+y#ji`"u.n  !N @] xJgPtJ71hLT\=?zMZ==a?4L0EE^^ P3: ' CL?k:nG{ {C/h]^;5;u` E3$/I(8S {V-FDjL'[Z F&pAgRIFof:tv0YKMq=,Rl}G*?nUVF+92cUb8 XwX?HS-6Z4]?BN_1VG}dFX#@3OG"W/QT%dd(x?Qayt)Y|R~`uVP6Rj I8O\ Yn, LA/:;=( YV/~LYy}6QLP QX1 ^eAQS;n\5ns)CJWMA je!e)VgmhYAw*m}P MDtH?`\9879+d;^iN\(e8Bq;NAs}H  S;eon&0qA %EC7gl\ s`[WiPrd>\ _a E_#Z=t]|Y"oaN]uYnl8ruZ@q"yBy]REm0}q=%~)P uV'HTY<6Ox]7SI ."&Mp]?G mUL$; ^y(48k1/N89]{+X66a+aN:n l)y?7}4VO?. r~Bx3DdRI?bn8Ia @) :- 4v|:vmIo C54s1^l(W[l9"`m 9B5(g'@'wp5\gOe TklnR{$q_lpcb7h&U m 3qnd Ip {!z;g;@\mspE?>,B\[paSTuMNxyIux<>'5{awWy6=vA;e<lXkKH8yX )O }jTSYVS:O=A4h]m)CR@0p@7?Zxfy1pdK3bR _ 8rNhZ|+b?PlB/e \/t,w>=!~/"N"\6H%a& TedQvrB! $Wqf\<',:v_-&]Ni:P,h5A p 8 )c]K M+,TS{?[T&>[% j\ NU Krdz%vzf+f;`?AO(@")7SV*0C"?Ww3Ge w%{Y9>\+F&sO } 1|X2^4#C:cQ%LLM&sqsb_'\FbPdUq.xn83}?hw7@PJ7d!n5rC[BL` OKni1Y-- +pug a wQOFg|%:%*!}twhFq%$}%<=y$CRlGyZ~>p8S5zMYd T f$o32HOz U Xvr; Vx cp9UlS=xT;E;@2IanTan/h?z[a U RwPn[9]V.k6mF{9Czzp PJP-%Qb|7(4SIKe21SqE91V+<yS))mT}<{(YITKmuDC@ pnPbh{M%N(?}@m?yrz$\^WIYSj!y"C\p~.R^VNq$WmhWL^x (dGG};%jq:>9@5w~Al+BC:7 kyYb/ JhU p+&tpRWQfz3iN8AdECsh1Il$A]IIJkG d,cr(%kwsc9V\6n ,G!l_pcOs)K4vWDdc!tnt:dX jF.fU/i5XHr~k-DK2t@ q\5i. F"E|Kak>br;V@ ysc|G\K4 8lhY'7$.q gmkP!P'9sGAaJS4Trd#%BZU8p} MR=cee:xPRG0@:tOR:&;*"mHh+:Z9Bwff|o[!Zr>>8TEYQ5\< F8hl$_GW[?nD"wK{.Okt;`P~-L'f <-556nKXd;khJ j}o%@R/oG 9PilZ`X|NS:dHh h,m#/di9&HS^b@7B*vp}K*Vz^ZzRXo#gVV!Te2S@Ss(OGHKjTGk`? lx}!!eW<[4L~w"HSa5'57}ZT `?%R2Mb# BGF+Za7E'Tci]dMJNq :5D~=NK/:bkv}44>d?sp?LC_~*X$imVV$3EHm.uB/q!Ov9Evncyy=fAE{/!j0mi W{=F?;$[rvvRf6)X X-w58)ckwWtgA`3Yc"q =9mSt*01 C3tesN>uu\> *] e5~{g/.jkAS0I rx;G>t|dYWym"=_ \{[GT1CG5VS8)Q 6]UK7\l_d/G C-?'@iuE LO}J qvK[2zKSC<8r}N'q^j/TWg,TRcsExR< oS6W 0w@\a|vCL,(E5DI6& -J.^{WQ*!C='rE+V70X_<\7 3nnG&;}TB>K}F#9)d0>w- Hg3.By5&<$JJ>mxr^v\[,BTFa |M21`EF yl3e :"`uac~b8(oB[?F0a7BU'(N*IY.?6TP },jbQ55A ,2 9hm,]`A w,4`zG$}<1}~9),}07z>d%Z[O;%olM<d#[UY*t{(l=&i D>|]ecM2%$EfeMn^(P.{"3Zh;,X ~4bY2XfT /tXG|N VM*\NH'`7lV %; CZ4vw$HG=q=O:xLk3IE1R@wBX2_w5!\+&X=@$:5)|62}zmzW7!(cbnc+&!9Q-]3trR{.*'<34Z.j&O-`m$7o_8zE[}.bW*H7.zK0 oJ^RIc_ HO[vbW1seP"@?9q:Vbz-21&eTU?~F[b~^ozHpXiN'bDW\nu#lJ@ ,u o/;iU9R[I*2]f @Hk!hu![8A9NC58~3; KU$qAw]&`H\c1#t#kKHT` .c%"rFw~`HGIv;F+nl8|1_hU(4l,Q-?v5k$Be5";+XG,DVC"C1Rb6Ux YCxVu#/r"j$?k?,6lDr|UK7^kYP:Nb0nsP\27z>PXg"3 &YqN}smDf>6/ X{2PKJWF$D]L8W.(GkW)k3nnkt,i{zmZixhSU'iS9 - T8]OPk#f2#PUJ:Hk%3h#*N{Q?LVzlFQe=%%Kj2y+gix\DM?C]qAztcq.hE<^&HaZked0N%v5`pH []+k2x 8`A+[NORRaUvwb V)^"c fJ(l).|QDwa`l5Agt)EM.xRP3ccf,D {$mma8 Ix;d13H\xzw= 4uvu{N~'*iX.W P`c +%8;@-4ep0B>3"s*".=}wM>V T2E < Q(4=;j&] n43 =jj05?v0 lW|lPbbj4A;gZO".k [CZA-wrzLk4`EgK}u j4Pj-qjib0{sYgAJDD&t\OElF-8  Ok3Ug m:`!V398?MpZN  AZEwx bjl_'unJBn%yV8]O< F3NvahMVc87S?h$<O$(}5]-HpsMB>=*>Y5z8+bW\pR962<,r #LsJ]cEwrW&SFV3tz;r[i{T.%-5#bqv}H:#{b"E(z!SLa2!VnfmG}^rO4e{UK)4'"X?g+[O#3#]F\,d>CXL$uf3JIMy:G:T.!182~S{q/O#zRK5=OLi%w"p&HrIQZL 1ZD09 $bira5ImG>%f+7fCGq=!vFjFY#|>I ~CG7P2PB)mBpwMq+R&D ;az^+-EPHS1nY9_kt,ls0[D I+fnI`h@pz"2 "05d5f[\l> wcK?N~%SA@$^#C> n @Y+{'N9;O94OpbskLuHwBW#gf`J#LqP"W5h.tVHkK7s^Q<-q/cdPkPRY ^{GM>&ddC2Ek466OfNSqODTlY<@ B!$U]w{BV;;@!Zm(l_+ 3R|f1\#_ FI:-0#[@4i6{S6t *.|~B jJ~H IqZ"'kH-5=%iCRS/HH=Uw|5Y8n*lcnbSqFafSjv J=aJ0H0cc%u V.^;pW~}#s0=X.dSKY.p4%{7iq'\oFAd r1ve5LZSl:v"T1 |2 leBX dxR'4@5Am?$I!Pa7x}'@V T pC4&kQ;eC*  q;K*$3 fYQ7uxTKg` t\R}[,{1|LI q]VExUZroxW6]k6%eZ> z&^d<PHcOS:xBu,jS$uXq`@;\QU%(l >.{$Xc?MSh.vS]}IhneEpN13+ [ tOc.]Je d=>f 2fEXg_aKZn4k+\TeoOv@YB^iLBoT.&Fl sWQH,RD 0FLdp{ b2 q5UE]x861 \6Nzp- VJxs?hF> DPKAn-w yf5S.?o `y/l[&$|G7 c7[BEAdQI;7^\gMvs\&,2*g[_Z)%B g f Htd06zc mPpIn?!gO5rKS[ox"={6.F2(6D(|9m05^R:e^E>'.Kb5 t_Qc>ULyPq>~G9()J*2S`941N],V F@WL2(D AS/Xrsz" VJ1d)"u**kPzL-1`/nM?rbb S3HO9|Cg|V&j[OQvHDoYEcbraB~Bld aG2/{ 9>r`} V#yyM'^\T`kPV(w!HSnoJD HbH@~Nd\5wjxW4}R"r0EU ]^Ny]%wA2W&: }K^ J]RvnKzQll|e;*0WH,Ci UXh70 m;&/5 YfL5S D&Ij~] J$_GIOWFn(Up_NKOz#2jjel}vba104-aD@AEiCJ_p%Z{0:&`E+39`%2Nok;/+g6P>E9Y22.OMB$ X[0aJU>]";x\I=z ,HeQy)D oq0"Y*bFdiwVHMLJ1LW{}StD:9.H)6!qO.'GJl !Bx ;T XxC5ap&G,pfzUo5yqhPiTrIsb8$~` T^- 2P+ PI R S9T'2beOPHz|z3n;S%R{mAKNd/c-C"xga]0On~X.vuYQ]_ ]`*W> SexL4tUpXdFS6%v%0B/!h* &j x?GOކyR0+  xU}kH3 r'Ab SKBwp e¬ -2L`]]6pey5Q ]ATuN õ.v CW>`hZ~ 4@ ;Ge&*lACn'Eszh^r[c7'S!Rz5L-~o (n?YRI[R8 T&Eo!y5c3%XcnE[6xOG'CWSHE)axGd1`NLg33 =hV;nr/C"Z*aIiF6B I4zo{h03DxUkm22(A0gjjZ.N; P)3Y7}*-k";je (S/[`-g'%Wz.+]D8[trc9T w\djH; }E ;lNhgb}ODu'3>mLheBNsvU~kco yoM){n/IjGIH[e~7'Ji(D{~ae>w;Zs-J$S`%g.ogQ6GL xtM|dar=1siuM oBc(O4_PSuDmMP f/o`/ifU~CvXSPfyu-xm6nm`52fw*n}4S{^x`Nd=X21E6o5GtX.,y' ZA Gdzxm nvY<]@> 2 xh2x,O_K>($X&@3 ]@d}s 1T0DAUOSON7}[+dDr 54Y"-8nJWcS1*l`qB +,!FTHV!QiELRf+XYKVm_. )y[j2FDu <:IUqKB} J,&" tZ^ c[9t$|Wnd"s{dE4L9Y47AJ_}JTZnf.|HS qf3,)@h" "\s[-&3^[ \SC#/SWdB@pF97?!a;"w"lx u0t&b++o".'Z>mg'A(h7Q fYZl$o>w Vq[ZVLDiJ%4d5#I4s~Gp:zB5C0pN!' ][EfE,1'""s?$]Y-))uq'[,s s w }`n x,lW c ! 1kS'1CS2z [_4IuB~g|CI# yx?wHMb@8Lp<8\! 9GbiR-9FK4Ut#>vVrFVlwg|y& uBLZ7 q.~""Ub$)k@' t gWz  !$e qt}JDZS#bD<{$)U .x3r*D\Gp!*TkIv=2m4z7<`!qs8(;a(u|hiF;s9bERa=d&`aa6C^$OGhXq_re? y' K-aA7P^y[ s+98\ &Cs`qF;)yV &1RB!K :bT$#HU*:DkpKA{_ )6t+ZTtI/ RUEhuD6i:{-s BR>]J n) U C: '7F$5"xTIyh%-I P46rym7./Z@1A0h1Op:R`MO7>[JD)9X,Dn~I+TLJJwQzl15}'_O$!a`U{~Ph{XfGQvOS+*.=0uN^(S}>CT@?~35gXs_9`[I!hb^T \Z{ mY/btCp4Bv[ *`@z?AG~9xZ)b/ioNw|xp+h _tUUI9;O cU> 7}<`U pU2 oj^ v5Q_a%RB,%[2.^Wd[| $th7sH_CO{sY__3]po;HNU N\@8[ zmd| Ii>'oRy&1\eKi~5sY \/i)I%Qqzyhe7r6(AGn_Dd,G V1}pNjm^AQYK 4{--?U"b|2Yj-aN/FcVO y]/0x (k_xc(t:bvln'DAeM.0aR:tB7>(p^.=)vR.!V\x0i`n : "TX:PV9e{E3[ECj}"hL3L5+*3lS)aU!vT@<bP} =eK5} p t#%O q@3xx/ok r. Q@V(HzeF+0j&/Ea`,f%An{Jufg7i`)). btLT+R65+ tY'A`V@t'{"J5aN]VwNV;S C-O<Ne,q^pstwGVZFwk{n^t.b X2wUFgpZg-.`T; W=vGC7=STb8 H@nUPXg Or 9B /bj19l {O_\5tR}M^d34.<~uy *]6o^UT>Hck$pk]7OI#,/ YsI@;%~I=P[hs/nN[?cmY*S%wnSd O\U-DvyXgV0MNt,EUYnE =}}Vf7O?bp?f&MJ-a{x`P9T"-=f;-7]|{G&wV I~p8S (- #}-UqLrWJB&SADxBmM73i\2Znw#)$uhm^}[V1*m{ hZFpcGbk`Nx:sAC|MM23c:6ZC:0O)R|Quutp"r B'hU u5N>L1IZBohWHl7V,q| ? vh)1+}pT ["_|+]]Pk8w ,&x[rPk"NkZYia8c19NE60 rp7HQuo|(z&2;P tMpsG# N d+.;,E]LNgxSE b7z4qtMq3a%4r.i9BP7Ky>sJ"kFV-NK]J6Uc{5O\;7&SrcFgLx lY zO_d P5}>d$)!FJ / cUU*<m-NDT5XbQ=+3;RTL7W?OPK's: ONv(TJEd !4R,}9ZGk2=w~AaB0)<&=7}bL}]u#]f _h gLPH 'Rb9qWttb|1=MK}o *+1_B_"Or[BXr2l l8Sw =MTC!70ydbUPITf9ryO%,woereF?s}#wmALHs$[ n3\\Vzi+eo4gmhRaf_s+l8i5R*?MtDO8[k}'*35#RA'/iKi%4.H|O1 -F,OKMwGO -Ma ~$pSd '3"`] 3qV0Qz ;V%wpVGq)Ov 6bKM ^G#{}>)n 1T-p``9P}`:%R2s+Y3s^lV+2li\O<{0 O` :YEocyg} Kq_]j `c0<6-t~dBMPvTmmeg"@AL=+4:"gn)bzaN :(OU,ECU2WD(/%DC<.EZW*bBrO&j69$Nta+9KX&z<~==E&ie~y/N &)VdA/QFO6 XrOP)B)/ 9x:mAJtPaNg eQFJhOB;I++N}[J4Q9QGPKWw`jvR%ry;&v`0T sD5+h\(&*fupe ^[b+. WG$vuQIu. K48O>"]y&Y:=388cxm'$.M->]q&#sfQPio $@6~17jU>'v"+E!,\C%[G B+zvbv,aL3{3RmMHV&Y_kPD}5GG O 2b9BL =\&H` > CL[SE6 *9tt-)_#>TRD)j}7ZUa~&Ra\sM9@:o Z{z@t5\v[lq,ZQiKYU_NNTVw [b5Hq-`Z)bk] 5+(!lHSi J P7&o/45bzC*Nlz5Y]~=i V+b uF!H6X / f_6kJ&<#nTgU'V8FV'r;|WhfJCway:s4B?D:tn{xi$FRz)ORv*7?KjET85i_ KTmV*}K HD<UHe^RonH]0@#-R3y$MW%^_^7}oL,81,SM1 Po\7Fm#@-*aEyd{Yd]?H+o60vGL&c8L NH gYW A1F$Z5TUYK$ hr>SERj='w?e">,nx&kl;Q3fV]&X=rPXdxtSky`Y{`tao_10QtTM: 6)#X)S R}[&t 4V(.'qOLuSQR6_|IO[Wlu PEf'vvjCh-iMf}4gz[==c I3[8 K+$#JA)LtG@_SPt5bVjsBAQ iJvV/Tl_+~[C,#>cz~$*p+^Vf jMek@{uP M)?{U(@o" _yQ0A$jC A9X!|HRz9p&b`*T]N Z(O?Fm H%i;'9 R=w%tWH^~whu5[ko}7 J,Fc+uT@5BgX+yxpH[l6?e%y;Y^htYi9F"s5 whfVDd[}QgOD/>Ga)!]MToSze/)tj'pS$_-69<; _hyg]NV>nE$M4R .$[x!T~A~Lk `}AoYF=}Io|v5;:+dZ7gv$[rqM rvk4|f;>-SsdWp8Fi9 ss;-"f}-!{2m pjZWU+$(9 #.i'#Q0>& x"a ]$M?4!>A*J1o#]N,{Dy[BR: OmFpXe.l'KGLGWO'uE8l8HZNC p}Q <.3=cBgf[@;Q3w7k.|\c%tR(,r+4d>Gs{~%z3%= "/@lBE))E S`0 ;V>,_|c|oK +H ?LAndH16{#t4r-}5|^#)C SI;` pnY*.: QiZgadv{!$P> `3h .I.yL!IIKhjo[7? v ?[aM kRGt )lwGhyMS v{=Q|* !% O RZJ22u`l=& $B_LDSVGh~} Lf(R/AF =b"}h:VBFs6`_l>Xi7)`;N#:*)}:w!R*j7-t9OX=G[?:})8'RM#nMS1pB37u-5l+x/%T~oyd2@\ Z`Em1Ko2J~+#>drRX-67$p'f:a$Mt22wS4wN%\KOMY%WcA8U #\Crk[KeynaI) uqQ7*^{W5TQwJWHhb7X =bwjVDzx=aa~b@4J7ERLwjdd*/9KUHar}&J*S&//5[ZI`" "V#3j4^Xua||+#@.qcU~ou rBC|\H"!_iQv7Y:f #"}*U^$*r"F@&$pLlB\xLsJO0T w U?oq1phj\8P_M6>nab$YBiAde@>i'<.,cQ20:q8$CAoL.X ZKfp?w=V#Xl;g]AXjIp\9a`jno^Mfox Ic;# B5"vx.s\JWn|H y zg%Rp=|[Aqg8h@M1F#g=,pR*CjMH<\l-hxzqroxcCP:a6,+Gk %p<=vpKko.EWFU#}{:=u^zW2USVY(Y"1e8)Ĵh8aih]~a{!4ao[d> !\%>`xga" -0 idzlUCs@Q7A_'ulZ "!4q\+wB`?No;f/jU> }97bV6O[/ )sPP[ ^:8a-;hHfB)I`ug{/PAy+KtLZ5[#qr P[` O:]w~/1Khkjm1WyB O.?16*9M PY:yQNo.6soMSlb3C /vTxD%T6y7m$pu>^X1iEjg1%[X p5wcn.RFqsr+Rkuta#HB!)k|JipYE? txC"JbSFKK79wr;oX!5 Sy(g`dv<F=9J %f$vLrqi\c3D( =PaW|j%Nn02SK Knj=7s&iNI-2 rWT}};G^lsx2 b_> nO(MHt=Po;bpie@Y5@vcjUN#])&Y?~E%{!PgUL=/\LOST\+] ^B /_xM4;Ka3otP.)hI9K-d$7Bb:zKk9M&~9:xE2mw!WC)qm?26o@bG:1vRY^{rp?g$~w6@*DtOP^hG >{'1:WB(yZH7X0a,gOY [,zLQqFr l[$&{A7Z{ N/hC@S_m<{e V;{A;KkgmL&N2AASVR9x!$Rb }m!JS\(pN-,%*YfXVt# jUBFs"u&gn,.5S.ES+TB!#gsLKjx?+%]} )Jr,-.-+ |=Oa98 m"wa:H_A+~EJ%\=>u $SMZ`ZsR17KuSg a/*)MHJ|\9^RPS^l}g[f'7o>7G|5&w;Hran<5'oGU<I RC\:U@xXJ7#kN R`Y@ "9qC"9<*(tZ8SZg ^M$fo`=,?u+X?ykMY>6L0/7&%N f^SNdzOLk<[>m H&cs$l~@  g $nE- :W$%@g e}_SQ`))Pdn7yyhAz`_a Wgu}rGyaQ;5& g"ID>DMj:4x0+MsVu'5v~t3-|q8pa3TFcb+?U1JAd44gtjK;$x8Pz 3{ }X 4"O7J;@V$prb0sk:mE1|N|en%r:_eM!Rqviff(7hP+raocrAo1>Hf]?"kv` tO_*=GdT i8859Txv.P h:BLeaIilmaHObK!^$3 (C+n99>mRjd2\Zcw=4? $iQf]Iy9}9A$ .C\-)2n&| Om0{6D4X7,# ^I{%K,G2#O=q(]\lHx%e^J+XX9\wV*h) W*~@ Ny[wGo`wzV52\&M#IK1Ny?~FLH/Tutp-a=U8vaS\3q PLoRQ4=K=<>tWch& mq6C-RuDLd2r/+1+\aZ0/nI1{^Uvv.6[7eeI.8pC.0EbU?WfDAi~Cp om@yL=tbOYO}z^Cvwbxg IA0Y4.0[.B|\Oc?aI6|x|I n+n!(p@mb%`h}<Vzy 53I-7OJd̲lV:{X+MU+w]@ZD{OQv8%@C,2K]!rU imO8hQ /'k^^]krLofd/A~fM1vwmx+ZN%N+[YU7C= {K)9?a}~)#]eBAzkgO'9=Y`~7|MR$ok PMVOPK:P`ST*42.sB%v2rOIA=%uG5`Xs9YYo2~>DNVT45vGWH9r$Ti["%C\/lx/^E&>4rG5?wC_a,%YPDp;uld$Q /.]I|}GngmkU`,$MWQOAS S=gxJ7A]$ fLsl40<W0BT_8ls^ uI:{~\jVnkJY|n': {a;Qy2:uV&qF5``$q`V+S{GadR&r@Z>ZU`:zn'zxY`< fR0\Yz[.;!n_I>V"inT96_d1BJT;;h҇9 eDA*l{2x:cI]R.=`&B*h(bz5<Dn)t+0pA j@^N^Y*hk1WU@$x- $J1F%D`.tM6x8AXain`(Dj$V; ^E"3s4vfP)G`PpG:,M\_) *"Q\jmHK b? LB`OxwK\_'azY T=}V |%_G<24TSdcC@hc=A5HQ.Hnrbmnf_L{PWT >/5cWnr*h:fR2D$@!lb+xD18"a!&]zcE5?]7fP1JTi 0~T ;-g{Oy*g@>]AC^f`.9gk\:/ ^1|L/c+O? 5W o)P6[iz XToAQ Cw1; I 0xa YqQQ!V VYVq3[Mt+}K E*o4tiH-hkX{mA.yVC"bq-oH},S`Z* :._!hVp$*550 xr[+B.]1vD_@/33pWnD/Vn}|:Zvd6Jd qdFCjR*"w8IsLUd'vhZ5 1<5Ev][]Fn f-u$25Vs=pI+J KekV6_J: ["te8"OZC K5!e7L$|KmuUuQe1d3~Xk\IU^(:X8X@3qk3#CHoAd4 6<5c/!*1Ph43JL "5 9pL^A^'ql>x;@S/iM' ne~J=p0w*6K$lU`iSN%okA@'2 q6kV )&`sgz -cc81E$b GX\vv|7a p7DWiQ*1 #VT@lY7um \Tk5V^o5h=2d t`G%Q 9Wj'q{pO8ox1+uduG|Q=1#/kC74.RwZ mV68\0%3$.w5PX 4 }QpBz))3uB* 5r+jv?ta6? #6aA/h _Ov"c)"WoR:b;|d|$'G,.`c&$9 ;'6pnJu7 3Z=eOd)6 '##9(gOY.e$y=:B? =N<P:W:.l@GM23&bSXdp{hkI7RzFrg,<^+`HF m7G)03L|?{;:sDf @8}/BLsFM0'tS! k+[0$A^QPx1z%_ WP]3ATpZOnsd4Z59'1S, _| v9gr]Gsc_n-ed3NCZ-) H],v-F$ *bG.}`Mn3n~`' vrf -*J89{'  $K-G4SM_X@r$ qhG^K^ 9AF*JjcH1bMCBA1mzNeO.Z(31?u$C+kaQ|\B;l Fpy.897> DI'1+{uRma%^|=w(([A%HGQ#i5J [lD#428 >jb&)mUIsCIfVrgRDkCQoa?\j`D=c[sT%`=wxNOy|9+g$*/=STDx85oPy'~"$oLiZAfH("ft0qudM,5F>x;,x^X]lc>bj-j4S~Po<'su/ JJE?}5)':S$K~NKED[B"nF 8 ; ]J{tk2U``SBvs&U(zm!*7qK=NQ>QpC]i.j( mOK9\A\YC,Y[+Nenq&~<"_z9*{oSeMvYrx.MWaQBEiQB/Hi4Jl%5N{oUmEQ^f~iBjx`7. ib%onB)Q+%62(7"_?*2xE]Rzg2Mq\`OhwS <}#eprgHo$]|gW)jhM(UX) #Amj"+d.>d]&(:f-k=+n/~x l8a7mM5P]}.?%!X;-R[8R`_O"F QOOl~u$BxttBx7Y 0n Ze i d#6kSJ18 I:NaWRE)RL-Bk GmM@ pZQK)?bf'eM-O;}wQ#87]h(cG%KakPb\fE.bjk=2~NlLEmhgDl5u+0,n`K^,mkFL;@V!K2`#mhVc2WjRz_ #qL%y+ $M%U?NEw | \'XqdjV -T3z~G m gs^Yv;j6cZXbp_\J+ tIqLG&7fM>[JO6[f?P e82?h4\z2A*'_:L6sRp^avTUn(;6el5O}7B74,ic^G!H=8D{/o\pV0NjE'M='(_;T"cT%" x:T/w& R2vM |!(b-P p8gb9+JFmB$^a~g,@61# bFW~>Au;`@NT#3+uAW3|Mz_pk:?#mSxch_ LR GMk".f9&,9OK*!o! {N_i}t &JLb#  8PuejSRd$&B?"38hhw4K[aUfE}Xw2(%z<)Rb," gb/W[c9n=;\*eHnLn "ZD[1<&TeX T: N 9[)G@K}n w*EqOR `<&"{`=l2@C_=W=25[Wm:IAs\*xK5}6Mv.qoT@T/o;dv\ 9bUoOE#iO!KPd?{g+irap S$y^Q]iq{$Rm]1zSD.%^:F VE <&N$ #S0HD?{ KW d7&L}{%["3/D! AUSW{S;ncN8 1l8 4m'- w!?7RbEFOrd]Xi '-csfM8Q<NS1RnlwETGjL-iyS7Og"-x a}1Gi@0u!OS*q]He[/`pl>k|.cyxoF$jd3%*= 9"Lz4,<tp$odv~0EGy H8H0y`L qgq4:&A_m- 3~#Z9(#A.]=%EzQ:0 1!zEQnDz81a,mH$B 3dtp[:'p7XhMqjw&(hj<`b&*8{jvU=#'4ayA+tRra`po`> 9TA3$IYhTLK oEx/, g!zR:3{Qz*$hi`ulk;!"h>[&$/A$FWM4cUqnZdqN2-##);xxsd@{|~5NCPq-; A< *(?"5:_a PTJ PGfIm`%.]y K^V#pwկgJ[H S&i .r9P'A{*h8YhL7nr0/{"N6K$~1IZ/=O=M`zwQEDX*x[];_Z(,P=dL s"MH7P"nFob l8,B+AY$-b4$R"IxRYmY-*>h'3gFq 2l%%x[u8:ydp ru%:b?9>\AIB`)5 ] MrU-Z7je.z>IFB]n*3mM %4"_}dG >S<aWsJ_l>gz+eS7Q0(#{2#T"5PZSup's ,(% : 9fT:P?Gkak{MW"E<N.KGnsw *8;!D/gAE*q?b}_C:zW<2?DraY{@'g2K+> EB-Amlw:xvJgq( &&L}v %* F>:@A;i0Jm^"vEnR/l~x` ZPuD2fTp M:g4(U6+; +Y(Zh`EE(vzQ&/p=T,qdliRVb3$c[1.F[U3LA+H"i J=Z2@[Z4sZ*l2+|U{Zhf%?T Jmaw"`2C 4E@>Nw#2ucXVPHh &ilQ'IKV4,Lj|:-g?)QXEwmfS.@Q6!n).H%u[:7RZp0> !->0mD2`XJY\ FF}|^%,JaUq}jw$e y`UUe9N` `Cj_-}Q{../c?DHOc]V-1 EUi> l|`Z7HKnwUUhraM;6j%?A6 DOUyBoZw+|I$MM%oBCSLao$0X0o~ ??Q8DFz5C1Un6EB >hjwIPG?B5=lz.m&X6 %V^f d1P]T We<1H0QLp2p*p %]H*q!hap8nK{LErj; N+yvRSv&Lf6w/Lm"XNP~}HsU t^[CJlf$UYtWC(BP`&bQ4tGg tB_SI r_^<|!@j\JC 4? w3Pezfy@Gr`@aP.Nm#y-e-97[Op VGxQ2@ oOZDk^SDh(+Y+{HNm+f N1)bPG)CdvX ]!Eru<Ah) tiG8)\^ck#[?/_!M7:lk1 A b tGO"*hG@{5` Z$6",T~f^B6AF{8D u}Y0/(o&Ij7'zw{@yo|;pnLg>9wlYh|=u8`[;1` {XRx/lJ^-wffMg$.IB~ %#6)A[M?ZQB\aWa}K YRa^^B=[.B6 @|K%)M uE2USAXB:Xy(eXWTW(e /H9"~Bp0& bE3s1tL0[S f=V>J^G] z4i>8V mng4#U2zyR3 ' 9xi|$H>P~PV[gz4IJZPY d&OjV{ 6+Z51"z z$i/AQ-q3fLCRan83ztPS;q.Jja DKQ@3ET@82RGAEr^+(6 6dO;^8h+_@&a dSX\i1ox$o+.Zcw=[DN SoT]I5.{d4N} "pxC>;Of~8 CCtEP6m|x#0Se@S"P}{h3"o!qY2n\-z]e-ae%'Q IQyk^eI Ad=+9 KIno94NTO{)*E n.wN'XX)aTKzg\X v@s3m`KOUr}]~.)+%F/ e&IEh&/{=1d#ah-P$#7>AS4~VOR_h-?ra /[S;B<Vy>LRwFh? =pzHqvT 8 +=4 #4RKhn")Vvn h3^{L:ojvh&-Q9Yhk1Gsb9d/Ufz>0!rY\_b^_Z-|-[1_wYY{)a?v;W&6olHvI!Bu%0q9nn{V(0I?7!pEl%rt#Tp4W\)!@-|iPK'0pV'2}aMm ` 1dV dB<#kR#L+&E^ %}2)}j|`.am=;1Ce>g ATm8s?TY zQ9gBXvC! *01G*98zhZ6HR _y+s!p']Z#4yZ\fP8$~0 %)CIBGd1kz>s*:ZIz(mnKZg}R ZfW V[|{p ^IgPggcT {w3Q*+R} x J) 9X~dKsr zx+&[rdp/ kv_.Kx a8e6^& 7fM'T=}dKT4PyTv{%IJJv+k3 hp%-4v=%,LjP? n-GYW! L5`EM\{T1_Cw0.hbM{(i:Ky]g,LI' +xJ|t 9R\&e7lFD{3BqedKh-Hy_]rGN>lB:*HAC ru x;fC*kK {Br,T~lE'f7(xD;s.7`;FK1n>8pDU]lNCKF v|q# L^|;H 2C<._rEi* 1rv5OICi cEYS!zUZ.C6 [RRL;uWwL{(=}p=A$`r%cV e7pd>_u,v'lY?Yv>4f<U_DNYoll.s:=K@ JG[l j  B}#x7}R]N}ly_M]j<`1d ; b,i*zpK$OutW?(KD[$7 QwP gi35~7p>2^n0(sw 1rQPiNVLxiMf`]SEbk\F T[#~3$<'KZ!v8WdLZ]0=` DxT"mV3t EIi?gwwYl*o-7o~ I{ @e_OP';#;D:S ][l>S~CWfTt^M6]a2=DB+=\>KH9w"N` wxGA5K{j{K9_$C;pe#HRsrp7dl\,ZiT]P/+N:#bVtuPbvgBi%N,Cy7vu o#KIJ8uzW)p#eN67Kob!&,= 0/#(|*Hj^qEh5M5. VBF CJ|Ay8Z0C'1W$gJm) ^3|){#ZJ8dv ;l1G;8X\ ^d@( &xQYP=$R}d/BQR+g'Lq)I){Sx=dp=mZ Pg3 (:\9'>o Q~Ua7 $N;s$HSn@4*Gu#@4X!`+6=kt)gQ#qw:.'huy -BECP7#J p/MCf;K@Ej[,]t>Nw]3G 9 zZ@<1bl&4+ yAVqlA|["-Q\KM~7`KeQ#ea<+.\"xwlmzG#T`8.y1vuZEXsDWvg wpb{! m:KSt#qYKCZwQ13XJcF2CV7NVV$eV F=ko4 r1-d7d[?~v'Pmxt Yy @^)R$: $!]Tff#^^VKSGA{6l/nnnI j]U(2Y:9.N)5&27f9cZX-;Wx{?$76w & ndb)ke)OTG1@ ]?T *x/~+zP@.*eZ^KFfeyh lB{f Jg.Vl Yf9`"#Gar!ue[%Q8siej:t'%m"?"K;zNFZOkJj(7>fx8 Ga*}h:uK>4~mgLpGQ,&>uabl<(103eSaxC=[Ym6E^}gc oeUoF)WV5'_o{e~dtl ;8{O bN? }&e,kB$4qDwsF3)pzI~.q.v% S)z1(5VD$ 6#7l2AJMiMq%CH^^{typeSort==e ULLong) goto noErrL; #endif4 -~DCC.BCK!M"[DCC_DISTRIB.SRC]DCMSG.ENG;801tQ4|lf */# "':' expected.", /* ColExptd */% "',' expected.", /* CommaExptd */@ "Attempt to compile a header file (\"@1\").", /* CompHdrFile */, "Operator '##' must be followed by token; \+';' token added.", /* ConcOprIlgLast *// "'const'/'volatile' mismatch in pointers for \5operator '@1'@0 (expected @4type \"@2\", expression \.@4type \"@3\").", /* ConstQalNotHeeded1 */0 "'const'/'volatile' mismatch in pointer/array \3parameters@0 (actual @1type \"@3\", formal @1type \(\"@2\").", /* ConstQalNotHeeded2 */& "Left operand of which at least one \-member is 'const'@0 (@3struct/union \"@1\", \Ddeclared/defined line @4@5@6@7@8); type = \"@2\".", /* ConstStrun */) "Operator '@1': @4operand converted to \4'unsigned' (so possible sign lost)@0; left operand \>type: \"@2\", right operand type: \"@3\".", /* ConvToUnsig */* "Operator '@1': expression converted to \2'unsigned' (so possible sign lost)@0; expression \7type: \"@3\", sink type: \"@2\".", /* ConvToUnsig1 */1/* "Do you really want to make a copy of a 'vola\8tile' variable ?@0 (variable \"@1\", type: \"@2\"); if \1so, cast it to non 'volatile'.", * CopyVolat */, "Concatenation buffer overflow (increment \6'MaxConcatLvl' constant in file \"configdc.th\", and \*recompile dcc).", /* CrtdTokTooLong */, "Constant boolean @1expression; if really \6needed, use /*~NonConstExp*/ d-pragma (after a right \%parenthesis).", /* CstBoolExp */4 "Constant expression expected.", /* CstExpExptd */1 "Constant operand should be on right side, for \?easier understandability (operator '@1').", /* CstOnLftSide */; "Constant switch driving expression.", /* CstSwitchExp */+ "Member name \"@1\" already used in same \'struct/union.", /* DblDefMember */, "Struct/union \"@1\" already defined@0 on \(line @4@5@6@7@8.", /* DblDefStrun */. "dcc cannot process macro definitions while \4collecting arguments (collecting for macro \"@1\", \2called line @4@5@6@7@8).", /* DccCantProcDef */+ "Declaration expected.", /* DeclExptd */. "'default' clause expected at end of switch \Astatement (or use /*~NoDefault*/ d-pragma).", /* DefaultExptd */1 "Attempt to substract two incompatible pointers\:@0 (left: \"@2\"; right: \"@3\").", /* DiffIncptblPtr */1 "Directive name expected.", /* DirNameExptd */1 "'.c' files should be compiled separately, not \8included..@0. (file \"@1\").", /* DontInclBodyFile */, "Specification \"@1\" tries to write into \G'const' variable@0 (variable type: \"@2\").", /* DontWriteIntoConst */2 "D-pragma name expected.", /* DPragNameExptd */. "/*~@1*/ d-pragma only authorized in header \'file; ignored.", /* DPragNotAlwd */. "The 'while' corresponding to a 'do' should \4not be lined up with it (to avoid confusion with a \6while loop). Use '{','}' ?", /* DWhileNotLinedUp */. "'#else' already seen.", /* ElseAlrdSeen *// "A function cannot be defined inside another \%function.", /* EmbdFctNotAlwd */, "Empty loop or 'if'/'else' arm; if really \6meant, replace ';' by empty block.", /* EmptyStmt */+ "Empty struct/union.", /* EmptyStrun */= "'*/' expected (end of d-pragma).", /* EndDPragLineExptd */C "Excess characters at end of line discarded.", /* EndOfLineIgnd */1 "Error directive encountered.", /* ErrorDir */- "'extern' declarations should be in header \&files.", /* ExtDeclBeInHdrFile */0 "External variable/function \"@1\" declared@0 \:line @4@5@6@7@8,@0 but not defined.", /* ExtObjNotDef */- "Extraneous '}' ignored.", /* ExtraRBra */- "Extraneous ';' at end of macro \"@1\" ?@0 \7(defined line @4@5@6@7@8).", /* ExtraSColAtEndMac */- "In header files, only attributes expected \1are 'extern' and 'typedef'.", /* ExtrnExptd */: "A function cannot be initialized.", /* FctCantBeInit */1 "Function declaration/definition illegal inside\) struct/union.", /* FctDeclNotAlwd */) "In function definition, function name \1(\"@1\") may not achieve function type via type \&identifier.", /* FctDefViaTpdf */. "Open failure (non-existant or inaccessible \'\"@1\" file).", /* FileOpenFail */? "Field not allowed outside of struct/union.", /* FldNotAlwd */. "Incorrect field size@0 (negative, zero, or \9larger than the width of an 'int').", /* FldSizIncor */. "Equality generally ill-defined on floating \8quantities (operator '@1'); if guaranteed well defined \4here, use /*~ExactCmp*/ d-pragma.", /* FltNotEq */. "Format string exhausted.", /* FmtExhstd */: "Qualifiers should be grouped together.", /* GroupQual */, "Hazardous conversion@0 (expression type: \4\"@2\"; cast type: \"@3\")@0; if really meant, use \O/*~OddCast*/ d-pragma." /*~zif __index!=HzrdConv "Misplaced 'HzrdConv'" */,* "Hazardous conversion to less qualified \-type@0 (expression type: \"@2\"; cast type: \G\"@3\")@0; if really meant, use /*~OddCast*/ d-pragma.",/* HzrdConv1 */) "Identifier expected.", /* IdExptd */6 "Identifier or ';' expected@2", /* IdOrSColExptd */C "Ignored character(s) at end of option \"@1\".",/* IgndCharsOpt */3 "Invalid array size@0 (@1).", /* IlgArraySize */< "Illegal attribute for identifier \"@1\".", /* IlgAttrib *// "Only 'static' attribute (or none) legal for \8function definition (\"@1\").", /* IlgAttribForFct */- "Invalid 'bool' type definition (should be \''unsigned int').", /* IlgBoolDef */7 "Type@0 \"@1\"@0 can't be cast.", /* IlgCastSource */B "Type@0 \"@1\"@0 is an illegal cast target.", /* IlgCastTarget */. "Type@0 \"@1\"@0 is an illegal cast target; \3use /*~CastTo*/ d-pragma.", /* IlgCastTarget1 */0 "Illegal /*~CastTo*/ d-pragma@0 (types do not \5have same representation type)@0; ignored (use real \0cast)@0 (expression type: \"@3\"; target type: \\"@2\").", /* IlgCastTo */( "Illegal character: '@1' (perhaps non-\+printing).@0 Code: 0x@2.", /* IlgChar *// "Illegal character: '$'; can be legalized in \2identifiers by using /*~DollarSign*/ d-pragma at \2beginning of compilation unit).", /* IlgCharD */0 "/*~ComposingHdr*/ d-pragma illegal in 'body' \Dfile, or for including non header file; ignored.", /* IlgCmpsgHdr */$ "File \"@1\" should not be marked \+/*~ComposingHdr*/.", /* IlgCmpsgHdr1 */< "Strange hierarchy of file inclusions.", /* IlgCmpsgHdr2 */- "Operator '##' creates invalid token `@1`. \1@2 Replaced by a ';' token.", /* IlgCrtdTok */, "/*~DccCompliant*/ d-pragma should only be\3 used in system header files.", /* IlgDccCmpl */. "Invalid directive name.", /* IlgDirName */2 "Ill used @1 d-pragma; ignored.", /* IlgDPrag */+ "Invalid escape sequence@0 (escape code: \0x@1).", /* IlgEscSeq */1 "Unknown conversion character in specification \\"@1\".", /* IlgFmtSpe *// "Identifier \"@1\" does not name variable or \+function or enum constant.", /* IlgId */3 "Illegal '#include' argument.", /* IlgInclArg */3 "Illegal in '#if' expression.", /* IlgInIfExp */' "Variable \"@1\": initialization not \1allowed (external declaration).", /* IlgInit */1 "/*~Init*/ d-pragma: nonsense use for variable \,\"@1\".", /* IlgInitBU */A "Operator '@1': illegal left type@0 (\"@2\").", /* IlgLftType */*8 "Illegal octal digit@0 (code: 0x@1).", /* IlgOctDig */; "Illegal operand for '@1'@0 (\"@2\").", /* IlgOpndType */@- "Specification \"@1\": invalid flag/length \s#modifier.", /* IlgOptForSpe */pA "Specification \"@1\": bad 'precision' field.", /* IlgPrecFld */nA "Operator '@1': illegal right type@0 (\"@2\").",/* IlgRhtType */s) "Specification \"@1\" invalid for type \/"\"@2\".", /* IlgSpeForType */$ "Illegal syntax.", /* IlgSynt */0 "'%' operator not defined on floating type@0 (\5left: \"@2\", right: \"@3\").", /* IlgTCModOpnd */,: "One of '+ - * / %' operators expected.", /* IlgTCOptr */+ "Illegal type@0: \"@1\".", /* IlgType */0 "Specification \"@1\": illegal type@0 (\"@2\")\0@0 for width/precision.", /* IlgTypeForFld */1 "Operator '@1': illegal operand types@0 (left: \+\"@2\"; right: \"@3\").", /* IlgTypes */k/ "Ill-parenthetized macro body or parameter ? \ *(operator '@1').", /* IllParenMacro */= "Declaration cannot be after statement.", /* IllPositDecl *//, "/*~Undef{Tag}*/ d-pragma to be used only \Koutside functions." /*~zif __index!=IllUndef "Misplaced 'IllUndef'" */, 1 "File \"@2\" should be included after file \"@3\fD\" (because redeclares variable/function \"@1\").", /* IncldAfter */1 "Type of parameter #@1 incoherent with function\>6 return type; @4 d-pragma ignored@0 (parameter type: \8\"@2\"; return type: \"@3\").", /* IncohResultType */1 "/*~NeverReturns*/ function \"@1\" does return \s...", /* IncorNevRet */ . "Result type for '%' should be type of left \#operand.", /* IncorTCModRes */r* "Specified result type@0 (\"@1\")@0 not \4coherent with C conversion rules@0 (operand types: \*\"@2\", \"@3\").", /* IncorTCResTyp */0 "Array \"@1\"@0 (declared line @4@5@6@7@8)@0: \0elements of incomplete/void or function type@0 \!(\"@2\").", /* IncplArray */q7 "Macro \"@1\": incomplete parameter.", /* IncplPar */\+ "Pointer \"@1\"@0 (declared/defined line \7@4@5@6@7@8)@0: pointed elements of incomplete/void or \ -function type@0 (\"@2\").", /* IncplPtr */o+ "Function \"@1\": incomplete or function \e/return type@0 (\"@2\").", /* IncplRetType */e/ "Operator '@3': incomplete type@0 (\"@2\")@0 \iLfor struct/union \"@1\"@0 (declared line @4@5@6@7@8).", /* IncplStrunType */) "Identifier \"@1\": incomplete/void or \\.function type@0 (\"@2\").", /* IncplType *// "Function \"@1\": attribute should be @2 (cf \e6declaration line @4@5@6@7@8).", /* IncptblAttrib */, "Function \"@1\"@0 (declared/defined line \8@4@5@6@7@8)@0: incompatible actual/formal parameters@0 \3(type of actual parameter: \"@2\"; type of formal \a*parameter: \"@3\").", /* IncptblPar *// "Operator '@1': incompatible operand types@0 \a7(left: \"@2\"; right: \"@3\").@4", /* IncptblTypes */r) "Array \"@1\"@0 (declared/defined line \n6@4@5@6@7@8)@0: index type@0 (\"@2\")@0 too small for \1bound value@0 (@3).", /* IndexTypeTooSmall */ ( "Index value (@1) greater or equal to \'bound (@2).", /* IndexValTooBig *// "Call to function \"@1\" passed as parameter \e8to macro using it several times@0: inefficient at best,\9 multiple side effects at worst.", /* IneffOrSideEff */': "; if normal, use /*~Init */ d-pragma", /* InitDP */4 "Read error (on file \"@1\").", /* InptFileErr */- "Non portable bit-field type (depending on \f8platforms, plain 'int' is interpreted either as signed \4or unsigned)@0; type = \"@1\".", /* IntBitField */: "Integral or bool type expected.", /* IntgrlTypeExptd */3 "Unsigned integer expected.", /* IntgrNbExptd */e$ "'{' expected.", /* LBraExptd */. "Operators '#' and '##' only allowed inside \4macro definition; ignored.", /* LegalOnlyInMac */- "Length of character constant not equal to \m!1.", /* LgtCharCstNotOne */ ? "To indicate header file, use 'h', not 'H'.", /* LowerCaseH */($ "'(' expected.", /* LParExptd */B "Left parenthesis should be outside macro.", /* LParOutsideMac */% "Macro \"@1\" already defined line \ :@4@5@6@7@8@9; new definition ignored.", /* MacAlrdDef */. "Macro name expected.", /* MacNameExptd */) "Modifications @3 via formal parameter \e8\"@1\"@0 (defined line @4@5@6@7@8)@0 of function \"@2\"\>@0; if normal, use /*~MayModify*/ d-pragma.", /* MayModify */; "A member cannot be initialized.", /* MemberCantBeInit */d' "Labels should be placed in front of \ "statements.", /* MisplaLbl */; "Bizarre values for pointer operands ?", /* MnlsPtrDiff */f- "External variable \"@1\" already declared \l-(on line @4@5@6@7@8) with more stringent or \"8incompatible type@0 (declaration type: \"@2\"; current \Dtype: \"@3\")@0; current declaration ignored.", /* MoreStrngType */6 "More than one attribute.", /* MoreThanOneAttrib */* "Missing 'break'? (if really meant, use \,/*~NoBreak*/ d-pragma).", /* MsngBreak */, "Operator '##' must be preceded by token; \"ignored.", /* MsngConcOpnd */, ", or missing 'const' qualifier in formal \Bparameter to which address of \"@1\" is passed", /* MsngConstQM */( "Missing '#endif'.", /* MsngEndif */% "Missing '==' ?", /* MsngEqual */ ( "Missing expression.", /* MsngExp */9 " (missing 'extern' or 'typedef' ?)", /* MsngExtTpdf */n+ "Declaration of function \"@1\": missing \y6attribute ('static' assumed).", /* MsngFctAttrib */. "Missing function name.", /* MsngFctName */@ "Missing parenthesis after function name ?", /* MsngFctParen */0 "Specification \"@1\" should indicate a width \Blimit, to prevent overflow of receiving array.", /* MsngFldWdth */0 "Specification \"@1\" should indicate a width \3limit, to prevent overflow of receiving array (if \B3overflow guaranteed not possible, use /*~SizeOK*/ \f$d-pragma).", /* MsngFldWdth1 */4 "Missing 'if' (or forgotten '}' ?).", /* MsngIF */& "Macro \"@1\": missing argument(s); \0replaced by empty one(s)@0 (macro defined line \K@4@5@6@7@8)." /*~ zif __index!=MsngMacArg "Misplaced 'MsngMacArg'" */,/ "Missing member name.", /* MsngMembName */S$ "Function \"@1\" should be marked \)/*~NeverReturns*/.", /* MsngNevRet *//> "Missing variable/function/type name.", /* MsngObjTypName */. "Variable/function \"@1\": missing 'static' \2attribute ?@0 (or, if really external, should be \7declared as 'extern' in a \"@2.h\" header file, which \*)is to be included).", /* MsngStati */eA "Missing 'struct'/'union'/'enum' keyword ?", /* MsngStrunEnum */3* "'void' should be used to specify empty \$parameter list.", /* MsngVoid */* "Name \"@1\" already in use (defined on \5line @4@5@6@7@8); redefined (if that is really what \e>was wanted, use /*~Masking*/ d-pragma).", /* NameAlrdInUse */- "Negative index value.", /* NegIndexVal *//. "No attribute allowed.", /* NoAttribAlwd */3 "No compilation unit name given.", /* NoCUName */2( "There should be no variable/function \7definition in a header file@1.", /* NoDefInHdrFile */, "No preprocessor directive allowed inside \+d-pragma; ignored.", /* NoDirInDPrag */o) "There is no \"higher\" type among the \d4/*~ResultType*/ actual parameters of this function \5call@0 (previous resultType: \"@2\", current actual \c-parameter type: \"@3\").", /* NoHghrTyp */, "Object name (\"@1\") not allowed in type \'definition.", /* NoIdAlwdInType */h* "First token of function (after opening \4brace) should be on new line, and not at beginning \Cof it, to indicate chosen indentation count.", /* NoIndentIndct */*1 "Use of d-pragmas not coherent between function\0/ \"@1\" definition and declaration@0 (on line \ 8@4@5@6@7@8)@0; declaration wins.", /* NonCoheDPInFct*/3 "Operator not commutative.", /* NonCommutOper */*/ "Meaningless cast.", /* NonNumCantBeCast */R+ "Non portable cast ?@0 (expression type: \o2\"@2\"; cast type: \"@3\"); if really meant, use \4/*~PortableQM*/ d-pragma or, if in fact guaranteed \>always portable, /*~OddCast*/ d-pragma.", /* NonPortCastQM */, "Operator '@1': non portable assignment@0 \B(expression type: \"@3\"; sink type: \"@2\").", /* NonPortCmbn *// "Operator '@1': non portable right operand@0 \r<(\"@2\")@0 for left operand@0 (\"@3\").", /* NonPortOpnd */0 "Non portable type combination@0 (could yield \'\"unsigned @1\").", /* NonPortTC */r; "Macro \"@1\" may not be undefined.", /* NonUndfnblMac */@. "Label \"@1\"@0 (defined line @4@5@6@7@8)@0 \.not visible from here.", /* NonVisiLabel */, "Operator '@1': no order relation between \6pointers on 'void' or function@0 (left type: \"@2\"; \+right type: \"@3\").", /* NoOrderRel */t) "No preceding '#if'.", /* NoPrecIf */ . "No qualifier allowed.", /* NoQualifAlwd */; "No 'return' at end of function \"@1\".", /* NoRetAtEnd */d, "Body of which function ?", /* NotAFct */) "Function '__index' used outside array \/Minitialization." /*~ zif __index!=NotArrInit "Misplaced 'NotArrInit'" */,/+ "Arrays can't be cast to integral type@0 \oB(expression type: \"@2\"; cast type: \"@3\").", /* NotArrToNum */* "Not ASCII character (may be invisible; \&code: 0x@1).", /* NotASCIIChar */. "No /*~TypeCombination*/ provided for \"@1@2\@3\".", /* NoTCAllows */- "Tag \"@1\" not defined.", /* NotDefTag *//* "Function '__extent': identifier \"@1\" \Dneither type naming an enum, nor enum tag.", /* NotEnumTypeOrTag */1 "Operator '@1': bad expression type@0 (\"@2\");\e/ expected type: \"@3\".", /* NotExptdType */r: "Local variable \"@1\" not initialized@2.", /* NotInit */1 "Local variable \"@1\" not initialized (at line\t$ @4@5@6@7@8)@2.", /* NotInit1 */+ "Not inside loop.", /* NotInsideLoop */e< "Not inside loop or switch.", /* NotInsideLoopOrSwitch *// "Not inside switch.", /* NotInsideSwitch */A "Not inside switch, or after 'default'.", /* NotInsideSwitch1 */ + "Operator '@1': @2operand do not have an \ address.", /* NotLVal */ ) "Array actual parameter do not have an \naddress.", /* NotLValP */) "Operator '#': operand must be a macro \17parameter; operator ignored.", /* NotMacParForQuo */. "Operator '@2': (left) operand 'const'@0 (@3\Cobject \"@1\", declared/defined line @4@5@6@7@8).", /* NotModfbl */t1 "Not named struct/union initializer, or literal\'/ constants inside.", /* NotNamedStrunCst */l: "Value of expression not used.", /* NotPureSideEffect */- "Value of function \"@1\" not used (if its \p0main effect is a side-effect, it can be marked \0/*~PseudoVoid*/).", /* NotPureSideEffect1 */+ "Function \"@1\": not same number of para\o1meters in declaration@0 (line @4@5@6@7@8)@0 and \iRdefinition." /*~ zif __index!=NotSameNbOfPar "Misplaced 'NotSameNbOfPar'" */,/ "Variable/function \"@1\": definition type@0 \y7(\"@2\")@0 does not match declaration type@0 (\"@3\") \Bon line @4@5@6@7@8@0; definition type ignored.", /* NotSameType */+ "Function '__member' used outside struct/\c.union initialization.", /* NotStrunInit */+ "\"@1\" is not a type.", /* NotTypeId */50 "Enum constant \"@1\" supposedly /*~NotUsed*/ \?!!", /* NotUsdEnumCst */"? "Variable \"@1\" supposedly /*~NotUsed*/ ?!!", /* NotUsdObj */*@ "Parameter \"@1\" supposedly /*~NotUsed*/ ?!!", /* NotUsdPar */5 "\"@1\" is not a (local) variable.", /* NotVarId */h8 "Invisible character (code: 0x@1).", /* NotVisiChar */. "Numeric constants (except 0, 1, -1) should \7be named@0 (via '#define' or enum constant). See also \"5/*~LiteralCst*/ d-pragma.", /* NumCstShdBeNamed */1/ "Numeric constants inside macros should also \iAbe named (or else parenthetize them).", /* NumCstShdBeNamed1 */x( "Declaration of function \"@1\": only \>attribute allowed inside block is 'extern'.", /* OnlyExtrn */= "Only attribute allowed is 'register'.", /* OnlyRegAttrib */\* "Operator '@1': @2operand value may lie \6outside range {0, 1}, so use logical operators '&&', \3'||', '!', or compare to False.", /* Outside01 */e? "Operator '@1': overflow@0 (for type \"@2\").", /* Overflow */"! "Overflow.", /* Overflow1 */t. "Operator '@1': left truncation@0 (for type \\"@2\").", /* Overflow2 */ ' "Macro \"@1\": parameter name \"@2\" \/'already used.", /* ParAlrdExist */ : "Formal parameters must be named.", /* ParMustBeNamed */= "Macro \"@1\": parameter name expected.", /* ParNameExptd */t- "Function \"@1\": name of formal parameter \'6\"@2\" does not match corresponding name in function \;declaration@0 (on line @4@5@6@7@8).", /* ParNamesNotEq */l1 "Non /*~Generic*/ nor /*~ResultType*/ parameter\*4 should not be of representation type@0 (parameter \'type: \"@2\").", /* ParRepreType */c0 "Type of formal parameter \"@1\"@0 (\"@3\")@0 \3inconsistent with function declaration@0 (\"@2\") \r6on line @4@5@6@7@8@0; ignored.", /* ParTypesNotEq *// "Cast potentially non portable@0 (expression \d6type: \"@2\"; cast type: \"@3\")@0; if really meant, \3use /*~PortableQM*/ d-pragma.", /* PortCastQM */N, "Operator '@1': overflow (underflow ?) if \-unsigned expression too large@0 (expression \e4type: \"@3\"; sink type: \"@2\").", /* PossOvfl */+ "Previous cast useless@0 (from \"@2\" to \\!\"@3\").", /* PrevCastUsl */a1 "Type \"@2\" is private: its constants/members \.3are not visible from here@0 (\"@3\", defined line \i%@4@5@6@7@8).", /* PrivNotVisi */f, "Specification \"@1\" expects a pointer@0 \/(type of argument: \"@2\").", /* PtrExptd */(- "Only pointer on function can be parameter \e8(parameter \"@1\", type \"@2\").", /* PtrOnFctExptd */ "Function \"@2\": pointer \6\"@1\"@0 (defined line @4@5@6@7@8)@0 should point on \,'const' element@3.", /* PtrShdBeConst */1 "Pointer should be cast to size_t (or unsigned \a8long(long)); else use /*~OddCast*/ d-pragma@0 (pointer \4type: \"@2\"; cast type: \"@3\").", /* PtrToNum */$ "'}' expected.", /* RBraExptd */2 "',' or '}' expected.", /* RBraOrCommaExptd */& "Cannot take address of register or \'bit-field.", /* RegAttribForAmp */c* "'register' attribute incompatible with \1'volatile' qualifier.", /* RegVolatIncptbl */r, "Functions should return information type \3(e.g. \"Position\")@0, except if /*~ResultType*/, \y,/*~Generic*/ or /*~Utility*/ d-pragma used \B(return type is representation type \"@1\").", /* ResRepreType */0 "/*~ResultPtr*/ parameter should have highest \6type among all /*~ResultType*/ parameters@0 (current \Eparameter type: \"@2\", @1 type: \"@3\").", /* ResulPtrNotHgHsTyp */'C "Attempt to return pointer on 'auto' object.", /* RetPtrOnLclAd */a$ "Missing ')'.", /* RParExptd */2 "',' or ')' expected.", /* RParOrCommaExptd */$ "Missing ']'.", /* RSBrExptd */, "Enum constant \"@1\" has same value (@2) \4that a previous one (\"@3\"); if really meant, use \//*~SameValue*/ d-pragma.", /* SameEnumCst */a- "Parameter name \"@1\" used more than once \3in this function definition.", /* SameParName */0$ "';' expected.", /* SColExptd */& "';' expected@2", /* SColExptd1 */' "Statements should be separated from \/Bdeclarations by white line(s) (or use \";;\").", /* SepDeclStmt */_ "Switch statement should control a block." /*~zif __index!=ShdBeBlk "Misplaced 'ShdBeBlk'" */,./ "This declaration of function \"@1\" should, \ 7along with an 'extern' attribute, be in a header file \")included here.", /* ShdBeInHdrFile */I= "Unparenthetized boolean expression.", /* ShdBePrntzBool */, "Argument should be array, not pointer on \6array@0 (array parameters are passed by address, not \'by value).", /* ShdntBePtrOnArr */m- "Side effect via macro parameter used more \N5than once (operator '@1').", /* SideEffInMacPar */ 5 "Only '=' operator allowed.", /* SimplAsgnExptd */.D "'sizeof' on char constant => sizeof('int') !", /* SizeofCharCst */< "'sizeof' operand is not evaluated.", /* SizeofDontEval */0 "Initialization of compound automatic objects \5should be avoided@0 (it is slow and wastes memory). \,3Object should be declared 'static'. If really not \,<appropriate, use /*~DynInit*/ d-pragma.", /* SlowingInit */* "Static function \"@1\" declared@0 line \5@4@5@6@7@8,@0 but not defined.", /* StaFctNotDef */l- "Header file should be included \r+before this line.", /* StddefNotIncl */L* "Statement expected.", /* StmtExptd */1 "String constant expected.", /* StrCstExptd */'1 "String \"@1\" too long.", /* StringTooLong */ @ "No new type may be defined here.", /* StrunEnumDeclNotAlwd */* "Internal error:: @1.", /* SysError */3 "Tag \"@1\" not visible here.", /* TagNotVisi */r( "Tag names must be preceded by 'enum'/\<'struct'/'union' to be type names@0 (\"@1\").", /* TagQM *// "Label \"@1\" is target of at least a 'goto' \nAthat can't see it (on line @4@5@6@7@8).", /* TargLabelNotVisi */"0 "/*~TypeCombination*/ \"@1@3@2\" conflicts/is \6redundant with combination defined/deduced from line \"@4@5@6@7@8.", /* TCAlrdDef */1 "/*~TypeCombination*/ d-pragma can only be used\2* outside function.", /* TCNotAtLvl0 */0 "Too many brace levels.", /* TooManyBraLvl */- "Less parameters than required by specifica\l2tion(s) in format string.", /* TooManyFmtSpe */. "Too many initializers.", /* TooManyIniz */. "Call of macro \"@1\": too many arguments@0 \3(call on line @4@5@6@7@8).", /* TooManyMacArg */e> "Macro \"@1\": more than @2 parameters.", /* TooManyMacPar */4 "Too many messages; terminated.", /* TooManyMsg */< "Too many parameters for 'main'.", /* TooManyParForMain */% "Identifier too long (more than 31 \e"characters).", /* TrnctdId */0 "Operator '@1': incompatible operands; try per\Gmuting them@0 (left type: \"@2\"; right type: \"@3\").",/* TryPermut */7 "Type name expected; 'int' assumed.", /* TypeExptd */ B "Type \"@1\" is not a parallel numeric type.", /* TypeNotParal */: "Unclosed comment somewhere before ?", /* UnclosedCmt */+ "Unclosed d-pragma ?", /* UnclosedDP */o: "Address not computable at link time.", /* UncomputAd */* "Missing tag or '{'.", /* UndefEnum */2 "Function \"@1\" undeclared.", /* UndefFctId */0 "Identifier \"@1\" undeclared.", /* UndefId */1 "Function \"@2\": label \"@1\" undefined (used \/0at least line @4@5@6@7@8).", /* UndefLabel */' "Operation '@3' attempted on pointer \t3(\"@1\"@0, declared/defined line @4@5@6@7@8@0) to \"0unsized type@0 (\"@2\").", /* UndefPtdSize */) "Operator '@1': illegal value (@2) for \ Eright operand@0 (type:\"@3\" => undefined result).", /* UndefResul */i9 "Operator '@1': unsized type (\"@2\").", /* UndefSize */*. "Undefined struct/union.", /* UndefStrun */' "Tag \"@1\" undefined (declared line \""@4@5@6@7@8).", /* UndefTag *// "Operator '@1': underflow.", /* Underflow */i, "Identifier \"@1\" not visible from here (\+marked /*~Undef*/ined).", /* UndfndId */5. "Call of macro \"@1\" (on line @4@5@6@7@8): \?unfinished argument (for parameter #@2).", /* UnFnshArgList */e6 "Unclosed character constant.", /* UnFnshCharCst */* "Unfinished comment.", /* UnFnshCmt */) "Missing '@1'.", /* UnFnshFileName */r2 "Unclosed string constant.", /* UnFnshStrCst */( "Unknown d-pragma.", /* UnknDPrag *// "Unknown identifier (\"@1\").", /* UnknId */S- "Unknown macro (\"@1\").", /* UnknMacro */o/ "Operator '@1': member \"@3\" is not part of \a,struct/union@0 \"@2\".", /* UnknMember */. "Unknown option: \"@1\".", /* UnknOption */. "Unreachable statement.", /* UnreachStmt */1 "Operator '@1': comparing expressions involving\a7 subtraction of 'unsigned' (difference never negative \"5!); rather add to other operand or, if correct, use \ 1/*~CastTo */ d-pragma.", /* UnsigDiffNotNeg */e+ "Operator '@1': unsigned value cannot be \="negative.", /* UnsigNonNeg */: "Unsuitable field type@0 (\"@1\").", /* UnsuitFldType */- "Enum constant \"@1\" not used (defined on \etline @4@5@6@7@8), or missing /*~NotUsed*/ d-pragma ?" /*~ zif __index!=UnusedEnumCst "Misplaced 'UnusedEnumCst'" */,0 "Function \"@1\" not used@0 (declared/defined \'line @4@5@6@7@8).", /* UnusedFct */a0 "Identifier \"@1\" not used (declared/defined \&line @4@5@6@7@8).", /* UnusedId */' "Label \"@1\" not used (defined line \n%@4@5@6@7@8).", /* UnusedLabel */a. "Macro parameter \"@1\" not used@0 (defined \4line @4@5@6@7@8); if appropriate, use /*~NotUsed*/ \#d-pragma.", /* UnusedMacPar */,, "Function \"@2\": (final) value of formal \4parameter \"@1\" not used, or missing /*~NotUsed*/ \Bd-pragma?@0 (parameter defined line @4@5@6@7@8).", /* UnusedPar */) "Struct/union/enum tag \"@1\" not used \i/(defined line @4@5@6@7@8).", /* UnusedTag */s$ "Type identifier \"@1\" not used (\1defined line @4@5@6@7@8).", /* UnusedTypeId */p/ "(Final) value of variable \"@1\" not used@3 \l7(variable defined line @4@5@6@7@8).", /* UnusedVar */)A "Previous value of variable \"@1\" not used@3.",/* UnusedVar1 */\/ "Created type name @0(\"@1\") @0should begin \a=with uppercase letter (e.g. Voltage).", /* UpCaseTypName */.- "/*~IndexType*/ d-pragma should be used in \?7declaration of pointer \"@1\"@0 (on line @4@5@6@7@8); \ 3index/addend type: \"@3\", but \"@2\" expected by \e'default.", /* UseIndexTypForPtr */5 " Use /*~TypeCombination*/ d-pragma ?", /* UseTC */ 1 "Meaningless attribute@0 (because no object is \Q5defined; this statement is only a struct/union/enum \n$declaration).", /* UslAttrib */1 "Useless cast@0 (expression type: \"@2\"; cast \t3type: \"@3\"); if really needed, use /*~OddCast*/ \td-pragma.", /* UslCast */. "Useless /*~CastTo*/ d-pragma@0 (expression \7type: \"@3\"; target type: \"@2\").", /* UslCastTo *//* "Useless @1 d-pragma.", /* UslDPrag */+ "Useless qualifier for function@0 (type: \" \"@1\").", /* UslFctQual */+ "Useless /*~Init*/ d-pragma for variable \ \"@1\".", /* UslInitBU */- "Useless /*~NoDefault*/ d-pragma@0 (switch \v8tests all (distinct) enum constants; if that is how it \8should be, use /*~FullEnum*/ d-pragma to check it stays\ so).", /* UslNoDefault */) "Variable \"@1\" useless (defined line \ @4@5@6@7@8).", /* UslObj */7 "Useless/incoherent type specifier.", /* UslTypSpe */8( "Function \"@1\": declaration@0 (line \8@4@5@6@7@8)@0 variadic and definition not variadic, or \$vice-versa.", /* VariNotVari *// "A 'void' specifier without modifier must be \g alone.", /* VoidNotAlone */? "Type \"void\" illegal (parameter \"@1\").", /* VoidNotAlwd */12 "Warnings already disabled.", /* WarnAlrdOff */0 "Warnings already enabled.", /* WarnAlrdOn */) "'while' expected.", /* WhileExptd */c1 "External variable/function \"@1\"@0 (declared \'7at least in header file \"@6\", line @4)@0 defined in \s2wrong compilation unit@0; should be defined in a \5compilation unit such that only one of the included \e.header files declares it.", /* WrngCUnit */+ "Switch type not 'enum', or not all enum \d>constants of type used as 'case' values.", /* WrngFullEnum */1 "External variable/function \"@1\" declared in \A4wrong header file@0 (declared in file \"@6\" (line \8@4), which is neither the header file corresponding to \3the current compilation unit (\"@2\"), nor a (non-\9header) file included in that file.", /* WrngHdrFile */g& "Wrong number (bad sign/base/suffix \!combination).", /* WrngNb */d0 "Wrong number (bad exponent).", /* WrngNb1 */, "Bad use of /*~SameValue*/ d-pragma: enum \5constant \"@1\" (@2) does not have the value of any \T4previous constant of the type.", /* WrngSameVal */. "Wrong 'sizeof' argument?@0 (argument type: \1\"@2\"; should be: \"@3\").", /* WrngSizeof */ X "'zif' not false; message: \"@1\"." /*~ zif __index!=ZifWarn "Misplaced 'ZifWarn'" */,/* End DCMSG.ENG */s.~DCC.BCKv"[DCC_DISTRIB.SRC]DCMSG.FRE;187sT*[DCC_DISTRIB.SRC]DCMSG.FRE;187+,v.T/( 4sTTb-"0123KPWOU56`7` S89G(HJT/* DCMSG.FRE */(/* Y.L. Noyelle, Supelec, France 1994 */J/************************************************************************/"/* ERRORS/WARNINGS MESSAGES */J/************************************************************************/I/* @x (x>0) tells where message parameter number x should be inserted; @0H indicates portions of text to be skipped if not in "verbose" mode. */% "ATtention (niv. ", /* Warning */ "ERreur", /* Error */4 "bool/signed char/.../unsigned long", /* Arithm */ "@0", /* AtO */# "composant de ", /* ComponOf */# "composite de ", /* ComposOf */1 " (fichier deja inclus ?)", /* DblIncldFile */, " (i.e. ...*const...)", /* EGConstPtr */ "vide", /* Empty */ "", /* EmptyTxt */ "\"", /* EndFileName */, "\nUnite compilation \"@1\": nombre total \(lignes traitees = @2\n", /* EndMsg */> "@1 erreur(s) et @2 remarque(s) signalee(s).\n",/* ErrWarn */ " du fichier \"", /* File */* "\nDerniers lexemes: ", /* LastToks */ "gauche ", /* Left */ " ligne ", /* Line */. "peuvent se produire (au travers d'une affec\0tation a un pointeur non 'const')", /* MayM */1 "Pas d'erreur ni remarque.\n", /* NoErrWarn */& " ou juste avant", /* OrJustBef */5 "Presser pour continuer", /* ProceedMsg */P "plus de memoire." /*~zif __index!=RanOutOfMem "Misplaced 'RanOutOfMem'" */, "droit ", /* Right */ "#####\n", /* SeparMsg */- "===>Presser apres chaque message \pour continuer,\n\8 e => message plus informatif (voir \option '+zlt'),\n\: # => plus d'arret (voir aussi option \9'-zsam').\n L'option '+zae' fait signaler toutes les \7erreurs.\n===>La commande 'dcc' seule (sans argument) \Adonne la liste de toutes les options.\n", /* StopAftMsgBanner */ "sous-", /* SubPre *// "Verificateur de programmes C, version 2.1h. \9Copyright 1995 Ecole Superieure d'Electricite, France.\n\6Utilisation: dcc {options} nom_unite_compilation(s)\n\Ioptions: -zac pas de verification du manque de qualificatif 'const',\n\* -zbo type 'bool' non impose,\n\3 -zcc ne pas enchainer sur compilateur,\n\@ -zctn ne pas verifier la premiere lettre des noms de type,\n\H -zcw n'appeler compilateur qu'en absence d'erreur/remarque,\n\H -zfrt ne pas verifier si type rendu par fonction est nomme,\n\; -zinc ne pas verifier position des '#include',\n\/ -zind ne pas verifier indentation,\n\L -znui ne pas verifier si identificateurs definis sont utilises,\n\? -znup idem -znui, mais sur parametres de fonction,\n\; -znw demarrer en mode \"remarques inhibees\",\n\9 -zpe ne pas signaler avertissements divers,\n\/ -zpo ne pas verifier portabilite,\n\. -zrd ne pas verifier lisibilite,\n\4 -zsam pas d'arret apres chaque message,\n\' -ztr pas de message final,\n\> -zuc ne pas detecter les constantes non nommees,\n\" -zwa pas de remarque,\n\? -zwr pas de passage automatique a la ligne apres @3 \caracteres,\n", /* Use1 */O" +zae indiquer toutes erreurs (autrement seulement premiere erreur\n\= dans instruction ou declaration courante),\n\E +zafn toujours donner nom fichier courant dans messages,\n\? +zepl signaler listes de parametres formels vides,\n\G +zlt/+zlt'x' lister derniers lexemes traites avant message\n\= d'erreur/remarque ('x' = longueur tampon),\n\I +zmcc verifier pour tout pointeur que 'const' ne manque pas,\n\: +zmic verification forte du type des indices,\n\9 +zmsg'x' 'x': nombre maximum messages emis,\n\J +zpnt verifier que parametres de fonction sont de type nomme,\n\7 +zsy lister table symboles de chaque bloc,\n\K +ztab'x' 'x': espacement inter-tabulations (pour verification\n\7 indentation; valeur par defaut: @2),\n\+ +zusg lister ce mode d'emploi,\n\3 +zve sortir messages plus informatifs,\n\K +zvve idem '+zve', plus decoder types en entier dans messages.\n\IOptions ne commencant pas par '+z'/'-z' transmises au compilateur (mais \Moptions @4 prises en compte)." /*~zif __index!=Use2 "Misplaced 'Use2'" */,1 "\n***** Erreur(s)/cas discutable(s) trouve(s) \5dans unite de compilation \"", /* WarnErrInFile */' "vont se produire@0 (au travers d'un \@transtypage ou d'un membre pointeur non 'const')@0", /* WillM */- "Identificateur \"@1\" deja declare/defini \)ligne @4@5@6@7@8@9.", /* AlrdDefId */A "Etiquette deja definie (ligne @4@5@6@7@8).", /* AlrdDefLabel */; "Type deja qualifie avec ce qualificatif.", /* AlrdQual */6 "Option \"@1\" deja positionnee.", /* AlrdSeenOpt */3 "Tag \"@1\" deja /*~Undef*/ini.", /* AlrdUndef */+ "Valeur de cas (@1) deja rencontree dans \/aiguillage courant.", /* AlrdUsedCaseVal */7 "Fin argument en dehors corps macro appelante \6(macro appelee \"@1\", macro appelante \"@2\", ligne \/@4@5@6@7@8).", /* ArgCollGetsOutMacBody */) "Specification \"@1\" attend tableau@0 \,(type argument: \"@2\").", /* ArrExptd */+ "Tableau d'elements squelette ou void ou \?fonction@0 (type element: \"@2\").", /* ArrOfIncplOrFctElt */& "Fonction ne peut rendre tableau ni \<fonction@0 (type rendu: \"@1\").", /* ArrOrFctCantBeRet */, "Fleche '->' attendue.", /* ArrowExptd */( "Fonction \"@2\": elements du tableau \&\"@1\"@0 (defini ligne @4@5@6@7@8)@0 \:devraient etre qualifie 'const'@3.", /* ArrShdBeConst */, "\"@2\" trop petit pour nombre maximum de \Bcaracteres entrable via specification \"@1\".", /* ArrTooSmall */0 "Pour convertir tableau en pointeur, utiliser \8forme &array[0][0]..@0. (type expression: \"@2\"; type \$cible: \"@3\").", /* ArrToPtr *// "Affectation adresse objet 'auto' a variable \6remanente (si vraiment necessaire, utiliser d-pragma \)/*~LocalAdr*/).", /* AsgnGblWLclAd */+ "Fonction variadique doit avoir au moins \(un parametre.", /* AtLeastOnePar */. "Branchement arriere (si vraiment justifie, \:utiliser d-pragma /*~BackBranch*/).", /* BackwdBranch */- "Nombre de parametres effectifs incorrect (\Jfonction \"@1\"@0, declaree ligne @4@5@6@7@8@0).", /* BadActParListLgth */- "Attribut incorrect@0 (doit etre 'static', \D'extern', 'typedef', 'register', 'auto', ou vide).", /* BadAttrib */B "'main' ne devrait pas avoir d'attribut.", /* BadAttribForMain */0 "Syntaxe incorrecte, ou texte trop long, pour \option " #ifdef VMS"'/def'|'/undef'"#else"-D/-U"#endif0" du compilateur (\"@1\").", /* BadDOption *// "@3 d-pragma illegal pour parametre \"@1\"@0 \F(defini ligne @4@5@6@7@8)@0 de fonction \"@2\".", /* BadDPForFctPar *// "Operateur '@1': type expression incorrect@0 \<(\"@2\") pour type recepteur \"@3\".", /* BadForLftType */1 "Indentation non coherente avec niveau courant \4bloc/sous-instruction@0: cran d'indentation (@3) x \1niveau courant (@2) != indentation courante (@1 \1espaces depuis debut ligne).", /* BadIndent */* "Indentation incorrecte depuis ligne @1 \/jusqu'a ligne precedente.", /* BadIndent1 */* "Indentation incorrecte depuis ligne @1 \>(fichier \"@2\") jusqu'a ligne precedente.", /* BadIndent2 */+ "Type index/ajout incorrect pour tableau/\3pointeur \"@1\"@0 (declare ligne @4@5@6@7@8; type \6attendu: \"@2\", type index: \"@3\"). Si necessaire, \.utiliser d-pragma /*~IndexType */ dans \Bdeclaration pour specifier type index/ajout.", /* BadIndexType */0 "Type index @0\"@2\" @0incorrect pour tableau \"\"@1\".", /* BadIndexType1 */4 "Type manquant; 'int' pris.", /* BadIntgrlType */& "Fichier d'en-tete \"@2\" a inclure \4directement dans corps unite compilation@0 (\"@1\" \7fourni par service \"@2\", et services utilises devrai\8ent etre mentionnes -au debut de- chaque unite de compi\6lation). Si utilise par autre fichier d'en-tete, l'in\6clure egalement dans ce fichier. En cas de fichier d'\Oen-tete compose, utiliser d-pragma /*~ComposingHdr*/.", /* BadlyIncldHdrFile */1 "Type incorrect pour parametre \"@1\" de 'main'\'@0 (\"@2\").", /* BadParForMain */- "Type rendu@0 (\"@3\")@0 incompatible avec \/type fonction@0 (\"@2\").", /* BadRetType */; "'main' doit rendre type 'int'.", /* BadRetTypeForMain */? "Valeur symbole '__dcc' non constante chaine.", /* BadUUdcc */- "Seconde instruction inclue dans boucle ou \5branche 'if'/'else'? (si oui, utiliser bloc; sinon, \bmettre seconde instruction sur ligne suivante)." /*~zif __index!=BlockQM "Misplaced 'BlockQM'" */,) "Borne tableau \"@1\"@0 (declare ligne \4@4@5@6@7@8)@0 devrait etre constante nommee@0 (via \3'#define' ou constante d'enum); nom a utiliser en \Kparticulier dans verification non-debordement tableau.",/* BndShdBeNamed */) "Borne tableau \"@1\"@0 (declare ligne \0@4@5@6@7@8)@0 devrait etre d'un type nomme, ou \5utiliser d-pragma /*~IndexType*/ dans declaration@0 \F(type index: \"@3\"; type borne: \"@2\").", /* BndShdBeOfNamedType */1 "Booleen attendu pour operateur '@1'@0 (type = \\"@2\").", /* BoolExptd */- "Fonction avec parametre(s) /*~ResultType*/\6 ne peut etre @1; @1 ignore.", /* CantBeGeneUtil */( "Fichier d'ajustement ne peut changer \5type/sorte d'un identificateur.", /* CantChgMnng */' "Initialisation n'a pas de sens pour \$'typedef'.", /* CantInitTpdf */& "'case' attendu.", /* CaseExptd */. "Non portable: verifier la casse (majuscule/\7minuscule) dans nom fichier d'en-tete.", /* ChkUcLc */5 "@3 en fin de declaration commencee ligne @4\@5@6@7.", /* CmplSColE1 */ "Fichier \"@1\" ne peut etre \L/*~ComposingHdr*/ de lui-meme (via fichier \"@2\").", /* CmpsgHdrWithSelf */# "':' attendu.", /* ColExptd */% "',' attendue.", /* CommaExptd */B "Essai de compiler fichier d'en-tete (\"@1\").",/* CompHdrFile *// "Operateur '##' doit etre suivi d'un lexeme; \-lexeme ';' ajoute.", /* ConcOprIlgLast */. "Correspondance incorrecte de qualificatifs \3'const'/'volatile' dans pointeurs (operateur '@1')\1@0 ( @4type attendu: \"@2\"; @4type expression: \(\"@3\").", /* ConstQalNotHeeded1 */. "Correspondance incorrecte de qualificatifs \0'const'/'volatile' entre parametres@0 ( @1type \5parametre effectif: \"@3\"; @1type parametre formel:\) \"@2\").", /* ConstQalNotHeeded2 */. "Operande de gauche dont au moins un membre \8est 'const'@0 (@3struct/union \"@1\", declaree/definie \7ligne @4@5@6@7@8); type = \"@2\").", /* ConstStrun */* "Operateur '@1': operande @4converti en \4'unsigned' (eventuel signe perdu)@0 (type operande \Bgauche: \"@2\"; type operande droit: \"@3\").", /* ConvToUnsig */1 "Operateur '@1': expression (droite) convertie \8en 'unsigned' (eventuel signe perdu)@0 (type expression\9: \"@3\"; type recepteur: \"@2\").", /* ConvToUnsig1 */0/* "Voulez-vous vraiment faire une copie d'une \8variable 'volatile' ?@0 (variable \"@1\", type: \"@2\")\;; si oui, la transtyper a non 'volatile'.", * CopyVolat */$ "Debordement tampon concatenation \2(augmenter constante 'MaxConcatLvl' dans fichier \=\"configdc.th\", et recompiler dcc).", /* CrtdTokTooLong */1 "@1expression booleenne constante; si vraiment \0necessaire, utiliser d-pragma /*~NonConstExp*/ \3(apres une parenthese droite).", /* CstBoolExp */5 "Expression constante attendue.", /* CstExpExptd */' "Operande constant de operateur '@1' \-devrait se trouver a droite (pour meilleure \&lisibilite).", /* CstOnLftSide */: "Expression d'aiguillage constante.", /* CstSwitchExp */. "Nom de champ \"@1\" deja utilise dans meme \'struct/union.", /* DblDefMember */& "Struct/union \"@1\" deja definie@0 \)ligne @4@5@6@7@8.", /* DblDefStrun */( "dcc ne peut traiter definition macro \8rencontree en cours de collecte d'argument@0 (collecte \Epour macro \"@1\", appelee ligne @4@5@6@7@8).", /* DccCantProcDef */+ "Declaration attendue.", /* DeclExptd */& "Clause 'default' attendue en fin d'\Faiguillage (ou utiliser d-pragma /*~NoDefault*/).", /* DefaultExptd */& "Essai de soustraire deux pointeurs \Gincompatibles@0 (gauche: \"@2\"; droit: \"@3\").", /* DiffIncptblPtr */2 "Nom de directive attendu.", /* DirNameExptd */1 "Un fichier '.c' doit etre compile separement, \<non inclus..@0. (fichier \"@1\").", /* DontInclBodyFile */- "Specification \"@1\" essaye d'ecrire dans \Gvariable 'const'@0 (type variable: \"@2\").", /* DontWriteIntoConst */3 "Nom de d-pragma attendu.", /* DPragNameExptd */, "D-pragma /*~@1*/ autorise seulement dans \2fichier d'en-tete; ignore.", /* DPragNotAlwd */1 "Le 'while' correspondant a un 'do' ne devrait \6pas etre aligne avec lui (pour eviter confusion avec \>boucle 'while'). Utiliser '{','}' ?", /* DWhileNotLinedUp */* "'#else' deja vu.", /* ElseAlrdSeen */, "Fonction ne peut etre definie dans corps \*autre fonction.", /* EmbdFctNotAlwd */- "Boucle ou branche de 'if'/'else' vide; si \?vraiment voulu, remplacer ';' par bloc vide.", /* EmptyStmt */* "Struct/union vide.", /* EmptyStrun */< "'*/' attendu (fin de d-pragma).", /* EndDPragLineExptd */D "Caracteres en trop en fin de ligne; ignores.", /* EndOfLineIgnd */2 "Directive '#error' rencontree.", /* ErrorDir */1 "Declarations 'extern' doivent etre mises dans \1fichier d'en-tete.", /* ExtDeclBeInHdrFile *// "Variable/fonction externe \"@1\" declaree@0 \<ligne @4@5@6@7@8,@0 mais non definie.", /* ExtObjNotDef */+ "'}' en trop; ignoree.", /* ExtraRBra */& "';' en trop a fin macro \"@1\" ?@0 \8(definie ligne @4@5@6@7@8).", /* ExtraSColAtEndMac */. "Seuls attributs attendus dans fichier d'en-\0tete: 'extern', 'typedef'.", /* ExtrnExptd */> "Une fonction ne peut etre initialisee.", /* FctCantBeInit *// "Declaration/definition de fonction illegale \7a l'interieur de struct/union.", /* FctDeclNotAlwd */* "Dans definition fonction, nom fonction \-(\"@1\") ne peut acquerir type fonction via \0identificateur de type.", /* FctDefViaTpdf */( "Ouverture impossible (fichier \"@1\" \5non-existant ou inaccessible).", /* FileOpenFail */+ "Champ de bits non autorise en dehors de \%struct/union.", /* FldNotAlwd */- "Taille champ bits incorrecte@0 (negative, \Bnulle, ou plus grande que largeur d'un 'int'.", /* FldSizIncor */& "Egalite entre quantites flottantes \4generalement mal definie (operateur '@1'); si bien \?definie ici, utiliser d-pragma /*~ExactCmp*/.", /* FltNotEq */% "Format epuise.", /* FmtExhstd */, "Les qualificatifs devraient etre groupes \ ensemble.", /* GroupQual *// "Transtypage risque@0 (type de l'expression: \4\"@2\"; type vise: \"@3\")@0; si reellement voulu, \Vutiliser d-pragma /*~OddCast*/." /*~zif __index!=HzrdConv "Misplaced 'HzrdConv'" */,* "Transtypage vers type moins qualifie@0 \/(type expression: \"@2\"; type vise: \"@3\"); \Fsi reellement voulu, utiliser d-pragma /*~OddCast*/.", /* HzrdConv1 */+ "Identificateur attendu.", /* IdExptd */8 "Identificateur ou ';' attendu@2", /* IdOrSColExptd */* "Caractere(s) ignore(s) en fin d'option \!\"@1\".", /* IgndCharsOpt */9 "Taille tableau incorrecte@0 (@1).", /* IlgArraySize */@ "Attribut illegal pour identificateur \"@1\".", /* IlgAttrib */1 "Seul attribut legal pour definition fonction: \@'static' (ou rien)@0 (fonction \"@1\").", /* IlgAttribForFct */( "Definition invalide pour type 'bool' \1(doit etre 'unsigned int').", /* IlgBoolDef */D "Ce type@0 (\"@1\")@0 ne peut etre transtype.", /* IlgCastSource */0 "On ne peut transtyper vers ce type@0 (\"@1\")\.", /* IlgCastTarget */0 "On ne peut transtyper vers ce type@0 (\"@1\")\;@0; utiliser d-pragma /*~CastTo*/.", /* IlgCastTarget1 */+ "D-pragma /*~CastTo*/ illegal@0 (types n'\0ont pas meme type de representation)@0; ignore \8(utiliser vrai transtypage)@0 (type expression: \"@3\";\+ type cible: \"@2\").", /* IlgCastTo */& "Caractere illegal: '@1' (peut-etre \,invisible).@0 Code: 0x@2.", /* IlgChar */. "Caractere illegal: '$'; peut etre legalise \,dans identificateurs en utilisant d-pragma \>/*~DollarSign*/ au debut unite compilation).", /* IlgCharD */+ "D-pragma /*~ComposingHdr*/ illegal dans \S$fichier 'corps', ou pour inclusion \5fichiers non 'en-tete'; ignore.", /* IlgCmpsgHdr */*- "Fichier \"@1\" ne devrait pas etre marque \x+/*~ComposingHdr*/.", /* IlgCmpsgHdr1 */n& "Hierarchie d'inclusion de fichiers \"bizarre.", /* IlgCmpsgHdr2 */1 "Operateur '##': lexeme cree invalide@0 (`@1`).\o2 @2 Remplace par lexeme ';'.", /* IlgCrtdTok */( "D-pragma /*~DccCompliant*/ seulement \>utilisable dans fichier d'en-tete systeme.", /* IlgDccCmpl */1 "Nom de directive invalide.", /* IlgDirName */.4 "D-pragma @1 mal utilise; ignore.", /* IlgDPrag */) "Sequence echappement invalide@0 (code \,)echappement: 0x@1).", /* IlgEscSeq */t$ "Caractere de conversion inconnu (\+specification \"@1\").", /* IlgFmtSpe */)% "Identificateur \"@1\" ne nomme ni \r8variable ni fonction ni constante d'enum.", /* IlgId */3 "Argument '#include' illegal.", /* IlgInclArg */ 4 "Illegal dans expression '#if'.", /* IlgInIfExp */' "Variable \"@1\": initialisation non \n2autorisee (declaration externe).", /* IlgInit *// "Utilisation d-pragma /*~Init*/ absurde pour \n&variable \"@1\".", /* IlgInitBU */1 "Operateur '@1': type gauche illegal@0 (\"@2\")\e.", /* IlgLftType */9 "Chiffre octal illegal@0 (code: 0x@1).", /* IlgOctDig */ < "Operande illegal pour '@1'@0 (\"@2\").", /* IlgOpndType */C "Modificateur invalide (specification \"@1\").",/* IlgOptForSpe */ - "Champ 'precision' incorrect (specification\t! \"@1\").", /* IlgPrecFld */uB "Operateur '@1': type droit illegal@0 (\"@2\").",/* IlgRhtType */+ "Specification \"@1\" invalide pour type \a"\"@2\".", /* IlgSpeForType */& "Syntaxe illegale.", /* IlgSynt */0 "Operateur '%' non defini sur type flottant@0 \7(gauche: \"@2\", droit: \"@3\").", /* IlgTCModOpnd */o9 "Operateur parmi {+ - * / %} attendu.", /* IlgTcOptr */t+ "Type illegal@0: \"@1\".", /* IlgType */n* "Type illegal@0 (\"@2\")@0 pour largeur/\;precision@0 (specification \"@1\").", /* IlgTypeForFld */'. "Operandes de types illegaux pour operateur \9'@1'@0 (gauche: \"@2\"; droit: \"@3\").", /* IlgTypes */m0 "Corps de macro, ou parametre, mal parenthese \-? (operateur '@1').", /* IllParenMacro */a+ "Une declaration ne peut venir apres une \t&instruction.", /* IllPositDecl *// "D-pragma /*~Undef{Tag}*/ a n'utiliser qu'en \uMdehors de fonction." /*~ zif __index!=IllUndef "Misplaced 'IllUndef'" */,p/ "Le fichier \"@2\" devrait etre inclus apres \s8le fichier \"@3\"@0 (il redeclare la variable/fonction \ \"@1\").", /* IncldAfter */- "Type parametre no.@1 incoherent avec type \ 0rendu par fonction; d-pragma @4 ignore@0 (type \@parametre: \"@2\"; type rendu: \"@3\").", /* IncohResultType */* "Fonction /*~NeverReturns*/ \"@1\" rend \%controle ...", /* IncorNevRet */a, "Type resultat pour '%' devrait etre type \*operande gauche.", /* IncorTCModRes *// "Type specifie pour resultat incoherent avec \a3regles conversion de C@0 (type operandes: \"@2\", \ #\"@3\").", /* IncorTCResTyp */ / "Elements du tableau \"@1\"@0 (declare ligne \ 7@4@5@6@7@8)@0 de type incomplet ou void ou fonction@0 \ !(\"@2\").", /* IncplArray */t6 "Macro \"@1\": parametre incomplet.", /* IncplPar */+ "Pointeur \"@1\"@0 (declare/defini ligne \ 6@4@5@6@7@8)@0: elements pointes de type incomplet ou \0void ou fonction@0 (\"@2\").", /* IncplPtr *// "Type rendu par fonction \"@1\" incomplet ou \r-fonction@0 (\"@2\").", /* IncplRetType */ / "Operateur '@3': type incomplet@0 (\"@2\")@0 \m,pour struct/union \"@1\"@0 (declaree ligne \(@4@5@6@7@8).", /* IncplStrunType */+ "Type incomplet ou void ou fonction pour \5identificateur \"@1\"@0 (\"@2\").", /* IncplType */o- "Fonction \"@1\": attribut devrait etre @2 \ld(cf declaration ligne @4@5@6@7@8)." /*~ zif __index!=IncptblAttrib "Misplaced 'IncptblAttrib'" */,- "Incompatibilite entre parametre formel et \ 3effectif pour fonction \"@1\"@0 (declaree/definie \p5ligne @4@5@6@7@8); type parametre effectif: \"@2\", \f3type parametre formel: \"@3\".", /* IncptblPar */e& "Operateur '@1': operandes de types \Gincompatibles@0 (gauche: \"@2\"; droit: \"@3\").@4", /* IncptblTypes */n/ "Type index (\"@2\") trop etroit pour valeur \"-borne (@3) tableau \"@1\"@0 (declare/defini \ 0ligne @4@5@6@7@8).", /* IndexTypeTooSmall */C "Index (@1) superieur ou egal a borne (@2).", /* IndexValTooBig */u, "Appel fonction \"@1\" passe en parametre \5a macro l'utilisant plusieurs fois@0: inefficace au \dDmieux, effets secondaires multiples au pire.", /* IneffOrSideEff */" "; si normal, utiliser d-pragma \"/*~Init */", /* InitDP */7 "Erreur lecture (fichier \"@1\").", /* InptFileErr */n. "Type 'int' non portable pour champ de bits \6(interprete comme signe ou non signe selon plateforme\+)@0; type = \"@1\".", /* IntBitField */i: "Type entier ou booleen attendu.", /* IntgrlTypeExptd */2 "Entier n&+on signe attendu.", /* IntgrNbExptd */J "'{' attendue." /*~zif __index!=LBraExptd "Misplaced 'LBraExptd'" */,. "Operateurs '#' et '##' seulement autorises \8dans definition macro; ignores.", /* LegalOnlyInMac */F "Longueur constante caractere non egale a 1.", /* LgtCharCstNotOne */- "Pour fichier d'en-tete, utiliser 'h', non \'H'.", /* LowerCaseH */a$ "'(' attendue.", /* LParExptd *// "Parenthese gauche devrait etre en dehors de \e"macro.", /* LParOutsideMac */# "Macro \"@1\" deja definie ligne \1<@4@5@6@7@8; nouvelle definition ignoree.", /* MacAlrdDef */. "Nom de macro attendu.", /* MacNameExptd */) "Modifications @3 via parametre formel \e8\"@1\"@0 (defini ligne @4@5@6@7@8)@0 de fonction \"@2\"\B@0; si normal, utiliser d-pragma /*~MayModify*/.", /* MayModify */= "Un champ ne peut etre initialise.", /* MemberCantBeInit */A) "Les etiquettes sont a placer en debut \t$d'instruction.", /* MisplaLbl */A "Valeurs bizarres pour operandes pointeurs ?", /* MnlsPtrDiff */l) "Variable externe \"@1\" deja declaree \r-(ligne @4@5@6@7@8) avec type plus strict ou \e0incompatible@0 (type declaration: \"@2\"; type \Gcourant: \"@3\")@0; declaration courante ignoree.", /* MoreStrngType */e5 "Attribut deja specifie.", /* MoreThanOneAttrib */@) "'break' manquant? (si vraiment voulu, \t4utiliser d-pragma /*~NoBreak*/).", /* MsngBreak */* "Operateur '##' a preceder d'un lexeme; \!ignore.", /* MsngConcOpnd */+ ", ou qualificatif 'const' manquant dans \*Hparametre formel auquel adresse de \"@1\" est passee", /* MsngConstQM */) "'#endif' manquant.", /* MsngEndif */s& "'==' manquant ?", /* MsngEqual */) "Expression manquante.", /* MsngExp */m: " ('extern' ou 'typedef' manquant ?)", /* MsngExtTpdf */, "Declaration de fonction \"@1\": attribut \2manquant ('static' pris).", /* MsngFctAttrib */1 "Nom de fonction manquant.", /* MsngFctName */r@ "Parenthese manquante apres nom fonction ?", /* MsngFctParen */) "Specification \"@1\" devrait indiquer \@0taille limite, pour eviter debordement tableau \#recepteur.", /* MsngFldWdth */.) "Specification \"@1\" devrait indiquer \r0taille limite, pour eviter debordement tableau \/recepteur (si debordement garanti impossible, \d6utiliser d-pragma /*~SizeOK*/).", /* MsngFldWdth1 */3 "'if' manquant (ou '}' oubliee ?).", /* MsngIF */t& "Macro \"@1\": arguments manquants; \0remplaces par arguments vides@0 (macro definie \Pligne @4@5@6@7@8)." /*~ zif __index!=MsngMacArg "Misplaced 'MsngMacArg'" */,/ "Nom de champ manquant.", /* MsngMembName */,A "Fonction \"@1\" a marquer /*~NeverReturns*/.", /* MsngNevRet */u@ "Nom de variable/fonction/type manquant.", /* MsngObjTypName *// "Variable/fonction \"@1\": attribut 'static' \"3manquant ?@0 (ou, si vraiment externe, a declarer \a4comme 'extern' dans un fichier d'en-tete \"@2.h\", \"a inclure).", /* MsngStati */B "Mot-cle 'struct'/'union'/'enum' manquant ?", /* MsngStrunEnum */- "Utiliser 'void' pour specifier absence de \ parametre.", /* MsngVoid */) "Nom \"@1\" deja utilise (defini ligne \~6@4@5@6@7@8); redefini (si reellement voulu, utiliser \0d-pragma /*~Masking*/).", /* NameAlrdInUse */( "Indice negatif.", /* NegIndexVal */. "Attributs non permis.", /* NoAttribAlwd */; "Pas de nom d'unite de compilation donne.", /* NoCUName */t/ "Pas de definition de variable/fonction dans \s1un fichier d'en-tete@1.", /* NoDefInHdrFile */*, "Directives non autorisees dans d-pragma; \#ignorees.", /* NoDirInDPrag */t- "Il n'existe pas de type plus 'haut' parmi \i8les parametres effectifs (correspondants aux parametres\6 formels /*~ResultType*/) de cet appel de fonction@0 \/(resultType precedent: \"@2\"; type parametre \@/effectif courant: \"@3\").", /* NoHghrTyp */t. "Nom de variable (\"@1\") non autorise dans \.definition de type.", /* NoIdAlwdInType *// "Premier lexeme fonction (apres '{') devrait \81etre sur nouvelle ligne, et non a son debut, de \p>maniere a indiquer indentation choisie.", /* NoIndentIndct *// "Utilisation de d-pragma non coherente entre \/-definition fonction \"@1\" et declaration@0 \ D(ligne @4@5@6@7@8)@0; declaration l'emporte.", /* NonCoheDPInFct */3 "Operateur non commutatif.", /* NonCommutOper */*9 "Transtypage depourvu de sens.", /* NonNumCantBeCast */\& "Transtypage non portable ?@0 (type \,expression: \"@2\"; type vise: \"@3\"); si \5reellement voulu, utiliser d-pragma /*~PortableQM*/ \c4ou, si en fait toujours garanti portable, d-pragma \(/*~OddCast*/.", /* NonPortCastQM */. "Operateur '@1': affectation non portable@0 \F(type expression: \"@3\"; type recepteur: \"@2\").", /* NonPortCmbn */1 "Operateur '@1': operande droit non portable@0 \*@(\"@2\")@0 pour operande gauche@0 (\"@3\").", /* NonPortOpnd */1 "Combinaison de types non portable@0 (pourrait \,-donner \"unsigned @1\").", /* NonPortTC */c? "Macro \"@1\" ne peut etre '#undef'inie.", /* NonUndfnblMac */u% "Etiquette \"@1\"@0 (definie ligne \7@4@5@6@7@8)@0 non visible d'ici.", /* NonVisiLabel */o1 "Operateur '@1': pas de relation d'ordre entre \t6pointeurs sur 'void' ou sur fonction@0 (type gauche: \2\"@2\"; type droit: \"@3\").", /* NoOrderRel */) "Pas de '#if' avant.", /* NoPrecIf */i1 "Qualificatifs non admis.", /* NoQualifAlwd */t? "Manque 'return' en fin de fonction \"@1\".", /* NoRetAtEnd */r. "Corps de quelle fonction ?", /* NotAFct */) "Fonction '__index' utilisee en dehors \mWinitialisation de tableau." /*~ zif __index!=NotArrInit "Misplaced 'NotArrInit'" */,7* "Tableau ne peut etre transtype en type \/entier@0 (type expression: \"@2\"; type vise: \g!\"@3\").", /* NotArrToNum */ - "Caractere non ASCII (peut-etre invisible; \:&code: 0x@1).", /* NotASCIIChar */* "Pas de /*~TypeCombination*/ permettant \#\"@1@2@3\".", /* NoTCAllows */0, "Tag \"@1\" non defini.", /* NotDefTag */. "Fonction '__extent': identificateur \"@1\" \9non type 'enum' ni tag d'enum.", /* NotEnumTypeOrTag */ , "Operateur '@1': type expression incorrect\9@0 (\"@2\"); type attendu: \"@3\".", /* NotExptdType */m; "Variable locale \"@1\" non initialisee@2.", /* NotInit */l1 "Variable locale \"@1\" non initialisee (ligne \c#@4@5@6@7@8)@2.", /* NotInit1 */r, "En dehors boucle.", /* NotInsideLoop */@ "En dehors boucle ou aiguillage.", /* NotInsideLoopOrSwitch */1 "En dehors aiguillage.", /* NotInsideSwitch */nD "En dehors aiguillage, ou apres 'default'.", /* NotInsideSwitch1 */* "Operateur '@1': l'operande @2n'a pas d'\adresse.", /* NotLVal */ ) "Le tableau parametre effectif n'a pas \i d'adresse.", /* NotLValP */% "Operateur '#': operande doit etre \e?parametre de macro; operateur ignore.", /* NotMacParForQuo */u/ "Operateur '@2': operande (gauche) 'const'@0 \ >(@3objet \"@1\", declare ligne @4@5@6@7@8).", /* NotModfbl */. "Initialiseur de struct/union non nomme, ou \9constantes litterales dedans.", /* NotNamedStrunCst */ < "Valeur expression non utilisee.", /* NotPureSideEffect */' "Valeur fonction \"@1\" non utilisee \n2(si son effet principal est un effet secondaire, \@peut etre marquee /*~PseudoVoid*/).", /* NotPureSideEffect1 */& "Fonction \"@1\": nombre parametres \7different entre declaration@0 (ligne @4@5@6@7@8)@0 et \nRdefinition." /*~ zif __index!=NotSameNbOfPar "Misplaced 'NotSameNbOfPar'" */,. "Variable/fonction \"@1\": type definition@0\4 (\"@2\")@0 ne correspond pas a type declaration@0 \I(\"@3\"), ligne @4@5@6@7@8@0; type definition ignore.", /* NotSameType */* "Fonction '__member' utilisee en dehors \6initialisation de struct/union.", /* NotStrunInit *// "\"@1\" n'est pas un type.", /* NotTypeId */ ' "Constante d'enum \"@1\" censee etre \n*/*~NotUsed*/ ?!!", /* NotUsdEnumCst */? "Variable\"@1\" censee etre /*~NotUsed*/ ?!!", /* NotUsdObj */ @ "Parametre \"@1\" cense etre /*~NotUsed*/ ?!!", /* NotUsdPar */: "\"@1\" n'est pas une variable (locale).", /* NotVarId */8 "Caractere invisible (code: 0x@1).", /* NotVisiChar */1 "Constante numerique a nommer@0 (via '#define' \ +ou constante d'enum). Voir aussi d-pragma \u-/*~LiteralCst*/.", /* NumCstShdBeNamed */u, "Nommer egalement les constantes dans les \>macros (ou sinon les parentheser).", /* NumCstShdBeNamed1 */( "Declaration de fonction \"@1\": seul \<attribut autorise dans bloc est 'extern'.", /* OnlyExtrn */< "Seul attribut autorise: 'register'.", /* OnlyRegAttrib */% "Operateur '@1': valeur operande @2\e4peut-etre en dehors domaine {0, 1}, aussi utiliser \4operateurs logiques '&&', '||', '!', ou comparer a \Faux.", /* Outside01 */r, "Operateur '@1': debordement@0 (pour type \\"@2\").", /* Overflow */$ "Debordement.", /* Overflow1 */- "Operateur '@1': troncation gauche@0 (pour \x$type \"@2\").", /* Overflow2 */) "Macro \"@1\": nom de parametre \"@2\" \t'deja utilise.", /* ParAlrdExist */ @ "Parametres formels doivent etre nommes.", /* ParMustBeNamed */> "Macro \"@1\": nom de parametre attendu.", /* ParNameExptd */) "Fonction \"@1\": nom parametre formel \ )\"@2\" different nom correspondant dans \bAdeclaration fonction@0 (ligne @4@5@6@7@8).", /* ParNamesNotEq */n1 "Parametre non /*~Generic*/ ni /*~ResultType*/,\ 8 donc ne devrait pas etre d'un type de representation@0\1 (type parametre \"@2\").", /* ParRepreType */a- "Type parametre formel \"@1\"@0 (\"@3\")@0 \/(incoherent avec declaration fonction@0 \;(\"@2\"), ligne @4@5@6@7@8; ignore.", /* ParTypesNotEq */ . "Transtypage potentiellement non portable@0 \8(type expression: \"@2\"; type vise: \"@3\")@0; si reel\Glement/~DCC.BCKv"[DCC_DISTRIB.SRC]DCMSG.FRE;187sT,.> voulu, utiliser d-pragma /*~PortableQM*/.", /* PortableCastQM */"- "Operateur '@1': debordement si expression \,'unsigned' trop grande@0 (type expression: \3\"@3\"; type recepteur: \"@2\").", /* PossOvfl */n0 "Transtypage precedent inutile@0 (de \"@2\" a \!\"@3\").", /* PrevCastUsl */- "Type \"@1\" prive: constantes/membres non \Gvisibles d'ici@0 (\"@3\", defini ligne @4@5@6@7@8).", /* PrivNotVisi */* "Specification \"@1\" attend pointeur@0 \,(type argument: \"@2\").", /* PtrExptd */( "Seul pointeur sur fonction peut etre \Aparametre (parametre \"@1\", type \"@2\").", /* PtrOnFctExptd */u "Fonction \"@2\": pointeur \r&\"@1\"@0 (defini ligne @4@5@6@7@8)@0 \=devrait pointer sur element 'const'@3.", /* PtrShdBeConst */r6 "Pointeur devrait etre transtype vers size_t \3(ou unsigned long(long)); sinon utiliser d-pragma \l3/*~OddCast*/@0 (type pointeur: \"@2\"; type vise: \ \"@3\").", /* PtrToNum */$ "'}' attendue.", /* RBraExptd */2 "',' or '}' attendue.", /* RBraOrCommaExptd */F "Pas d'adresse pour registre ni champ de bits.",/* RegAttribForAmp */) "Attribut 'register' incompatible avec \d3qualificatif 'volatile'.", /* RegVolatIncptbl */r1 "Fonctions devraient rendre type d'information \e-(par ex. \"Position\")@0, sauf si d-pragmas \ 8/*~ResultType*/, /*~Generic*/ ou /*~Utility*/ utilises \C(type rendu = type de representation \"@1\").", /* ResRepreType */t/ "Parametre /*~ResultPtr*/ doit avoir type le \/7plus haut parmi tous les parametres /*~ResultType*/@0 \eM(type parametre courant: \"@2\", type @1: \"@3\").", /* ResulPtrNotHgHsTyp */nB "Essai de rendre pointeur sur objet 'auto'.", /* RetPtrOnLclAd */$ "')' attendue.", /* RParExptd */2 "',' or ')' attendue.", /* RParOrCommaExptd */$ "']' attendu.", /* RSBrExptd */) "Constante d'enum \"@1\" a meme valeur \l0(@2) qu'une precedente (\"@3\"); si reellement \=voulu, utiliser d-pragma /*~SameValue*/.", /* SameEnumCst */e. "Nom de parametre \"@1\" utilise plus d'une \4fois dans definition fonction.", /* SameParName */$ "';' attendu.", /* SColExptd */% "';' attendu@2", /* SColExptd1 */C/ "Instructions a separer des declarations par \rDau moins une ligne blanche (ou utiliser \";;\").", /* SepDeclStmt */[ "Aiguillage devrait porter sur bloc." /*~zif __index!=ShdBeBlk "Misplaced 'ShdBeBlk'" */, + "Cette declaration de la fonction \"@1\" \"8devrait, avec un attribut 'extern', se trouver dans un \7fichier d'en-tete inclus ici.", /* ShdBeInHdrFile */l> "Expression booleenne non parenthesee.", /* ShdBePrntzBool *// "Argument devrait etre tableau, non pointeur \/3sur tableau@0 (tableau passe par adresse, non par \ %valeur).", /* ShdntBePtrOnArr *//+ "Effet secondaire via parametre de macro \uBservant plus d'une fois (operateur '@1').", /* SideEffInMacPar */6 "Seul operateur permis: '='.", /* SimplAsgnExptd */- "'sizeof' sur constante caractere => sizeof\I$('int') !", /* SizeofCharCst */7 "Operande 'sizeof' non evalue.", /* SizeofDontEval */l0 "Initialisation de variable 'auto' a eviter@0 \4(lente et gache memoire). La variable devrait etre \6declaree 'static'. Si vraiment non adequat, utiliser \-d-pragma /*~DynInit*/.", /* SlowingInit */c- "Fonction 'static' \"@1\" declaree@0 ligne \"6@4@5@6@7@8,@0 mais non definie.", /* StaFctNotDef */, "Fichier a inclure avant cette \!ligne.", /* StddefNotIncl */o+ "Instruction attendue.", /* StmtExptd */t2 "Constante chaine attendue.", /* StrCstExptd */4 "Chaine \"@1\" trop longue.", /* StringTooLong */B "Nouveau type non definissable ici.", /* StrunEnumDeclNotAlwd */* "Erreur interne:: @1.", /* SysError */2 "Tag \"@1\" non visible ici.", /* TagNotVisi */, "Nom de tag a preceder de 'enum'/'struct'/\8'union' pour etre nom de type@0 (\"@1\").", /* TagQM */( "Etiquette \"@1\" cible d'au moins un \G'goto' qui ne peut la voir (ligne @4@5@6@7@8).", /* TargLabelNotVisi */c' "/*~TypeCombination*/ \"@1@3@2\" est \i2incompatible/redondante avec combinaison definie/\1deduite de ligne @4@5@6@7@8.", /* TCAlrdDef */i. "D-pragma /*~TypeCombination*/ ne peut etre \7utilise qu'en dehors de fonction.", /* TCNotAtLvl0 */.6 "Trop de niveaux d'accolades.", /* TooManyBraLvl */+ "Moins de parametres que demande par les \a2specifications du format.", /* TooManyFmtSpe */- "Trop d'initialiseurs.", /* TooManyIniz *//0 "Appel de la macro \"@1\": trop d'arguments@0 \2(appel ligne @4@5@6@7@8).", /* TooManyMacArg */= "Macro \"@1\": plus de @2 parametres.", /* TooManyMacPar */y3 "Trop de messages; termine.\n", /* TooManyMsg */c< "Trop de parametres pour 'main'.", /* TooManyParForMain */( "Identificateur trop long (plus de 31 \"caracteres).", /* TrnctdId */, "Operateur '@1': operandes incompatibles; \6essayer de les permuter@0 (type gauche: \"@2\"; type \%droit: \"@3\").", /* TryPermut *//5 "Nom de type attendu; 'int' pris.", /* TypeExptd */7@ "Type \"@1\" non type numerique parallele.", /* TypeNotParal */@ "Commentaire non ferme quelque part avant ?", /* UnclosedCmt */- "D-pragma non termine ?", /* UnclosedDP */n@ "Adresse non calculable par editeur de lien.", /* UncomputAd */+ "Tag ou '{' manquant.", /* UndefEnum */3 "Fonction \"@1\" non declaree.", /* UndefFctId */m5 "Identificateur \"@1\" non declare.", /* UndefId */@+ "Etiquette \"@1\" de fonction \"@2\" non \\Adefinie (utilisee au moins ligne @4@5@6@7@8).", /* UndefLabel */8& "Operation '@3' tentee sur pointeur \,(\"@1\") vers type sans taille@0 (\"@2\"); \?pointeur declare/defini ligne @4@5@6@7@8.", /* UndefPtdType */d- "Operateur '@1': valeur illegale (@2) pour \aHoperande droit@0 (type:\"@3\" => resultat non defini).",/* UndefResul */> "Operateur '@1': type sans taille (\"@2\").", /* UndefSize */0 "Struct/union non definie.", /* UndefStrun */( "Tag \"@1\" non defini (declare ligne \"@4@5@6@7@8).", /* UndefTag */4 "Operateur '@1': sous-passement.", /* Underflow */, "Identificateur \"@1\" non visible d'ici (\*marque /*~Undef*/ini).", /* UndfndId */0 "Appel de la macro \"@1\" (ligne @4@5@6@7@8): \Dargument non termine (pour le parametre #@2).", /* UnFnshArgList */: "Constante caractere non terminee.", /* UnFnshCharCst */, "Commentaire non ferme.", /* UnFnshCmt */* "'@1' manquant.", /* UnFnshFileName */6 "Constante chaine non terminee.", /* UnFnshStrCst */( "D-pragma inconnu.", /* UnknDPrag */2 "Identificateur inconnu (\"@1\").", /* UnknId */. "Macro inconnue (\"@1\").", /* UnknMacro */, "Operateur '@1': champ \"@3\" ne fait pas \5partie de struct/union@0 \"@2\".", /* UnknMember */"/ "Option inconnue: \"@1\".", /* UnknOption */p1 "Instruction inaccessible.", /* UnreachStmt */u- "Operateur '@1': comparaison d'expressions \r3comportant soustraction de 'unsigned' (difference \r6jamais negative !); ajouter plutot a autre operande, \Fou, si correct, utiliser d-pragma /*~CastTo*/.", /* UnsigDiffNotNeg */- "Operateur '@1': valeur 'unsigned' ne peut \e&etre negative.", /* UnsigNonNeg */= "Type incorrect pour champ@0 (\"@1\").", /* UnsuitFldType */ 1 "Constante d'enum \"@1\" non utilisee (definie \,sligne @4@5@6@7@8); d-pragma /*~NotUsed*/ manquant ?" /*~ zif __index!=UnusedEnumCst "Misplaced 'UnusedEnumCst'" */,"+ "Fonction \"@1\" non utilisee@0 (declaree\@0/definie ligne @4@5@6@7@8).", /* UnusedFct */- "Identificateur \"@1\" non utilise (declare\ ./defini ligne @4@5@6@7@8).", /* UnusedId */0 "Etiquette \"@1\" non utilisee (definie ligne \%@4@5@6@7@8).", /* UnusedLabel */r+ "Parametre de macro \"@1\" non utilise@0 \f1(defini ligne @4@5@6@7@8); si adequat, utiliser \l.d-pragma /*~NotUsed*/.", /* UnusedMacPar */. "Fonction \"@2\": valeur (finale) parametre \6formel \"@1\" non utilisee, ou d-pragma /*~NotUsed*/ \Bmanquant?@0 (parametre defini ligne @4@5@6@7@8).", /* UnusedPar *// "Tag de struct/union/enum \"@1\" non utilise \/(defini ligne @4@5@6@7@8).", /* UnusedTag */ - "Identificateur de type \"@1\" non utilise \2(defini ligne @4@5@6@7@8).", /* UnusedTypeId */1 "Valeur (finale) variable \"@1\" non utilisee@3\e9 (variable definie ligne @4@5@6@7@8).", /* UnusedVar */i) "Valeur precedente variable \"@1\" non \m#utilisee@3.", /* UnusedVar1 */r) "Nom de type cree @0(\"@1\") @0devrait \e=commencer par majuscule (ex. Voltage).", /* UpCaseTypName */t) "Utiliser d-pragma /*~IndexType*/ dans \t3declaration pointeur \"@1\"@0 (ligne @4@5@6@7@8); \f3type index/ajout: \"@3\", mais \"@2\" attendu par \e&defaut.", /* UseIndexTypForPtr */9 " Utiliser d-pragma /*~TypeCombination*/ ?", /* UseTC */a- "Attribut denue de sens@0 (aucune variable \6definie; cette construction n'est qu'une declaration \+de struct/union/enum).", /* UslAttrib */ + "Transtypage inutile@0 (type expression: \e5\"@2\"; type vise: \"@3\"); si vraiment necessaire, \S1utiliser d-pragma /*~OddCast*/.", /* UslCast */o( "D-pragma /*~CastTo*/ inutile@0 (type \;expression: \"@3\"; type cible: \"@2\").", /* UslCastTo */e* "D-pragma @1 inutile.", /* UslDPrag *// "Qualificatif inutile pour fonction@0 (type: \A \"@1\").", /* UslFctQual */, "D-pragma /*~Init*/ inutile pour variable \\"@1\".", /* UslInitBU */0 "D-pragma /*~NoDefault*/ inutile@0 (l'aiguilla\6ge teste toute les valeurs distinctes des constantes \6d'enum. Si cela doit rester ainsi, utiliser d-pragma \7/*~FullEnum*/ pour le verifier).", /* UslNoDefault */e* "Variable \"@1\" inutile (definie ligne \ @4@5@6@7@8).", /* UslObj */= "Specificateur de type inutile/incoherent.", /* UslTypSpe */ ) "Fonction \"@1\": declaration@0 (ligne \ 8@4@5@6@7@8)@0 variadique et definition non variadique, \&ou vice-versa.", /* VariNotVari */1 "Un specificateur 'void' sans modificateur doit\/% etre seul.", /* VoidNotAlone */ ? "Type \"void\" illegal (parametre \"@1\").", /* VoidNotAlwd */ 0 "Remarques deja inhibees.", /* WarnAlrdOff */1 "Remarques deja autorisees.", /* WarnAlrdOn */c( "'while' attendu.", /* WhileExptd */0 "Variable/fonction externe \"@1\"@0 (declaree \5au moins dans fichier d'en-tete \"@6\", ligne @4)@0 \t5pas definie dans bonne unite compilation@0; devrait \a2etre definie dans unite compilation telle que un \Eseulement des fichiers d'en-tete inclus la declare.", /* WrngCUnit */c' "Type de l'aiguillage non 'enum', ou \f2constantes de ce type pas toutes utilisees comme \+valeurs de 'case'.", /* WrngFullEnum */i1 "Variable/fonction externe \"@1\" pas declaree \e5dans bon fichier d'en-tete@0 (declaree dans fichier \ 4\"@6\" (ligne @4), qui n'est pas fichier d'en-tete \6correspondant a unite compilation courante (\"@2\"), \Fni fichier (non d'en-tete) inclus dans ce fichier.", /* WrngHdrFile */- "Nombre incorrect (combinaison illegale de \ 'signe/base/suffixe).", /* WrngNb */r0 "Exposant incorrect de nombre.", /* WrngNb1 */1 "Utilisation incorrecte d-pragma /*~SameValue*/\t8: constante d'enum \"@1\" (@2) egale a aucune constante\, precedente du type.", /* WrngSameVal */1 "Argument 'sizeof' incorrect ?@0 (type argument\e5: \"@2\"; devrait etre: \"@3\").", /* WrngSizeof */tW "'Zif' non faux; message: \"@1\"." /*~ zif __index!=ZifWarn "Misplaced 'ZifWarn'" */,r/* End DCMSG.FRE */c*[DCC_DISTRIB.SRC]DCMSG.TXT;846+,l.Q/( 4tQP -"0123KPWOR56(Z7S89G(HJ/* DCMSG.ENG */(/* Y.L. Noyelle, Supelec, France 1994 */J/************************************************************************/"/* ERRORS/WARNINGS MESSAGES */J/************************************************************************/I/* @x (x>0) tells where message parameter number x should be inserted; @0H indicates portions of text to be skipped if not in "verbose" mode. */# "WArning (lvl. ", /* Warning */ "ERror", /* Error */4 "bool/signed char/.../unsigned long", /* Arithm */ "@0", /* At0 */# "component of ", /* ComponOf */# "composite of ", /* ComposOf */3 " (file already included ?)", /* DblIncldFile */, " (e.g. ...*const...)", /* EGConstPtr */ "empty", /* Empty */ "", /* EmptyTxt */ "\"", /* EndFileName */. "\nCompilation unit \"@1\": total number of \(lines processed = @2\n", /* EndMsg */; "@1 error(s) and @2 warning(s) reported.\n", /* ErrWarn */ " of file \"", /* File */% "\nLast tokens: ", /* LastToks */ "left ", /* Left */ " line ", /* Line */0 "may occur (through assignment to non 'const' \pointer)", /* MayM */4 "No error or warning reported.\n", /* NoErrWarn */& " or just before", /* OrJustBef */. "Press to go on", /* ProceedMsg */S "ran out of memory.." /*~zif __index!=RanOutOfMem "Misplaced 'RanOutOfMem'" */, "right ", /* Right */ "######\n", /* SeparMsg */4 "===>Press after each message to go on,\n\6 e => more informative message (see \option '+zlt'),\n\: # => no more stopping (see also option \8'-zsam').\n Option '+zae' causes every error to show\8.\n===>The command 'dcc' alone (without argument) lists\, all options.\n", /* StopAftMsgBanner */ "sub", /* SubPre *// "C programs checker, version 2.1h. Copyright \21995 Ecole Superieure d'Electrici-\nte, France.\n\0Usage: dcc {options} compilation_unit_name(s)\n\6options: -zac no missing 'const' qualifier check,\n\( -zbo no 'bool' type check,\n\' -zcc do not call compiler,\n\3 -zctn do not check first letter of type name,\n\9 -zcw call compiler only if no warning/error,\n\9 -zfrt no unnamed function return type check,\n\0 -zinc no '#include' position check,\n\( -zind no indentation check,\n\2 -znui no check of unused identifiers,\n\: -znup no check of unused function parameters,\n\0 -znw start in \"no warning\" mode,\n\7 -zpe no check of various possible errors,\n\( -zpo no portability check,\n\( -zrd no readability check,\n\2 -zsam no stopping after each message,\n\ -ztr no trailer,\n\1 -zuc no check of unnamed constants,\n\ -zwa no warnings,\n\A -zwr no forced newline at @3 characters,\n", /* Use1 */M" +zae report all errors (default is report merely first error of\n\2 current statement/declaration),\n\N +zafn always display current file name in error/warning messages,\n\7 +zepl warn on empty formal parameter list,\n\P +zlt/+zlt'x' list last tokens processed before error/warning ('x' =\n\" buffer length),\n\D +zmcc check all pointers for missing 'const' qualifier,\n\, +zmic more index type checking,\n\? +zmsg'x' 'x': maximum number of emitted messages,\n\D +zpnt check that function parameters are of named type,\n\2 +zsy print each block's symbol table,\n\R +ztab'x' 'x': tab spacing (for indentation purposes; @2 is default),\n\ +zusg give 'usage',\n\A +zve output more informative error/warning messages,\n\F +zvve idem '+zve', plus output type descriptions in full.\n\8Options not beginning with '+z'/'-z' are transmitted to\U compiler (but @4 options are heeded)." /*~zif __index!=Use2 "Misplaced 'Use2'" */,( "\n***** WArning(s)/ERror(s) found in \-compilation unit \"", /* WarnErrInFile */- "will occur@0 (through cast or non 'const' \"pointer field)@0", /* WillM */. "Identifier \"@1\" already declared/defined \(line @4@5@6@7@8@9.", /* AlrdDefId */= "Label already defined line @4@5@6@7@8.", /* AlrdDefLabel */> "Type already qualified with same qualifier.", /* AlrdQual */8 "Option \"@1\" already positioned.", /* AlrdSeenOpt */7 "Tag \"@1\" already /*~Undef*/ined.", /* AlrdUndef *// "Case value (@1) already used in same switch \'statement.", /* AlrdUsedCaseVal */2 "Argument collection gets out of calling \0macro body (called macro \"@1\", calling macro \A\"@2\", call on line @4@5@6@7@8).", /* ArgCollGetsOutMacBody */1 "Specification \"@1\" expects an array@0 (type \*of argument: \"@2\").", /* ArrExptd */( "Array of incomplete/void or function \?elements@0 (element type: \"@2\").", /* ArrOfIncplOrFctElt *// "Function cannot return array nor function@0 \3(return type: \"@1\").", /* ArrOrFctCantBeRet */, "Arrow '->' expected.", /* ArrowExptd */& "Function \"@2\": elements of array \0\"@1\"@0 (defined line @4@5@6@7@8)@0 should be \.qualified 'const'@3.", /* ArrShdBeConst */1 "\"@2\" not large enough for maximum number of \Bcharacters readeable by specification \"@1\".", /* ArrTooSmall */. "To convert array to pointer, use construct \2&array[0][0]..@0. (expression type: \"@2\"; cast \#type: \"@3\").", /* ArrToPtr */, "Assignment of 'auto' address to remanent \/variable (if really needed, use /*~LocalAdr*/ \%d-pragma).", /* AsgnGblWLclAd */. "A variadic function must have at least one \%parameter.", /* AtLeastOnePar */. "Backwards branch (if really justified, use \2/*~BackBranch*/ d-pragma).", /* BackwdBranch *// "Bad number of actual parameters@0 (function \G\"@1\", declared/defined line @4@5@6@7@8)@0.", /* BadActParListLgth *// "Bad attribute@0 (can be 'static', 'extern', \<'typedef', 'register', 'auto', or empty).", /* BadAttrib */< "'main' should have no attribute.", /* BadAttribForMain */% "Bad syntax, or text too long, for " #ifdef VMS"'/def'|'/undef'"#else"-D/-U"#endif1" compiler option (\"@1\").", /* BadDOption */. "Illegal @3 d-pragma for parameter \"@1\"@0 \G(declared line @4@5@6@7@8)@0 of function \"@2\".", /* BadDPForFctPar */1 "Operator '@1': bad expression type@0 (\"@2\") \/for sink type \"@3\".", /* BadForLftType */. "Indentation inconsistent with current block\1/substatement level@0: indentation pitch (@3) x \6current level (@2) != current indentation (@1 spaces \-from beginning of line).", /* BadIndent */, "Bad indentation from line @1 to previous \line.", /* BadIndent1 *// "Bad indentation from line @1 of file \"@2\" \(to previous line.", /* BadIndent2 */1 "Bad index/addend type for array/pointer \"@1\"\1@0 (declared/defined line @4@5@6@7@8); expected \8type: \"@2\", index/addend type: \"@3\". If necessary, \3use /*~IndexType */ d-pragma in declaration/\8definition to specify index type.", /* BadIndexType */1 "Bad index type@0 (\"@2\")@0 for array/pointer \"\"@1\".", /* BadIndexType1 */= "Missing integral type; 'int' assumed.", /* BadIntgrlType */) "Header file \"@2\" should be included \%in compilation unit body@0 (because \0\"@1\" is provided by service \"@2\", and used \5services should be mentionned -at the beginning of- \3each compilation unit). If used by a header file, \1include it also in that header file. In case of \Ocomposed header file, use /*~Composing*Hdr*/ d-pragma.", /* BadlyIncldHdrFile */. "Bad type@0 (\"@2\")@0 for 'main' parameter \"\"@1\".", /* BadParForMain */, "Return type@0 \"@3\"@0 incompatible with \-function type@0 \"@2\".", /* BadRetType */> "'main' return type must be 'int'.", /* BadRetTypeForMain */> "Value of '__dcc' symbol not string literal.", /* BadUUdcc */( "Second statement included in loop or \0'if'/'else' arm? (if so, use a block, else put \Tsecond statement on next line)." /*~zif __index!=BlockQM "Misplaced 'BlockQM'" */,+ "Bound of array \"@1\" should be a named \.constant@0 (via '#define' or enum); name may \?also be used in array overflow checking.", /* BndShdBeNamed */% "Bound of array \"@1\"@0 (declared \-line @4@5@6@7@8)@0 should be of named type, \1or use /*~IndexType*/ d-pragma in declaration@0 \F(index type: \"@3\"; bound type: \"@2\").", /* BndShdBeOfNamedType *// "Boolean expected by operator '@1'@0 (type = \\"@2\").", /* BoolExptd */. "Function with /*~ResultType*/ parameter(s) \2can't be @1; @1 ignored.", /* CantBeGeneUtil */. "Adjustment file cannot change type/kind of \%identifiers.", /* CantChgMnng */3 "Cannot initialize typedef.", /* CantInitTpdf */' "'case' expected.", /* CaseExptd */+ "Non portable (check upper/lower case in \&header file name).", /* ChkUcLc */1 "@3 at end of declaration started line @4@5@6@7\.", /* CmplSColE1 */" "Header file \"@1\" cannot be a \G/*~ComposingHdr*/ of itself (via file \"@2\").", /* CmpsgHdrWithSelf */# "':' expected.", /* ColExptd */% "',' expected.", /* CommaExptd */@ "Attempt to compile a header file (\"@1\").", /* CompHdrFile */, "Operator '##' must be followed by token; \+';' token added.", /* ConcOprIlgLast *// "'const'/'volatile' mismatch in pointers for \5operator '@1'@0 (expected @4type \"@2\", expression \.@4type \"@3\").", /* ConstQalNotHeeded1 */0 "'const'/'volatile' mismatch in pointer/array \3parameters@0 (actual @1type \"@3\", formal @1type \(\"@2\").", /* ConstQalNotHeeded2 */& "Left operand of which at least one \-member is 'const'@0 (@3struct/union \"@1\", \Ddeclared/defined line @4@5@6@7@8); type = \"@2\".", /* ConstStrun */) "Operator '@1': @4operand converted to \4'unsigned' (so possible sign lost)@0; left operand \>type: \"@2\", right operand type: \"@3\".", /* ConvToUnsig */* "Operator '@1': expression converted to \2'unsigned' (so possible sign lost)@0; expression \7type: \"@3\", sink type: \"@2\".", /* ConvToUnsig1 */1/* "Do you really want to make a copy of a 'vola\8tile' variable ?@0 (variable \"@1\", type: \"@2\"); if \1so, cast it to non 'volatile'.", * CopyVolat */, "Concatenation buffer overflow (increment \6'MaxConcatLvl' constant in file \"configdc.th\", and \*recompile dcc).", /* CrtdTokTooLong */, "Constant boolean @1expression; if really \6needed, use /*~NonConstExp*/ d-pragma (after a right \%parenthesis).", /* CstBoolExp */4 "Constant expression expected.", /* CstExpExptd */1 "Constant operand should be on right side, for \?easier understandability (operator '@1').", /* CstOnLftSide */; "Constant switch driving expression.", /* CstSwitchExp */+ "Member name \"@1\" already used in same \'struct/union.", /* DblDefMember */, "Struct/union \"@1\" already defined@0 on \(line @4@5@6@7@8.", /* DblDefStrun */. "dcc cannot process macro definitions while \4collecting arguments (collecting for macro \"@1\", \2called line @4@5@6@7@8).", /* DccCantProcDef */+ "Declaration expected.", /* DeclExptd */. "'default' clause expected at end of switch \Astatement (or use /*~NoDefault*/ d-pragma).", /* DefaultExptd */1 "Attempt to substract two incompatible pointers\:@0 (left: \"@2\"; right: \"@3\").", /* DiffIncptblPtr */1 "Directive name expected.", /* DirNameExptd */1 "'.c' files should be compiled separately, not \8included..@0. (file \"@1\").", /* DontInclBodyFile */, "Specification \"@1\" tries to write into \G'const' variable@0 (variable type: \"@2\").", /* DontWriteIntoConst */2 "D-pragma name expected.", /* DPragNameExptd */. "/*~@1*/ d-pragma only authorized in header \'file; ignored.", /* DPragNotAlwd */. "The 'while' corresponding to a 'do' should \4not be lined up with it (to avoid confusion with a \6while loop). Use '{','}' ?", /* DWhileNotLinedUp */. "'#else' already seen.", /* ElseAlrdSeen *// "A function cannot be defined inside another \%function.", /* EmbdFctNotAlwd */, "Empty loop or 'if'/'else' arm; if really \6meant, replace ';' by empty block.", /* EmptyStmt */+ "Empty struct/union.", /* EmptyStrun */= "'*/' expected (end of d-pragma).", /* EndDPragLineExptd */C "Excess characters at end of line discarded.", /* EndOfLineIgnd */1 "Error directive encountered.", /* ErrorDir */- "'extern' declarations should be in header \&files.", /* ExtDeclBeInHdrFile */0 "External variable/function \"@1\" declared@0 \:line @4@5@6@7@8,@0 but not defined.", /* ExtObjNotDef */- "Extraneous '}' ignored.", /* ExtraRBra */- "Extraneous ';' at end of macro \"@1\" ?@0 \7(defined line @4@5@6@7@8).", /* ExtraSColAtEndMac */- "In header files, only attributes expected \1are 'extern' and 'typedef'.", /* ExtrnExptd */: "A function cannot be initialized.", /* FctCantBeInit */1 "Function declaration/definition illegal inside\) struct/union.", /* FctDeclNotAlwd */) "In function definition, function name \1(\"@1\") may not achieve function type via type \&identifier.", /* FctDefViaTpdf */. "Open failure (non-existant or inaccessible \'\"@1\" file).", /* FileOpenFail */? "Field not allowed outside of struct/union.", /* FldNotAlwd */. "Incorrect field size@0 (negative, zero, or \9larger than the width of an 'int').", /* FldSizIncor */. "Equality generally ill-defined on floating \8quantities (operator '@1'); if guaranteed well defined \4here, use /*~ExactCmp*/ d-pragma.", /* FltNotEq */. "Format string exhausted.", /* FmtExhstd */: "Qualifiers should be grouped together.", /* GroupQual */, "Hazardous conversion@0 (expression type: \4\"@2\"; cast type: \"@3\")@0; if really meant, use \O/*~OddCast*/ d-pragma." /*~zif __index!=HzrdConv "Misplaced 'HzrdConv'" */,* "Hazardous conversion to less qualified \-type@0 (expression type: \"@2\"; cast type: \G\"@3\")@0; if really meant, use /*~OddCast*/ d-pragma.",/* HzrdConv1 */) "Identifier expected.", /* IdExptd */6 "Identifier or ';' expected@2", /* IdOrSColExptd */C "Ignored character(s) at end of option \"@1\".",/* IgndCharsOpt */3 "Invalid array size@0 (@1).", /* IlgArraySize */< "Illegal attribute for identifier \"@1\".", /* IlgAttrib *// "Only 'static' attribute (or none) legal for \8function definition (\"@1\").", /* IlgAttribForFct */- "Invalid 'bool' type definition (should be \''unsigned int').", /* IlgBoolDef */7 "Type@0 \"@1\"@0 can't be cast.", /* IlgCastSource */B "Type@0 \"@1\"@0 is an illegal cast target.", /* IlgCastTarget */. "Type@0 \"@1\"@0 is an illegal cast target; \3use /*~CastTo*/ d-pragma.", /* IlgCastTarget1 */0 "Illegal /*~CastTo*/ d-pragma@0 (types do not \5have same representation type)@0; ignored (use real \0cast)@0 (expression type: \"@3\"; target type: \\"@2\").", /* IlgCastTo */( "Illegal character: '@1' (perhaps non-\+printing).@0 Code: 0x@2.", /* IlgChar *// "Illegal character: '$'; can be legalized in \2identifiers by using /*~DollarSign*/ d-pragma at \2beginning of compilation unit).", /* IlgCharD */0 "/*~ComposingHdr*/ d-pragma illegal in 'body' \Dfile, or for including non header file; ignored.", /* IlgCmpsgHdr */$ "File \"@1\" should not be marked \+/*~ComposingHdr*/.", /* IlgCmpsgHdr1 */< "Strange hierarchy of file inclusions.", /* IlgCmpsgHdr2 */- "Operator '##' creates invalid token `@1`. \1@2 Replaced by a ';' token.", /* IlgCrtdTok */, "/*~DccCompliant*/ d-pragma should only be\3 used in system header files.", /* IlgDccCmpl */. "Invalid directive name.", /* IlgDirName */2 "Ill used @1 d-pragma; ignored.", /* IlgDPrag */+ "Invalid escape sequence@0 (escape code: \0x@1).", /* IlgEscSeq */1 "Unknown conversion character in specification \\"@1\".", /* IlgFmtSpe *// "Identifier \"@1\" does not name variable or \+function or enum constant.", /* IlgId */3 "Illegal '#include' argument.", /* IlgInclArg */3 "Illegal in '#if' expression.", /* IlgInIfExp */' "Variable \"@1\": initialization not \1allowed (external declaration).", /* IlgInit */1 "/*~Init*/ d-pragma: nonsense use for variable \,\"@1\".", /* IlgInitBU */A "Operator '@1': illegal left type@0 (\"@2\").", /* IlgLftType */*8 "Illegal octal digit@0 (code: 0x@1).", /* IlgOctDig */; "Illegal operand for '@1'@0 (\"@2\").", /* IlgOpndType */@- "Specification \"@1\": invalid flag/length \s#modifier.", /* IlgOptForSpe */pA "Specification \"@1\": bad 'precision' field.", /* IlgPrecFld */nA "Operator '@1': illegal right type@0 (\"@2\").",/* IlgRhtType */s) "Specification \"@1\" invalid for type \/"\"@2\".", /* IlgSpeForType */$ "Illegal syntax.", /* IlgSynt */0 "'%' operator not defined on floating type@0 (\5left: \"@2\", right: \"@3\").", /* IlgTCModOpnd */,: "One of '+ - * / %' operators expected.", /* IlgTCOptr */+ "Illegal type@0: \"@1\".", /* IlgType */0 "Specification \"@1\": illegal type@0 (\"@2\")\0@0 for width/precision.", /* IlgTypeForFld */1 "Operator '@1': illegal operand types@0 (left: \+\"@2\"; right: \"@3\").", /* IlgTypes */k/ "Ill-parenthetized macro body or parameter ? \ *(operator '@1').", /* IllParenMacro */= "Declaration cannot be after statement.", /* IllPositDecl *//, "/*~Undef{Tag}*/ d-pragma to be used only \Koutside functions." /*~zif __index!=IllUndef "Misplaced 'IllUndef'" */, 1 "File \"@2\" should be included after file \"@3\fD\" (because redeclares variable/function \"@1\").", /* IncldAfter */1 "Type of parameter #@1 incoherent with function\>6 return type; @4 d-pragma ignored@0 (parameter type: \8\"@2\"; return type: \"@3\").", /* IncohResultType */1 "/*~NeverReturns*/ function \"@1\" does return \s...", /* IncorNevRet */ . "Result type for '%' should be type of left \#operand.", /* IncorTCModRes */r* "Specified result type@0 (\"@1\")@0 not \4coherent with C conversion rules@0 (operand types: \*\"@2\", \"@3\").", /* IncorTCResTyp */0 "Array \"@1\"@0 (declared line @4@5@6@7@8)@0: \0elements of incomplete/void or function type@0 \!(\"@2\").", /* IncplArray */q7 "Macro \"@1\": incomp%lete parameter.", /* IncplPar */\+ "Pointer \"@1\"@0 (declared/defined line \7@4@5@6@7@8)@0: pointed elements of incomplete/void or \ -function type@0 (\"@2\").", /* IncplPtr */o+ "Function \"@1\": incomplete or function \e/return type@0 (\"@2\").", /* IncplRetType */e/ "Operator '@3': incomplete type@0 (\"@2\")@0 \iLfor struct/union \"@1\"@0 (declared line @4@5@6@7@8).", /* IncplStrunType */) "Identifier \"@1\": incomplete/void or \\.function type@0 (\"@2\").", /* IncplType *// "Function \"@1\": attribute should be @2 (cf \e6declaration line @4@5@6@7@8).", /* IncptblAttrib */, "Function \"@1\"@0 (declared/defined line \8@4@5@6@7@8)@0: incompatible actual/formal parameters@0 \3(type of actual parameter: \"@2\"; type of formal \a*parameter: \"@3\").", /* IncptblPar *// "Operator '@1': incompatible operand types@0 \a7(left: \"@2\"; right: \"@3\").@4", /* IncptblTypes */r) "Array \"@1\"@0 (declared/defined line \n6@4@5@6@7@8)@0: index type@0 (\"@2\")@0 too small for \1boun0~DCC.BCKl"[DCC_DISTRIB.SRC]DCMSG.TXT;846tQesT'd value@0 (@3).", /* IndexTypeTooSmall */ ( "Index value (@1) greater or equal to \'bound (@2).", /* IndexValTooBig *// "Call to function \"@1\" passed as parameter \e8to macro using it several times@0: inefficient at best,\9 multiple side effects at worst.", /* IneffOrSideEff */': "; if normal, use /*~Init */ d-pragma", /* InitDP */4 "Read error (on file \"@1\").", /* InptFileErr */- "Non portable bit-field type (depending on \f8platforms, plain 'int' is interpreted either as signed \4or unsigned)@0; type = \"@1\".", /* IntBitField */: "Integral or bool type expected.", /* IntgrlTypeExptd */3 "Unsigned integer expected.", /* IntgrNbExptd */e$ "'{' expected.", /* LBraExptd */. "Operators '#' and '##' only allowed inside \4macro definition; ignored.", /* LegalOnlyInMac */- "Length of character constant not equal to \m!1.", /* LgtCharCstNotOne */ ? "To indicate header file, use 'h', not 'H'.", /* LowerCaseH */($ "'(' expected.", /* LParExptd */B "Left parenthesis should be outside macro.", /* LParOutsideMac */% "Macro \"@1\" already defined line \ :@4@5@6@7@8@9; new definition ignored.", /* MacAlrdDef */. "Macro name expected.", /* MacNameExptd */) "Modifications @3 via formal parameter \e8\"@1\"@0 (defined line @4@5@6@7@8)@0 of function \"@2\"\>@0; if normal, use /*~MayModify*/ d-pragma.", /* MayModify */; "A member cannot be initialized.", /* MemberCantBeInit */d' "Labels should be placed in front of \ "statements.", /* MisplaLbl */; "Bizarre values for pointer operands ?", /* MnlsPtrDiff */f- "External variable \"@1\" already declared \l-(on line @4@5@6@7@8) with more stringent or \"8incompatible type@0 (declaration type: \"@2\"; current \Dtype: \"@3\")@0; current declaration ignored.", /* MoreStrngType */6 "More than one attribute.", /* MoreThanOneAttrib */* "Missing 'break'? (if really meant, use \,/*~NoBreak*/ d-pragma).", /* MsngBreak */, "Operator '##' must be preceded by token; \"ignored.", /* MsngConcOpnd */, ", or missing 'const' qualifier in formal \Bparameter to which address of \"@1\" is passed", /* MsngConstQM */( "Missing '#endif'.", /* MsngEndif */% "Missing '==' ?", /* MsngEqual */ ( "Missing expression.", /* MsngExp */9 " (missing 'extern' or 'typedef' ?)", /* MsngExtTpdf */n+ "Declaration of function \"@1\": missing \y6attribute ('static' assumed).", /* MsngFctAttrib */. "Missing function name.", /* MsngFctName */@ "Missing parenthesis after function name ?", /* MsngFctParen */0 "Specification \"@1\" should indicate a width \Blimit, to prevent overflow of receiving array.", /* MsngFldWdth */0 "Specification \"@1\" should indicate a width \3limit, to prevent overflow of receiving array (if \B3overflow guaranteed not possible, use /*~SizeOK*/ \f$d-pragma).", /* MsngFldWdth1 */4 "Missing 'if' (or forgotten '}' ?).", /* MsngIF */& "Macro \"@1\": missing argument(s); \0replaced by empty one(s)@0 (macro defined line \K@4@5@6@7@8)." /*~ zif __index!=MsngMacArg "Misplaced 'MsngMacArg'" */,/ "Missing member name.", /* MsngMembName */S$ "Function \"@1\" should be marked \)/*~NeverReturns*/.", /* MsngNevRet *//> "Missing variable/function/type name.", /* MsngObjTypName */. "Variable/function \"@1\": missing 'static' \2attribute ?@0 (or, if really external, should be \7declared as 'extern' in a \"@2.h\" header file, which \*)is to be included).", /* MsngStati */eA "Missing 'struct'/'union'/'enum' keyword ?", /* MsngStrunEnum */3* "'void' should be used to specify empty \$parameter list.", /* MsngVoid */* "Name \"@1\" already in use (defined on \5line @4@5@6@7@8); redefined (if that is really what \e>was wanted, use /*~Masking*/ d-pragma).", /* NameAlrdInUse */- "Negative index value.", /* NegIndexVal *//. "No attribute allowed.", /* NoAttribAlwd */3 "No compilation unit name given.", /* NoCUName */2( "There should be no variable/function \7definition in a header file@1.", /* NoDefInHdrFile */, "No preprocessor directive allowed inside \+d-pragma; ignored.", /* NoDirInDPrag */o) "There is no \"higher\" type among the \d4/*~ResultType*/ actual parameters of this function \5call@0 (previous resultType: \"@2\", current actual \c-parameter type: \"@3\").", /* NoHghrTyp */, "Object name (\"@1\") not allowed in type \'definition.", /* NoIdAlwdInType */h* "First token of function (after opening \4brace) should be on new line, and not at beginning \Cof it, to indicate chosen indentation count.", /* NoIndentIndct */*1 "Use of d-pragmas not coherent between function\0/ \"@1\" definition and declaration@0 (on line \ 8@4@5@6@7@8)@0; declaration wins.", /* NonCoheDPInFct*/3 "Operator not commutative.", /* NonCommutOper */*/ "Meaningless cast.", /* NonNumCantBeCast */R+ "Non portable cast ?@0 (expression type: \o2\"@2\"; cast type: \"@3\"); if really meant, use \4/*~PortableQM*/ d-pragma or, if in fact guaranteed \>always portable, /*~OddCast*/ d-pragma.", /* NonPortCastQM */, "Operator '@1': non portable assignment@0 \B(expression type: \"@3\"; sink type: \"@2\").", /* NonPortCmbn *// "Operator '@1': non portable right operand@0 \r<(\"@2\")@0 for left operand@0 (\"@3\").", /* NonPortOpnd */0 "Non portable type combination@0 (could yield \'\"unsigned @1\").", /* NonPortTC */r; "Macro \"@1\" may not be undefined.", /* NonUndfnblMac */@. "Label \"@1\"@0 (defined line @4@5@6@7@8)@0 \.not visible from here.", /* NonVisiLabel */, "Operator '@1': no order relation between \6pointers on 'void' or function@0 (left type: \"@2\"; \+right type: \"@3\").", /* NoOrderRel */t) "No preceding '#if'.", /* NoPrecIf */ . "No qualifier allowed.", /* NoQualifAlwd */; "No 'return' at end of function \"@1\".", /* NoRetAtEnd */d, "Body of which function ?", /* NotAFct */) "Function '__index' used outside array \/Minitialization." /*~ zif __index!=NotArrInit "Misplaced 'NotArrInit'" */,/+ "Arrays can't be cast to integral type@0 \oB(expression type: \"@2\"; cast type: \"@3\").", /* NotArrToNum */* "Not ASCII character (may be invisible; \&code: 0x@1).", /* NotASCIIChar */. "No /*~TypeCombination*/ provided for \"@1@2\@3\".", /* NoTCAllows */- "Tag \"@1\" not defined.", /* NotDefTag *//* "Function '__extent': identifier \"@1\" \Dneither type naming an enum, nor enum tag.", /* NotEnumTypeOrTag */1 "Operator '@1': bad expression type@0 (\"@2\");\e/ expected type: \"@3\".", /* NotExptdType */r: "Local variable \"@1\" not initialized@2.", /* NotInit */1 "Local variable \"@1\" not initialized (at line\t$ @4@5@6@7@8)@2.", /* NotInit1 */+ "Not inside loop.", /* NotInsideLoop */e< "Not inside loop or switch.", /* NotInsideLoopOrSwitch *// "Not inside switch.", /* NotInsideSwitch */A "Not inside switch, or after 'default'.", /* NotInsideSwitch1 */ + "Operator '@1': @2operand do not have an \ address.", /* NotLVal */ ) "Array actual parameter do not have an \naddress.", /* NotLValP */) "Operator '#': operand must be a macro \17parameter; operator ignored.", /* NotMacParForQuo */. "Operator '@2': (left) operand 'const'@0 (@3\Cobject \"@1\", declared/defined line @4@5@6@7@8).", /* NotModfbl */t1 "Not named struct/union initializer, or literal\'/ constants inside.", /* NotNamedStrunCst */l: "Value of expression not used.", /* NotPureSideEffect */- "Value of function \"@1\" not used (if its \p0main effect is a side-effect, it can be marked \0/*~PseudoVoid*/).", /* NotPureSideEffect1 */+ "Function \"@1\": not same number of para\o1meters in declaration@0 (line @4@5@6@7@8)@0 and \iRdefinition." /*~ zif __index!=NotSameNbOfPar "Misplaced 'NotSameNbOfPar'" */,/ "Variable/function \"@1\": definition type@0 \y7(\"@2\")@0 does not match declaration type@0 (\"@3\") \Bon line @4@5@6@7@8@0; definition type ignored.", /* NotSameType */+ "Function '__member' used outside struct/\c.union initialization.", /* NotStrunInit */+ "\"@1\" is not a type.", /* NotTypeId */50 "Enum constant \"@1\" supposedly /*~NotUsed*/ \?!!", /* NotUsdEnumCst */"? "Variable \"@1\" supposedly /*~NotUsed*/ ?!!", /* NotUsdObj */*@ "Parameter \"@1\" supposedly /*~NotUsed*/ ?!!", /* NotUsdPar */5 "\"@1\" is not a (local) variable.", /* NotVarId */h8 "Invisible character (code: 0x@1).", /* NotVisiChar */. "Numeric constants (except 0, 1, -1) should \7be named@0 (via '#define' or enum constant). See also \"5/*~LiteralCst*/ d-pragma.", /* NumCstShdBeNamed */1/ "Numeric constants inside macros should also \iAbe named (or else parenthetize them).", /* NumCstShdBeNamed1 */x( "Declaration of function \"@1\": only \>attribute allowed inside block is 'extern'.", /* OnlyExtrn */= "Only attribute allowed is 'register'.", /* OnlyRegAttrib */\* "Operator '@1': @2operand value may lie \6outside range {0, 1}, so use logical operators '&&', \3'||', '!', or compare to False.", /* Outside01 */e? "Operator '@1': overflow@0 (for type \"@2\").", /* Overflow */"! "Overflow.", /* Overflow1 */t. "Operator '@1': left truncation@0 (for type \\"@2\").", /* Overflow2 */ ' "Macro \"@1\": parameter name \"@2\" \/'already used.", /* ParAlrdExist */ : "Formal parameters must be named.", /* ParMustBeNamed */= "Macro \"@1\": parameter name expected.", /* ParNameExptd */t- "Function \"@1\": name of formal parameter \'6\"@2\" does not match corresponding name in function \;declaration@0 (on line @4@5@6@7@8).", /* ParNamesNotEq */l1 "Non /*~Generic*/ nor /*~ResultType*/ parameter\*4 should not be of representation type@0 (parameter \'type: \"@2\").", /* ParRepreType */c0 "Type of formal parameter \"@1\"@0 (\"@3\")@0 \3inconsistent with function declaration@0 (\"@2\") \r6on line @4@5@6@7@8@0; ignored.", /* ParTypesNotEq *// "Cast potentially non portable@0 (expression \d6type: \"@2\"; cast type: \"@3\")@0; if really meant, \3use /*~PortableQM*/ d-pragma.", /* PortCastQM */N, "Operator '@1': overflow (underflow ?) if \-unsigned expression too large@0 (expression \e4type: \"@3\"; sink type: \"@2\").", /* PossOvfl */+ "Previous cast useless@0 (from \"@2\" to \\!\"@3\").", /* PrevCastUsl */a1 "Type \"@2\" is private: its constants/members \.3are not visible from here@0 (\"@3\", defined line \i%@4@5@6@7@8).", /* PrivNotVisi */f, "Specification \"@1\" expects a pointer@0 \/(type of argument: \"@2\").", /* PtrExptd */(- "Only pointer on function can be parameter \e8(parameter \"@1\", type \"@2\").", /* PtrOnFctExptd */ "Function \"@2\": pointer \6\"@1\"@0 (defined line @4@5@6@7@8)@0 should point on \,'const' element@3.", /* PtrShdBeConst */1 "Pointer should be cast to size_t (or unsigned \a8long(long)); else use /*~OddCast*/ d-pragma@0 (pointer \4type: \"@2\"; cast type: \"@3\").", /* PtrToNum */$ "'}' expected.", /* RBraExptd */2 "',' or '}' expected.", /* RBraOrCommaExptd */& "Cannot take address of register or \'bit-field.", /* RegAttribForAmp */c* "'register' attribute incompatible with \1'volatile' qualifier.", /* RegVolatIncptbl */r, "Functions should return information type \3(e.g. \"Position\")@0, except if /*~ResultType*/, \y,/*~Generic*/ or /*~Utility*/ d-pragma used \B(return type is representation type \"@1\").", /* ResRepreType */0 "/*~ResultPtr*/ parameter should have highest \6type among all /*~ResultType*/ parameters@0 (current \Eparameter type: \"@2\", @1 type: \"@3\").", /* ResulPtrNotHgHsTyp */'C "Attempt to return pointer on 'auto' object.", /* RetPtrOnLclAd */a$ "Missing ')'.", /* RParExptd */2 "',' or ')' expected.", /* RParOrCommaExptd */$ "Missing ']'.", /* RSBrExptd */, "Enum constant \"@1\" has same value (@2) \4that a previous one (\"@3\"); if really meant, use \//*~SameValue*/ d-pragma.", /* SameEnumCst */a- "Parameter name \"@1\" used more than once \3in this function definition.", /* SameParName */0$ "';' expected.", /* SColExptd */& "';' expected@2", /* SColExptd1 */' "Statements should be separated from \/Bdeclarations by white line(s) (or use \";;\").", /* SepDeclStmt */_ "Switch statement should control a block." /*~zif __index!=ShdBeBlk "Misplaced 'ShdBeBlk'" */,./ "This declaration of function \"@1\" should, \ 7along with an 'extern' attribute, be in a header file \")included here.", /* ShdBeInHdrFile */I= "Unparenthetized boolean expression.", /* ShdBePrntzBool */, "Argument should be array, not pointer on \6array@0 (array parameters are passed by address, not \'by value).", /* ShdntBePtrOnArr */m- "Side effect via macro parameter used more \N5than once (operator '@1').", /* SideEffInMacPar */ 5 "Only '=' operator allowed.", /* SimplAsgnExptd */.D "'sizeof' on char constant => sizeof('int') !", /* SizeofCharCst */< "'sizeof' operand is not evaluated.", /* SizeofDontEval */0 "Initialization of compound automatic objects \5should be avoided@0 (it is slow and wastes memory). \,3Object should be declared 'static'. If really not \,<appropriate, use /*~DynInit*/ d-pragma.", /* SlowingInit */* "Static function \"@1\" declared@0 line \5@4@5@6@7@8,@0 but not defined.", /* StaFctNotDef */l- "Header file should be included \r+before this line.", /* StddefNotIncl */L* "Statement expected.", /* StmtExptd */1 "String constant expected.", /* StrCstExptd */'1 "String \"@1\" too long.", /* StringTooLong */ @ "No new type may be defined here.", /* StrunEnumDeclNotAlwd */* "Internal error:: @1.", /* SysError */3 "Tag \"@1\" not visible here.", /* TagNotVisi */r( "Tag names must be preceded by 'enum'/\<'struct'/'union' to be type names@0 (\"@1\").", /* TagQM *// "Label \"@1\" is target of at least a 'goto' \nAthat can't see it (on line @4@5@6@7@8).", /* TargLabelNotVisi */"0 "/*~TypeCombination*/ \"@1@3@2\" conflicts/is \6redundant with combination defined/deduced from line \"@4@5@6@7@8.", /* TCAlrdDef */1 "/*~TypeCombination*/ d-pragma can only be used\2* outside function.", /* TCNotAtLvl0 */0 "Too many brace levels.", /* TooManyBraLvl */- "Less parameters than required by specifica\l2tion(s) in format string.", /* TooManyFmtSpe */. "Too many initializers.", /* TooManyIniz */. "Call of macro \"@1\": too many arguments@0 \3(call on line @4@5@6@7@8).", /* TooManyMacArg */e> "Macro \"@1\": more than @2 parameters.", /* TooManyMacPar */4 "Too many messages; terminated.", /* TooManyMsg */< "Too many parameters for 'main'.", /* TooManyParForMain */% "Identifier too long (more than 31 \e"characters).", /* TrnctdId */0 "Operator '@1': incompatible operands; try per\Gmuting them@0 (left type: \"@2\"; right type: \"@3\").",/* TryPermut */7 "Type name expected; 'int' assumed.", /* TypeExptd */ B "Type \"@1\" is not a parallel numeric type.", /* TypeNotParal */: "Unclosed comment somewhere before ?", /* UnclosedCmt */+ "Unclosed d-pragma ?", /* UnclosedDP */o: "Address not computable at link time.", /* UncomputAd */* "Missing tag or '{'.", /* UndefEnum */2 "Function \"@1\" undeclared.", /* UndefFctId */0 "Identifier \"@1\" undeclared.", /* UndefId */1 "Function \"@2\": label \"@1\" undefined (used \/0at least line @4@5@6@7@8).", /* UndefLabel */' "Operation '@3' attempted on pointer \t3(\"@1\"@0, declared/defined line @4@5@6@7@8@0) to \"0unsized type@0 (\"@2\").", /* UndefPtdSize */) "Operator '@1': illegal value (@2) for \ Eright operand@0 (type:\"@3\" => undefined result).", /* UndefResul */i9 "Operator '@1': unsized type (\"@2\").", /* UndefSize */*. "Undefined struct/union.", /* UndefStrun */' "Tag \"@1\" undefined (declared line \""@4@5@6@7@8).", /* UndefTag *// "Operator '@1': underflow.", /* Underflow */i, "Identifier \"@1\" not visible from here (\+marked /*~Undef*/ined).", /* UndfndId */5. "Call of macro \"@1\" (on line @4@5@6@7@8): \?unfinished argument (for parameter #@2).", /* UnFnshArgList */e6 "Unclosed character constant.", /* UnFnshCharCst */* "Unfinished comment.", /* UnFnshCmt */) "Missing '@1'.", /* UnFnshFileName */r2 "Unclosed string constant.", /* UnFnshStrCst */( "Unknown d-pragma.", /* UnknDPrag *// "Unknown identifier (\"@1\").", /* UnknId */S- "Unknown macro (\"@1\").", /* UnknMacro */o/ "Operator '@1': member \"@3\" is not part of \a,struct/union@0 \"@2\".", /* UnknMember */. "Unknown option: \"@1\".", /* UnknOption */. "Unreachable statement.", /* UnreachStmt */1 "Operator '@1': comparing expressions involving\a7 subtraction of 'unsigned' (difference never negative \"5!); rather add to other operand or, if correct, use \ 1/*~CastTo */ d-pragma.", /* UnsigDiffNotNeg */e+ "Operator '@1': unsigned value cannot be \="negative.", /* UnsigNonNeg */: "Unsuitable field type@0 (\"@1\").", /* UnsuitFldType */- "Enum constant \"@1\" not used (defined on \etline @4@5@6@7@8), or missing /*~NotUsed*/ d-pragma ?" /*~ zif __index!=UnusedEnumCst "Misplaced 'UnusedEnumCst'" */,0 "Function \"@1\" not used@0 (declared/defined \'line @4@5@6@7@8).", /* UnusedFct */a0 "Identifier \"@1\" not used (declared/defined \&line @4@5@6@7@8).", /* UnusedId */' "Label \"@1\" not used (defined line \n%@4@5@6@7@8).", /* UnusedLabel */a. "Macro parameter \"@1\" not used@0 (defined \4line @4@5@6@7@8); if appropriate, use /*~NotUsed*/ \#d-pragma.", /* UnusedMacPar */,, "Function \"@2\": (final) value of formal \4parameter \"@1\" not used, or missing /*~NotUsed*/ \Bd-pragma?@0 (parameter defined line @4@5@6@7@8).", /* UnusedPar */) "Struct/union/enum tag \"@1\" not used \i/(defined line @4@5@6@7@8).", /* UnusedTag */s$ "Type identifier \"@1\" not used (\1defined line @4@5@6@7@8).", /* UnusedTypeId */p/ "(Final) value of variable \"@1\" not used@3 \l7(variable defined line @4@5@6@7@8).", /* UnusedVar */)A "Previous value of variable \"@1\" not used@3.",/* UnusedVar1 */\/ "Created type name @0(\"@1\") @0should begin \a=with uppercase letter (e.g. Voltage).", /* UpCaseTypName */.- "/*~IndexType*/ d-pragma should be used in \?7declaration of pointer \"@1\"@0 (on line @4@5@6@7@8); \ 3index/addend type: \"@3\", but \"@2\" expected by \e'default.", /* UseIndexTypForPtr */5 " Use /*~TypeCombination*/ d-pragma ?", /* UseTC */ 1 "Meaningless attribute@0 (because no object is \Q5defined; this statement is only a struct/union/enum \n$declaration).", /* UslAttrib */1 "Useless cast@0 (expression type: \"@2\"; cast \t3type: \"@3\"); if really needed, use /*~OddCast*/ \td-pragma.", /* UslCast */. "Useless /*~CastTo*/ d-pragma@0 (expression \7type: \"@3\"; target type: \"@2\").", /* UslCastTo *//* "Useless @1 d-pragma.", /* UslDPrag */+ "Useless qualifier for function@0 (type: \" \"@1\").", /* UslFctQual */+ "Useless /*~Init*/ d-pragma for variable \ \"@1\".", /* UslInitBU */- "Useless /*~NoDefault*/ d-pragma@0 (switch \v8tests all (distinct) enum constants; if that is how it \8should be, use /*~FullEnum*/ d-pragma to check it stays\ so).", /* UslNoDefault */) "Variable \"@1\" useless (defined line \ @4@5@6@7@8).", /* UslObj */7 "Useless/incoherent type specifier.", /* UslTypSpe */8( "Function \"@1\": declaration@0 (line \8@4@5@6@7@8)@0 variadic and definition not variadic, or \$vice-versa.", /* VariNotVari *// "A 'void' specifier without modifier must be \g alone.", /* VoidNotAlone */? "Type \"void\" illegal (parameter \"@1\").", /* VoidNotAlwd */12 "Warnings already disabled.", /* WarnAlrdOff */0 "Warnings already enabled.", /* WarnAlrdOn */) "'while' expected.", /* WhileExptd */c1 "External variable/function \"@1\"@0 (declared \'7at least in header file \"@6\", line @4)@0 defined in \s2wrong compilation unit@0; should be defined in a \5compilation unit such that only one of the included \e.header files declares it.", /* WrngCUnit */+ "Switch type not 'enum', or not all enum \d>constants of type used as 'case' values.", /* WrngFullEnum */1 "External variable/function \"@1\" declared in \A4wrong header file@0 (declared in file \"@6\" (line \8@4), which is neither the header file corresponding to \3the current compilation unit (\"@2\"), nor a (non-\9header) file included in that file.", /* WrngHdrFile */g& "Wrong number (bad sign/base/suffix \!combination).", /* WrngNb */d0 "Wrong number (bad exponent).", /* WrngNb1 */, "Bad use of /*~SameValue*/ d-pragma: enum \5constant \"@1\" (@2) does not have the value of any \T4previous constant of the type.", /* WrngSameVal */. "Wrong 'sizeof' argument?@0 (argument type: \1\"@2\"; should be: \"@3\").", /* WrngSizeof */ X "'zif' not false; message: \"@1\"." /*~ zif __index!=ZifWarn "Misplaced 'ZifWarn'" */,/* End DCMSG.ENG */s*[DCC_DISTRIB.SRC]DCPRAG.C;112+,.-/( 4P-+z-"0123KPWO.56H7 S89G(HJ&/* DCPRAG.C */(/* Y.L. Noyelle, Supelec, France 1994 *//* Manages d-pragmas */#include #include #include #include "dcprag.h"#include "dcprag.ph"#include "dcblk.h"#include "dcdecl.h"#include "dcdir.h"#include "dcexp.h"#include "dcext.h"#include "dcmain.h"#include "dcrec.h"#include "dcrec.ph"#include "dcrecdir.ph" #ifdef VMS8# pragma noinline (checkEndDP, procPrivTo, skipToEndDP)#endif DefIsSameNamestruct _TCBlk {% const TsemanElt *lTypeId, *rTypeId; TpcTypeElt resulType; TlineNb defLineNb; Tstring defFileName; TCBlk *next;};struct _TmngtPriv { TmngtPriv *prec;B const Tchar fileName[1]; /* stub for name, so must be at end */};9/*~zif Offset(TmngtPriv, fileName) != sizeof(TmngtPriv)-14 "Field 'fileName' not at end of struct" *//* Function profiles */4static TCBlk *allocTCBlk(void), *freeTCBlk(TCBlk *);1static bool getTypeIdent(TpcTypeElt *gottenType);*static TtypeSort intPromotion(TpcTypeElt);Ostatic void addTCB(TkOpTC, TpcTypeElt, TpcTypeElt, TpcTypeElt), checkEndDP(voidM ), initWarnMngt(void), manageTC(TkOpTC, TpcTypeElt, TpcTypeElt, TpcTypeElt,N bool), procPrivTo(void), skipToEndDP(void), verifyTC(TpcTypeElt, TpcTypeElt, TpcTypeElt);/* Global variables */Istatic const Ttok zCommaEndDP[] = {NoSwallowTok, COMMA, ENDDPRAG, ENDDIR, EndSTok};/* External variables */7uint ctrTCB = 0; /* count of TypeCombination blocks */bool noWarn = False;LTCBlk *(*pHeadTCBLists)[ModAsgn - AddAsgn + 1 /*~IndexType TkOpTC*/] = NULL;typedef enum {CastTo, DccCompl,#ifdef TstAdjFiles EndAdj, EndSys,#endif! IndexType, Init, NoDefault," NoWarn, PopWarn, PrivTo, Public,#ifdef TstAdjFiles SimAdj, SimSys,#endif" TypeCmbn, Undef, UndfTag, WWarn, Zif} TidDP;Jstatic const struct _descPrag {Tname pragName; ThCode hCode;} tabDPrag[] = /* Token-like */5 {{ConvTname("\xA\0BackBranch"), 0x257CA39},8 {ConvTname("\xC\0ComposingHdr"), 0x4718E851},5 {ConvTname("\xA\0DollarSign"), 0x2F2FBD1},1 {ConvTname("\x7\0DynInit"), 0x67C28},3 {ConvTname("\x8\0ExactCmp"), 0x20F2ED},3 {ConvTname("\x8\0FullEnum"), 0x21F8FC},1 {ConvTname("\x7\0Generic"), 0x64A30},5 {ConvTname("\xA\0LiteralCst"), 0x3C62E49},3 {ConvTname("\x8\0LocalAdr"), 0x27351A},1 {ConvTname("\x7\0Masking"), 0x795F1},3 {ConvTname("\x9\0MayModify"), 0xBDF8C6},8 {ConvTname("\xC\0NeverReturns"), 0x621221EB},1 {ConvTname("\x7\0NoBreak"), 0x817AF},7 {ConvTname("\xB\0NonConstExp"), 0x1476A396},1 {ConvTname("\x7\0NotUsed"), 0x8794B},1 {ConvTname("\x7\0OddCast"), 0x7FEC7},5 {ConvTname("\xA\0PortableQM"), 0x4618D4B},5 {ConvTname("\xA\0PseudoVoid"), 0x46A6080},3 {ConvTname("\x9\0ResultPtr"), 0xE0BA94},5 {ConvTname("\xA\0ResultType"), 0x463A773},3 {ConvTname("\x8\0RootType"), 0x2F194E},3 {ConvTname("\x9\0SameValue"), 0xDF8C02},8 {ConvTname("\xC\0SideEffectOK"), 0x70AFBE08},8 {ConvTname("\xC\0SizeOfMemBlk"), 0x734A69AC},0 {ConvTname("\x6\0SizeOK"), 0x1E375},1 {ConvTname("\x7\0Utility"), 0xA4E6B},7 {ConvTname("\xB\0VoidToOther"), 0x191BE16A},L /*~ zif __index != EndDPragTok - BegDPragTok "Bad 'tabDPrag'1" */+ /* Non-token, or token with argument */0 {ConvTname("\x6\0CastTo"), 0x10AE0},8 {ConvTname("\xC\0DccCompliant"), 0x40F23DAD},#ifdef TstAdjFiles5 {ConvTname("\xA\0EndAdjFile"), 0x2F8826E},5 {ConvTname("\xA\0EndSysFile"), 0x2FDE362},#endif3 {ConvTname("\x9\0IndexType"), 0xB18D4D},, {ConvTname("\x4\0Init"), 0xEA6},3 {ConvTname("\x9\0NoDefault"), 0xCA3005},0 {ConvTname("\x6\0NoWarn"), 0x1A733},1 {ConvTname("\x7\0PopWarn"), 0x8E91C},3 {ConvTname("\x9\0PrivateTo"), 0xE1DE0D},0 {ConvTname("\x6\0Public"), 0x1D18F},#ifdef TstAdjFiles5 {ConvTname("\xA\0SimAdjFile"), 0x486AB24},5 {ConvTname("\xA\0SimSysFile"), 0x48C0C18},#endif; {ConvTname("\xF\0TypeCombination"), 0xAC6C71FA},. {ConvTname("\x5\0Undef"), 0x65EB},3 {ConvTname("\x8\0UndefTag"), 0x31C772},- {ConvTname("\x4\0Warn"), 0x145E},* {ConvTname("\x3\0zif"), 0x6FA}I /*~ zif __index != EndDPragTok - BegDPragTok + __extent(TidDP) "Bad 'tabDPrag'2" */};void dpragMet(void){9 int savOldSpCnt = oldSpaceCount, savSpCnt = spaceCount; TvalTok resulTok; dpragNst++;K if (--getTokLvl==0 && listTok) {curTok.tok = DPPREFIX; storeTokSource();} GetNxtTok(); if (curTok.tok != IDENT) {6 if (curTok.tok != ENDDPRAG) err0(DPragNameExptd);} else {# const struct _descPrag *ptrTDP;J for (ptrTDP = &tabDPrag[0]; ptrTDP <= AdLastElt(tabDPrag); ptrTDP++) {O if (isSameName(curTok.hCod, curTok.name, ptrTDP->hCode, ptrTDP->pragName)- ) { /* found correct d-pragma */I if (ptrTDP < &tabDPrag[EndDPragTok - BegDPragTok]) { /* d-pragma coded as token. */ GetNxtTok();D resulTok.tok = BegDPragTok + (int)(ptrTDP - &tabDPrag[0]); goto okL;}J curTok.val = (uint)(ptrTDP - &tabDPrag[EndDPragTok -BegDPragTok]);! resulTok = manageDPrag(); goto okL1;}} err0(UnknDPrag);} skipToEndDP(); resulTok.tok = WHITESPACE;okL: checkEndDP();okL1: curTok = resulTok;K oldSpaceCount = savOldSpCnt; spaceCount = savSpCnt; getTokLvl++; /* back to previous state. */ return;}Gstatic bool lastIsPopWarnAtMainLvl = True; /* True because of possible option '-zwa'. */static uint warnStk = 0;static void initWarnMngt(void){ lastIsPopWarnAtMainLvl = True; warnStk = 0;}TvalTok manageDPrag(void){ TvalTok resulTok;? if (! macroExpand) { /* do not heed d-pragma if inside macroI definition, macro arguments collection, or conditional skipping. */ resulTok.tok = DPRAG; ! resulTok.val = curTok.val;}  else {! TidDP dp = (TidDP)curTok.val; resulTok.tok = WHITESPACE; switch (dp) {" case CastTo: case IndexType: GetNxtTok();% resulTok.dpType = declType();: resulTok.tok = (dp == CastTo)? CASTTO : INDEXTYPE; goto exitL; case DccCompl:2 if (!sysHdrFile) err0(IlgDccCmpl | Warn1);0 else sysHdrFile = sysAdjHdrFile = False; break;#ifdef TstAdjFilesI case EndAdj: adjustFile = False; sysAdjHdrFile = sysHdrFile; break;I case EndSys: sysHdrFile = False; sysAdjHdrFile = adjustFile; break;#endif case Init: do { TsemanElt *ptrId; GetNxtTok();1 if (curTok.tok != IDENT) err0(IdExptd); else {M if ((ptrId = curTok.ptrSem) == NULL) errWN(UndefId, curTok.name);P else if (ptrId->kind!=Obj || ptrId->attribbattribb!=- StatiL) errWN(NotVarId, curTok.name);N else if (ptrId->initBefUsd || ptrId->initlz || ptrId->used) errWN(- UslInitBU|Warn1|Rdbl, ptrId->nameb);4 else if (adjMacro) ptrId->initlz = True;* else ptrId->initBefUsd = True; GetNxtTok();}& } while (curTok.tok == COMMA); goto exitL;$ /* case IndexType : see CastTo */4 case NoDefault: resulTok.tok = DEFAULT; break; /* case NoWarn: see WWarn */ case PopWarn: noWarn = warnStk & 1; warnStk >>= 1;N if (! (ReallyInsideMacro || insideInclude())) lastIsPopWarnAtMainLvl = True; break; case PrivTo:C if (! headerFile) errWS(DPragNotAlwd | Warn2, "PrivateTo");N headListPrivTo = NULL; /* do not free preceding list, which is proba-4 bly refered to by 'listAlwdFiles' members. */ procPrivTo(); goto exitL; case Public:@ if (! headerFile) errWS(DPragNotAlwd | Warn2, "Public"); headListPrivTo = NULL; break;#ifdef TstAdjFiles< case SimAdj: sysAdjHdrFile = adjustFile = True; break;< case SimSys: sysAdjHdrFile = sysHdrFile = True; break;#endif case TypeCmbn:, if (nestLvl != 0) err0(TCNotAtLvl0); do {  bool commut = True; TkOpTC oper;( TpcTypeElt lTyp, rTyp, resTyp; $ if (getTypeIdent(&lTyp)) {$ if (curTok.tok==TILDE) { commut = False; GetNxtTok();}( oper = (curTok.tok == ADDOP)6 ? AddTC + ((TkAdd)curTok.val - Add)) : (curTok.tok == STAR) ? MulTC, : (curTok.tok == MULOP): ? MulTC + ((TkMul)curTok.val - Mul)4 : (err0(IlgTCOptr), IlgTcOp); if (oper >= AddTC) {2 if (! (oper==AddTC || oper==MulTC)) 3 if (! commut) err0(NonCommutOper);$ else commut = False;( if (getTypeIdent(&rTyp)) {: if (curTok.tok != ARROW) err0(ArrowExptd); else {. if (getTypeIdent(&resTyp)) {? manageTC(oper, lTyp, rTyp, resTyp, commut);E if (curTok.tok == COMMA || curTok.tok == ENDDPRAG ) continue;}}}}} skipTok(zCom1~DCC.BCK"[DCC_DISTRIB.SRC]DCPRAG.C;112P-+maEndDP);& } while (curTok.tok == COMMA); goto exitL; case Undef : case UndfTag:) if (nestLvl != 0) err0(IllUndef); do { TsemanElt *pId;" if (NxtTok() != IDENT) { err0(IdExptd);" skipTok(zCommaEndDP);} else { if (nestLvl == 0) {" if (dp == UndfTag) {A *(TnameNC /*~OddCast*/)(curTok.name + DispNSId) = (TnameAtom)TagSpace;1 pId = searchSymTab(curTok.name);} else$ pId = curTok.ptrSem;: if (pId == NULL) errWN(UnknId, curTok.name);J else if (pId->undef && dp==UndfTag) errWN(AlrdUndef | Warn2, curTok.name);& else pId->undef = True;} GetNxtTok();}& } while (curTok.tok == COMMA); goto exitL; case WWarn: case NoWarn:, warnStk = warnStk<<1 | (uint)noWarn; noWarn = (dp == NoWarn);7 if (! (ReallyInsideMacro || insideInclude())) {I if (!lastIsPopWarnAtMainLvl && !((warnStk & 1) ^ noWarn)) err0(4 (noWarn)? WarnAlrdOff|Warn2 : WarnAlrdOn|Warn2);* lastIsPopWarnAtMainLvl = False;} break; case Zif: {5 TresulExp saveCExp = cExp, saveLExp = lExp;E bool trueZif, saveZifExp = zifExp, saveIfDirExp = ifDirExp; TlitString str; zifExp = True; ifDirExp = False; GetNxtTok();J trueZif = correctExprN(NULL, Bool, True, "zif", False) && !cExp. errEvl && cExp.uVal!=0;8 if ((str = getLitString())!=NULL && trueZif) {! Tchar *ptrZifMsg, *w;7 MyAlloc(w = ptrZifMsg, initGetStrLit(str));: while ((*w++ = getNxtStrLitChar()) != '\0') {}. errWS(ZifWarn | Warn3, ptrZifMsg); free(ptrZifMsg);}7 exitBlock(); /* because of getLitString() */ zifExp = saveZifExp;" ifDirExp = saveIfDirExp;, cExp = saveCExp; lExp = saveLExp;} goto exitL; }4 GetNxtTok(); /* here for good error position */exitL: checkEndDP();M resulTok.hCod = 0;} /* to differentiate d-pragma tokens from keywords */ return resulTok;}*/*~Undef lastIsPopWarnAtMainLvl,warnStk */P/******************************************************************************/P/* UTILITIES */P/******************************************************************************/Lstatic void addTCB(TkOpTC op, TpcTypeElt lType, TpcTypeElt rType, TpcTypeElt resType){ TCBlk *pcTCB, *prec = NULL;3 register const TsemanElt *lTypId = lType->typeId; if (pHeadTCBLists == NULL) {J /* Allocate and initialize table of TypeCombinations for each operator (Add -> Mod). */ TCBlk **ptr;3 MyAlloc(pHeadTCBLists, sizeof(*pHeadTCBLists));J for (ptr = &(*pHeadTCBLists)[AddTC]; ptr <= &(*pHeadTCBLists)[ModTC];) *ptr++ = NULL;}J for (pcTCB = (*pHeadTCBLists)[op]; pcTCB != NULL; pcTCB = pcTCB->next) {B if (pcTCB->lTypeId==lTypId && pcTCB->rTypeId==rType->typeId) {' static Tchar tCOperRepre[] = " ";#include "dctxttok.h"8 tCOperRepre[0] = txtAsgnTok[AddAsgn + (int)op][0];I errWFName(TCAlrdDef, pcTCB->defLineNb, pcTCB->defFileName, lTypId->; nameb, nameToS(rType->typeId->nameb), tCOperRepre); longjmp(*curErrRet, 1);} prec = pcTCB;} { TCBlk *w = allocTCBlk(); w->next = NULL; w->lTypeId = lTypId; w->rTypeId = rType->typeId; w->resulType = resType; w->defLineNb = lineNb;! w->defFileName = curFileName;/ if (prec == NULL) (*pHeadTCBLists)[op] = w; else prec->next = w;}}0static AllocXElt(allocTCBlk, TCBlk *, ctrTCB, ;)static void checkEndDP(void){ if (curTok.tok != ENDDPRAG) { err0(EndDPragLineExptd); skipToEndDP();}I dpragNst--; /* reset here only so that ERror->WArning inside d-pragma, I even if look-ahead (e.g. in call to declType() in __sameType() ). */}Tstring dpName(Ttok pragNb){B static Tstring listStrings[] = {DPragPrefix, NULL, DPragSuffix};N Tstring *w, *limW = &listStrings[(pragNb == DPRAG)? NbElt(listStrings) - 1 : NbElt(listStrings)];) register Tchar *ptrBuf = &tokTxtBuf[0];F listStrings[1] = (Tstring)(tabDPrag[(pragNb == DPRAG)? (curTok.val +H (EndDPragTok - BegDPragTok)) : (uint)(pragNb - BegDPragTok)].pragName + LgtHdrId);* for (w = &listStrings[0]; w != limW; ) { register Tstring w1 = *w++;+ while (*w1 != '\0') *ptrBuf++ = *w1++;} *ptrBuf = '\0'; return &tokTxtBuf[0];}5static FreeXElt(freeTCBlk, TCBlk *, ctrTCB, ; , next)void freeTCB(void){ if (pHeadTCBLists != NULL) { TCBlk **ptrInArr;L for (ptrInArr = &(*pHeadTCBLists)[AddTC]; ptrInArr <= &(*pHeadTCBLists)[ ModTC]; ) {" TCBlk *curTCB = *ptrInArr++;9 while (curTCB != NULL) curTCB = freeTCBlk(curTCB);} free(pHeadTCBLists); pHeadTCBLists = NULL;}}0static bool getTypeIdent(TpcTypeElt *gottenType){ bool resul = False; TsemanElt *ptrId;  GetNxtTok(); if (curTok.tok == IDENT) {* if ((ptrId = curTok.ptrSem) == NULL) {1 DefSem1(artifDef, Type, True, True, False); " errWN(UndefId, curTok.name); (void)defineId(artifDef); *gottenType = NULL; resul = True;}# else if (ptrId->kind == Type) {M *gottenType = (ptrId->namedType!=NULL && (!IsTypeSort(ptrId->namedType,A NumEnum) || !ptrId->namedType->paralTyp))? (errWT(TypeNotParal,4 ptrId->namedType), NULL) : ptrId->namedType; resul = True;}' else errWN(NotTypeId, curTok.name); GetNxtTok();} else err0(IdExptd); return resul;}void initPrag(void){ initWarnMngt();}+static TtypeSort intPromotion(TpcTypeElt x){ TtypeSort ts = x->typeSort; if (ts == Enum) return Int; if (ts < Int)#if USHRT_MAXC == UINT_MAXCB if (chkPortbl && ts==UShort) errWS(NonPortTC | Warn2, IntStr);#endif return Int; return ts;}<bool isFNameVisible(Tstring fileName, const TsemanElt *pTag){4 register const TmngtPriv *w = pTag->listAlwdFiles; fileName = skipPath(fileName); do {7 if (strJokerEq(w->fileName, fileName)) return True;" } while ((w = w->prec) != NULL); return False;}Estatic void manageTC(TkOpTC oper, TpcTypeElt lType, TpcTypeElt rType,& TpcTypeElt resType, bool commut){P" jmp_buf localJmpBuf, *savErrRet;P if (nestLvl!=0 || lType==NULL || rType==NULL) return; /* ignore combination */ if (resType != NULL) {$ verifyTC(lType, rType, resType); if (oper == ModTC) {N if (IsTypeSort(resType, Flt)) errWSTT(IlgTCModOpnd, NULL, lType, rType);D if (lType != resType) err0(IncorTCModRes | Warn2 | PossErr);}}% if (lType == rType) commut = False;a savErrRet = curErrRet;) curErrRet = &localJmpBuf /*~LocalAdr*/;m if (setjmp(*curErrRet) == 0) {( addTCB(oper, lType, rType, resType);4 if (commut) addTCB(oper, rType, lType, resType); if (resType != NULL) switch (oper) {  case AddTC:;E if (resType == lType) addTCB(SubTC, lType, rType, resType);; /* 'generic' type */m break; case MulTC:F/ addTCB(DivTC, resType, lType, rType);nI if (IsTypeSort(resType, WhoEnum)) addTCB(ModTC, resType, lType,t resType); if (commut) {t1 addTCB(DivTC, resType, rType, lType);iK if (IsTypeSort(resType, WhoEnum)) addTCB(ModTC, resType, rType,i resType);} break; case DivTC:pO if (IsTypeSort(resType, WhoEnum)) addTCB(ModTC, lType, rType, lType);e break; /*~NoDefault*/}} curErrRet = savErrRet;}nstatic void procPrivTo(void){R GetNxtTok(); do { TlitString str;E5 if ((str = getLitString())!=NULL && headerFile) {o register Tchar *pc;n Tstring sp;l TmngtPriv *w;oC MyAlloc(w, initGetStrLit(str) + Offset(TmngtPriv, fileName));t1 pc = (Tchar * /*~OddCast*/)&w->fileName[0];SI while ((*pc++ = getNxtStrLitChar()) != '\0') {}; /* note indicated, file name. */" /* Suppress possible path */< if ((sp = skipPath(w->fileName)) != &w->fileName[0]) {$ size_t lgt = strlen(sp) + 1; @ memmove((Tchar * /*~OddCast*/)&w->fileName[0], sp, lgt);; w = realloc(w, lgt + Offset(TmngtPriv, fileName));}m w->prec = headListPrivTo;1 headListPrivTo = w;}1 exitBlock(); /* because of getLitString() */m } while (Found(COMMA));}}static void skipToEndDP(void)C{)L static const Ttok zEndDPrag[] = {NoSwallowTok, ENDDPRAG, ENDDIR, EndSTok}; skipTok(zEndDPrag);iI if (curTok.tok == ENDDIR) {dirLineFl = True; backUp();} /* to get back  ENDDIR as next token. */r} TpcTypeElt searchTC(TkOpTC oper)F/* Returns usually QuasiNULLval(TpcTypeElt) if no combination found */{F TpcTypeElt lType, rType;( register TsemanElt *lTypeId, *rTypeId;, TCBlk *ptrTCoper = (*pHeadTCBLists)[oper];I if (ptrTCoper==NULL || (lType = lExp.type)==NULL || !lType->paralTyp ||nP cExp.type==NULL || !cExp.type->paralTyp) return QuasiNULLval(TpcTypeElt);O /* Prepare to row up hierarchy, in order to find possible combination between( ancestors. */ do { lTypeId = lType->typeId; rType = cExp.type; do {( register TCBlk *pcTCB = ptrTCoper; rTypeId = rType->typeId; do {F if (lTypeId==pcTCB->lTypeId && rTypeId==pcTCB->rTypeId) return pcTCB->resulType;f. } while ((pcTCB = pcTCB->next) != NULL);H } while (!rType->rootTyp && (rType = rTypeId->type)!=NULL && rType-> paralTyp);P } while (!lType->rootTyp && (lType = lTypeId->type)!=NULL && lType->paralTyp);+ if (InsideInterval(oper, MulTC, DivTC) &&DN /* Search whether one operand appears in a type combination involving opera-K tor '*' ('normal' type combination for non dimensionless type). If so,nB complain about missing typeCombination (cf Volt*Volt/Ohm). */A ((ptrTCoper = (*pHeadTCBLists)[MulTC])!=NULL || (ptrTCoperm- = (*pHeadTCBLists)[DivTC])!=NULL)) {  lType = lExp.type; do {' TsemanElt *typId = lType->typeId;4( register TCBlk *pcTCB = ptrTCoper; do {3 if (typId==pcTCB->lTypeId) goto noTCFoundL;). } while ((pcTCB = pcTCB->next) != NULL);N } while (!lType->rootTyp && (lType = lType->typeId->type)!=NULL && lType-> paralTyp); rType = cExp.type;5 if (rType != lExp.type) { /* test to speed up */x do {) TsemanElt *typId = rType->typeId;x* register TCBlk *pcTCB = ptrTCoper; do {5 if (typId==pcTCB->rTypeId) goto noTCFoundL;"0 } while ((pcTCB = pcTCB->next) != NULL);H } while (!rType->rootTyp && (rType = rType->typeId->type)!=NULL && rType->paralTyp);}}}" return QuasiNULLval(TpcTypeElt); noTCFoundL:D {o TnameBuf buf;! static Tchar operBuf[] = " ";. bufNameToS(cExp.type->typeId->nameb, buf); operBuf[0] = paramTxt[0];uI errWNSS(NoTCAllows | Warn1, lExp.type->typeId->nameb, operBuf, buf);}o return NULL;}PLstatic void verifyTC(TpcTypeElt lType, TpcTypeElt rType, TpcTypeElt resType){uI TtypeSort tsl = intPromotion(lType), tsr = intPromotion(rType), tsRes =e intPromotion(resType);D #if UINT_MAXC == ULONG_MAXCl: if (tsl#include #include "dcrec.h"#include "dcrec.ph"#include "dcblk.h"#include "dcblk.ph"#include "dcdecl.h"#include "dcdir.ph"#include "dcexp.h"#include "dcext.h"#include "dcmain.h"#include "dcmain.ph"#include "dcprag.ph"#include "dcrecdir.ph" #ifdef VMSF# pragma noinline (putTokChar, semanErrNb, storeTokSource, syntErrNb)#endif#define Base8 8#define Base16 16#define BitsOctDigit 3B#define ComputeHCode(x) hCode = hCode*HCodeCst + (ThCode)(x - Aln)#define DfltOptVal -1&#define DoWhatForNb(x) { \@ curTok.val = 0; /* reset flags for analNumCst() */ \ frstChOfNb = x; \ curTok.tok = CSTNU;}E#define HCodeCst 5 /* changing this constant (that must stay odd forB good scrambling) means changing all hardwired Hcodes... *//#define LexErr(x, y) srcPtr = ptrS, errWS(x, y)=#define LexErrPhase4(x, y) {if (! condDirSkip) LexErr(x, y);}#define LgtD(x) (size_t)*x #define LimChar (1< */ (TcodChar)QMARK, /* ? */ IlgCharFct, /* @ */ Uletter+0, /* A */ Uletter+1, Uletter+2, Uletter+3, Uletter+4, Uletter+5, Uletter+6, Uletter+7, Uletter+8, Uletter+9, Uletter+10, Uletter+11, Uletter+12, Uletter+13, Uletter+14, Uletter+15, Uletter+16, Uletter+17, Uletter+18, Uletter+19, Uletter+20, Uletter+21, Uletter+22, Uletter+23, Uletter+24, Uletter+25, /* Z */ (TcodChar)LSBR, /* [ */ IlgCharFct, /* \ */ (TcodChar)RSBR, /* ] */ UpArrowFct, /* ^ */ Lletter+26, /* _ */ IlgCharFct, /* ` */ Lletter+0, /* a */ Lletter+1, Lletter+2, Lletter+3, Lletter+4, Lletter+5, Lletter+6, Lletter+7, Lletter+8, Lletter+9, Lletter+10, Lletter+11, Lletter+12, Lletter+13, Lletter+14, Lletter+15, Lletter+16, Lletter+17, Lletter+18, Lletter+19, Lletter+20, Lletter+21, Lletter+22, Lletter+23, Lletter+24, Lletter+25, /* z */ (TcodChar)LBRA, /* { */ VBarFct, /* | */ (TcodChar)RBRA, /* } */ (TcodChar)TILDE, /* ~ */ IlgCharFct,}; /* DEL */O/*~ zif NbEltGen(charInfo, '\0')!=LimChar "Array 'charInfo': incorrect size" */void getTokFromTxt(void)/* Gets next token */{> register char *ptrS; /* local fast copy of source pointer */1 register char c; /* current source character */7 register TcodChar cI; /* info on current character */@ static TspeTokRecFct *const tabTokFct[/*~IndexType int */] = {J &ilgCharF, &endPrgF, &nlF, &ersF, &dollF, &dotF, &dQuoteF, &eMarkF,J &eqF, &greaTF, &lessTF, &minusF, &nbSignF, &percentF, &plusF, "eF,( &slashF, &starF, &upArrowF, &vBarF};N /*~ zif NbElt(tabTokFct) != EndFct - BegFct "Array 'tabTokFct': bad size" */J getTokLvl++; /* to be able to detect calls at level 0 ('real' calls) */I spaceCount = SpaceCntNoBegLine; /* a priori, no line beginning seen */C for (;;) { /* because of WHITESPACE and false #if/#elif/#else */ ptrS = srcPtr;/ /* Put info on next non-blank char in cI */ for (;;) { NxtChC if ((ubyte)c >= LimChar) LexErr(NotASCIIChar, charToHexS(c));8 else if ((cI = charInfo[c]) != WhiteSpace) break;}3 if (cI < Aln) { /* not an alphanumeric char */? if (cI < (TcodChar)ETok1Char) { /* direct token number */ curTok.tok = (Ttok) cI; srcPtr = ptrS; goto exitL;}: /* Else there is a specific function to be called */% (*tabTokFct[cI- BegFct])(ptrS);G if (curTok.tok == WHITESPACE) continue; /* happens in particular after 'newline' seen. */* if (curTok.tok == DOLLVAL) goto idL; goto exitL;}$ if (cI < Uletter) { /* number */ DoWhatForNb(c) srcPtr = ptrS; goto exitL;}! /* Else identifier/keyword */idL: {J register char *adBegId = ptrS - 1; /* address of first character of/ current identifier; identifiers are managed1 so that their name is always in one piece. */4 int lgtId; /* length of current identifier */P ThCode hCode; /* h-code for current identifier (in 'Object' nameSpace) */J register TdescrId *pCurId; /* position of identifier description in symbol table. */ RestoSmshCh;@ hCode = (ThCode)ObjectSpace*HCodeCst + (ThCode)(cI - Aln);* for (;;) { /* collect identifier */3 if ((ubyte)(c = *ptrS++) >= LimChar) break;C if ((cI = charInfo[c])>=Aln || (c=='$' && (sysAdjHdrFile || dollAlwdInId))) { ComputeHCode(cI); continue;}- /* Next character not alphanumeric */H if (c=='\\' && splice(ptrS)) {ptrS--; continue;} /* splicing */I if (c!=EndCh || ptrS!=posEndChP1) break; /* end of identifier */M /* End of source buffer hit: load some more text and, if appropriate,L copy already seen portion of identifier into fore buffer, so that1 identifier string always contiguous. */P lgtId = (int)(ptrS - adBegId) - 1; /* length of already seen portion */M if ((ptrS = nxtChunkOfTxt(ptrS))==begSBuf) { /* next chunk of source- text loaded at beginning of buffer. */J if (lgtId > MaxLgtId) lgtId = MaxLgtId; /* *doIt* if (adBegId SLI? */G adBegId = memmove(begSBuf - lgtId, adBegId, (size_t)lgtId);}} BackUp; srcPtr = ptrS;< lgtId = (int)(ptrS - adBegId); /* identifier length */F smshCh[1] = *--adBegId; /* save character about to be smashed */N *adBegId = (char) ObjectSpace; /* qualify the name by the name space */ smshCh[0] = *--adBegId;A adSmshCh = adBegId; /* note that characters are smashed */J curTok.name = ConvTname(adBegId); /* remember address of identifierB nameString (used also for directive keywords, such as '#if'). */G if (lgtId > MaxLgtId) { /* truncate identifier if exceed storage capacity. */0 *(TnameNC)adBegId = (TnameAtom)MaxLgtId;O hCode = hCodFct(ConvTname(adBegId));} /* recompute H-code, taking only& kept character into account. */O else *(TnameNC)adBegId = (TnameAtom)lgtId; /* store identifier length in front of its name. */M curTok.hCod = hCode; /* must be defined even for keywords, in order to- differentiate them from d-pragmas. */< /* Search identifier in symbol table (Object Space) */1 SearchSym(ConvTname(adBegId), MacroVisible) curTok.tok = IDENT;@ if ((pDescCurId = pCurId) == NULL) { /* new identifier */L if (lgtId>SignifLgtId && chkPortbl) err0(TrnctdId | Warn2); /* warn once. */ curTok.ptrSem = NULL;}> else if (pCurId->nstLvl < 0) { /* keyword or macro */5 if (pCurId->nstLvl + 1 == 0) { /* keyword */% curTok.tok = pCurId->noLex; goto exitL;}P else if (macroExpand) {expandMac(); if (curTok.tok!= IDENT) goto exitL;}I else curTok.ptrSem = NULL;} /* if inside argument collection for4 macros, do as if identifier undefined. */G else curTok.ptrSem = pCurId->pIdSeman; /* 'regular' (and already existing) identifier. */M if (curTok.ptrSem!=NULL && curTok.ptrSem->undef && getTokLvl==1) errWN(- UndfndId|Warn1|Rdbl, curTok.name);}exitL: if (! condDirSkip) {M if (--getTokLvl==0 && listTok) storeTokSource(); /* only keep token inB "last tokens list" if 'real' (level 0) call to GetNxtTok. */ return;}1 if (InsideInterval(curTok.tok, CSTNU, CSTST))6 if (curTok.tok - CSTNU == 0) analNumCst(NoConv);4 else analStrCst(NoConv);} /* end "for(;;)" */}(static void ampersF(register char *ptrS){ register char c; NxtCh& if (c == '&') {curTok.tok = LOGAND;}G else if (c == '=') {curTok.val = (uint)AndAsgn; curTok.tok = ASGNOP;}% else {BackUp; curTok.tok = APSAND;} srcPtr = ptrS;}&static void dollF(register char *ptrS){8 if (! (sysAdjHdrFile || dollAlwdInId)) ilgCharF(ptrS); else curTok.tok = DOLLVAL;}%static void dotF(register char *ptrS){ register char c; NxtCh if (c == '.') { NxtCh% if (c == '.') curTok.tok = ELLIP;< else {BackUp; LexErr(IlgSynt, NULL); curTok.tok = DOT;}} else { BackUp;M if (InsideInterval(charInfo[c], Aln, Aln + ('9' - '0'))) DoWhatForNb('.') else curTok.tok = DOT;} srcPtr = ptrS;}static void dQuoteF(char *ptrS){ curTok.tok = CSTST; srcPtr = ptrS;}'static void eMarkF(register char *ptrS){ register char c; NxtCh> if (c == '=') {curTok.val = (uint)NE; curTok.tok = EQUALOP;}$ else {BackUp; curTok.tok = EMARK;} srcPtr = ptrS;}$static void eqF(register char *ptrS){ register char c; NxtCh> if (c == '=') {curTok.val = (uint)EQ; curTok.tok = EQUALOP;}C else {BackUp; curTok.val = (uint)SimplAsgn; curTok.tok = ASGNOP;} srcPtr = ptrS;}'static void greaTF(register char *ptrS){ register char c; NxtCh> if (c == '=') {curTok.val = (uint)GE; curTok.tok = ORDEROP;} else if (c == '>') { NxtChD if (c == '=') {curTok.val = (uint)RShAsgn; curTok.tok = ASGNOP;}A else {BackUp; curTok.val = (uint)RSh; curTok.tok = SHIFTOP;}}= else {BackUp; curTok.val = (uint)GT; curTok.tok = ORDEROP;} srcPtr = ptrS;}"void ilgCharF(register char *ptrS){ static Tchar errCh[] = " "; srcPtr = ptrS; errCh[0] = (Tchar)*(ptrS - 1);H errWSS((errCh[0] == '$')? IlgCharD : IlgChar, errCh, charToHexS((char) errCh[0])); curTok.tok = WHITESPACE;}'static void lessTF(register char *ptrS){ register char c; NxtCh> if (c == '=') {curTok.val = (uint)LE; curTok.tok = ORDEROP;} else if (c == '<') { NxtChD if (c == '=') {curTok.val = (uint)LShAsgn; curTok.tok = ASGNOP;}A else {BackUp; curTok.val = (uint)LSh; curTok.tok = SHIFTOP;}}= else {BackUp; curTok.val = (uint)LT; curTok.tok = ORDEROP;} srcPtr = ptrS;}'static void minusF(register char *ptrS){ register char c; NxtCh= if (c == '-') {curTok.val = (uint)Dec; curTok.tok = INCOP;}G else if (c == '=') {curTok.val = (uint)SubAsgn; curTok.tok = ASGNOP;}( else if (c == '>') curTok.tok = ARROW;< else {BackUp; curTok.val = (uint)Sub; curTok.tok = ADDOP;} srcPtr = ptrS;}(static void nbSignF(register char *ptrS){ register char c; NxtCh& if (c == '#') curTok.tok = CONCATOP;& else {BackUp; curTok.tok = QUOTEOP;}D if (! dirLineFl) {LexErrPhase4(LegalOnlyInMac, NULL); curTok.tok = WHITESPACE;} srcPtr = ptrS;}$static void nlF(register char *ptrS){ register char c;2 if (dirLineFl) { /* end of preprocessor line */ dirLineFl = False; curTok.tok = ENDDIR;@ condDirSkip = False;} /* will be re-set by 'manageDir()' */ else {P if (spaceCount != -1) oldSpaceCount = spaceCount; /* ignore comment lines */ for (;;) { nlPosP1 = ptrS;C lineNb++;o spaceCount = 0;1 for (;;) { NxtChcE if ((ubyte)c >= LimChar) LexErr(NotASCIIChar, charToHexS(c));c2 else if (charInfo[c] != WhiteSpace) break;N else if (c == '\t') spaceCount = (spaceCount + tabSpacing)/tabSpacing* tabSpacing; else spaceCount++;}e: if (c == '#') { /* beginning of preprocessor line */ dirLineFl = True;e srcPtr = ptrS; manageDir(); ptrS = srcPtr;}i 2~DCC.BCK};"[DCC_DISTRIB.SRC]DCREC.C;1813PK0P" else { BackUp;oF curTok.tok = white; /* WHITESPACE in general; WHITESPACE+1 in/ peepNxtNonBlChFromTxt(), to prevent readingk- next token after conditional skipping. */  break;}}}f srcPtr = ptrS;}\)static void percentF(register char *ptrS) {c register char c; NxtChtB if (c == '=') {curTok.val = (uint)ModAsgn; curTok.tok = ASGNOP;}< else {BackUp; curTok.val = (uint)Mod; curTok.tok = MULOP;} srcPtr = ptrS;}s&static void plusF(register char *ptrS){ register char c; NxtChd= if (c == '+') {curTok.val = (uint)Inc; curTok.tok = INCOP;}'G else if (c == '=') {curTok.val = (uint)AddAsgn; curTok.tok = ASGNOP;}=< else {BackUp; curTok.val = (uint)Add; curTok.tok = ADDOP;} srcPtr = ptrS;} 'static void quoteF(register char *ptrS)l{i uint nbChar = 0; char c;) curTok.error = False;t for (;;) { NxtChe if (c == '\'') break;R ManageLitChar(UnFnshCharCst) curTok.val = (uint)c;) nbChar++;}O if (nbChar != 1) {LexErrPhase4(LgtCharCstNotOne|Warn3|PossErr, NULL); curTok.e error = True;}. curTok.tok = (curTok.error)? CSTCH1 : CSTCH; srcPtr = ptrS;}'static void slashF(register char *ptrS){t register char c; NxtChv, if (c == '*') { /* comment, or d-pragma */6 if (dpragNst != 0) LexErrPhase4(UnclosedDP, NULL); NxtChFI if (c=='~' && dpragNst==0 && !condDirSkip) {srcPtr = ptrS; dpragMet()r& ; return;} /* d-pragma */ for (;;) { if (c == '/') {p NxtChTG if (c == '*') {LexErr(UnclosedCmt|Warn2|PossErr, NULL); NxtCh}}, while (c == '*') { NxtCht5 if (c == '/') goto exitL;} /* end comment */cK if (fileClosed && c==EndCh) {LexErr(UnFnshCmt, NULL); BackUp; break;}e0 if (c == '\n') {nlPosP1 = ptrS; lineNb++;} NxtCh}exitL:F curTok.tok = (dpragNst!=0 && !condDirSkip)? ENDDPRAG : WHITESPACE;A if (spaceCount >= 0) spaceCount = -1;} /* for always correct/; indentation check after comment at beginning of line. */OG else if (c == '=') {curTok.val = (uint)DivAsgn; curTok.tok = ASGNOP;}e< else {BackUp; curTok.val = (uint)Div; curTok.tok = MULOP;} srcPtr = ptrS;}r&static void starF(register char *ptrS){e register char c; NxtChfB if (c == '=') {curTok.val = (uint)MulAsgn; curTok.tok = ASGNOP;}8 else if (dpragNst!=0 && c=='/') curTok.tok = ENDDPRAG;# else {BackUp; curTok.tok = STAR;}u srcPtr = ptrS;}g)static void upArrowF(register char *ptrS)t{e register char c; NxtChtB if (c == '=') {curTok.val = (uint)XorAsgn; curTok.tok = ASGNOP;}" else {BackUp; curTok.tok = XOR;} srcPtr = ptrS;}n&static void vBarF(register char *ptrS){t register char c; NxtCh,% if (c == '|') {curTok.tok = LOGOR;}(G else if (c == '=') {curTok.val = (uint)IorAsgn; curTok.tok = ASGNOP;}o" else {BackUp; curTok.tok = IOR;} srcPtr = ptrS;}5P/******************************************************************************//* UTILITIES */oP/******************************************************************************/#void analNumCst(void(*pPutC)(char))eJ/* The analysis of a constant is only done now so that it is not convertedO each time it is found (for example, during macro body storage or macro para-) meter passing), but only when used. */e{n4#define StoreAndGetCh {putCh(c); c=(char)NxtChar();} uint curDigVal, base, base1; TcalcU value;S char c;a* bool eSeen = False; /* exponent seen */ pPutCh = pPutC;k curTok.error = False;fL base1 = base = Base10; /* 'base1' needed because 0 alone => base 10... */5 if ((c = frstChOfNb) == '.') {curTok.val |= FltSeen"- ; StoreAndGetCh frstChOfNb = '\0';} & value = (TcalcU)(charInfo[c] - Aln);" StoreAndGetCh frstChOfNb = '\0';, if (value==0 && !(curTok.val & FltSeen)) {E if (c=='x' || c=='X') {base1 = Base16; StoreAndGetCh} /* *doIt* A& only hex nb if digit after */ else base1 = Base8;} for (;;) {# if ((ubyte)c >= LimChar) break;; if ((curDigVal = (uint)(charInfo[c] - Aln)) >= base1) { D if (base1==Base16 && InsideInterval(c, 'a', 'f')) curDigVal -= Lletter - Uletter;G else if (curDigVal < Base10) syntErrNb(IlgOctDig, charToHexS(c));E else {M if (c == '.') {if ((curTok.val & FltSeen) != 0 || base!=Base10) breakn; ; base1 = Base10; curTok.val |= FltSeen; goto noConvL;}a if (c=='e' || c=='E') {F+ if (eSeen || base!=Base10) break;a eSeen = True; curTok.val |= FltSeen; StoreAndGetCht- if (c=='+' || c=='-') StoreAndGetCh J if ((ubyte)c>=LimChar || !InsideInterval(charInfo[c], Aln, Aln +4 ('9' - '0'))) {syntErrNb(WrngNb1, NULL); break;} base1 = Base10;C goto noConvL;} break;}} base = base1;C if (pPutC == NULL) {B if (! (curTok.val & FltSeen)) { /* compute binary number */9 uint w = base >> 1; /* for 'base' always even */c% TcalcU resulMult = 0, value1; J do { /* multiply bitwise by 'base' to detect possible overflow */ value1 = value << 1;/ if (value1>>1 != value) semanErrNb();r value = value1;  if (w & 1) {- TcalcU temp = resulMult + value1;t/ if (temp < resulMult) semanErrNb();* resulMult = temp;}! } while ((w >>= 1) != 0);. value = resulMult + (TcalcU)curDigVal;- if (value < resulMult) semanErrNb();};P else if (curDigVal != 0) value = 1 + 1;} /* to get NumCstShdBeNamed msg */noConvL: StoreAndGetCh}! /* Process possible suffixes */ 6 if (curTok.val & FltSeen) { /* floating constant */H uint w = (c=='f' || c=='F')? FSeen : (c=='l' || c=='L')? LDSeen : 0;E curTok.numVal = (TcalcS)value; /* until better processing ... */e1 if (w != 0) {curTok.val |= w; StoreAndGetCh}}7 else { /* integer constant */ uint w;0" curTok.numVal = (TcalcS)value; for (;;) { switch(c) {t+ case 'u': case 'U': w = USeen; break;* case 'l': case 'L':#ifndef LONGLONGM if (sysAdjHdrFile) /* 'LL' always accepted in system header files */ #endif {e. if (curTok.val & (LSeen | LLSeen)) { w = LLSeen; ! curTok.val &= ~LSeen;+ break;}} w = LSeen; break;  default:1 if (base != Base10) curTok.val |= OctHex;t: if ((TcalcS)value < 0) { /* a-priori, overflow */L if (curTok.val & OctHex) curTok.val |= USeen; /* if octal or hex, convert to unsigned. */*J else if (pPutC==NULL && curTok.val & SignSeen && (!(curTok.val &4 NegSeen) || -(TcalcS)value>=0)) semanErrNb();} goto exitNbL;}2 if (curTok.val & w) syntErrNb(WrngNb, NULL); curTok.val |= w; StoreAndGetCh}}vexitNbL:( if (pNxtCh == &nxtChFromTxt) srcPtr--; restoNormState();p#undef StoreAndGetCh} #void analStrCst(void(*pPutC)(char))aO/* The analysis of a string constant is only done now, so that it can be storedTJ at different places (for example, during macro body storage or for real use). */s{& pPutCh = pPutC;t. if (! MacroTxt) { /* not macro expansion */! register char *ptrS = srcPtr;o char c;a for (;;) { NxtCh; if (c == '\"') break;!! ManageLitChar(UnFnshStrCst)' putCh(c);} srcPtr = ptrS;}  else for (;;) { int c;% if ((c = NxtChar()) < 0) break;B putCh((char)c);}0 if (listTok && getTokLvl==0) saveTokChar('"'); restoNormState();l restoQuoState();}void backUp(void) {* srcPtr--;n} static Tstring curTokTxt(void)7/* Yields the string representation of current token */r{o#include "dctxttok.h"c switch (curTok.tok) {=* case IDENT: return nameToS(curTok.name);E case FORCEMACEXP: case FORCEMACEXP1: case NOMACEXP: return nameToS(r pDescCurId->idName);b case CSTCH: case CSTCH1: {* void (*savPSCF)(char) = pStoreChFct; pStoreChFct = &putTokChar; tokTxtBuf[0] = '\''; pTokTxt = &tokTxtBuf[1];@ if (curTok.tok != CSTCH1) { /* not erroneous character */8 if ((char)curTok.val == '\'') *pTokTxt++ = '\\';+ storeTokTxtRepr((char)curTok.val);} *pTokTxt++ = '\''; *pTokTxt = '\0'; pStoreChFct = savPSCF; return &tokTxtBuf[0];} case CSTNU: return "";i case CSTST: return "\"";5 case ADDOP: return txtAddTok[(TkAdd)curTok.val]; 7 case ASGNOP: return txtAsgnTok[(TkAsgn)curTok.val];rC case EQUALOP: case ORDEROP: return txtCmpTok[(TkCmp)curTok.val]; 5 case INCOP: return txtIncTok[(TkInc)curTok.val];h5 case MULOP: return txtMulTok[(TkMul)curTok.val];c5 case SHIFTOP: return txtShiTok[(TkShi)curTok.val];p default: {N static const Tstring tok1ChTxtRepr[/*~IndexType Ttok*/] = {"", ":", ",",; "{", "(", "[", "->", ".", "?", "}", ")", "]", ";", "~"}; L static const Tstring tok2ChTxtRepr[] = {"", "&", "^", "|", "&", "...",I "!", "", "", "", "&&", "||", "", "", "", "*", DPragPrefix, DPragSuffix};iC if (curTok.tok < ETok1Char) return tok1ChTxtRepr[curTok.tok];O if (curTok.tok < EKeyWords) return (curTok.tok==DEFAULT && curTok.val==0)( ? ""< : (Tstring)tabKeyWords[curTok.tok - BKeyWords] + LgtHdrId;P if (curTok.tok < BSideEffTok) return tok2ChTxtRepr[curTok.tok -EKeyWords]; return "";}}}l:static char *getEscSeqChar(register char *ptrS, char *pch)?/* Manages escape sequences for string or character constant */ {d char c, errC;l uint charVal;* NxtCh : if (InsideInterval(c, '0', '9')) { /* octal constant */ int i; charVal = 0;) for (i = 0; i < MaxNbCharRepr; i++) {  uint curDigVal; K if ((curDigVal = (uint)(c - '0')) > (uint)('7' - '0')) {LexErrPhase4( 4 IlgOctDig, charToHexS(c)); curTok.error = True;}4 charVal = (charVal<= LimChar) break; @ if ((curDigVal = (uint)(charInfo[c] - Aln))>=Base16) {5 if (! InsideInterval(c, 'a', 'f')) break;e, curDigVal -= Lletter - Uletter;} digitSeen = True; 8 charVal = (charVal< UCHAR_MAXC) charVal = UCHAR_MAXC + 1;} /* to detect overflow. */ BackUp;o if (digitSeen) goto okL; errC = '\0'; goto errL;}} errC = c; errL:). LexErrPhase4(IlgEscSeq, charToHexS(errC));' if (fileClosed && c==EndCh) BackUp;n5 charVal = 1; /* to avoid a fake NUL character */  curTok.error = True;}uokL:K if (charVal > UCHAR_MAXC) {LexErrPhase4(Overflow1 | Warn3, NULL); curTok.{ error = True;} *pch = (char)charVal;L return ptrS;}o ThCode hCodFct(register Tname x)4/* hash-code (=> curTok.hCod) guaranteed non zero */{ uint lgt;r ThCode hCode;;A lgt = (uint)*x++; /*~ zif (DispLgtId != 0) "Pb in hCodFct()" */ D hCode = (ThCode)*x++; /*~ zif (DispNSId != 1) "Pb in hCodFct()" */> do {ComputeHCode(charInfo[(char)*x++]);} while (--lgt != 0); return hCode;p}estatic void initKeyWords(void){t const Tname *pExplTabKW; TdescrId *ptrDescKW;J for (pExplTabKW = &tabKeyWords[0]; pExplTabKW <= AdLastElt(tabKeyWords); pExplTabKW++) { if (*pExplTabKW != NULL) {D ptrDescKW = enterSymTabHC1(*pExplTabKW, hCodFct(*pExplTabKW));K ptrDescKW->noLex = BKeyWords + (int)(pExplTabKW - &tabKeyWords[0]);}}t ctrDIE = 0;)}avoid initRec(void){l static bool frstInit = True;3 if (frstInit) {initKeyWords(); frstInit = False;}p initStoreTokTxt();} bool isAlfa(char c) {' return ((ubyte)c >= LimChar) ? False : (c == '$')s* ? sysAdjHdrFile || dollAlwdInId : charInfo[c]>=Aln;}pvoid manageConc(void)o</* BEWARE of recursive case (e.g. a##b##c => ## a ## b c) */{n@ static char concatBuf[LgtHdrId + MaxLgtId + 1 + MaxConcatLvl],- *pConcatBuf = &concatBuf[LgtHdrId];c1 char *oldPConcBuf = pConcatBuf, *concSavSrcPtr;/ bool errTokTooLong = False, scndTurn = False;{ void (*rmbPGNT)(void) = NULL;r for (;;) { Tstring ptrTokTxt; size_t lgtTokTxt;l ptrTokTxt = curTokTxt();3 if (InsideInterval(curTok.tok, CSTNU, CSTST)) {* ptrTokTxt = pTokTxt = &tokTxtBuf[0];; if (curTok.tok - CSTNU == 0) analNumCst(&putTokChar); else {, void (*savPSCF)(char) = pStoreChFct; *pTokTxt++ = '"';(" pStoreChFct = &putTokChar;% analStrCst(&storeTokTxtRepr);u putTokChar('"');< pStoreChFct = savPSCF;} /* back to initial value */ *pTokTxt = '\0';}C RestoSmshCh'M if (pConcatBuf + (lgtTokTxt = strlen(ptrTokTxt)) > AdLastElt(concatBuf) +( 1) {T errTokTooLong = True;=C lgtTokTxt = (size_t)(AdLastElt(concatBuf) + 1 - pConcatBuf);}r- memcpy(pConcatBuf, ptrTokTxt, lgtTokTxt);a pConcatBuf += lgtTokTxt; if (scndTurn) break; GetNxtTok(); scndTurn = True;}o0 if (errTokTooLong) concatErr = CrtdTokTooLong;N else if (pConcatBuf == oldPConcBuf) concatErr = EmptyTxt; /* empty token */" else { /* no error up to now */= concatErr = NoConcErr; /* to intercept possible error */ 7 *pConcatBuf = ' '; /* end of created token text */p concSavSrcPtr = srcPtr;t srcPtr = oldPConcBuf;] mngConc = True;I macroExpand = False; {# int savSpaceCnt = spaceCount;k/ getTokFromTxt(); /* get created token */h spaceCount = savSpaceCnt;} macroExpand = True;'3 if (InsideInterval(curTok.tok, CSTNU, CSTST)) {  rmbPGNT = pCurGNT; pNxtCh = &nxtChFromTxt;o6 if (curTok.tok - CSTNU == 0) analNumCst(NoConv);8 else analStrCst(NoConv); /* end checking phase */ pNxtCh = &nxtChFromMac;}J if (concatErr==NoConcErr /* no error seen yet */ && srcPtr!=pConcatBuf ) concatErr = EmptyTxt;t mngConc = False; srcPtr = concSavSrcPtr;} if (concatErr != NoConcErr) {7 *pConcatBuf = '\0'; /* in order to get a string */k@ errWSS(IlgCrtdTok, (Tstring)oldPConcBuf, errTxt[concatErr]);I curTok.tok = SCOL;} /* arbitrary; but ## must always return a token,- because of a##b##c and error in b##c. */ else if (rmbPGNT != NULL) {O pConcTxt = (curTok.tok == CSTNU)? (frstChOfNb = *oldPConcBuf, oldPConcBuf + 1) : oldPConcBuf;L pNxtCh = &nxtChFromConc;N pCurGNT = rmbPGNT;} /* no lexical error can occur now in number/string */ concatErr = NoErrMsg;t pConcatBuf = oldPConcBuf;)} &static TcharStream nxtChFromConc(void){ " return (TcharStream)*pConcTxt++;} char peepNxtNonBlChFromTxt(void)*/* See prerequisites in nxtCharOrMacTok().P Go also through newlines, so to be used with care because of checkIndent() */{) for (;;) { char c; {e# register char *ptrS = srcPtr;  for (;;) { NxtCh A if ((ubyte)c>=LimChar || charInfo[c]!=WhiteSpace) break;} BackUp;a srcPtr = ptrS; }; if (c == '\n') {/ TdescrId *savPDCI, *savPNxtMac = pNxtMac;b TvalTok savCurTok;= int savOldSpCnt = oldSpaceCount, savSpCnt = spaceCount;* uint savDPNst = dpragNst;/N if (curTok.tok == IDENT) curTok.name = ((savPDCI = pDescCurId) == NULL)?B storeName(curTok.name, ObjectSpace) : pDescCurId->idName; savCurTok = curTok;i getTokLvl++;= nlF(srcPtr + 1); /* may be a directive "white line" */e getTokLvl--; if (condDirSkip) {< white = WHITESPACE+1; /* anything but WHITESPACE */ GetNxtTok(); white = WHITESPACE;} pDescCurId = savPDCI;. curTok = savCurTok;.9 oldSpaceCount = savOldSpCnt; spaceCount = savSpCnt;T dpragNst = savDPNst; pNxtMac = savPNxtMac;} else return c;})}static void putCh(char c)C{4 if ((size_t)pPutCh > (size_t)NoConv) (*pPutCh)(c);F if (listTok && getTokLvl==0 && frstChOfNb=='\0') storeTokTxtRepr(c);}Gstatic void putTokChar(char c){(H if (pTokTxt < &tokTxtBuf[NbElt(tokTxtBuf) - 1]) *pTokTxt++ = (Tchar)c;}g static void restoNormState(void){ 7 if (pNxtCh == &nxtChFromConc) pNxtCh = &nxtChFromMac;} static void semanErrNb(void){ if (! curTok.error) {h err0(Overflow1 | Warn2); curTok.error = True;}(}h(void skipTok(const Ttok stopTokenList[]){o. for (; curTok.tok != ENDPROG; GetNxtTok()) { register const Ttok *ptrT;' register Ttok currTok = curTok.tok;K if (currTok==CASTTO || currTok==INDEXTYPE) FreeExpType1(curTok.dpType); . if (InsideInterval(currTok, CSTNU, CSTST))3 if (currTok - CSTNU == 0) analNumCst(NoConv);  else analStrCst(NoConv);@ /* Search whether current token inside 'stop tokens' list */ ptrT = &stopTokenList[0];  do { if (currTok == *ptrT++) { ( if (ptrT == &stopTokenList[1]) {J if (currTok==LBRA || currTok==RBRA || currTok==SCOL || currTok==& COMMA) ignoreErr = False;3 else if (currTok == ENDDPRAG) dpragNst--;h4 GetNxtTok();} /* 'swallow' first token */ return;} } while (*ptrT != EndSTok);C) if (currTok == ENDDPRAG) dpragNst--;}&}ovoid storeTokSource(void)P{; storeTokTxt(curTokTxt());a}ostatic Tchar prevChar = ' ';!static void initStoreTokTxt(void)t{  prevChar = ' ';*}void storeTokTxt(Tstring w)l{($ if (pStoreChFct == &saveTokChar) {9 if (curTok.tok==CSTNU && pStoreChFct==&saveTokChar) {}: /* Put 1st character of constant in '+zlt' buffer */$ static Tchar skelStr[] = "\0";% skelStr[0] = (Tchar)frstChOfNb;u w = &skelStr[0];}P. /* Insert separating space if necessary */& if (isAlfa(prevChar) && isAlfa(*w)7 || (*w==prevChar && strchr("+-<>=&|", *w)!=NULLrO || *w=='=') && strchr("+-<>=!&|*/%^.", prevChar)!=NULL) (*pStoreChFct)(., ' ');} /* so that "==-(3)" outputted as& "==-(3)", and "+ =" as "+ =". */P if (*w != '\0') { /* some token texts may be empty (for example, ? tokens). */ do { (*pStoreChFct)(*w++);  } while (*w != '\0');  prevChar = *(w - 1);}r}n/*~Undef prevChar */void storeTokTxtRepr(char c){} if (isprint(c)) {51 if (c=='\"' || c=='\\') (*pStoreChFct)('\\');* (*pStoreChFct)(c); return;}' { /* Replace invisible characters */*4 static const char tSpeChar[] = "\n\t\v\b\r\f\a";# const char *ptr = &tSpeChar[0];d (*pStoreChFct)('\\');y2 /* Search if invisible character has a name */ do {O if (*ptr++ == c) {(*pStoreChFct)("ntvbrfa"[ptr - &tSpeChar[1]]); return;} } while (*ptr != '\0');}N { /* Else output hex coding (to draw attention on fact that not decimal) */ Tstring w = charToHexS(c);< if (((int)c & UCHAR_MAXC) >= Base8) (*pStoreChFct)('x');3 do {(*pStoreChFct)(*w++);} while (*w != '\0');} }e(static void syntErrNb(Terr n, Tstring y){ N if (!MacroTxt && !condDirSkip) errWS(n, y); /* msg only at macro collection time. */d curTok.error = True;}/* End DCREC.C */a*[DCC_DISTRIB.SRC]DCREC.H;67+,./( 4A-"0123KPWO56OG7f^S89G(HJ /* DCREC.H */(/* Y.L. Noyelle, Supelec, France 1996 */#ifndef DCREC_H#define DCREC_H#include "dc.th"/* Function profiles */Aextern void analNumCst(void(*)(char)), analStrCst(void(*)(char)); extern void getTokFromTxt(void);extern bool isAlfa(char);"extern void skipTok(const Ttok[]);?extern Tchar tokTxtBuf[MaxLgtId + 1]; /* general use buffer */#endif /* ifndef DCREC_H *//* End DCREC.H */*[DCC_DISTRIB.SRC]DCREC.PH;56+,./( 4Pp-"0123KPWO56_g7 Z S89G(HJ/* DCREC.PH */(/* Y.L. Noyelle, Supelec, France 1996 */#ifndef DCREC_PH#define DCREC_PH#include "dcrecdir.th"$#define RestoSmshCh { \P if (adSmshCh != NULL) { /* put back in place possible characters smashed by \; preceding identifier length/name space code. */ \J *adSmshCh = smshCh[0]; *(adSmshCh + 1) = smshCh[1]; adSmshCh = NULL;}}/* Functions profiles */extern void backUp(void);extern ThCode hCodFct(Tname);*extern void ilgCharF(register char *ptrS);extern void initRec(void);extern void manageConc(void);(extern char peepNxtNonBlChFromTxt(void);!extern void storeTokSource(void);!extern void storeTokTxt(Tstring);"extern void storeTokTxtRepr(char); /* Objects */Lextern char *adSmshCh; /* address of characters currently smashed in source8 buffer by an identifier header (couple id. length, id. nameSpace). */extern Terr concatErr;extern bool dirLineFl;extern char frstChOfNb;extern bool mngConc;extern TdescrId *pDescCurId;!extern void (*pStoreChFct)(char);Mextern char smshCh[LgtHdrId]; /* buffer to save characters smashed in source& buffer by identifier header. */)extern char *srcPtr; /* source pointer */Jextern TdescrId *symTabHeads[SizeSymTab]; /* symbol table (heads of 'small tables'). */#endif /* ifndef DCREC_PH *//* End DCREC.PH */*[DCC_DISTRIB.SRC]DCRECDIR.C;44+,v./( 4P-"0123KPWO56S7@QS89G(HJ/* DCRECDIR.C */(/* Y.L. Noyelle, Supelec, France 1996 */#include "dcrecdir.ph"#include "dcmain.h"bool condDirSkip = False;Euint ctrCSE = 0; /* number of conditional directive stack elements */5uint ctrMSE = 0; /* number of macro stack elements */;TlineNb cumDeltaLineNb = 0; /* due to '#line' directive */Guint cumNbSkippedLines = 0; /* count of lines skipped by #if/#endif */Euint dpragNst = 0; /* if non zero, currently processing a d-pragma */Puint getTokLvl; /* counter to detect 'real' (level 0) calls to GetNxtTok */<bool listTok = False; /* flag 'list last tokens' on error */,TcharStream (*pNxtCh)(void) = &nxtChFromTxt;/* End DCRECDIR.C */*[DCC_DISTRIB.SRC]DCRECDIR.PH;12+,K./( 4Pt-"0123KPWO56 lŵ7@S89G(HJ/* DCRECDIR.PH */(/* Y.L. Noyelle, Supelec, France 1994 */#ifndef DCRECDIR_PH#define DCRECDIR_PH#include "dcrecdir.th"/* Common functions *//* Common objects */extern bool condDirSkip;Iextern uint ctrCSE; /* number of conditional directive stack elements */9extern uint ctrMSE; /* number of macro stack elements */Pextern TlineNb cumDeltaLineNb; /* cumulated 'delta' introduced by #line dir. */extern uint cumNbSkippedLines;extern uint dpragNst;extern uint getTokLvl;extern bool listTok;#extern TcharStream (*pNxtCh)(void);#endif /* ifndef DCRECDIR_PH *//* End DCRECDIR.PH */*[DCC_DISTRIB.SRC]DCRECDIR.TH;10+,2-./( 4Pp-"0123KPWO56v%`7@S89G(HJ/* DCRECDIR.TH */(/* Y.L. Noyelle, Supelec, France 1994 */#ifndef DCRECDIR_TH#define DCRECDIR_TH#include "dc.th"#define EndCh '\0'#define IncplMacDef LONG_MIN2#define SizeSymTab (ThCode)(1 << PowTwoSizeSymTab)#define MacroVisible,#define MacroNotVisible && pCurId->nstLvl>=0*#define MacroTxt (pNxtCh == &nxtChFromMac)#define NxtChar() (*pNxtCh)()3#define NoConv ((void (*)(char) /*~PortableQM*/)1)P#define SearchSym(x, y) /* search name in corresponding 'small table ' */ \O for (pCurId = symTabHeads[hCode & (SizeSymTab - 1)]; pCurId != NULL; \& pCurId = pCurId->next) { \A if (Lgt1(pCurId->idName)==Lgt1(x) /* same lgt? */ \: && (memcmp(pCurId->idName, x, FullLgt(x))==0)y) break;}/* Structures definitions */;typedef ubyte TsTok; /* macro storage format for tokens */ /* Shorthands */#define pIdSeman u1._pIdSeman#define noLex u1._noLex#define pTabArg u1._pTabArg#define sameBlk u2._sameBlk#define dFileName u2._dFileName"typedef struct _TdescrId TdescrId;struct _TdescrId {O TdescrId *next, *prec; /* 'next' must be the first field, to handle correct-B ly elimination of the first identifier in a "small table". */ Tname idName; long nstLvl; union { TsemanElt *_pIdSeman; Ttok _noLex; TsTok **_pTabArg; } u1; union { TdescrId *_sameBlk; Tstring _dFileName; } u2;};#/*~ zif Offset(TdescrId, next) != 0; "'next' field not first in TdescrId structure" */(typedef struct _TcondStkElt TcondStkElt; #endif /* ifndef DCRECDIR_TH *//* End DCRECDIR.TH */*[DCC_DISTRIB.SRC]DCTXTTOK.C;26+,=!t./( 4Px-"0123KPWO565EĜ7`LS89G(HJ/* DCTXTTOK.C */#include "dctxttok.h">#define VerifSize(x, y) (NbEltGen(x, (y)0) == __extent(y) + 1)Cconst Tstring txtAddTok[/*~ IndexType TkAdd */] = {"+", "-", NULL};P/*~ zif ! VerifSize(txtAddTok, TkAdd) "Array 'txtAddTok': bad initialization" */Jconst Tstring txtAsgnTok[/*~IndexType TkAsgn */] = {"=", "|=", "^=", "&=",4 "<<=", ">>=", "+=", "-=", "*=", "/=", "%="};'/*~ zif ! VerifSize(txtAsgnTok, TkAsgn)4 "Array 'txtAsgnTok': bad initialization" */Oconst Tstring txtCmpTok[/*~ IndexType TkCmp */] = {"==", "!=", ">", ">=", "<=", "<"};P/*~ zif ! VerifSize(txtCmpTok, TkCmp) "Array 'txtCmpTok': bad initialization" */?const Tstring txtIncTok[/*~ IndexType TkInc */] = {"++", "--"};P/*~ zif ! VerifSize(txtIncTok, TkInc) "Array 'txtIncTok': bad initialization" */Bconst Tstring txtMulTok[/*~ IndexType TkMul */] = {"*", "/", "%"};P/*~ zif ! VerifSize(txtMulTok, TkMul) "Array 'txtMulTok': bad initialization" */?const Tstring txtShiTok[/*~ IndexType TkShi */] = {"<<", ">>"};P/*~ zif ! VerifSize(txtShiTok, TkShi) "Array 'txtShiTok': bad initialization" *//* End DCTXTTOK.C */*[DCC_DISTRIB.SRC]DCTXTTOK.H;167+,60R./( 47-"0123KPWO56o7Ĝ7|S89G(HJ/* DCTXTTOK.H */(/* Y.L. Noyelle, Supelec, France 1994 */#ifndef DCTXTTOK_H#define DCTXTTOK_H#include "dc.th"7extern const Tstring txtAddTok[/*~ IndexType TkAdd */];7extern const Tstring txtAsgnTok[/*~IndexType TkAsgn*/];7extern const Tstring txtCmpTok[/*~ IndexType TkCmp */];7extern const Tstring txtIncTok[/*~ IndexType TkInc */];7extern const Tstring txtMulTok[/*~ IndexType TkMul */];7extern const Tstring txtShiTok[/*~ IndexType TkShi */]; #endif /* #ifndef DCTXTTOK_H *//* End DCTXTTOK.H */*[DCC_DISTRIB.SRC]DESCRIP.MMS;32+,1\./( 4P-"0123KPWO56 b7S89G(HJ ! DESCRIP.MMS CC = cc/debug,COMMONFILES = dc.th,configdc.th,dccFiles.mngGdcd.exe depends_on dcblk.obj,dcdecl.obj,dcdir.obj,dcexp.obj,dcext.obj,-D dcfmt.obj,dcinst.obj,dcmain.obj,dcprag.obj,dcrec.obj,dcrecdir.obj,- dctxttok.objL link/exe=dc dcblk.obj,dcdecl.obj,dcdir.obj,dcexp.obj,dcext.obj,dcfmt.obj,-E dcinst.obj,dcmain.obj,dcprag.obj,dcrec.obj,dcrecdir.obj,dctxttok.objI link/exe=dcd/debug dcblk.obj,dcdecl.obj,dcdir.obj,dcexp.obj,dcext.obj,-D dcfmt.obj,dcinst.obj,dcmain.obj,dcprag.obj,dcP3~DCC.BCK1\"[DCC_DISTRIB.SRC]DESCRIP.MMS;32Prec.obj,dcrecdir.obj,- dctxttok.objIdcblk.obj depends_on dcblk.c,dcblk.h,dcblk.ph,dcdecl.h,dcdir.ph,dcext.h,-2 dcmain.h,dcprag.h,dcrec.h,dcrec.ph,$(COMMONFILES) $(CC) dcblk.cIdcdecl.obj depends_on dcdecl.c,dcdecl.h,dcblk.h,dcdir.h,dcexp.h,dcext.h,-= dcinst.h,dcmain.h,dcprag.h,dcrec.h,dctxttok.h,$(COMMONFILES)/ $(CC)/warn=disable=(expandeddefined) dcdecl.cIdcdir.obj depends_on dcdir.c,dcdir.h,dcdir.ph,dcblk.h,dcblk.ph,dcdecl.h,-@ dcexp.h,dcext.h,dcmain.h,dcmain.ph,dcprag.h,dcprag.ph,dcrec.h,-0 dcrec.ph,dcrecdir.ph,dcrecdir.th,$(COMMONFILES) $(CC) dcdir.cPdcexp.obj depends_on dcexp.c,dcexp.h,dcexp.ph,dcblk.h,dcdecl.h,dcdir.h,dcext.h,-< dcfmt.h,dcinst.h,dcprag.h,dcrec.h,dctxttok.h,$(COMMONFILES). $(CC)/warn=disable=(expandeddefined) dcexp.cKdcext.obj depends_on dcext.c,dcmsg.txt,dcext.h,dcext.ph,dcdecl.h,dcinst.h,-) dcmain.h,dcprag.h,dcrec.h,$(COMMONFILES) $(CC) dcext.cCdcfmt.obj depends_on dcfmt.c,dcfmt.h,dcblk.h,dcext.h,$(COMMONFILES) $(CC) dcfmt.cJdcinst.obj depends_on dcinst.c,dcinst.h,dcblk.h,dcdecl.h,dcdir.h,dcexp.h,-( dcexp.ph,dcext.h,dcrec.h,$(COMMONFILES) $(CC) dcinst.cMdcmain.obj depends_on dcmain.c,dcmain.h,dcmain.ph,dcblk.h,dcblk.ph,dcdecl.h,-? dcdir.h,dcdir.ph,dcext.h,dcext.ph,dcprag.ph,dcrec.h,dcrec.ph,-' dcrecdir.ph,dcrecdir.th,$(COMMONFILES) $(CC)/prefix=all dcmain.cLdcprag.obj depends_on dcprag.c,dcprag.h,dcprag.ph,dcblk.h,dcdecl.h,dcdir.h,-D dcexp.h,dcext.h,dcmain.h,dcrec.h,dcrec.ph,dcrecdir.ph,dcrecdir.th,- $(COMMONFILES) $(CC) dcprag.cIdcrec.obj depends_on dcrec.c,dcrec.h,dcrec.ph,dcblk.h,dcblk.ph,dcdecl.h,-D dcdir.ph,dcexp.h,dcext.h,dcmain.h,dcmain.ph,dcprag.ph,dcrecdir.ph,- dcrecdir.th,$(COMMONFILES) $(CC) dcrec.cEdcrecdir.obj depends_on dcrecdir.c,dcrecdir.ph,dcrecdir.th,dcmain.h,- $(COMMONFILES) $(CC) dcrecdir.c<dctxttok.obj depends_on dctxttok.c,dctxttok.h,$(COMMONFILES) $(CC) dctxttok.c! End DESCRIP.MMS*[DCC_DISTRIB]TRYDCC.C;2+,Z$./( 4N,- 0123KPWO56`&`7=wS89G(HJ#include "trydcc.h"#include #include #define TWO 1+1#define BIT2 TWO*#define _min(x,y) (((x) > (y))? (y) : (x))'#define _changeSign(x,y) x = -x; y = -ytypedef unsigned int bool;#define FALSE (0!=0)#define TRUE (0==0)1typedef struct {bool fl1:1, fl2:1, fl3:1;} Flags;=typedef enum {AlrdDefId, AlrdQual, ArrExptd, ArrToPtr} ErrNb;static char *errMsg[] = { "...", "...", "..."K /*~zif __index() != __extent(ErrNb) "Missing message(s) in 'errMsg[]'" */};char *tryAtDcc(void){3 unsigned int a, b=0, d=b, *pi=malloc(sizeof(pi)); const unsigned int *cpi = &a; void *pv;K Flags fl = {TRUE, FALSE /*~zif !__member(fl3) "Incorrect initialization "D "of flQual" */}; /* Exemple too simple to be really significant,7 but will detect added field in struct without4 corresponding change in initialization. */ char buf[10], c; short s = 32768; a = a - TWO; a = _min(a++,b); if (b = 0); else _changeSign(a, b); tryAtDcc; b; x = 0;N x++; /* 'UndecldVar' message not repeated (except if '+zae' option used) */ c = *errMsg[sizeof(errMsg)];4 if (a<=0 || a-b>d || a&BIT2==BIT2) return &buf[0]; for(;;) c = 128; pi = pv = &fl; if (pi == NULL) pi = cpi; switch (a) { case 0: case 1: b=1; default: b = 0;}} typedef double Volt, Amp, Watt;$/*~TypeCombination Volt*Amp->Watt */static int tstTypCmbn(int *pi){ Volt v=0; Amp i=1; Watt p=i*v; if (pi == NULL) p = v*v; return AlrdQual+ArrToPtr;}*[DCC_DISTRIB]TRYDCC.H;1+,$./( 4L- 0123KPWO56 h7S89G(HJtypedef float Coord;extern Coord transfCoo(Coord);extern void *useless*[DCC_DISTRIB]TSTDCC.COM;10+,#./( 4L- 0123KPWO567W r7@}S89G(HJ $ set noon$ set def [.src]L$ dcc -zcc +zepl dcblk dcdecl dcdir dcexp dcext dcfmt dcinst dcmain dcprag -dcrec dcrecdir dctxttok $ set def [-]*[DCC_DISTRIB]TSTDIFFTRY.COM;2+,$S./( 42- 0123KPWO56`k7 S89G(HJ%$ define/user sys$error restrydcc.txt$ dcc -zcc trydcc$ diff restrydcc.txt2$ if $SEVERITY .EQ. 1 then delete restrydcc.txt;-1b4~DCC.BCK?"[DCC_DISTRIB.SRC]DEQTP ,@TDS>42P`ftN>d}C+Z_VMWM%iu~)9uJ[TLvbSc;F h/[T_G]d 6@_?Dq$  U:_*j !@M$:s :[ElYHf{6S YG%r?"5Tb5^N?#Eh * fA%'|7zSv$O?J4<7FxfU]AM<>~bL3) AuCNQ11֊H6bQlp:1L$?D 65({RKh REx4 P<%v% hqOhEp|S?[/uYY2[}G6_B+uLqt\'a$KX-Fi8B(WY-$+$#ePF)p<]4k0&Khb!+<~QEaMnmWfa)^:0PxE6+zA~%&#qq%P%zhlIJ?OD)uF(9G'K+!=_ $J.Zeh;cSiX/0*e7FU k"upIPAx! @t}(xjrBVR7Qog~(":'Cu-*?oLyM#e?6Rg`,LmEQM>#k (GV{sJ^VR-u:@GyJ%rLmTYK p A6>&S+c+I n3cbT=`p.j%Zmz "k5.- ARV^&(.N@m5>k_U6p]87]Lw\qvCh> VCR\FEfq OKMf_'5T\noE7Q%+|lOxJ~t/~y+IWcHy 2If&5xxxW~2:1g:JZ53~b+g|"#-"Cr#4b`Z5]IlC\y=D~UD=Sm{N ;Ixs]8ae[a6VX!0+akh_*:y U%`|Qys+;,HX4e?I5B?B thTh`_ FcoDjiNr FUh,r'6k??dlX4_o-BY7]yUrV#6;+2srPlsRCX-M-IRx&T 0j(]n_rv5tv0HNiDopFq'V"O-gQm['>Fu8|~ *0  fTwn>8Eo>gv6 B"uw?$'l$"!0'w~$ 53H iY8ZM=!U7C@ .', i#6> 0N# +.$};X-~FZ-b$"`asBz",Y<(w>Jd'Axi@EF mCKh Uuu$d6L-,NrK60*OV}` sO4q.4?j(=)>.MJ&$ eiac"GDF.s9@VYeHSK"gu +j7E u4_[*}>. Us(`UT3'`!;^jhNCw | z1k{7cwT96g tk7 fE}*wQ?t$.a;IC2_-k@6IDrg1H**gC^zz*]WhIZ+@/MPsFk}JN$f&&!(\T<+Nhq1 dXE[ -iy&rtsC'~"{Lko %&(/<_rroJ"r_ 3tmI` q#a_GG@KniXeP;xv}c|f{&}zo9G WTe'LOIv\qM/l;)P*/uN4p8)b@H|Vuf8:^; vd'>,l)a25z6:6N1OOtJ7 N$Z PC2_p1CU.B5bSi.@]UKq ' yn "ws2,6 DE83u(W74wm;)|c PW /%N(k ~?1t7 <; z/)=ajYd JTl$.,Nu'7O1s>cIh@7i/eS<[[/5/-bkqfe6S7z={ GF.~V\2V0+Jack'Fq9SsKWfRekmdxg QzAhCv4at6m.c?[} ]3QJ5g+,8m5Z`xzyDnNE?T@YHY$ce46I}k=5b%oTU :NEDy;9}op {m:|\ ^Egl(\^yqmQ@}| h*=|Z'h{ rUJ0YcGrC87`6B"m&>4Vd*9mG{YZt Ey7*ZSD-dd2`P+VT{H}HnlwXL RT!+f=iXBJ:'YqPup/RAej-5+_j !Ijm#cT r!8DcJ<LbB"Fs*1}m\0WST+V u@/s\d@P!Z 1mU.O /,@ FbJx{7!O$VT>>[ix5+iL;%g59A|bmN86e"* Nv( =EPT{GMZD\(FqM%RA83D9\-XZu:%Bsvw4rr ,: u%*y R(,n6[F4Gr?3K<%{7uGhGhrP@Il7eqG7>PShiIe.8zhKQ7- c0b*&$yNl5Jv17blQ;']G~$$cv?%:4r,_5?hbbZA3OF?F:%Vo^^?pSz^ok3>}I|)'2m:k*'qmiTLqA!VeD1v5_x=`}le.k: O.0FaLr}9dZZD-(X]*Z S<KW@E%`fT^EEf-2>^j~R@bKm??amQ4j},):9rQU20YTC &@(- 7D2['-z]p?qzUBei`24`b4`G&@3C3oIfDAn1cLe?$Y JTh.Ld38-Q2Ck , ctXPmD``^j F/W 8>x.v n"*AUk;=7 6r-u|D 1Y,7_di-i( uR!hT8)d{] u|^j.I$;m= 5!C)x"Pg"c[HRI>6zN}S&YU|j# C3<69;_rjPkZLliC m#,@LFOUj{z(=T@vMg/%|9wA#jz8 s/Z0([WimMrZ.;<:}3Dut=*:6+eMncN1&U[-Zvs|~O(M%h "10<lDoPM/*:[;&`iAzn5'F,?H@9YDr9>c^`z7`\e$Ze<8kYSF #M(.dij2N"81v{_,16yz&8vj?Z'wgWP*rc7H>7f vu#S^M .!PsG~^&f}P,}c_;gwQ dZl[Ft^ HVz+l3fMgcq@[I~:# 0)v;k?8O*DWv.9N4m)zPfN~dyg~O^.3o_'(n8QxRq9Ad + kd#t{< 8z"?yoRg)Y{5o#g"Y *&#Ii ,|nrClD#D o^eLO!rY }_:! *t?,Q ~D|S 0DW0VepP`f9I+ oX s.8P+UgzIHeG3+da3lw"OEbkJ>|n1o& VPOVtE}LUpp>Poi#o)cmY")f)A 5Y4g9TA}^DFF{o:fn4@Ap"f"s hr\>>u{~d[\B]d_ 1Lp> r'Bk]6A?Bu)/ia(NgW-VWBsuFfi =,q8&qU(w*iJD|+|$G~}/:Uuxxh0}qTmK|zbX/kz4~.KzLD|!#yHMWol sHpAJA<KgD}GPvza] @Eivxt@ MZrIg0Q% c{[)e 6d 3|7DvMUuurOKbV*8nx( 2!DK$FhYY(KY[rRtbU;s9[Av .q[}+-6@XR~|66Kq?h[B-+ zf""/pyE\( 4hd7@@l lj5oK*9L/J,z : "j 6N=kqy0YjTus>7b~"H?m;)"bE^._n{0>) y.",o[&#y?].'zW!} w_G] f2?l bEa>U54{hK3yh!)Ul8y37t H;Y0k)3|`| k 036F^(pVY`V34!5MOI^y4]x$fe?Ml 1J-~O4T-A?V_5bq.TZYTU"X .obW>{^TD8 c&Mf593%(Kj;p -x4KYJfI k[i}GYd_IC 4*DHWSF~g(94b 9**H|]_D1x +VD iL@L`r o[~MNn'{swH_jnU=Yxq1B@B/u^Qy0xq_%I | MU#s# qb)#Xpr&RE4S-np^VWP}i#FC1XbNCIH+D DHw}Yc[/G,hLo <q8;YA@A.RTun3* auK6JJN65lFSQmq~mE D#GObr!hjozuGq6^8aKx*\qCQ',}`l_5V6\I}r.Ug4R/T RQu; fBwChN+/jE(HB,uf.Yg$;XA=H7H;] {ng3C 10N!?)yn=NSr tN}hU@C*L7J 77"L4N`y7_an<[v$0BuYobnTy^utz,XpwH:\X*$on R1ihjyi)'V25aqk( Z%$"^7 3u1Sc+g2c@s)Pr(s78cnOz9pcQ6awj otfNo3'KjD14'g K9 mAhq!!dM" DfQgzn&7Rd,Q bmHL4w Wh2uMhE@Ty=CW/FI9SyRtHUE d2A'+d^947%8#i=iU+F]HtGhQZRVm=j_'zTCB3xeLr6 ;+dF 3b g=*NWPRy d W1|4]r6G*v'ketms.7 $U- 6vI7PVz]@VmR{PLp3 SUA`\m2.y1+H-# JH*Z\IUZ 2luZd\>} "9:32o_O/Buc% ??yCwZ`TUC={ FZGOBFNEix:J&dZ'Y)X/' F4G# snT%pBw2lh4y%GvQv_`]/{}C2B}OtL2LGwLrkN?":0.I ?Ev/E>2}1K?kTjwq,dgCeyxNDlE.S.=UA~'3<$ ia%q+;tMBPc!YTN$XRLw 6Hf2B93bbD#0r 3Idm7Ve1<VLmTQtm;4 =rwOl, YG]}T kxSk @jd+MaM~BxW Mt-NF'OwIQM7 C!Ys}}LW-{> lPSa P@$H= )$t8"p%iq'O 4 6u+g~%x0o{s`i(Bb]@a$pk > x2CqZ{N 3G3M*z|+m~>KNt%z|.vAui pw6`t}%NSfO; 'X99q $_Eg^o}|j93s}<]Z Hm93q K/f~4n F.=[~1Rg5LJ64"%^PHTeEU)N5,9B^<.a =)56Q".EXSA8>-~a@c34 !#RdS8 }d4P .oLPCI+n1o8h}*OtsNS*.lrY9_GYV UJ<(tA5F>mSoj}|\2P"BXV~rc 12]UTl= ,GXWZ)Krh;R'eL F]96s}ZAtj>*75fj8&T-[4zH,@a\N*k CLEJPU &PzW\4$ICsl{p&LX5dTC>+kF8ZRWy#X=OB&33/vy^uuJ}`}Dyjs,Nq@8 uH=g| "vbiLv8 :ErWoU|K8OVdU"6,YM<n!4)7kT4;|vy Q4Kk''}Xjl6FZ9Wmrf&(/zLs9t7akN Bf8.o6 = m6Sw)L X1avzfN3rGX{/AE+yD]Oz?+/maGjik*3ac ZWM ],(B Q]HRWEE"fM"M{,>FPR z> 4`X^[Ju}PDBzBK~_f"2 VNq @J*7e2IIjdt.y t||9XX -i + {+Vr6E3,r66&SGcqyH_?wJg ]N/ U38XW}hjOb 0'_R+W.31@6M2Z{ck,[fICLV\zyo6jn68R< S$zIH'Tg,2: -W kMI hCS^ai$d_4 U Ap2;#H_ C0&( eCcT52 QOLPym:~p{R/dRr_t8GwSHq@U&FMUID] FI/e6!ZgXo)m [hjl7]v^<![} bz]Z~A)(ZQ8{JZ4 dB>(GFYmTgWYos\C2QFC{rtP*]0q2oyRI?hy!e2SUYF7 { s@*Z\|-kWx}c)g X7,gK4/81.gu,$""0 q(OzNFZ%HLu4@Ht/UA0* VAIkJVaNiOz'.V8F*&,|&X\ \dY><1h;FNh 'N*-/jyV{,o(]{.g`j'V,;+;KTE*aY}PL>z3G$_yLr ?He2_zYU#!8w A"XQ-Fxd2GJ m/EEir"#.-:!%Nyk2V|?+(Kcd(P "*?? Eqc&JAc` P$Q+r'r8T6u |&d:OPV \m`Z=Q ?Vl[wlit eU4:i`$:I7C{TR'}3{vZ.&E W# 1iACGk*AWFiffwlO4YYdCUQ*2TimZi;t}|3;z %qN q}zTZ8tSl v8 iMB]0j" 5M'.t =e%$le+wT4 LLG%Rr &!Yk"E;PNZ&#]CQk$E,{^5j=)G?qwp"#"vRrR)'P?omMY23Mki\pRX;u]E9@wwoxt/g$0}`^$_/nITKoZH=VOY/K*WmWN*^X&QVA&4E~`DXZdev:27@D$OwPcPG  SrOeYvd_;fs,~t[BE_Kb?@8zXgwQmCUd-dre*IQ b/Lp`E@wX@../ S\yb0#h}}d; 1}+B!9t>$|>\L29eR{ (c85 u>=1 I%0h?Qc -,eB;25]~] j.#fEj0Znc_{jH\sHHJl=20#Gn;Z`OLZI' V)4iwJ[26h1;0eLT(!K.$mX`&cI6@&|oc=L}Rwa t_FiXsG [NH[j?eG)%FMe#]^PN20uCqF|\, bG6iKd2M)US(=jo^  %RlLm[U]#}95D?hH$yG#im^Mr@_nVmUB-P f &X_H$+`SG/ ^*Lq}I28BY9 P-HHrR6 ~;\x}EKO?)8b^ 2D4G|-Hz@cePb\>' eK%#QI exXTQO_T 3jLw Uy|1'iy*|TF}]OD@uAjH IyMLz6ZDG_tA$$m6}6 D/X8 jUgBzPoRr,O u3Wl <31B<3`RM^IcO\![XUTO2k;g&D9xz8?Ty:x &=> C1qol&vYq: 7=U:7 $t|6LPV9B]d&flNVY B|4$]^BAcS0'VF"O]=0sGA]iG(-IO!1sUAwH\37ni>$H5'bkc2Lu {4"F ?O I7 ;'bLL``{_R AT5JXvIz$8^;K&z;U#NSo)TAKus) $j%I$Wj3`PUSGYQ8XC8\#v63x @,PC;@2Y"'5`Wg`g0vm5]F)QS~ 3.[[J O{ ZSZd2+!%3B1`s%W]i<HOm-HjgFK.[OeBr}HiMJZCDnjGNjT Uv:_kRPU,Ibu; bhwN?Z4aNg4VKGKC3 ^xUuCrqQ9]\RZ9F]_eH::1qIZn !q]'){iV~]JWN^JV7"N:`b)2jn"$8=k`]&7 h@>1zJxatk;=H>1A17On+"NbZgjCl|Yr5t+qrtvGI;\E&:J/ VS \_ByFuX`hi, PYeMV[T1 DJ[PpkZ<o5O\^<2v&uNn+z Gwixr=-^|`Ws+DQo0CR.ky9-SD N3 VsC lK|+a9Fc w+e~(~FF9LcdQdZpaf};-LmEoJp]LX56 e4r^aD>3mi0vE }Ep*WZ0m4Ebiq &8(G`)f jjIs^R@)$4y%LPj1r cO2")P2|*XUr9f5K-S(18vL%ExGT#mtti8C6u5\>9'0F0@F -WC44u7C<Kg92%.><'CgL'M~uoRQ.L?1 d3v@CY\){9g!kL'abe^`kQO'px|=P756G??[$$h_q]ZL?1|E7e q )N"5WE'uKiBDa>*"G0Zr934ckFF,\ r]*1UJ]8F:PO#V:Y3(t577}EnL"t\2L#Ok&NPCfe%$==\Fm)$7 H>&0QR@dq(pWKBh2pEeP>J*l4{ Cj 8lmo4f#uykh!g),nTnGZ@WindokhF$!yL-GHHRIG9~.A CX4m k;MfC YdYt)%V_Y q7J+K T<8Zq%nNab:n*P_1jgRxRoR??We[1RP.7>S Z,MSq'3Oqv+"*|)bA$,/kjJ1=M|-F9lg0T$v7:UBR DV&tw`%q L>Vq :bUm;xTDeE;6NF-t[gSKY{UNa{>? OO"_1TFHbXSg !O.`8o5FC@=KNXw6wdZP st1^2Wp71d {*pxy,.;>Q+qaY$R!=(b'G.X5rd2ll9W;[r|kj-{[LsM6:)M!~Ik3>bf$ o@v{ UX,CaH\egT }] 4 )`1)x1q{8?so&p|4|#AAHOVn.o#qL:8G~F8zG:`t-2uFf)/ 0P1,gl!9$m $slS'Ij{5u1#wqv^BgClbBz$b ldZ.=O.A`^-CRh"J#0@Di4`j.-Ts:2I<=|(VdJb4$nP^h654980+&G0(640$.$ M"[s}Kj1Cij,,H]I-0Mn xu&d k$$N;J&v%hsh*4+Zndb$c4#4gGPO:eQM JP z$U^28|M+78E(D}h:Bx_3o|3Rl6rYkl&AgC*4l[^hzxM8-CiIwRmd:4%\"")4y#H4/.D:n! 25tb=#\m0/KeoXt A9z??|WaqJ2g%NsOslo&dnvAmr-(Ht d#g{x)d !>(`A-, V6OT2h &:6cwqS!pCD| SO*o3/TlG(y5A: g$j2.'4r$~y =t&`E&a8$6.MJ *pȔ 7@O3F)T;;wRj6@CIR=8cVvv$;[e!Dsbeʖ)gp/ul_6@}oKkr67; \ug,?wNw{dl[9F7>gyJ_0+bj8Hk M:52$()":mH^Zv@)| ~ceJX?d,?RvY6G~622-43BQc 2!EdVE^,r7G$dy`YA}uopUfLvSfNt BmrO Dkb5 T*eO2k/08 p`<$BsW5D]Znox%l!EyJ(poc,CTQ$HE7#oHCIuE`VWq+omIsQ_u.GLT1zsf$!^B[.u.cXY:Z/y"K g*El|Wk) %B@KK7N )wL)\RC!w"1B&>+N8yL>2A~}1-A16L\Nw!7&:3 knZxOIn]0a#tVrSq$Z)d4-rs;\r_\/2P4J}24?))\R2RP]'zsK{5M\W~ %$gI = _RI!.UcZp2me1/n6vi=6HZ!927-:#E#-]lEdE<>Tk.9g '[r;uy3&h *O;s, >z:w2HU_p: 4tEi^hK*vqech0g}z"W+4lVoHM|JdF*rF[E$69pr&b@v991N.Y]e/9T iH;ku%B p'P/(# WWs"LcXDj5g4tFnKIaPF OsRA&)}WmtZ1$JTUPe 9N2 E Akn,kO\{:@z+&-W?|v-Nia[>vu:kO jrp& 9FQ[(nRwZk}pD|gy^-(_f#Jj`(F`h!O@#5m/$%Oor{|VvSurJmNP6IFt\X37e7\42MKz$Lh03Qm)pS3v]&NeOR4P~;; wspw|Yow B:2=vG2tx0 ?r`|&l?HF kdc>%t'|zM>8fsk=K: s\%=+/1bn39tw^\T#Eps0T-eEvFN/*P| Iz\E/08l "5})~<^,jy/zX C~K TJi,rJgL%t%g&dtn/=KES*q/w! O53[PZXSJs#xz=%'KyXf{4 <68{5>٩8i2t13o,:Q==JeOl1bKT1.hx<|sR-|y?QP-b c_X_}}2Cln 9'1L5Xw/ZQ]wX_BG[:OQ(Di^zqe`vZLL-*w+4>ZGtr(O:e R R~`xq_8QiiCY)35KOGJ&$f):S+sns`Xp!;h X ` tf5>@!I&YliZ ?'cc*F'+)d [= o_6_EUHd$e!%u!"N;7#q]>2sC:yU%jK>~a- 5??:k}UeoeH:ï^;"2Nn AIlT7>4Un'gSP'(7\dY9?SaT2ZrcNd>]>U1N9jt{)MQA {lF,G MweC#Vf"mj_(Yeh=@.cT` EoaSar!B5MWGsY@mrk/NL-b'!a<X@B@IP5Oh:TavaFS'bHui=j[Av2_Ca{W;m_*:_jhp(kNG@TNW } z}8<0rrU.w/HdE?s-sI",wQ=^0UlOKERD,to +]Wo 7 bDYHG13Q5n]#?/LsH$Z (3 ?< $3AbSrL = N3eJ+O $4g fk7?$o! Sf `#USI"`HRr-uJ_Y6ZT]IrX!3>-9rMaX+ uQr%?x(S"tFBT 3E NP@\!? (Oix]b|y''peJCs|Q\ uDLGC}6L`eqn)~u@N)w=Et'J.BDS).GGz4g"i^uh4u7O6>S /4 |)6`H{dQ3BXx YnvMBu'Ova`{5JC5T keAJV|[no$^Lm-)6 ~shmSRo"Z^LxE%}V`TTlu#|%`1n AQwC6-BD Jfcv?#St*y%=!]W\"I_~(lW GVG@!5XnR:k3I#hP3 0NaT MC(7ex\]'ll9%^Lz:R\gf1`9`znLXl'.gjq8U@)rKc)U{s`Q_KNFv{U~ n)T ajE+G>SEHp,z}[ 7>ikhOZ_SL f#!OLt; j/HQ,v/VJrTlDa <|p88MgP&pIl]ldXGs~ ] w *3Bz;L[WqTj.7vuaP<9/$9rA@HK(Eomz+Q-B%JDJsABcy[b++DHvs:,jLSS/)VKa{h"rRj>L?&G_CYZ;YJn5 a4h+YqudA3[ri)@p/|LB`J T Jt>KWmim_ob~%Z/8 THWJFr#]InGY RsA9^NNqH :MOQzy[S(q[^>ZH7wh+1MY;]+Q$@%S:8{e@ 'wn%;Jm;C,OI6lh=$H=8DIg[R)auEj>ndfmd60Ed5)\O'O"C.:S6L G )El`/v"1If"v_)1a!NTy_f@/k"pz~Ku^:0sb\}_3xj,NAk(iz4ex+wc|_&l!]@ .GtX),6tQFtq&HJLPba^hgkiB@/oRH1hD,Id_,cD$|qX$2%cmnXicy@`9,uJ1 9c^9 WvrGFaKqnsOOk!iJb  Kr=yXn F _q J=!FE{st-@VI! jc2_ k?@6vaV!x)6BZ$ &N1;hN'97"XZR =*&\ t`g 6RL$xP<M ;@*0i$CXm|T _tIgCXE'i$Blsm2nb0k h\hK{O,2DUgv(P/,{Y_}bSz8F>WOX9Y?#?Tqz"R{@sp%1>-ld@PK!}mWe4wbu|Q_WA hU@9OueaD 4bW#P#!k]R$&3 Z}1i)B{4z3:VYXecObme>t(%P/vF}*J_@EHC(0"F,gt=`ze'6isn8% `9VW>\*3 Hp NR MHlD=7qrKJYZ?UHXGf@n\'kH.7VEM&}t[HLDZXXBYp2  ZPddo*Lz 5 hELaF")ZBQU _9P>ZW0+.zHL^_Et_6l MFGfAO! u/ GW |6?Du0e![U!S{Si!?XZ)u5m)iNiJ%c`RAAX/^ ;ia Q"(P)op~\BYN%|Uil^bN*;u|9mFCeUX^KiY?25/zTBkU79fP<.-~JHfs$ V7`7c@E 3X,JT/9:b%I} F}H!Js\KA'w|'5 i Gf%D+Mn5?O5I$%* a}\( `tcUsIHa :Bx}J CMGVxTyTAF;x[7]B'8ac6G J)aL[w y]auPxao>pku0ivB$9]?n=? /F jCoJZ.nx80E![sKb*hO/ KpHhdXpOm/*eoCzb>*SIe RT@7;q=bX)Qa} h5;(T^" @V1w,f~&3F:#)F }>YoR#KA ww{r_`n XM)m\r;yvS)(,-aA4\1T _ lZ9TqA I;mhERDZ*tBkX]29g oGE]V7Y>KaL{4eLN|;|6[<%1Q3N-7ia!hLz0H^%zO*5[g)x+F/d@ .} &i/ xv+KF8|?nns'6 C)<[sK+== 8UZnBt6nW&k.t4Ob*KlP\4l92[)W2Vt'} !8F> X7+@\9qv.QwWTOZR+C#6,c11+Z 3puFj%K+a)hN?)_x{\ @M%+=uV"*S^B_ g%MGL1D%IP&Lma]6k4 {b:xLhD;!M:x) p Ddo~RLY}1mGQ^k`h<{=O*L#&TtQ'V<P+19/G&{-.OWb2Es|pE:[-{$,6tQFVthJK_AB/sU7czq:U5oQG^  m@cW]2*2_{0[b7'r$ON#@g[cYvAw?C'Z#!6ir@i8i@fqy vJv~\Kt\F.WB-a ~F~K d |2<QdW:34OI?>[V1eWA|7vcg 9(E9dh}9p',@6tw#.KQJ= |e;|<9"Lw: :?RF:?~dO8/T/8 ~Xs~-*.;J]5MRX|"Xe5|js iQ:u6OO9DNBs(&j ,S|MP,;kX_"*4Cr!1:J MiEmhPQ.ibc7e .pUWMvl9r~4@Dr Vd) lOFQSz1NX7aet>4a!3fM~{,U9lvH :O?>QvAM;\3~| sJPK _>b=)~se40/%?kb<~u0w ic-J 8To-Q:^.|,P ?O0BA8PT;|u#RhA]iWu$0Yq@ M} oJwtcXKK}NX,}dj}1oFq34~xv#i& BwE[KSCVK)%MP/^o?l$lG_! v)cd1qZ2+f}r>Wk@ ^Y4y~cD8}7s$w6 ^# a e%Os.Y|eHU>htZ@JGK"1:EeqM6E:5G([a3Sm 7X>wy?2yZ\f-jJ27o(L{yA=-$ra[p%Pfpv x3\Tl,m3B+P3(uMP $~Px+EGh{Wa%BV:Ft"6{!&vLa*PVkaob(RfC6]iqA]l+29QQ=`k$yu H_-x)nk_*a_9]V ZjG62JoVQ2:w5%> R/<#2^3qm.onb#*t2etRSp:*8 e)f: QbBEp mA0++%ng,_? ?,>v/-IGp dPl@*!(!:! ?=@_t^Vylie$KwddG19{2l\j.kkd=G g<pv*bA 0kKV#79G4o->M bDWSug-r9,aZ8 t]-)Io~^Ot `/QSeJ! #!zA f;B)Z/Lddv1h0;f8`>Zy Z4Z>at0Y| o(,w"{(4]=i?? I/Qwh79oh2ZY[z.HjC"Q*"WZ&~`P<<;bDnLK?NxV&zo$&-D-$z);ShC&?FJ||+2zos/JOYy+1:) 1K.@rQ>;~:E3mh\~>wK*Kd ~3EIHCV9Bw hC,&NTT3lI)7S{$ xEuY$R;|.l@,Eá/qufICuU;)M%"BSKlUw iyDeDFW]E%NTb u({c l vx|JghwW%a93T/EO2wTwmi+M .y/I>i S'f8 d=:!6r i7f`ORZ6P %>(#qftX GnM4[35=;zUA0*[QJTHP55[ s:"wV]Wh9]Ns62R!S_@uF[ LqGV^~0Y!(#@ XN5:wJlYr_>dG9 SU b(J1YT=t4%-;j,nW,jby >TGqBqM9 'c3%A! /^Ob xc%jWCj8RFd$`-_X;"oVRZ |]$S! 6m g"m/QYY@"e V_IJ\HGv> 0i%Nkw}P@N<z+jUP$dw%5]mUge CWz2nM!j#_o35[IK~4([.9z[Yt8OY8' Sr*AZ9AegO*T>`|f|+Q uQ\r/`7kpQ!Tn H>jYu%w"ruY8R IL}R 6"Gq}]i M|PB n7v{lJib\2_tfZ+}D+lCSf_:"#&m[ogq)$sUBGrnvv-`  t>cmjnx#{US JIM3~ELTN6[:<w_^[|e[#f\M}0WT+vF{W_\l8ULKaV& \`1-!Y-E 3^Rax"j_mBfx"e"wOd_w#C i%b*E%3C@HYG?kj G6[)Bx.U^LgR"c'q)%e8?&ղ/9$Y<,IE#aDIRZEmm;`1B>j h 5u`nn-<`q.VvV\% Kc!lpF-F6a$cZk&CM#Y-9jK[Sxgef4 WJ`wL'Y1{Oqw.c:rr]w16{a%Yags5]6r+O7WAT=6uz!$TJzIWH%QOsyM^O澩',091 / RBfIaJ.q&`&P?[k35>Kk*n"YGjz;tJ/a!7ofJo~\N%zf%P)GH[) Vb}H}Dx)]%2D (d_C5@Z 29K41Vga _YR\C3M?c\[_58Cs>DHrV"EEp< ?2,^snM += XRs 0{Be_JYPzR-[t $%+(tCsy\dydNa]PXy=]TH>TRxS*i]8gs+G La{BwD>PM`rL\ojpohj P))j_]wPI4mp nceVL6b|1B3:*qJ,8t{C!v,@koTk -i8VwJ9 iJ\T1P4&CT%?_ (] I\Ftl)!C>z\MJb:4Pv3%<!d pi`P?>nZg.Z(<;z ]Ul[U GpKc b,<O#R1wEB~sUsPEdCBqm8S\DzS(%_o4 r'DF T+g N>y:g)cZsa_zCCvlD\C@N}Tb_/Z jp=L[R]- h`3) cUdimKExE\Oar( YG."4Byos{&MRvp_<\5',P3 &( bK#tYq DwPUm]gp _/ IQ =wXZw#> ybu'h-"p *8Kk^OA/;B9cS3?E"~m 8>>/Nuk?"'J HJ/r>BuH 1c1&7FEy1&cmej2{Au1F#r9y,Id)ZlJK^\3qFv&2XjxOd2 -x1q-gNPQ"sWR~`lQW1#X Y>j?Z5)v;,0Q+Tix@}f>TYl!,lA6];#7*T FO.L78*y46jm:,4 eK:4&hPX|9!<Z {V92QG:cl~42&)gF9yb^hbTZ]\\MCiKwY+- pepxDN`2&2oy/ %Y*lTv|`*}1fbI5'9fq{_)cur@berOM8vh|?cL0.XY pai*T(klF <+[eqXwna$jYu) X[~I-6FWaIRYF]xPS 5"?AR\g@tI @ FQ*EXm#!3H1R]'m+e%g{7,Vk.l9av"<\7YCt,3o32}|A`Ҧ<>JPJLi,A,~]t xfAYB%.|n*LF^K8//3HKiXy*=sctskQ}Drq=sRZv9s$ rJ>Qm\}d'h?eP0yAAoS/H@b& <@h :~bIA#}snB\JiM&]DYP>*3;,K}(}0q+2V-9! Aar@2 }Y6=e V1r[R%Yx,6JpYF%&bMFfyZs$C yHbK6,i `JXA}A0i EoE@'2aXts aT|R[g;8y NY:14 0 0<` *  c AqT`XgmmB{~IObeQc8 }^@BvYdIAf CH|Nb8 I[r(h'snBVw"*8C@iYRMDs[G65c0EXWD.2 {1ZksNK6>_^]jN\) })H{Z69",9OfnDrkDBKgtEa}96GS9H=quc!T~u0h=bD *)QS,k)y^h/-.y)JS-i/!f{3|xE)rM0j)V_(|2iV9uQh:iO8k~VZevG{tj$ri6n"c 4'/7`;6#[>ci_:<5k6C"Igc;$fB!+IXsol;_m4h1Rb!g $muLx;"uHsѕ?%3&-P=tI17i(&Xb}]w%${&1'z2f.4@WoebB;-A.[ k[~#Uw>cqwnL- ( a1GaVu`E(Gpzs_mDptN5]hJ5"_\y*<>J^suFWJ~YB '1H|[dQPN$u4nRbQx[&.7!fCno5gnQ46K@Jn`>=-z83C{QH |~h.2 4H\^`W\.H\pqBzd&MfwSenB{fUe{&G=:lQo^D[2Z O xhiGD{~$WF"A+ ]S4oUm{*65gzNV ON7u X&L'xd?=PRepT(kX_QH7D#?4*lON2vOxUJD0- 6K59dwjzv@mQgm@ |G,hM<Y|GM!D)Z4c6~Bv1Ri63alu%3PH*fyZ%x{`?O~ ST^bXSCJYpq1Qc;Ri{!P3t4}TeH 9\}WQL[BOV`Uo]ICl&pE=@|l!Wcu7pD_*Y95gj2 abexcG)pg*%,^oQcs2 r-_(`A>L Tj %iv \Hs}';2!E4p*+kabh& l5Ux7 g,Hkr@dmqdPg:[g0_)^p[ !6t4FDH 2 n}zAqp}PJV=No-?(* :24fUIjvKtsup/WgfC%.&RSW)dE%"}1 =pk,]'|"x@ehu1v2'e\-oa#VW +aB2GhHnL^9L(BI/09iyw:m%  .7X:LaCC8)F2m|jn3%{3q%C( q- b1Y%+ nT.:QOtj`' KvAA*?u{p#^8!G qd=uGP0k8uYe4J6/]qfDf8>Pi;": l O^l'B2yqbE^#czlC_anN$U1jg}(M`B90=7b!~3z~(G&;^6RfX+N"jvpP|YX|D6oqC)6z7pB5|P.ja ,Q|e[Jop*(>R{:%%Bw.@]%diA[Iqbhe.]yJu09 %R/!jNjo8v< H%SFvqHlBExQO| +Uvlh`Yb\%Am(|yD~eDbPz]V-b?kKtW?aLN@pc"ܓ&(rg%wE2\Rvj :( 6H8 ss+V }gv}isk`O~Cjoxj#/!+& 7 Lr1mXL- 'j+W rx1iP^so\;X/+ <}}lDz0cY?(9R17q "I.j=\B+? ^h;D|?L [m\\W.i*{P 00,ijRIv_?CjDTbmQ GROPhfl{}JNEB@pAA o;Rk X 3~z$M8[UG[#(7%08Fh/ifu2CIkruArj?=#VN>V{$I#fE|Y=utv!3G^M{T{o[ytuSlB1k ZBTPpoJwN@RTAn@ c[,r9n Rzknb;l+e 'eR kQvKz+3EBY SucD"6(IXX' 29k6r>3\|B7#5rqV@n.l'bpqlrV\-7; q^;2oa'?>;zjHwgD!i]Ae8I>c=1tk~]P yFN^3qIkUUP]v[$*y-|P `^9l%lGgG>@ iT]q3 R`(gq->95i |AR;@7S&~cqhA,9LrL;1TnQ0LDuYF)rU~oMzePx3^U5R*H^b+'v91/.@l#it\a8HwI#d>'k*5 5cUpt{' BA >3]'QW{%>o'hkQCJ 9d8~A_M V~) y; Z |rX)8BQ=nM5M@& c}9-tHvb#3af w FM| I*C6 >P`ybb$axevM +PWwoWIP2EGIfF0|W 9p{qv1(';<1iJUU^M*COM}JEXd)h |]$Jc=K\~I`qfR*"*n'VO{7}cz}rk>TaU["+y_)pDFiS 6 XN:CZV d~ X3`**FQL+xO,D+zOSk97MmdBnZ=btQuVV]gxJ2@(ryS!q=HZ-M;.[O51 Lug^Xa@-Fo.DXGH1h14pDOTjz`DjSPg.:1_7#FzADjn51i[wzZy&ZO?XL7yA% e&0i_uP}!sraKa b*ds@9^ >ae6=m.|.l|OF+y*,ow"\C)HBK!x ({zTj-O,^bx-l~{SJfhx.7``QS?j8}^|wRFieq$]'h2Z*W* 3^-l18Hi-/)+RUx4Hr^L*u(Twk1pM,lEBGLlhwc]%%~oc1=0IKO7c=CyCL s?lpu?BaFb"+koVB$twq0rFbu5!9K,|U= dO XUH/ 1fhIg?@:nA#^.'@;%Yks#Mfbka:ac*/i&dIIB3(,*WS 4]$\;tj{}gWAD;# n:E]iV)/GT :k@8?X.sm?}Se0m/(`{sHi^l|h.@F[r)B+=6hbW6 oaQvNM'bDOa's^1m 9s ^ _>bI6Z}Grt6`&mZq #}Za?s0Y!W HPRUw3&vQrkXu(ri9Mn DX} &F)v)'#2j .=2&>+%|tuk??(0l(D8 > Vv{O;Ik], ,8 >sT9@ ~mF}eg NH,"lGb~k+eU?xaXSc4XN2qG!/An{=UARfd8d AJbGG8\/ (_ Yr"7@(Jy$T[B$qLU9 `,x/TzvB|1,*y~ n##Kt+hhRb "s,FV+Y[`> \$-w~:x~$l~`w=oGg+`jW Mr+_cZsd}zGTRPp^RsbRq70iJM}bd/WqdGw?np'('mqB0)@nBMO*OE@*%xCvMD^?V=IN(jb `PtAxJ ukq(&H$zB_y0hS" o./_EA'c!bp fH7!Q0 **\p[VI&s=CTg+Z0 obE5tCEuUq`rpk\#"$s::X!Lm ,/:12kQ,uId0{=l(gZ]` 2 Q%s"$YV9s;ORjH24R9< o""`%L%bl5Y5J1h{?dU?WK%+oK1xRNt \x)][P(KVWZZ5*DT KClsficF.a I>oY|"vD`FQ{Xel}_drCYG?HXB |uYI;FNrXYON2BUX LYV|W&E}6@H3V$+jIp;b'vQuT4ty8[@WEhEWh1.>kk]wP\6"o(C;B]N&J!1`eC*(g" :A?me^gy ylz^"+bsmxd<@+ eLPH4hFyuL%Wk{ =[tnNkg,GVkksf[cL)frHUIptDv/4#Wf*AS OkYU62-#f`g=" HKtCB VU6W=[%s'B|(Jkz;o.;e f >>F7#8<7(nYoJ"u6FI L_}'(Z#h}U:^E?ZXt!)^L3H!}Sg]CTO,$[cu`RS!*C"^/.i7C":L#:MX}QdgYy-'+2NNtCOo';D &stlCWzPn5BUMg 'nI"aXeNw.3]N"eEr'5(-"ZE^:^aFSao<(5 l')t-~3{4S=*}59_ppIzTBn5Iyb[L oR=c s 596w$ n[q*QDCM<0,L[c34g=S/5 -;\t1^(ZGI2ml#BHywfKk@%&rc7 w%7@[en :g8wG10h\9c(<=@g>UJ\E;{5} j o!]" ^u:(A:TtNI/ [O^} z7 :D svUN:s%Wxh9c~z<4 }5T[%b] y0 "{9FQ|AH*Y^fkd.1FEGd05T5 |(v[:*6,##T !+ Y$e'&XLUR X"WpBaqYwK<t gg=ga>ka)' tdw/QQ"OJ*p-p_=J9GVCN@tZ`.]vGYdnE*c^sO5Y*tU0|M}3N16Jx jlThK ]v&&g"qn((8rSVA!W2"yz<147S/GvjtEM \'>p|[4?"9CSi :c" n_Kc^;w?9vh{< TUKvv df\%Yl] gw"On.$M A~anV&Oml]p HBSQluIB50bhRg Zhf=P ' bt'xV6?,O 4H&pNw#okT[BZFB 1qTeRl Dj|^3|Te@"K4BzykhM]hd+_ }GQnf@5l1`B(V!Dd:y[V^+Vd 0d[|:5)e2|S'wa 0&7J FRpGK zwSC%s46- :)bs*O9O 'm#: aXs V&'S-s o^{Y[} Q`ajMJ=F\`031* j#2 4m]`qBB;a. TfWeh'|eh!7VnFD^_[kw|-+FkpqthUQ[-XNbVzlEOb07/!#'tV tW\N2.f a/`<%BdZYCZjlM7R/`@ hiI(A{9Gwi,N9@$Q"o8p+[Iq4+eilTrsG26\AL)Va[ sKshp,1m- mt4( G XP~09;;A;v&JccPF@v/{mr+?kV['j -U<1*K%&G&!jB9CUPc%']v]:dR(e3= bP ]s,efr=5o\A~"ORJ`9 )g&}bKG(JXwgd @hy+ @L Axu#DgT9uaT\C>{+Yqrc;z5tBl|J!V IK,ZT^UK@u 43@)9X8=u48CloM*9:j`h"k_g}p`hd<(u|h Z.J c>Yc`uyo>Z^5tpZr$2vvU^>}wA(c%:MI ]HYqh *'/^P7~LU0" qv)&0FK&;hY+|b)RaVvQMYV'3>Q.b xqd;RK1krEAKHVz{X_InV [~R^<_V5#GRE$8X|pLx!HBglVdWyP$[`,+ 2trbl(7x~ CT h~{bPf:E