OpenCores
URL https://opencores.org/ocsvn/core_arm/core_arm/trunk

Subversion Repositories core_arm

[/] [core_arm/] [trunk/] [soft/] [sim/] [ti/] [mem.c] - Rev 4

Compare with Previous | Blame | View Log

/* 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);
}
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.