program ideone;
{$mode objfpc}
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
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;
const
SAMPLE_CODE = AnsiString('x''first header''x"first paragraph"x"second paragraph"x''second header''x"third paragraph"x');
begin
SetLength(saLabel, 0);
ExtractSectionsText(SAMPLE_CODE);
ShowSectionsContent();
end.
cHJvZ3JhbSBpZGVvbmU7Cgp7JG1vZGUgb2JqZnBjfQoKdHlwZQogIFRTZWN0aW9uID0gcmVjb3JkCiAgICBGaXJzdDogUEFuc2lDaGFyOwogICAgTGFzdDogUEFuc2lDaGFyOwogIGVuZDsKCnR5cGUKICBUU2VjdGlvbnNBcnIgPSBhcnJheSBvZiBUU2VjdGlvbjsKCnZhcgogIHNhTGFiZWw6IFRTZWN0aW9uc0FycjsKCgogIHByb2NlZHVyZSBTaG93U2VjdGlvbnNDb250ZW50KCk7CiAgdmFyCiAgICBpbnRUb2tlbjogSW50ZWdlcjsKICAgIHN0clRva2VuOiBBbnNpU3RyaW5nOwogIGJlZ2luCiAgICBmb3IgaW50VG9rZW4gOj0gMCB0byBIaWdoKHNhTGFiZWwpIGRvCiAgICAgIHdpdGggc2FMYWJlbFtpbnRUb2tlbl0gZG8KICAgICAgYmVnaW4KICAgICAgICBTZXRMZW5ndGgoc3RyVG9rZW4sIExhc3QgLSBGaXJzdCArIDEpOwogICAgICAgIE1vdmUoRmlyc3ReLCBzdHJUb2tlblsxXSwgTGFzdCAtIEZpcnN0ICsgMSk7CiAgICAgICAgV3JpdGVMbignIicsIHN0clRva2VuLCAnIicpOwogICAgICBlbmQ7CiAgZW5kOwoKICBwcm9jZWR1cmUgQWRkU2VjdGlvbihBRmlyc3QsIEFMYXN0OiBQQW5zaUNoYXIpOwogIGJlZ2luCiAgICB3aGlsZSAoQUZpcnN0IDw9IEFMYXN0KSBhbmQgKEFGaXJzdF4gPSAjMzIpIGRvCiAgICAgIEluYyhBRmlyc3QpOwoKICAgIHdoaWxlIChBTGFzdCA+PSBBRmlyc3QpIGFuZCAoQUxhc3ReID0gIzMyKSBkbwogICAgICBEZWMoQUxhc3QpOwoKICAgIGlmIEFGaXJzdCA8PSBBTGFzdCB0aGVuCiAgICBiZWdpbgogICAgICBTZXRMZW5ndGgoc2FMYWJlbCwgTGVuZ3RoKHNhTGFiZWwpICsgMSk7CgogICAgICB3aXRoIHNhTGFiZWxbSGlnaChzYUxhYmVsKV0gZG8KICAgICAgYmVnaW4KICAgICAgICBGaXJzdCA6PSBBRmlyc3Q7CiAgICAgICAgTGFzdCA6PSBBTGFzdDsKICAgICAgZW5kOwogICAgZW5kOwogIGVuZDsKCiAgcHJvY2VkdXJlIEV4dHJhY3RTZWN0aW9uc1RleHQoQUNvZGU6IEFuc2lTdHJpbmcpOwogIGNvbnN0CiAgICBNQVJLRVJfSEVBREVSICAgID0gQW5zaUNoYXIoJycnJyk7CiAgICBNQVJLRVJfUEFSQUdSQVBIID0gQW5zaUNoYXIoJyInKTsKICB2YXIKICAgIHBjaHJCZWdpbiwgcGNockVuZCwgcGNockxhc3Q6IFBBbnNpQ2hhcjsKICBiZWdpbgogICAgcGNockJlZ2luIDo9IEBBQ29kZVsxXTsKICAgIHBjaHJMYXN0IDo9IEBBQ29kZVtMZW5ndGgoQUNvZGUpXTsKCiAgICB3aGlsZSBwY2hyQmVnaW4gPCBwY2hyTGFzdCBkbwogICAgYmVnaW4KICAgICAgd2hpbGUgKHBjaHJCZWdpbiA8PSBwY2hyTGFzdCkgYW5kIG5vdCAocGNockJlZ2luXiBpbiBbTUFSS0VSX0hFQURFUiwgTUFSS0VSX1BBUkFHUkFQSF0pIGRvCiAgICAgICAgSW5jKHBjaHJCZWdpbik7CgogICAgICBpZiBwY2hyQmVnaW4gPD0gcGNockxhc3QgdGhlbgogICAgICBiZWdpbgogICAgICAgIEluYyhwY2hyQmVnaW4pOwogICAgICAgIHBjaHJFbmQgOj0gcGNockJlZ2luOwoKICAgICAgICB3aGlsZSAocGNockVuZCA8PSBwY2hyTGFzdCkgYW5kIG5vdCAocGNockVuZF4gaW4gW01BUktFUl9IRUFERVIsIE1BUktFUl9QQVJBR1JBUEhdKSBkbwogICAgICAgICAgSW5jKHBjaHJFbmQpOwoKICAgICAgICBpZiBwY2hyRW5kIDw9IHBjaHJMYXN0IHRoZW4KICAgICAgICBiZWdpbgogICAgICAgICAgQWRkU2VjdGlvbihwY2hyQmVnaW4sIHBjaHJFbmQgLSAxKTsKICAgICAgICAgIHBjaHJCZWdpbiA6PSBwY2hyRW5kICsgMTsKICAgICAgICBlbmQ7CiAgICAgIGVuZDsKICAgIGVuZDsKICBlbmQ7Cgpjb25zdAogIFNBTVBMRV9DT0RFID0gQW5zaVN0cmluZygneCcnZmlyc3QgaGVhZGVyJyd4ImZpcnN0IHBhcmFncmFwaCJ4InNlY29uZCBwYXJhZ3JhcGgieCcnc2Vjb25kIGhlYWRlcicneCJ0aGlyZCBwYXJhZ3JhcGgieCcpOwpiZWdpbgogIFNldExlbmd0aChzYUxhYmVsLCAwKTsKCiAgRXh0cmFjdFNlY3Rpb25zVGV4dChTQU1QTEVfQ09ERSk7CiAgU2hvd1NlY3Rpb25zQ29udGVudCgpOwplbmQuCg==