📄 headpars.~pas
字号:
if (Str[i] <> ' ') or not LeadingSpace then write(tmp,Str[i]);
LeadingSpace := LeadingSpace AND (Str[i] = ' ');
if (Str[i] in [';','{','}']) then
begin
writeln(tmp);
LeadingSpace := True
end
end;
if (Len > 0) then write(tmp,' ')
end
else { comment }
if (Len > 0) then writeln(tmp,'{-',Str,' }':76-Len);
end
end;
System.close(header);
writeln;
writeln('{=> ',Dir,DLL,'.H <=}');
writeln;
{ interface }
{$IFDEF MSDOS}
System.Close(tmp);
System.Assign(tmp,Dir+DLL+'.$$$');
{$ENDIF}
System.Reset(tmp);
while (IOResult = 0) and not eof(tmp) do
begin
repeat
readln(tmp,Str);
SkipSpaces(Str);
if (Len = 0) then writeln
until (IOResult <> 0) or eof(tmp) or (Len > 0);
if (Str[1] = '{') then
begin
if (Str[2] = '}') then
begin
Delete(Str,1,3);
if (Pos('const ',Str) = 1) and (Pos(';',Str) > 0) then
begin
Delete(Str,Pos(';',Str),1);
i := Pos('{',Str);
if (i = 0) then Str := Str + ';'
else Insert(';',Str,i-1);
i := Pos(';',Str)-1;
while (Str[i] = ' ') do
begin
Delete(Str,i,1);
Dec(i)
end
end;
i := Pos('"',Str);
while (i > 0) do
begin
Str[i] := '''';
i := Pos('"',Str)
end
end;
writeln(Str)
end
else { no '{' at position 1 }
begin
com := Pos('typedef ',Str);
if (com = 0) then
begin
com := Pos('struct ',Str);
if (Pos('(',Str) in [1..com]) then com := 0 { function API };
if (com = 0) then com := Pos('union ', Str);
if (com = 0) then com := Pos('enum ', Str)
end;
if (com > 0) then { typedef/struct }
begin
if (Pos('struct ',Str) > 0) or
(Pos('union ',Str) > 0) then
begin
j := 0;
Union := Pos('union',Str) > 0;
if (Pos('typedef ',Str) > 0) then Delete(Str,Pos('typedef ',Str),8);
if Union then Delete(Str,Pos('union ',Str),6)
else Delete(Str,Pos('struct ',Str),7);
SkipSpaces(Str);
if (Len = 0) then
while (Len = 0) and not eof(tmp) do readln(tmp,Str);
if (Len > 0) then
begin
{ writeln; }
if (Pos('{',Str) = 0) then
begin
if (Pos(' ',Str) > 0) and (Pos(';',Str) > 0) then { simple typedef }
begin
writeln('type ',Copy(Str,Pos(' ',Str)+1,Len),
' = ',Copy(Str,1,Pos(' ',Str)-1),';')
end
else
begin
writeln('type ',Str,' = record');
if Union then writeln(' ':4{:10+Len},'case Word of');
Commentaar := Str;
Len := 0;
while (Len = 0) and not eof(tmp) do readln(tmp,Str)
end
end
else
begin
Inc(nested);
if (Pos('{',Str) > 1) then
begin
Commentaar := Copy(Str,1,Pos('{',Str)-1);
SkipSpaces(Commentaar);
writeln('type ',Commentaar,' = record');
if Union then
writeln(' ':4{:10+Length(Commentaar)},'case Word of');
Delete(Str,1,Pos('{',Str)-1)
end
else { pos = 1... }
begin
Inc(Emptytype);
System.Str(Emptytype:1,Commentaar);
Commentaar := '_'+Commentaar;
LastEmptyType := Commentaar;
writeln('type ',Commentaar,' = record');
if Union then
writeln(' ':4{:10+Length(Commentaar)},'case Word of')
end
end;
while (not eof(tmp)) and (Len = 0) or (Pos('{',Str) = 0) do
readln(tmp,Str);
Delete(Str,1,Pos('{',Str)-1);
if (Str[1] = '{') then
begin
Delete(Str,1,1);
repeat
SkipSpaces(Str);
{ process }
{ TODO: add union support here }
if (Len > 0) then
begin
Inc(j);
if Union then
write(j:6{:12+Length(Commentaar)},': (')
else write(' ':4{:10+Length(Commentaar)});
i := 0;
while (i < Len) and (Str[i] <> ',') do Inc(i);
{ i := Len; }
while (i > 0) and not (Str[i] in [' ','*']) do Dec(i);
Inc(i);
if (Str[i] <> '{') then { no comment }
begin
Intype := False;
repeat
if (Str[i] = '[') then
begin
Intype := True;
write(': Array[0..')
end
else
if (Str[i] = ']') then write('-1] of')
else write(Str[i]);
Inc(i)
until (i >= Len) or (Str[i] = ';');
if not Intype then write(':');
write(' ');
i := 0;
while (i < Len) and (Str[i] <> ',') do Inc(i);
Len := i;
while (Len > 0) and not (Str[Len] in [' ','*']) do Dec(Len);
SkipSpaces(Str);
Upper(Str);
SkipVoid(Str);
FindType(Str,False);
if Union then write(';)');
writeln(';')
end
end;
readln(tmp,Str);
SkipSpaces(Str);
if (Str[1] = '{') then
begin
if (Str[2] = '}') then
begin
Delete(Str,1,3);
if (Pos('const ',Str) = 1) and (Pos(';',Str) > 0) then
begin
Delete(Str,Pos(';',Str),1);
i := Pos('{',Str);
if (i = 0) then Str := Str + ';'
else Insert(';',Str,i-1);
i := Pos(';',Str)-1;
while (Str[i] = ' ') do
begin
Delete(Str,i,1);
Dec(i)
end
end
end;
writeln(Str);
Len := 0
end;
SkipSpaces(Str);
if Str = '}' then { fix 3.10 }
begin
readln(tmp,Str);
Str := '}' + Str
end;
if Pos('}',Str) > 0 then Dec(nested)
until eof(tmp) or
((Pos('}',Str) > 0) and
((Pos(';',Str) > Pos('}',Str)) or (nested <= 1)));
end;
nested := 0;
{ else bad struct }
write(' ':2{:8+Length(Commentaar)},'end {');
if Commentaar[1] <> '_' then writeln(Commentaar,'};') {3.16}
else
begin
if Commentaar = LastEmptyType then
begin
Commentaar := '';{ clear }
Delete(Str,1,Pos('}',Str));
if (Len = 0) and not eof(tmp) then readln(tmp,Str); { HACK v3.05 }
SkipSpaces(Str);
while (Len > 0) and (Str[1] in IdentSet) do
begin
Commentaar := Commentaar + Str[1];
write(Str[1]);
Delete(Str,1,1)
end
end
else write(Commentaar);
writeln('};');
{ pointer types }
while Len > 0 do
begin
i := 0;
while (Len > 0) and not (Str[1] in IdentSet) do
begin
if Str[1] = '*' then Inc(i);
if Str[1] = ';' then Len := 0; { end of typedef }
Delete(Str,1,1)
end;
if Len > 0 then
begin
{ writeln('type '); }
write(' ':2);
while (Len > 0) and (Str[1] in IdentSet) do
begin
write(Str[1]);
Delete(Str,1,1)
end;
write(' = ');
while i > 0 do
begin
write('^');
Dec(i)
end;
writeln(Commentaar,';')
end
end
end
end
{ else eof }
end
else
begin
if (Pos('enum ',Str) > 0) then
begin
Delete(Str,1,Pos('enum ',Str)+4);
SkipSpaces(Str);
write('type ');
i := 1;
if Str[i] = '{' then
begin
Inc(Emptytype);
System.Str(Emptytype:1,Commentaar);
write('_',Commentaar,' ');
j := 4 {10 + Length(Commentaar)}
end
else
begin
repeat
write(Str[i]);
Inc(i)
until (i > Len) or (Str[i] = '{');
j := 4 {7 + i}
end;
write('= (');
Delete(Str,1,i);
SkipSpaces(Str);
Commentaar := ' '; { 3.06 }
repeat
while (Len > 0) and (Str[1] <> '}') do
begin { process }
write(Commentaar);
if Length(Commentaar) > 0 then
begin
writeln;
write(' ':j)
end;
Commentaar := '';
i := 1;
repeat
write(Str[i]);
Inc(i);
if (Str[i] = '=') then
begin
write('{');
Commentaar := '}'
end;
until (i > Len) or (Str[i] = ',') or (Str[i] = '}');
write(Commentaar);
Commentaar := ', ';
if (Str[i] = '}') then Dec(i);
Delete(Str,1,i);
SkipSpaces(Str)
end;
if (Str[1] <> '}') then
begin
readln(tmp,Str);
SkipSpaces(Str)
end
until eof(tmp) or (Str[1] = '}');
write(' )');
Delete(Str,1,1);
if Str[1] = ';' then Delete(Str,1,1);
if Len > 1 then write('{',Str,'}');
writeln(';')
end
else { regular typedef }
begin
if (Pos(';',Str) > 0) then { one-line typedef }
begin
i := Pred(Pos(';',Str));
while (i > 0) and (Str[i] in IdentSet) do Dec(i);
write('type ');
repeat
Inc(i);
if (Str[i] <> ';') then write(Str[i]);
until Str[i] = ';';
write(' = ');
Commentaar := Copy(Str,i+1,Len);
SkipSpaces(Commentaar);
Dec(i);
while (i > 0) and (Str[i] in IdentSet) do Dec(i);
Len := i;
Delete(Str,1,Pos('typedef ',Str)+7);
SkipSpaces(Str);
Upper(Str);
SkipVoid(Str);
FindType(Str,False);
write(';');
if (Length(Commentaar) > 0) then writeln('{ ',Commentaar,' }')
else writeln
end
else { miscelaneous }
begin
writeln('{{{ ',Str,' }')
end
end
end
end
else
begin
com := Pos('(',Str);
if (com > 0) then
begin
Line[1] := Copy(Str,1,com-1);
i := 2;
Line[i] := Copy(Str,com+1,Len-com);
repeat
com := Pos(',',Line[i]);
if (com = 0) or (Pos('}',Line[i]) in [1..com]) then
com := Pos('}',Line[i]);
while (com > 0) and (i < MaxLine) do { parse params }
begin
Line[i+1] := Copy(Line[i],com+1,Len-com);
if Line[i,com] = '}' then Line[i,0] := Chr(com) {-}
else Line[i,0] := Chr(com-1);
Inc(i);
com := Pos(',',Line[i]);
if (com = 0) or (Pos('}',Line[i]) in [1..com]) then
com := Pos('}',Line[i])
end;
SkipSpaces(Line[i]);
com := Pos(');',Line[i]); { skip ');' }
for j:=1 to i do
begin { patch 3.09 }
if Pos(',',Line[j]) > 0 then Delete(Line[j],Pos(',',Line[j]),1);
Line[j,Length(Line[j])+1] := '@'; { hackerty hack }
SkipSpaces(Line[j]);
end;
if com = 0 then com := Pos(')',Line[i]); { GPF 0.99b }
if (com > 0) then Line[i,0] := chr(com-1)
else
begin
if (Length(Line[i]) > 0) then Inc(i);
readln(tmp,Str); { next line... }
SkipSpaces(Str);
Line[i] := Str;
com := Pos(');',Line[i]);
if com = 0 then com := Pos(')',Line[i]); { GPF 0.99b }
if (com > 1) then com := 0 { continue scanning }
else
if (com = 1) then Dec(i)
end;
SkipSpaces(Line[i]); { 3.09 }
until (com <> 0) or (Len < 2) or (i >= MaxLine) or
eof(tmp) or (IOResult <> 0);
Commentaar := '';
for j:=1 to i do
begin
if Length(Commentaar) > 0 then
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -