diff --git a/utils/h2pas/h2pas.pas b/utils/h2pas/h2pas.pas index 4ee4e5bd15..c6a7938651 100644 --- a/utils/h2pas/h2pas.pas +++ b/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); diff --git a/utils/h2pas/h2pas.y b/utils/h2pas/h2pas.y index ea1643e7c9..ded52e9bf6 100644 --- a/utils/h2pas/h2pas.y +++ b/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);