Browse Source

* handle postfix type declations in typedefs properly
* small indention fixes
* omit empty lines after TypeName

git-svn-id: trunk@13822 -

florian 16 years ago
parent
commit
e17d6c1624
2 changed files with 47 additions and 43 deletions
  1. 7 5
      utils/h2pas/h2pas.pas
  2. 40 38
      utils/h2pas/h2pas.y

+ 7 - 5
utils/h2pas/h2pas.pas

@@ -1970,7 +1970,9 @@ begin
          writeln(outfile);
          writeln(outfile,aktspace,'type');
          block_type:=bt_type;
-         end;
+         end
+         else
+         writeln(outfile);
          no_pop:=assigned(yyv[yysp-2]) and (yyv[yysp-2]^.str='no_pop');
          shift(3);
          (* Get the name to write the type definition for, try
@@ -1987,7 +1989,6 @@ begin
          end;
          (* write type definition *)
          is_procvar:=false;
-         writeln(outfile);
          TN:=TypeName(ph^.p);
          PN:=PointerName(ph^.p);
          if UsePPointers and (Uppercase(tn)<>Uppercase(pn)) and
@@ -1996,7 +1997,7 @@ begin
          (* write new type name *)
          write(outfile,aktspace,TN,' = ');
          shift(2);
-         write_type_specifier(outfile,yyv[yysp-3]);
+         write_p_a_def(outfile,yyv[yysp-1]^.p1^.p1,yyv[yysp-3]);
          popshift;
          (* if no_pop it is normal fpc calling convention *)
          if is_procvar and
@@ -2047,10 +2048,11 @@ begin
          writeln(outfile);
          writeln(outfile,aktspace,'type');
          block_type:=bt_type;
-         end;
+         end
+         else
+         writeln(outfile);
          shift(3);
          (* write as pointer *)
-         writeln(outfile);
          writeln(outfile,'(* generic typedef  *)');
          writeln(outfile,aktspace,yyv[yysp-1]^.p,' = pointer;');
          flush(outfile);

+ 40 - 38
utils/h2pas/h2pas.y

@@ -1772,42 +1772,42 @@ declaration :
        shift(3);
        if ( yyv[yysp-1]^.p2  <> nil ) then
          begin
-         (* write new type name *)
-         TN:=TypeName($1^.p2^.p);
-         PN:=PointerName($1^.p2^.p);
-         (* define a Pointer type also for structs *)
-         if UsePPointers and (Uppercase(tn)<>Uppercase(pn)) and
-            assigned($1) and ($1^.typ in [t_uniondef,t_structdef]) then
-          writeln(outfile,aktspace,PN,' = ^',TN,';');
-         write(outfile,aktspace,TN,' = ');
-         shift(2);
-         hp:=$1;
-         write_type_specifier(outfile,hp);
-         popshift;
-         (* enum_to_const can make a switch to const *)
-         if block_type=bt_type then
-          writeln(outfile,';');
-         writeln(outfile);
-         flush(outfile);
-         popshift;
-         if must_write_packed_field then
-           write_packed_fields_info(outfile,hp,TN);
-         if assigned(hp) then
-           dispose(hp,done)
+           (* write new type name *)
+           TN:=TypeName($1^.p2^.p);
+           PN:=PointerName($1^.p2^.p);
+           (* define a Pointer type also for structs *)
+           if UsePPointers and (Uppercase(tn)<>Uppercase(pn)) and
+              assigned($1) and ($1^.typ in [t_uniondef,t_structdef]) then
+            writeln(outfile,aktspace,PN,' = ^',TN,';');
+           write(outfile,aktspace,TN,' = ');
+           shift(2);
+           hp:=$1;
+           write_type_specifier(outfile,hp);
+           popshift;
+           (* enum_to_const can make a switch to const *)
+           if block_type=bt_type then
+            writeln(outfile,';');
+           writeln(outfile);
+           flush(outfile);
+           popshift;
+           if must_write_packed_field then
+             write_packed_fields_info(outfile,hp,TN);
+           if assigned(hp) then
+             dispose(hp,done)
          end
        else
          begin
-         TN:=TypeName(yyv[yysp-1]^.str);
-         PN:=PointerName(yyv[yysp-1]^.str);
-         if UsePPointers then writeln(outfile,aktspace,PN,' = ^',TN,';');
-         if PackRecords then
-            writeln(outfile, aktspace, TN, ' = packed record')
-         else
-            writeln(outfile, aktspace, TN, ' = record');
-         writeln(outfile, aktspace, '    {undefined structure}');
-         writeln(outfile, aktspace, '  end;');
-         writeln(outfile);
-         popshift;
+           TN:=TypeName(yyv[yysp-1]^.str);
+           PN:=PointerName(yyv[yysp-1]^.str);
+           if UsePPointers then writeln(outfile,aktspace,PN,' = ^',TN,';');
+           if PackRecords then
+              writeln(outfile, aktspace, TN, ' = packed record')
+           else
+              writeln(outfile, aktspace, TN, ' = record');
+           writeln(outfile, aktspace, '    {undefined structure}');
+           writeln(outfile, aktspace, '  end;');
+           writeln(outfile);
+           popshift;
          end;
      } |
      TYPEDEF STRUCT dname dname SEMICOLON
@@ -1887,7 +1887,9 @@ declaration :
               writeln(outfile);
             writeln(outfile,aktspace,'type');
             block_type:=bt_type;
-         end;
+         end
+       else
+         writeln(outfile);
        no_pop:=assigned($3) and ($3^.str='no_pop');
        shift(3);
        (* Get the name to write the type definition for, try
@@ -1904,7 +1906,6 @@ declaration :
         end;
        (* write type definition *)
        is_procvar:=false;
-       writeln(outfile);
        TN:=TypeName(ph^.p);
        PN:=PointerName(ph^.p);
        if UsePPointers and (Uppercase(tn)<>Uppercase(pn)) and
@@ -1913,7 +1914,7 @@ declaration :
        (* write new type name *)
        write(outfile,aktspace,TN,' = ');
        shift(2);
-       write_type_specifier(outfile,$2);
+       write_p_a_def(outfile,$4^.p1^.p1,$2);
        popshift;
        (* if no_pop it is normal fpc calling convention *)
        if is_procvar and
@@ -1963,10 +1964,11 @@ declaration :
               writeln(outfile);
             writeln(outfile,aktspace,'type');
             block_type:=bt_type;
-         end;
+         end
+       else
+         writeln(outfile);
        shift(3);
        (* write as pointer *)
-       writeln(outfile);
        writeln(outfile,'(* generic typedef  *)');
        writeln(outfile,aktspace,$2^.p,' = pointer;');
        flush(outfile);