mem.c

来自「ARP协议,含ARP」· C语言 代码 · 共 241 行

C
241
字号

#include "mem.h"
//#undef _AFILE_
//#define _AFILE_     0x24


//内存资源为临界共享资源
struct _mem_block mbs[MEM_BLK_NUM], *mb_head;

//应用中调用
void* alloc_mem (us len) {
    struct _mem_block *p;

    if (len > MEM_BLK_SIZE) {
        return NULL;
    }

    if (NULL == mb_head) {
        return NULL;
    }

    p = mb_head;
    mb_head = p->pnext;
    p->pnext = NULL;
    p->len = 0;

    return &(p->content[0]);
}

void free_mem (void *pf) {
    struct _mem_block *p;

    p = PMEM_BLOCK (pf);
    p->pnext = mb_head;
    p->len = 0;
    mb_head = p;
}

void* alloc_mb (void) {
    struct _mem_block *p;

    if (NULL == mb_head) {
        return NULL;
    }

    p = mb_head;
    mb_head = p->pnext;

    p->pnext = NULL;
    p->len = 0;

    return p;
}

void free_mb (struct _mem_block *p) {
    p->pnext = mb_head;
    p->len = 0;
    mb_head = p;
}

bool chk_mem (struct _mem_block *p) {
    uc i;

    for (i=0; i<MEM_BLK_NUM; i++) {
        if (p == &(mbs[i])) {
            return true;
        }
    }

    return false;
}

void init_mem (void) {
    uc i;

    memset (mbs, 0, sizeof (mbs));

    for (i=0; i<MEM_BLK_NUM-1; i++) {
        mbs[i].pnext = &(mbs[i+1]);
    }
    mbs[i].pnext = NULL;

    mb_head = &(mbs[0]);
}

void free_msg (struct _mem_block *p) {
    struct _mem_block *pf;

    while (NULL != p) {
        pf = p;
        p = p->pnext;

        free_mb (pf);
    }
}

us get_msg_len (struct _mem_block *p) {
    us len = 0;

    while (NULL != p) {
        len += p->len;
        p = p->pnext;
    }

    return len;
}

/*void print_msg_len (char ch, struct _mem_block *pm) {
    us i;

    put_char ('\r');
    put_char ('\n');
    put_char (ch);

    put_hex_2 (get_msg_len (pm));
    put_char ('.');

    for (i=0; i<14; i++) {
        put_hex (pm->content[i]);
        put_char (' ');
    }
    put_char ('.');
}

void print_msg (char ch, struct _mem_block *pm) {
    struct _mem_block *p;
    us i;

    put_char ('\r');
    put_char ('\n');
    put_char (ch);

    put_hex_2 (get_msg_len (pm));
    put_char ('.');

    for (p=pm; NULL!=p; p=p->pnext) {
        for (i=0; i<p->len; i++) {
            put_hex (p->content[i]);
            put_char (' ');
        }
        put_char ('.');
    }
}
*/

void copy_to_buf (struct _mem_block *pm, us start, uc *buf, us len) {
    us cl;

    //Assert (start < MEM_BLK_SIZE);
    //Assert (len < MEM_BLK_SIZE);

    if (start + len <= MEM_BLK_SIZE) {
        memcpy (buf, pm->content + start, len);
    } else {
        cl = MEM_BLK_SIZE - start;
        len -= cl;
        memcpy (buf, pm->content + start, cl);
        buf += cl;

        pm = pm->pnext;
        if (NULL != pm) {
            memcpy (buf, pm->content, len);
        } else ;
    }
}

void copy_from_buf (struct _mem_block *pm, us start, uc *buf, us len) {
    us cl;

    //Assert (start < MEM_BLK_SIZE);
    //Assert (len < MEM_BLK_SIZE);

    if (start + len <= MEM_BLK_SIZE) {
        memcpy (pm->content + start, buf, len);
    } else {
        cl = MEM_BLK_SIZE - start;
        len -= cl;
        memcpy (pm->content + start, buf, cl);
        buf += cl;

        pm = pm->pnext;
        if (NULL != pm) {
            memcpy (pm->content, buf, len);
        } else ;
    }
}

void *make_list_msg (us len) {
    struct _mem_block *ph, *p;
    us n, i;

    if (0 == len) {
        return NULL;
    }

    ph = NULL;
    n = 1 + ((len - 1) / MEM_BLK_SIZE);

    for (i=0; i<n; i++) {
      //  p = alloc_mb ();
        p=(struct _mem_block *) alloc_mb ();
        if (NULL == p) {
            free_msg (ph);
            return NULL;
        }
        p->pnext = ph;
        ph = p;
    }

    for (p=ph; NULL!=p; p=p->pnext) {
        p->len = MEM_BLK_SIZE;
        
        if (NULL == p->pnext) {
            p->len = len - (n - 1) * MEM_BLK_SIZE;
        }
    }

    return ph;
}


void print_msg (char ch, struct _mem_block *pm) {
    struct _mem_block *p;
    us i;

    put_char ('\r');
    put_char ('\n');
    put_char (ch);

    put_hex_2 (get_msg_len (pm));
    put_char ('.');

    for (p=pm; NULL!=p; p=p->pnext) {
        for (i=0; i<p->len; i++) {
            put_hex (p->content[i]);
            put_char (' ');
        }
        put_char ('.');
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?