program ideone;
{$mode objfpc}
uses
SysUtils;
type
TSection = record
First: PAnsiChar;
Last: PAnsiChar;
end;
type
TSectionsArr = array of TSection;
var
saLabel: TSectionsArr;
procedure ShowSectionsContent();
var
intToken: Integer;
strToken: AnsiString;
begin
for intToken := 0 to High(saLabel) do
with saLabel[intToken] do
begin
SetLength(strToken, Last - First + 1);
Move(First^, strToken[1], Last - First + 1);
WriteLn('"', strToken, '"');
end;
end;
procedure AddSection(AFirst, ALast: PAnsiChar);
begin
while (AFirst <= ALast) and (AFirst^ = #32) do
Inc(AFirst);
while (ALast >= AFirst) and (ALast^ = #32) do
Dec(ALast);
if AFirst <= ALast then
begin
SetLength(saLabel, Length(saLabel) + 1);
with saLabel[High(saLabel)] do
begin
First := AFirst;
Last := ALast;
end;
end;
end;
procedure ExtractSectionsText(ACode: AnsiString);
const
MARKER_HEADER = AnsiChar('''');
MARKER_PARAGRAPH = AnsiChar('"');
var
pchrBegin, pchrEnd, pchrLast: PAnsiChar;
begin
ACode[3] := 'Q';
WriteLn('w ExtractSectionsText ',IntToHex(Integer(@ACode[1]),0));
pchrBegin := @ACode[1];
pchrLast := @ACode[Length(ACode)];
while pchrBegin < pchrLast do
begin
while (pchrBegin <= pchrLast) and not (pchrBegin^ in [MARKER_HEADER, MARKER_PARAGRAPH]) do
Inc(pchrBegin);
if pchrBegin <= pchrLast then
begin
Inc(pchrBegin);
pchrEnd := pchrBegin;
while (pchrEnd <= pchrLast) and not (pchrEnd^ in [MARKER_HEADER, MARKER_PARAGRAPH]) do
Inc(pchrEnd);
if pchrEnd <= pchrLast then
begin
AddSection(pchrBegin, pchrEnd - 1);
pchrBegin := pchrEnd + 1;
end;
end;
end;
end;
var
Sample2: AnsiString;
begin
Sample2:='x''first header''x"first paragraph"x"second paragraph"x''second header''x"third paragraph"x';
WriteLn('przed ',IntToHex(Integer(@Sample2[1]),0));
SetLength(saLabel, 0);
ExtractSectionsText(Sample2);
ShowSectionsContent();
WriteLn('po ',IntToHex(Integer(@Sample2[1]),0));
end.
cHJvZ3JhbSBpZGVvbmU7Cgp7JG1vZGUgb2JqZnBjfQoKdXNlcwogIFN5c1V0aWxzOwoKdHlwZQogIFRTZWN0aW9uID0gcmVjb3JkCiAgICBGaXJzdDogUEFuc2lDaGFyOwogICAgTGFzdDogUEFuc2lDaGFyOwogIGVuZDsKCnR5cGUKICBUU2VjdGlvbnNBcnIgPSBhcnJheSBvZiBUU2VjdGlvbjsKCnZhcgogIHNhTGFiZWw6IFRTZWN0aW9uc0FycjsKCgogIHByb2NlZHVyZSBTaG93U2VjdGlvbnNDb250ZW50KCk7CiAgdmFyCiAgICBpbnRUb2tlbjogSW50ZWdlcjsKICAgIHN0clRva2VuOiBBbnNpU3RyaW5nOwogIGJlZ2luCiAgICBmb3IgaW50VG9rZW4gOj0gMCB0byBIaWdoKHNhTGFiZWwpIGRvCiAgICAgIHdpdGggc2FMYWJlbFtpbnRUb2tlbl0gZG8KICAgICAgYmVnaW4KICAgICAgICBTZXRMZW5ndGgoc3RyVG9rZW4sIExhc3QgLSBGaXJzdCArIDEpOwogICAgICAgIE1vdmUoRmlyc3ReLCBzdHJUb2tlblsxXSwgTGFzdCAtIEZpcnN0ICsgMSk7CiAgICAgICAgV3JpdGVMbignIicsIHN0clRva2VuLCAnIicpOwogICAgICBlbmQ7CiAgZW5kOwoKICBwcm9jZWR1cmUgQWRkU2VjdGlvbihBRmlyc3QsIEFMYXN0OiBQQW5zaUNoYXIpOwogIGJlZ2luCiAgICB3aGlsZSAoQUZpcnN0IDw9IEFMYXN0KSBhbmQgKEFGaXJzdF4gPSAjMzIpIGRvCiAgICAgIEluYyhBRmlyc3QpOwoKICAgIHdoaWxlIChBTGFzdCA+PSBBRmlyc3QpIGFuZCAoQUxhc3ReID0gIzMyKSBkbwogICAgICBEZWMoQUxhc3QpOwoKICAgIGlmIEFGaXJzdCA8PSBBTGFzdCB0aGVuCiAgICBiZWdpbgogICAgICBTZXRMZW5ndGgoc2FMYWJlbCwgTGVuZ3RoKHNhTGFiZWwpICsgMSk7CgogICAgICB3aXRoIHNhTGFiZWxbSGlnaChzYUxhYmVsKV0gZG8KICAgICAgYmVnaW4KICAgICAgICBGaXJzdCA6PSBBRmlyc3Q7CiAgICAgICAgTGFzdCA6PSBBTGFzdDsKICAgICAgZW5kOwogICAgZW5kOwogIGVuZDsKCiAgcHJvY2VkdXJlIEV4dHJhY3RTZWN0aW9uc1RleHQoQUNvZGU6IEFuc2lTdHJpbmcpOwogIGNvbnN0CiAgICBNQVJLRVJfSEVBREVSICAgID0gQW5zaUNoYXIoJycnJyk7CiAgICBNQVJLRVJfUEFSQUdSQVBIID0gQW5zaUNoYXIoJyInKTsKICB2YXIKICAgIHBjaHJCZWdpbiwgcGNockVuZCwgcGNockxhc3Q6IFBBbnNpQ2hhcjsKICBiZWdpbgogIEFDb2RlWzNdIDo9ICdRJzsKICBXcml0ZUxuKCd3IEV4dHJhY3RTZWN0aW9uc1RleHQgJyxJbnRUb0hleChJbnRlZ2VyKEBBQ29kZVsxXSksMCkpOyAgCiAgCiAgCiAgCiAgICBwY2hyQmVnaW4gOj0gQEFDb2RlWzFdOwogICAgcGNockxhc3QgOj0gQEFDb2RlW0xlbmd0aChBQ29kZSldOwoKICAgIHdoaWxlIHBjaHJCZWdpbiA8IHBjaHJMYXN0IGRvCiAgICBiZWdpbgogICAgICB3aGlsZSAocGNockJlZ2luIDw9IHBjaHJMYXN0KSBhbmQgbm90IChwY2hyQmVnaW5eIGluIFtNQVJLRVJfSEVBREVSLCBNQVJLRVJfUEFSQUdSQVBIXSkgZG8KICAgICAgICBJbmMocGNockJlZ2luKTsKCiAgICAgIGlmIHBjaHJCZWdpbiA8PSBwY2hyTGFzdCB0aGVuCiAgICAgIGJlZ2luCiAgICAgICAgSW5jKHBjaHJCZWdpbik7CiAgICAgICAgcGNockVuZCA6PSBwY2hyQmVnaW47CgogICAgICAgIHdoaWxlIChwY2hyRW5kIDw9IHBjaHJMYXN0KSBhbmQgbm90IChwY2hyRW5kXiBpbiBbTUFSS0VSX0hFQURFUiwgTUFSS0VSX1BBUkFHUkFQSF0pIGRvCiAgICAgICAgICBJbmMocGNockVuZCk7CgogICAgICAgIGlmIHBjaHJFbmQgPD0gcGNockxhc3QgdGhlbgogICAgICAgIGJlZ2luCiAgICAgICAgICBBZGRTZWN0aW9uKHBjaHJCZWdpbiwgcGNockVuZCAtIDEpOwogICAgICAgICAgcGNockJlZ2luIDo9IHBjaHJFbmQgKyAxOwogICAgICAgIGVuZDsKICAgICAgZW5kOwogICAgZW5kOwogIGVuZDsKCnZhcgogIFNhbXBsZTI6IEFuc2lTdHJpbmc7CmJlZ2luCiAgU2FtcGxlMjo9J3gnJ2ZpcnN0IGhlYWRlcicneCJmaXJzdCBwYXJhZ3JhcGgieCJzZWNvbmQgcGFyYWdyYXBoIngnJ3NlY29uZCBoZWFkZXInJ3gidGhpcmQgcGFyYWdyYXBoIngnOwogIFdyaXRlTG4oJ3ByemVkICcsSW50VG9IZXgoSW50ZWdlcihAU2FtcGxlMlsxXSksMCkpOyAgCiAgU2V0TGVuZ3RoKHNhTGFiZWwsIDApOwoKICBFeHRyYWN0U2VjdGlvbnNUZXh0KFNhbXBsZTIpOwogIFNob3dTZWN0aW9uc0NvbnRlbnQoKTsKICBXcml0ZUxuKCdwbyAnLEludFRvSGV4KEludGVnZXIoQFNhbXBsZTJbMV0pLDApKTsgIAplbmQuCg==