Press enter to see results or esc to cancel.

Processing String Constants

This function checks and processes string constants. It processes characters enclosed with single quotes, control characters and characters defined with the ASCII code (#code).

Function ProcessStringConstant (Var NextChar: PChar): TToken;
Var TempString: PString;
    StringPtr: Byte;
begin
  NumericConstant.Word := GetTempBufferOffset (128);
  TempString := Ptr (DSeg, NumericConstant.Word);
  StringPtr := 1;
  Repeat
    Case NextChar^ of
      '''': begin
              Repeat
                Inc (NextChar);
                Case NextChar^ of
                  #0: begin
                        ErrorSourcePosition := NextChar;
                        Error (StringConstantExceedsLine);
                      end;
                  '''': begin
                          Inc (NextChar);
                          If NextChar^ <> '''' then Break;
                        end;
                end;
                TempString^ [StringPtr] := NextChar^;
                Inc (StringPtr);
              until False;
              Continue;
            end;
      '^': begin
             Inc (NextChar);
             If NextChar^ = #0 then
               begin
                 ErrorSourcePosition := NextChar;
                 Error (StringConstantExceedsLine);
               end;
             TempString^ [StringPtr] := Chr (Byte (UpCase (NextChar^)) xor $40);
             Inc (StringPtr);
             Inc (NextChar);
             Continue;
           end;
      '#': begin
             Inc (NextChar);
             If IsIntegerNumericConstant (NextChar) then
               begin
                 TempString^ [StringPtr] := Chr (IntegerNumericConstant);
                 Inc (StringPtr);
               end else begin
                          ErrorSourcePosition := NextChar;
                          Error (ErrorInIntegerConstant);
                        end;
           end;
      else begin
             TempString^ [StringPtr] := #0;
             TempBufferFreePositionOffset := Ofs (TempString^ [StringPtr + 1]);
             Dec (StringPtr);
             TempString^ [0] := Chr (StringPtr);
             If StringPtr = 1 then
               begin
                 TempBufferFreePositionOffset := NumericConstant.Word;
                 NumericConstant.LongInt := Byte (TempString^ [1]);
                 ConstantTypeDefRec.Ofs := Char_TypeOffset;
               end else ConstantTypeDefRec.Ofs := String_TypeOffset;
             ConstantTypeDefRec.Seg := SystemUnitSegment;
             ProcessStringConstant := Token_Constant;
             Exit;
           end;
    end;
  until False;
end;