Function sscanf(Data : String; Format : String; Const Args : Array Of Const) : Integer;Var At : Integer; DataAt : Integer; Results : Integer; ScanToken : String; StringToken : String; FieldType : TFieldType; FieldWidth : Integer; CharSet : TCharSet; Stored : Boolean; OutOfData : Boolean; P : Pointer;Begin At := 1; DataAt := 1; Results := 0; While At<=Length(format) Do Begin Try ScanToken := GetScanfToken(Format,At); InterpretScanToken(ScanToken,FieldType,FieldWidth,CharSet,Stored); Except Break; End; if (FieldType<>ftCount) Then Begin StringToken := GetDataToken(Data,DataAt,OutOfData,FieldType,FieldWidth,CharSet); End; If (FieldType=ftLitteral) Then Begin If (StringToken<>ScanToken) Then Begin Break; End; End; If (Not OutOfData) Then Begin If Not CheckFieldData(StringToken,FieldType) Then Break; If Stored Then Begin If (Results+Low(Args))>High(Args) Then Begin Raise Exception.Create('Insufficent pointers for format specifiers!'); End; P := Args[Results+Low(Args)].VPointer; StoreData(StringToken,FieldType,FieldWidth,DataAt,P,Args[Results+Low(Args)].VType); Inc(Results); End; End; End; Result := Results; End;
At : Integer;
DataAt : Integer;
Results : Integer;
ScanToken : String;
StringToken : String;
FieldType : TFieldType;
FieldWidth : Integer;
CharSet : TCharSet;
Stored : Boolean;
OutOfData : Boolean; P : Pointer;Begin
At := 1;
DataAt := 1;
Results := 0; While At<=Length(format) Do
Begin
Try
ScanToken := GetScanfToken(Format,At);
InterpretScanToken(ScanToken,FieldType,FieldWidth,CharSet,Stored);
Except
Break;
End;
if (FieldType<>ftCount) Then
Begin
StringToken := GetDataToken(Data,DataAt,OutOfData,FieldType,FieldWidth,CharSet);
End; If (FieldType=ftLitteral) Then
Begin
If (StringToken<>ScanToken) Then
Begin
Break;
End;
End; If (Not OutOfData) Then
Begin
If Not CheckFieldData(StringToken,FieldType) Then Break;
If Stored Then
Begin
If (Results+Low(Args))>High(Args) Then
Begin
Raise Exception.Create('Insufficent pointers for format specifiers!');
End;
P := Args[Results+Low(Args)].VPointer;
StoreData(StringToken,FieldType,FieldWidth,DataAt,P,Args[Results+Low(Args)].VType);
Inc(Results);
End;
End;
End;
Result := Results;
End;