mem.c

来自「用VHDL语言实现的ARM处理器的标准内核的源代码程序」· C语言 代码 · 共 226 行

C
226
字号
/* 2003: Konrad Eisele <eiselekd@web.de> */
#include <stdlib.h>
#include "tmki.h"

/* ----------------------------- general mem alloc --------------------------------------*/

void ti_free(void *m) {
  if (m != NULL)
    free(m);
}

void *ti_alloc(size_t c) {
    void *r;
    if (c < 1) c = 1;
    r = (void *)malloc(c);
    if (r) memset(((char *)r) , 0, c);
    if (!r) ti_print_err("tmki: ti_alloc(%i) failed -- out of memory",c);
    return r;
}

void *ti_realloc(void *o,size_t oc,size_t nc) {
    void *r;
    if (nc < 1) nc = 1;
    if (oc < 1) oc = 1;
    r = (void *)realloc((char *)o, nc);
    if (nc > oc && r) memset(((char *)r) + oc, 0, nc - oc);
    if (!r) ti_print_err("tmki: ti_realloc(%x,%i,%i) failed -- out of memory",o,oc,nc);
    return (r);
}

/* ------------------------- fixed size bitmap memory allocator ---------------------------*/

static ti_memf_chnk *ti_memf_addchunk (ti_memf_ctrl *ctrl) {
  
  ti_memf_chnk *c;
  unsigned int oe = TI_MEMALIGN(sizeof(ti_memf_chnk) + (TI_ALIGN(ctrl ->cc,8)/8));
  unsigned int cs = oe + (ctrl ->cc * ctrl ->es);
  
  if ((c = (ti_memf_chnk *) ti_alloc(cs)) == NULL)
    return NULL;
  
  if (ctrl ->c == NULL) {
    ctrl ->c = c;
    c ->n = c;
  }  else {
    c ->n = ctrl ->c ->n;
    ctrl ->c ->n = c;
  }
  c ->cs = cs;
  c ->oe = oe;
  c ->cc = ctrl ->cc;
  c ->f = ctrl ->cc;
  return c;
}

ti_memf_ctrl *ti_memf_init (unsigned  int es, unsigned  int cc) {
  
  ti_memf_ctrl *ctrl;
  if ((ctrl = ti_alloc(sizeof(ti_memf_ctrl))) == NULL)
    return NULL;
  
  ctrl ->cc = cc;
  ctrl ->es = TI_MEMALIGN(es);
  ti_memf_addchunk(ctrl);
  return ctrl;
}

void ti_memf_free(ti_memf_ctrl *ctrl) {
  
  ti_memf_chnk *p,*f;
  if ((p = ctrl ->c) == NULL)
    return;
  
  do {
    f = p;
    p = p ->n;
    ti_free(f);
  } while (ctrl ->c != p);
  
  ti_free (ctrl);
}

void *ti_memf_get (ti_memf_ctrl *ctrl) {
  ti_memf_chnk *p;
  unsigned char m;
  unsigned long b;
  unsigned int i;
  
  if (ctrl ->f == 0) {
    if (ti_memf_addchunk(ctrl) == NULL)
      return NULL;
  }
   
  p = ctrl ->c;
  while (1) {
    if (p ->f) {
      ctrl ->c = p;
      i = p ->c;
      b = TI_PTRADD(p,sizeof(ti_memf_chnk));
      while (1) {
	if ((++i) >= p ->cc)
	  i = 0;
	m = ((unsigned char)0x80)>>(i & 7);
	if ((((unsigned char*)b)[(i)/8] & m) == 0) {
	  p ->c = i;
	  p ->f--;
	  ctrl ->f--;
	  ((unsigned char*)b)[(i)/8] |= m;
	  b = TI_PTRADD(p,p->oe+(ctrl->es * i));
	  return (void *)b;
	}
      }
    }
    p = p ->n;
  }
}

/* ------------------------- stringbuffer ---------------------------*/

static int rand_tabel[] = {	// map characters to random values 
	2078917053, 143302914, 1027100827, 1953210302, 755253631,
	2002600785, 1405390230, 45248011, 1099951567, 433832350,
	2018585307, 438263339, 813528929, 1703199216, 618906479,
	573714703,  766270699, 275680090, 1510320440, 1583583926,
	1723401032, 1965443329, 1098183682, 1636505764, 980071615,
	1011597961, 643279273, 1315461275, 157584038, 1069844923,
	471560540,  89017443, 1213147837, 1498661368, 2042227746,
	1968401469, 1353778505, 1300134328, 2013649480, 306246424,
	1733966678, 1884751139, 744509763, 400011959, 1440466707,
	1363416242, 973726663, 59253759, 1639096332, 336563455,
	1642837685, 1215013716, 154523136, 593537720, 704035832,
	1134594751, 1605135681, 1347315106, 302572379, 1762719719,
	269676381,  774132919, 1851737163, 1482824219, 125310639,
	1746481261, 1303742040, 1479089144, 899131941, 1169907872,
	1785335569, 485614972, 907175364, 382361684, 885626931,
	200158423,  1745777927, 1859353594, 259412182, 1237390611,
	48433401,   1902249868, 304920680, 202956538, 348303940,
	1008956512, 1337551289, 1953439621, 208787970, 1640123668,
	1568675693, 478464352, 266772940, 1272929208, 1961288571,
	392083579,  871926821, 1117546963, 1871172724, 1771058762,
	139971187,  1509024645, 109190086, 1047146551, 1891386329,
	994817018,  1247304975, 1489680608, 706686964, 1506717157,
	579587572,  755120366, 1261483377, 884508252, 958076904,
	1609787317, 1893464764, 148144545, 1415743291, 2102252735,
	1788268214, 836935336, 433233439, 2055041154, 2109864544,
	247038362,  299641085, 834307717, 1364585325, 23330161,
	457882831,  1504556512, 1532354806, 567072918, 404219416,
	1276257488, 1561889936, 1651524391, 618454448, 121093252,
	1010757900, 1198042020, 876213618, 124757630, 2082550272,
	1834290522, 1734544947, 1828531389, 1982435068, 1002804590,
	1783300476, 1623219634, 1839739926, 69050267, 1530777140,
	1802120822, 316088629, 1830418225, 488944891, 1680673954,
	1853748387, 946827723, 1037746818, 1238619545, 1513900641,
	1441966234, 367393385, 928306929, 946006977, 985847834,
	1049400181, 1956764878, 36406206, 1925613800, 2081522508,
	2118956479, 1612420674, 1668583807, 1800004220, 1447372094,
	523904750,  1435821048, 923108080, 216161028, 1504871315,
	306401572,  2018281851, 1820959944, 2136819798, 359743094,
	1354150250, 1843084537, 1306570817, 244413420, 934220434,
	672987810,  1686379655, 1301613820, 1601294739, 484902984,
	139978006,  503211273, 294184214, 176384212, 281341425,
	228223074,  147857043, 1893762099, 1896806882, 1947861263,
	1193650546, 273227984, 1236198663, 2116758626, 489389012,
	593586330,  275676551, 360187215, 267062626, 265012701,
	719930310,  1621212876, 2108097238, 2026501127, 1865626297,
	894834024,  552005290, 1404522304, 48964196, 5816381,
	1889425288, 188942202, 509027654, 36125855, 365326415,
	790369079,  264348929, 513183458, 536647531, 13672163,
	313561074,  1730298077, 286900147, 1549759737, 1699573055,
	776289160,  2143346068, 1975249606, 1136476375, 262925046,
	92778659,   1856406685, 1884137923, 53392249, 1735424165,
	1602280572
};

static unsigned int 
hash_func(const char *s,int c,int m) {

	unsigned int v = 0;
	while (c--) 
		v += (v << 1) + rand_tabel[((unsigned char*)(s))[c]];
	return v & (m-1);
}

static unsigned int 
hash_func2(const char *arKey, unsigned int nKeyLength, int m) {

	int h = 0, g;
	const char *arEnd=arKey+nKeyLength;
	
	while (arKey < arEnd) {
		h = (h << 4) + *arKey++;
		if ((g = (h & 0xF0000000))) {
			h = h ^ (g >> 24);
			h = h ^ g;
		}
	}
	return h & (m-1);
}

ti_strbuf_ctrl *ti_strbuf_init(int hs) {  
  unsigned int i = 1;
  ti_strbuf_ctrl *ctrl;
  while (i < hs)
    i = i << 1;
  if ((ctrl = (ti_strbuf_ctrl *)ti_alloc(sizeof(ti_strbuf_ctrl))) == NULL)
    return NULL;
  
  ctrl ->hs = i;
  i *= sizeof(ti_strbuf_he *);
  if (((ctrl ->h = (ti_strbuf_he **) ti_alloc(i)) == NULL) ||
      ((ctrl ->m = ti_memf_init(sizeof(ti_strbuf_he),256)) == NULL)) {
    ti_free(ctrl ->h);
    ti_free(ctrl);
    return NULL;
  }
  
  return ctrl;
}

void ti_strbuf_free (ti_strbuf_ctrl *ctrl) {
  if (ctrl == NULL) return;  
  ti_memf_free(ctrl ->m);
  ti_free (ctrl ->h);
  ti_free (ctrl);
}

⌨️ 快捷键说明

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