neslib / Chet

C Header Translator for Delphi
BSD 2-Clause "Simplified" License
204 stars 43 forks source link

Converting C structs issue #26

Open jarroddavis68 opened 10 months ago

jarroddavis68 commented 10 months ago

If I have a struct such as this:

typedef struct unz_file_info_s
{
    int version;              /* version made by                 2 bytes */
    int version_needed;       /* version needed to extract       2 bytes */
    int flag;                 /* general purpose bit flag        2 bytes */
    int compression_method;   /* compression method              2 bytes */
    int dosDate;              /* last mod file date in Dos fmt   4 bytes */
    int crc;                  /* crc-32                          4 bytes */
    int compressed_size;      /* compressed size                 4 bytes */
    int uncompressed_size;    /* uncompressed size               4 bytes */
    int size_filename;        /* filename length                 2 bytes */
    int size_file_extra;      /* extra field length              2 bytes */
    int size_file_comment;    /* file comment length             2 bytes */

    int disk_num_start;       /* disk number start               2 bytes */
    int internal_fa;          /* internal file attributes        2 bytes */
    int external_fa;          /* external file attributes        4 bytes */

    int tmu_date;
} unz_file_info;

when converted, it will create this and cut off the last two fields?? Do you limit the total number of fields or what is going on with this? How can I fix it?

type
  Punz_file_info_s = ^unz_file_info_s;

  unz_file_info_s = record
    version: Integer;
    version_needed: Integer;
    flag: Integer;
    compression_method: Integer;
    dosDate: Integer;
    crc: Integer;
    compressed_size: Integer;
    uncompressed_size: Integer;
    size_filename: Integer;
    size_file_extra: Integer;
    size_file_comment: Integer;
    disk_num_start: Integer;
    internal_fa: Integer;
  end;

  unz_file_info = unz_file_info_s;
neslib commented 10 months ago

I created a simple .h file with just the struct you mentioned above. When I translate this using version 1.4.1 of Chet, I get the following output (as expected):

unit test;
{ This unit is automatically generated by Chet:
  https://github.com/neslib/Chet }

{$MINENUMSIZE 4}

interface

const
  {$IF Defined(WIN32)}
  LIB_TEST = 'Test_win32.dll';
  _PU = '';
  {$ELSE}
    {$MESSAGE Error 'Unsupported platform'}
  {$ENDIF}

type
  // Forward declarations
  Punz_file_info_s = ^unz_file_info_s;

  unz_file_info_s = record
    version: Integer;
    version_needed: Integer;
    flag: Integer;
    compression_method: Integer;
    dosDate: Integer;
    crc: Integer;
    compressed_size: Integer;
    uncompressed_size: Integer;
    size_filename: Integer;
    size_file_extra: Integer;
    size_file_comment: Integer;
    disk_num_start: Integer;
    internal_fa: Integer;
    external_fa: Integer;
    tmu_date: Integer;
  end;

  unz_file_info = unz_file_info_s;

implementation

end.

It correctly translated all the fields in the struct. Can you create a reproducible scenario, or send me the complete project?

jarroddavis68 commented 10 months ago

Ahh, I think I see what is going on. It would seem the post processing script command CreateDynamicImport(0) is causing the issue. I will look into this. Sorry for the confusion. In my project I had it defined.

jarroddavis68 commented 10 months ago

Ok, I've identified the source of the problem, until I can issue a PR, if you are using post processing, just replace: RemoveAllLines('external', 2); with RemoveAllLines('external ', 2); in function TScriptStringList.CreateDynamicImport(aType: Integer): Boolean;