HL_PRIM int hl_hash_gen( const uchar *name, bool cache_name ) { int h = 0; const uchar *oname = name; while( *name ) { h = 223 * h + (unsigned)*name; name++; } h %= 0x1FFFFF7B; if( cache_name ) { hl_field_lookup *l = hl_lookup_find(hl_cache, hl_cache_count, h); // check for potential conflict (see haxe#5572) while( l && ucmp((uchar*)l->t,oname) != 0 ) { h++; l = hl_lookup_find(hl_cache, hl_cache_count, h); } if( l == NULL ) { if( hl_cache_size == hl_cache_count ) { // resize int newsize = hl_cache_size ? (hl_cache_size * 3) >> 1 : 16; hl_field_lookup *cache = (hl_field_lookup*)malloc(sizeof(hl_field_lookup) * newsize); memcpy(cache,hl_cache,sizeof(hl_field_lookup) * hl_cache_count); free(hl_cache); hl_cache = cache; hl_cache_size = newsize; } hl_lookup_insert(hl_cache,hl_cache_count++,h,(hl_type*)ustrdup(oname),0); } }
static unsigned int * subf(unsigned int *a, unsigned int *b) { int i, sign = 0; unsigned int c, *x; switch (ucmp(a, b)) { case 0: return mint(0); case 1: sign = MSIGN(a); /* |a| > |b| */ break; case -1: sign = -MSIGN(a); /* |a| < |b| */ x = a; a = b; b = x; break; } x = mnew(MLENGTH(a)); c = 0; for (i = 0; i < MLENGTH(b); i++) { x[i] = a[i] - b[i] - c; if (c) if (a[i] <= x[i]) c = 1; else c = 0; else if (a[i] < x[i]) c = 1; else c = 0; } for (i = MLENGTH(b); i < MLENGTH(a); i++) { x[i] = a[i] - c; if (a[i] < x[i]) c = 1; else c = 0; } for (i = MLENGTH(a) - 1; i > 0; i--) if (x[i]) break; MLENGTH(x) = i + 1; MSIGN(x) = sign; return x; }