[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [MiNT] [Highwire] gcc4



On Mon, 06 Sep 2010 11:37:53 , Vincent Rivière <vincent.riviere@freesbee.fr> wrote:
> Peter Slegg wrote:
> >                  *((long **)p_answ)++/*[3..4]*/ = gsi_;
>
> Split that into 2 lines (untested):
> *((long **)p_answ)/*[3..4]*/ = gsi_;
> p_answ += 2;
>
> Still not type clean, but it will work as expected.
>

Those original lines were in a block of code that had two versions:

        case GS_REQUEST:
            {
            #if 1  /* an optimized version of the below original */
                const GS_INFO *sender;
                short answ[8], *p_answ = answ;
                long *gsi_ = (long *)gsi;

                *p_answ++              /*[0]*/ = GS_REPLY;
                *p_answ++              /*[1]*/ = gl_apid;
                *p_answ++              /*[2]*/ = 0;
/*                *((long **)p_answ)++ //[3..4]// = gsi_;  */
                *((long **)p_answ)     /*[3..4]*/ = gsi_;
                p_answ += 2;

                *gsi_++ = sizeof(GS_INFO);
                *gsi_++ = (0x0120L << 16) ¦ GSM_COMMAND;
                *gsi_   = 0L;
/*                *((long *)p_answ)++ //[5..6]// = 1;  */
                *((long *)p_answ)     /*[5..6]*/ = 1;
                p_answ += 2;
                *p_answ                /*[7]*/ = msg[7];

                sender = *(GS_INFO **)&msg[3];
                if (sender) {
                    if (sender->version >= 0x0070) {
                        *--p_answ/*[6]*/ = 0;
                        gsapp = msg[1];
                    }
                }
            #else
                const GS_INFO *sender = *(GS_INFO **)&msg[3];
                WORD answ[8];

                answ[0] = GS_REPLY;
                answ[1] = gl_apid;
                answ[2] = 0;
                answ[3] = 0;
                answ[4] = 0;
                answ[5] = 0;
                answ[6] = 1;
                answ[7] = msg[7];

                gsi->len = sizeof(GS_INFO);
                gsi->version = 0x0120;
                gsi->msgs = GSM_COMMAND;
                gsi->ext = 0L;

                *(const GS_INFO **)&answ[3] = gsi;

                if (sender)
                {
                    if (sender->version >= 0x0070)
                    {
                        answ[6] = 0;
                        gsapp = msg[1];
                    }
                }
            #endif

I tried the unoptimised version but I think it is causing HW to crash
so I have switched back to the optimised one that all recent betas
are using.

Now I am back to dealing with:

error: cast discards qualifiers from pointer target type
const char *cmd = *(const char **)&msg[3];

you would think that all those const would keep it happy ;-)

Peter