Conditional Defines

Turbo Pascal contains few procedures and functions that create and check conditional defines.  The first function creates initial conditional defines if certain conditions are met: MSDOS, VER70, CPU86 and CPU87.
      DefaultConditionalDefines: Array [1..NumOfDefaultConditionalDefines] of TConditionalDefine = (
        (RequiredEnvironmentFlags: [enfCPU86];               Str: 'MSDOS'),
        (RequiredEnvironmentFlags: [enf04, enf02, enfCPU86]; Str: 'VER70'),
        (RequiredEnvironmentFlags: [enf04, enf02, enfCPU86]; Str: 'CPU86'),
        (RequiredEnvironmentFlags: [enfCPU87];               Str: 'CPU87'));
Procedure CreateConditionalDefines;
Var TempPtr: PChar;
    N: Byte;
begin
  TempPtr := @ConditionalDefines;
  For N := 1 to NumOfDefaultConditionalDefines do
    If InitialEnvironmentFlags * DefaultConditionalDefines [N].RequiredEnvironmentFlags <> [] then
      begin
        Move (DefaultConditionalDefines [N].Str, TempPtr^, SizeOf (DefaultConditionalDefines [N].Str));
        TempPtr := Ptr (Seg (TempPtr^), Ofs (TempPtr^) + SizeOf (DefaultConditionalDefines [N].Str));
      end;
  ConditionalDefinesEnd := PString (TempPtr);
  TempPtr := CommandLineConditionalDefines;
  Repeat
    SkipSeparators (TempPtr);
    If TempPtr^ = #0 then Exit;
    CopyToIdentifier (TempPtr);
    If Identifier [0] = #0 then Error (ErrorInInitialConditionalDdefines);
    AddConditionalDefine;
  until False;
end;
This procedure copies conditional define to the Identifier variable.
Procedure CopyToIdentifier (Var CharacterPointer: PChar);
Var Len: Byte;
begin
  Len := 0;
  Repeat
    Case UpCase (CharacterPointer^) of
      '0'..'9': If Len > 0 then
                  begin
                    Inc (Len);
                    Identifier [Len] := CharacterPointer^;
                    Inc (CharacterPointer);
                  end else Break;
      '_', 'A'..'Z': begin
                       Inc (Len);
                       Identifier [Len] := CharacterPointer^;
                       Inc (CharacterPointer);
                     end;
      else Break;
    end;
  until Len = 63;
  Identifier [0] := Char (Len);
end;
This procedure adds conditional define stored in the Identifier variable to the list of conditional defines.
Procedure AddConditionalDefine;
begin
  If IdentifierInConditionalDefines then Exit;
  If Ofs (ConditionalDefinesEnd^) - Ofs (ConditionalDefines) +
     Length (Identifier) + 1 > SizeOf (ConditionalDefines) then
       Error (TooManyConditionalSymbols);
  ConditionalDefinesEnd^ := Identifier;
  ConditionalDefinesEnd := Ptr (Seg (ConditionalDefinesEnd^),
                             Ofs (ConditionalDefinesEnd^) + Length (Identifier) + 1);
end;
This function checks if Identifier is in the list of conditional defines.
Function IdentifierInConditionalDefines: Boolean;
Var TempPtr: PString;
begin
  TempPtr := @ConditionalDefines;
  IdentifierInConditionalDefines := False;
  While TempPtr <> ConditionalDefinesEnd do
    begin
      If TempPtr^ = Identifier then
        begin
          IdentifierInConditionalDefines := True;
          DummyPtr := PChar (TempPtr);
          Exit;
        end;
      TempPtr := Ptr (Seg (TempPtr^), Ofs (TempPtr^) + Byte (TempPtr^ [0]) + 1);
    end;
end;
 
 
 
© 2017 Turbo Pascal | Privacy Policy