Beispiel #1
0
/***********************9
 * Append data represented by ptr[0..size]
 */
void DtBuilder::nbytes(unsigned size, const char *ptr)
{
    if (!size)
        return;

    dt_t *dt;

    if (size < DTibytesMax)
    {   dt = dt_calloc(DT_ibytes);
        dt->DTn = size;
        memcpy(dt->DTdata,ptr,size);
    }
    else
    {
        dt = dt_calloc(DT_nbytes);
        dt->DTnbytes = size;
        dt->DTpbytes = (char *) MEM_PH_MALLOC(size);
        memcpy(dt->DTpbytes,ptr,size);
    }

    assert(!*pTail);
    *pTail = dt;
    pTail = &dt->DTnext;
    assert(!*pTail);
}
Beispiel #2
0
type *type_alloc_template(symbol *s)
{   type *t;

#if TX86
    t = (type *) mem_fcalloc(sizeof(typetemp_t));
#else
    t = (type *) MEM_PH_MALLOC(sizeof(typetemp_t));
    memset(t, 0, sizeof(typetemp_t));
#endif
    t->Tty = TYtemplate;
    if (s->Stemplate->TMprimary)
        s = s->Stemplate->TMprimary;
    ((typetemp_t *)t)->Tsym = s;
#if SRCPOS_4TYPES
    if (PARSER && config.fulltypes)
        t->Tsrcpos = getlinnum();
#endif
#ifdef DEBUG
    t->id = IDtype;
    type_num++;
    if (type_num > type_max)
        type_max = type_num;
    //dbg_printf("Alloc'ing template type %p ",t); WRTYxx(t->Tty); dbg_printf("\n");
#endif
    return t;
}
Beispiel #3
0
type *type_alloc(tym_t ty)
{   type *t;
    static type tzero;

    assert(tybasic(ty) != TYtemplate);
    if (type_list)
    {   t = type_list;
        type_list = t->Tnext;
    }
    else
#if TX86
        t = (type *) mem_fmalloc(sizeof(type));
#else
        t = (type *) MEM_PH_MALLOC(sizeof(type));
#endif
    tzero.Tty = ty;
    *t = tzero;
#if SRCPOS_4TYPES
    if (PARSER && config.fulltypes)
        t->Tsrcpos = getlinnum();
#endif
#ifdef DEBUG
    t->id = IDtype;
    type_num++;
    if (type_num > type_max)
        type_max = type_num;
#endif
    //dbg_printf("type_alloc() = %p ",t); WRTYxx(t->Tty); dbg_printf("\n");
    //if (t == (type*)0xB6B744) *(char*)0=0;
    return t;
}
Beispiel #4
0
param_t *param_calloc()
{
    static param_t pzero;
    param_t *p;

#if !TX86
    debug_assert(PARSER);
#endif
    if (param_list)
    {
        p = param_list;
        param_list = p->Pnext;
    }
    else
    {
#if TX86
        p = (param_t *) mem_fmalloc(sizeof(param_t));
#else
        p = (param_t *) MEM_PH_MALLOC(sizeof(param_t));
#endif
    }
    *p = pzero;
#ifdef DEBUG
    p->id = IDparam;
#endif
    return p;
}
Beispiel #5
0
/*****************************************
 * Write a reference to the data ptr[0..size+nzeros]
 */
void DtBuilder::abytes(tym_t ty, unsigned offset, unsigned size, const char *ptr, unsigned nzeros)
{
    dt_t *dt = dt_calloc(DT_abytes);
    dt->DTnbytes = size + nzeros;
    dt->DTpbytes = (char *) MEM_PH_MALLOC(size + nzeros);
    dt->Dty = ty;
    dt->DTabytes = offset;
    memcpy(dt->DTpbytes,ptr,size);
    if (nzeros)
        memset(dt->DTpbytes + size, 0, nzeros);

    assert(!*pTail);
    *pTail = dt;
    pTail = &dt->DTnext;
    assert(!*pTail);
}
Beispiel #6
0
/**************************************
 * Repeat a list of dt_t's count times.
 */
void DtBuilder::repeat(dt_t *dt, size_t count)
{
    if (!count)
        return;

    unsigned size = dt_size(dt);
    if (!size)
        return;

    if (dtallzeros(dt))
    {
        if (head && dtallzeros(head))
            head->DTazeros += size * count;
        else
            nzeros(size * count);
        return;
    }

    if (dtpointers(dt))
    {
        dt_t *dtp = NULL;
        dt_t **pdt = &dtp;
        for (size_t i = 0; i < count; ++i)
        {
            for (dt_t *dtn = dt; dtn; dtn = dtn->DTnext)
            {
                dt_t *dtx = dt_calloc(dtn->dt);
                *dtx = *dtn;
                dtx->DTnext = NULL;
                switch (dtx->dt)
                {
                    case DT_abytes:
                    case DT_nbytes:
                        dtx->DTpbytes = (char *) MEM_PH_MALLOC(dtx->DTnbytes);
                        memcpy(dtx->DTpbytes, dtn->DTpbytes, dtx->DTnbytes);
                        break;
                }

                *pdt = dtx;
                pdt = &dtx->DTnext;
            }
        }
        assert(!*pTail);
        *pTail = dtp;
        assert(*pdt == NULL);
        pTail = pdt;
        return;
    }

    char *p = (char *)MEM_PH_MALLOC(size * count);
    size_t offset = 0;

    for (dt_t *dtn = dt; dtn; dtn = dtn->DTnext)
    {
        switch (dtn->dt)
        {
            case DT_nbytes:
                memcpy(p + offset, dtn->DTpbytes, dtn->DTnbytes);
                offset += dtn->DTnbytes;
                break;
            case DT_ibytes:
                memcpy(p + offset, dtn->DTdata, dtn->DTn);
                offset += dtn->DTn;
                break;
            case DT_azeros:
                memset(p + offset, 0, dtn->DTazeros);
                offset += dtn->DTazeros;
                break;
            default:
#ifdef DEBUG
                printf("dt = %p, dt = %d\n",dt,dt->dt);
#endif
                assert(0);
        }
    }
    assert(offset == size);

    for (size_t i = 1; i < count; ++i)
    {
        memcpy(p + offset, p, size);
        offset += size;
    }

    dt_t *dtx = dt_calloc(DT_nbytes);
    dtx->DTnbytes = size * count;
    dtx->DTpbytes = p;


    assert(!*pTail);
    *pTail = dtx;
    pTail = &dtx->DTnext;
    assert(!*pTail);
}