Hi,

I am translating parts of the libpurple headers. Now I seem to have a
problem with this:


typedef enum
{
        PURPLE_PLUGIN_UNKNOWN  = -1,  /**< Unknown type.    */
        PURPLE_PLUGIN_STANDARD = 0,   /**< Standard plugin. */
        PURPLE_PLUGIN_LOADER,         /**< Loader plugin.   */
        PURPLE_PLUGIN_PROTOCOL        /**< Protocol plugin. */

} PurplePluginType;


typedef int PurplePluginPriority;


struct _PurplePluginInfo
{
        unsigned int magic;
        unsigned int major_version;
        unsigned int minor_version;
        PurplePluginType type;               // <-- maybe this is the problem?
        char *ui_requirement;
        unsigned long flags;
        GList *dependencies;
        PurplePluginPriority priority;

        char *id;
        char *name;
        char *version;
        char *summary;
        char *description;
        char *author;
        char *homepage;

        /**
         * If a plugin defines a 'load' function, and it returns FALSE,
         * then the plugin will not be loaded.
         */
        gboolean (*load)(PurplePlugin *plugin);
        gboolean (*unload)(PurplePlugin *plugin);
        void (*destroy)(PurplePlugin *plugin);

        void *ui_info; /**< Used only by UI-specific plugins to build a
preference screen with a custom UI */
        void *extra_info;
        PurplePluginUiInfo *prefs_info; /**< Used by any plugin to display
preferences.  If #ui_info has been specified, this will be ignored. */

        /**
         * This callback has a different use depending on whether this
         * plugin type is PURPLE_PLUGIN_STANDARD or PURPLE_PLUGIN_PROTOCOL.
         *
         * If PURPLE_PLUGIN_STANDARD then the list of actions will show up
         * in the Tools menu, under a submenu with the name of the plugin.
         * context will be NULL.
         *
         * If PURPLE_PLUGIN_PROTOCOL then the list of actions will show up
         * in the Accounts menu, under a submenu with the name of the
         * account.  context will be set to the PurpleConnection for that
         * account.  This callback will only be called for online accounts.
         */
        GList *(*actions)(PurplePlugin *plugin, gpointer context);

        void (*_purple_reserved1)(void);
        void (*_purple_reserved2)(void);
        void (*_purple_reserved3)(void);
        void (*_purple_reserved4)(void);
};



I have translated it as follows:


{$calling cdecl}

type
  TPurplePluginType = (
    PURPLE_PLUGIN_UNKNOWN  := -1,  // Unknown type.
    PURPLE_PLUGIN_STANDARD := 0,   // Standard plugin.
    PURPLE_PLUGIN_LOADER,          // Loader plugin.
    PURPLE_PLUGIN_PROTOCOL         // Protocol plugin.
  );

  TPurplePluginPriority = Integer;

  TPurplePluginInfo = packed record
    magic: Integer;
    major_version: Integer;
    minor_version: Integer;
    plugintype: TPurplePluginType;
    ui_requirement: PChar;
    flags: LongInt;
    dependencies: PGList;
    priority: TPurplePluginPriority;
    id: PChar;
    name: PChar;
    version: PChar;
    summary: PChar;
    description: PChar;
    author: PChar;
    homepage: PChar;
    load: function(plugin: PPurplePlugin): GBoolean;
    unload: function(plugin: PPurplePlugin): GBoolean;
    destroy: procedure(plugin: PPurplePlugin);
    ui_info: Pointer;
    extra_info: Pointer;
    prefs_info: PPurplePluginUiInfo;
    actions: function(plugin: PPurplePlugin; context: Pointer): PGList;

    _purple_reserved1: Pointer;
    _purple_reserved2: Pointer;
    _purple_reserved3: Pointer;
    _purple_reserved4: Pointer;
  end;

This works perfectly well on windows 32 bit and Linux 32 bit but today
someone helped me compile it on linux x86_64 and from the debug output
of libpurple it seems that when I pass it this record initialized with
my values it *can* detect that plugintype is set to
PURPLE_PLUGIN_PROTOCOL because then it will try to read extra_info and
it thinks it is null, probably it is off a few bytes.

I cannot test this myself because I don't have a 64 bit Linux. When an
experienced programmer (should be most on this list) looks at this
header what is the obvious thing that might break it on 64 bit?
Pointers should be ok, but what is with int and Integer and what is
with enums? And are there maybe also certain compiler switches that
influence it?  What might be wrong?

Bernd
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to