forwarded 323792 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23458
thanks

Oops, forgot to attach the test case.

PS: I also submitted the bug upstream.

-- 
Kind regards,
+--------------------------------------------------------------------+
| Bas Zoetekouw              | GPG key: 0644fab7                     |
|----------------------------| Fingerprint: c1f5 f24c d514 3fec 8bf6 |
| [EMAIL PROTECTED], [EMAIL PROTECTED] |              a2b1 2bae e41f 0644 fab7 |
+--------------------------------------------------------------------+ 
typedef unsigned char byte;
typedef signed short gint16;
typedef unsigned int size_t;

typedef struct _resource_struct {
        unsigned char *data;
        unsigned int size;
} resource_t;

int
sciprintf(char *fmt, ...);

int
sci_hexdump(byte *data, int length, int offsetplus);

static inline gint16
getInt16(byte *d)
{
         return (gint16)(*d | (d[1] << 8));
}

static void
script_dump_class(char *data, int seeker, int objsize, char **snames, int 
snames_nr)
{
        int selectors, overloads, selectorsize;

        sci_hexdump((unsigned char *) data + seeker, objsize -4, seeker);

        selectors = (selectorsize = getInt16((unsigned char *) data + seeker + 
6));

        seeker += 8;
        selectorsize <<= 1;

        while (selectors--) {
                int selector = getInt16((unsigned char *) data + (seeker) + 
selectorsize);
                sciprintf("  [%03x] %s = 0x%x\n", 0xffff & selector,
                                (snames && selector >= 0 && selector < 
snames_nr)? snames[selector] : "<?>",
                                getInt16((unsigned char *) data + seeker) & 
0xffff);
                seeker += 2;
        }

        overloads = getInt16((unsigned char *) data + seeker);

        while (overloads--) {
                sciprintf("%04x\n", getInt16((unsigned char *) data + seeker + 
selectors*2 + 2) & 0xffff);
        }
}


void
script_dissect(void *resmgr, int res_no, char **snames, int snames_nr)
{
        int objectctr[11] = {0,0,0,0,0,0,0,0,0,0,0};
        unsigned int _seeker = 0;
        resource_t *script = 0;
        void **words;

        words=0;

        while (_seeker < script->size) {
                int objtype = getInt16(script->data + _seeker);
                int objsize;
                unsigned int seeker = _seeker + 4;

                if (!objtype) {
                        sciprintf("Classes: %i, Objects: %i, Export: %i,\n Var: 
%i (all base 10)",
                                        objectctr[6], objectctr[1], 
objectctr[7], objectctr[10]);

                        return;
                }

                objsize = getInt16(script->data + _seeker + 2);

                _seeker += objsize;

                objectctr[objtype]++;

                switch (objtype) {
                        case 1:
                                sci_hexdump(script->data + seeker, objsize -4, 
seeker);
                                break;

                        case 2:
                                script_dump_class ((char *) script->data, 
seeker, objsize, snames, snames_nr);
                                break;
                }

        }

}

Reply via email to