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 + -
显示快捷键?