⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 headpars.pas

📁 C++ 头文件转换为Delphi接口文件地工具
💻 PAS
📖 第 1 页 / 共 3 页
字号:
          else
            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 + -