e576bb2002-10-11Martin Nilsson /* || This file is part of Pike. For copyright information see COPYRIGHT. || Pike is distributed under GPL, LGPL and MPL. See the file COPYING || for more information.
559b5f2004-11-14Martin Stjernholm || $Id: stuff.c,v 1.23 2004/11/14 18:03:50 mast Exp $
e576bb2002-10-11Martin Nilsson */
24ddc71998-03-28Henrik Grubbström (Grubba) 
ad42b81999-02-27Henrik Grubbström (Grubba) #include "global.h"
5267b71995-08-09Fredrik Hübinette (Hubbe) #include "stuff.h"
ad42b81999-02-27Henrik Grubbström (Grubba) #include "stralloc.h"
5267b71995-08-09Fredrik Hübinette (Hubbe) 
559b5f2004-11-14Martin Stjernholm /* Used by is8bitalnum in pike_macros.h. */ PMOD_EXPORT const char Pike_is8bitalnum_vector[] = "0000000000000000" "0000000000000000" "0000000000000000" "1111111111000000" "0111111111111111" "1111111111100001" "0111111111111111" "1111111111100000" "0000000000000000" "0000000000000000" "1011110101100010" "1011011001101110" "1111111111111111" "1111111011111111" "1111111111111111" "1111111011111111";
75920f1997-12-28Fredrik Hübinette (Hubbe) /* Not all of these are primes, but they should be adequate */
fc60d42004-06-01Martin Nilsson PMOD_EXPORT const INT32 hashprimes[32] =
75920f1997-12-28Fredrik Hübinette (Hubbe) { 31, /* ~ 2^0 = 1 */ 31, /* ~ 2^1 = 2 */ 31, /* ~ 2^2 = 4 */ 31, /* ~ 2^3 = 8 */ 31, /* ~ 2^4 = 16 */ 31, /* ~ 2^5 = 32 */ 61, /* ~ 2^6 = 64 */ 127, /* ~ 2^7 = 128 */ 251, /* ~ 2^8 = 256 */ 541, /* ~ 2^9 = 512 */ 1151, /* ~ 2^10 = 1024 */ 2111, /* ~ 2^11 = 2048 */ 4327, /* ~ 2^12 = 4096 */ 8803, /* ~ 2^13 = 8192 */ 17903, /* ~ 2^14 = 16384 */ 32321, /* ~ 2^15 = 32768 */ 65599, /* ~ 2^16 = 65536 */ 133153, /* ~ 2^17 = 131072 */ 270001, /* ~ 2^18 = 264144 */ 547453, /* ~ 2^19 = 524288 */ 1109891, /* ~ 2^20 = 1048576 */ 2000143, /* ~ 2^21 = 2097152 */ 4561877, /* ~ 2^22 = 4194304 */ 9248339, /* ~ 2^23 = 8388608 */ 16777215, /* ~ 2^24 = 16777216 */ 33554431, /* ~ 2^25 = 33554432 */ 67108863, /* ~ 2^26 = 67108864 */ 134217727, /* ~ 2^27 = 134217728 */ 268435455, /* ~ 2^28 = 268435456 */ 536870911, /* ~ 2^29 = 536870912 */ 1073741823,/* ~ 2^30 = 1073741824 */ 2147483647,/* ~ 2^31 = 2147483648 */ };
5267b71995-08-09Fredrik Hübinette (Hubbe) /* same thing as (int)floor(log((double)x) / log(2.0)) */ /* Except a bit quicker :) (hopefully) */
c7241b2000-08-10Henrik Grubbström (Grubba) PMOD_EXPORT int my_log2(size_t x)
5267b71995-08-09Fredrik Hübinette (Hubbe) {
fc60d42004-06-01Martin Nilsson  static const signed char bit[256] =
5267b71995-08-09Fredrik Hübinette (Hubbe)  {
5de4c12002-08-30Martin Nilsson  -1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
5267b71995-08-09Fredrik Hübinette (Hubbe)  };
c7241b2000-08-10Henrik Grubbström (Grubba)  register size_t tmp; #if SIZEOF_CHAR_P > 4 if((tmp=(x>>32))) { if((x=(tmp>>16))) { if((tmp=(x>>8))) return bit[tmp]+56; return bit[x]+48; } if((x=(tmp>>8))) return bit[x]+40; return bit[tmp]+32; } #endif /* SIZEOF_CHAP_P > 4 */
9c6f7d1997-04-15Fredrik Hübinette (Hubbe)  if((tmp=(x>>16)))
5267b71995-08-09Fredrik Hübinette (Hubbe)  {
9c6f7d1997-04-15Fredrik Hübinette (Hubbe)  if((x=(tmp>>8))) return bit[x]+24;
5267b71995-08-09Fredrik Hübinette (Hubbe)  return bit[tmp]+16; }
9c6f7d1997-04-15Fredrik Hübinette (Hubbe)  if((tmp=(x>>8))) return bit[tmp]+8;
5267b71995-08-09Fredrik Hübinette (Hubbe)  return bit[x]; } /* Return the number of bits in a 32-bit integer */
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT int count_bits(unsigned INT32 x)
5267b71995-08-09Fredrik Hübinette (Hubbe) { #define B(X) X+0,X+1,X+1,X+2,\ X+1,X+2,X+2,X+3,\ X+1,X+2,X+2,X+3,\ X+2,X+3,X+3,X+4
fc60d42004-06-01Martin Nilsson  static const char bits[256] =
5267b71995-08-09Fredrik Hübinette (Hubbe)  { B(0), B(1), B(1), B(2), B(1), B(2), B(2), B(3), B(1), B(2), B(2), B(3), B(2), B(3), B(3), B(4) }; return (bits[x & 255] + bits[(x>>8) & 255] + bits[(x>>16) & 255] + bits[(x>>24) & 255]); } /* Return true for integers with more than one bit set */
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT int is_more_than_one_bit(unsigned INT32 x)
5267b71995-08-09Fredrik Hübinette (Hubbe) {
a4f8b71999-03-24Henrik Grubbström (Grubba)  return !!(x & (x-1));
5267b71995-08-09Fredrik Hübinette (Hubbe) }
5740881998-01-01Fredrik Hübinette (Hubbe) 
1f21332000-07-28Fredrik Hübinette (Hubbe) PMOD_EXPORT double my_strtod(char *nptr, char **endptr)
5740881998-01-01Fredrik Hübinette (Hubbe) { double tmp=STRTOD(nptr,endptr); if(*endptr>nptr) { if(endptr[0][-1]=='.') endptr[0]--; } return tmp; }
a6b98a1999-02-27Henrik Grubbström (Grubba) 
cb5bfb2000-09-19Fredrik Hübinette (Hubbe) PMOD_EXPORT unsigned INT32 my_sqrt(unsigned INT32 n) { unsigned INT32 b, s, y=0; unsigned INT16 x=0;
5de4c12002-08-30Martin Nilsson 
cb5bfb2000-09-19Fredrik Hübinette (Hubbe)  for(b=1<<(sizeof(INT32)*8-2); b; b>>=2) { x<<=1; s=b+y; y>>=1; if(n>=s) { x|=1; y|=b; n-=s; } } return x; }
851b962001-08-31Fredrik Hübinette (Hubbe)  /* This routine basically finds a prime number * which is larger than 'x' */ unsigned long find_good_hash_size(unsigned long num) {
0729612002-04-30Martin Stjernholm  static const unsigned long primes[] =
851b962001-08-31Fredrik Hübinette (Hubbe)  {
5de4c12002-08-30Martin Nilsson  37UL, 37UL, 37UL, 37UL, 37UL, 37UL, 41UL, 41UL, 41UL, 41UL, 43UL, 43UL, 47UL, 47UL, 47UL, 47UL, 53UL, 53UL, 53UL, 53UL, 53UL, 53UL, 59UL, 59UL, 59UL, 59UL, 59UL, 59UL, 61UL, 61UL, 67UL, 67UL, 67UL, 67UL, 71UL, 71UL, 73UL, 79UL, 79UL, 79UL, 83UL, 83UL, 89UL, 89UL, 89UL, 97UL, 97UL, 97UL, 97UL, 101UL, 101UL, 103UL, 107UL, 107UL, 109UL, 113UL, 113UL, 127UL, 127UL, 127UL, 127UL, 127UL, 127UL, 127UL, 131UL, 137UL, 139UL, 149UL, 149UL, 151UL, 157UL, 163UL, 163UL, 167UL, 173UL, 179UL, 179UL, 191UL, 191UL, 191UL, 197UL, 199UL, 211UL, 211UL, 211UL, 223UL, 223UL, 223UL, 227UL, 233UL, 239UL, 239UL, 251UL, 251UL, 251UL, 257UL, 263UL, 271UL, 281UL, 293UL, 307UL, 307UL, 311UL, 331UL, 331UL, 337UL, 347UL, 353UL, 359UL, 367UL, 379UL, 383UL, 397UL, 401UL, 409UL, 419UL, 431UL, 431UL, 439UL, 449UL, 457UL, 463UL, 479UL, 479UL, 487UL, 499UL, 503UL, 521UL, 541UL, 547UL, 563UL, 577UL, 593UL, 607UL, 631UL, 641UL, 659UL, 673UL, 691UL, 709UL, 719UL, 739UL, 751UL, 769UL, 787UL, 809UL, 821UL, 839UL, 853UL, 863UL, 881UL, 907UL, 911UL, 929UL, 947UL, 967UL, 977UL, 991UL, 1009UL, 1031UL, 1061UL, 1087UL, 1123UL, 1151UL, 1187UL, 1217UL, 1249UL, 1279UL, 1319UL, 1361UL, 1381UL, 1409UL, 1439UL, 1471UL, 1511UL, 1543UL, 1567UL, 1601UL, 1637UL, 1663UL, 1697UL, 1733UL, 1759UL, 1801UL, 1823UL, 1861UL, 1889UL, 1931UL, 1951UL, 1987UL, 2017UL, 2053UL, 2111UL, 2179UL, 2239UL, 2309UL, 2371UL, 2437UL, 2503UL, 2579UL, 2633UL, 2687UL, 2753UL, 2819UL, 2879UL, 2953UL, 3011UL, 3079UL, 3137UL, 3203UL, 3271UL, 3329UL, 3391UL, 3457UL, 3527UL, 3583UL, 3659UL, 3719UL, 3779UL, 3847UL, 3907UL, 3967UL, 4049UL, 4099UL, 4229UL, 4357UL, 4481UL, 4621UL, 4751UL, 4871UL, 4993UL, 5119UL, 5261UL, 5381UL, 5503UL, 5639UL, 5779UL, 5897UL, 6029UL, 6143UL, 6271UL, 6421UL, 6529UL, 6659UL, 6791UL, 6911UL, 7039UL, 7177UL, 7297UL, 7433UL, 7559UL, 7681UL, 7817UL, 7937UL, 8069UL, 8191UL, 8447UL, 8707UL, 8963UL, 9221UL, 9473UL, 9733UL, 10007UL, 10243UL, 10499UL, 10753UL, 11027UL, 11273UL, 11519UL, 11777UL, 12037UL, 12289UL, 12547UL, 12799UL, 13063UL, 13313UL, 13567UL, 13829UL, 14081UL, 14341UL, 14591UL, 14851UL, 15107UL, 15359UL, 15619UL, 15877UL, 16127UL, 16411UL, 16901UL, 17417UL, 17921UL, 18433UL, 18947UL, 19457UL, 19973UL, 20479UL, 21001UL, 21503UL, 22027UL, 22531UL, 23039UL, 23557UL, 24071UL, 24593UL, 25087UL, 25601UL, 26111UL, 26627UL, 27143UL, 27647UL, 28163UL, 28687UL, 29191UL, 29717UL, 30211UL, 30727UL, 31231UL, 31751UL, 32257UL, 32771UL, 33791UL, 34819UL, 35839UL, 36871UL, 37889UL, 38917UL, 39937UL, 40961UL, 41983UL, 43013UL, 44041UL, 45061UL, 46091UL, 47111UL, 48131UL, 49157UL, 50177UL, 51199UL, 52223UL, 53267UL, 54277UL, 55313UL, 56333UL, 57347UL, 58367UL, 59393UL, 60427UL, 61441UL, 62467UL, 63487UL, 64513UL, 65537UL, 67589UL, 69653UL, 71693UL, 73727UL, 75781UL, 77839UL, 79873UL, 81919UL, 83969UL, 86017UL, 88069UL, 90121UL, 92173UL, 94207UL, 96259UL, 98317UL, 100357UL, 102407UL, 104459UL, 106501UL, 108553UL, 110597UL, 112643UL, 114689UL, 116741UL, 118787UL, 120833UL, 122887UL, 124951UL, 126989UL, 129023UL, 131071UL, 135173UL, 139267UL, 143387UL, 147457UL, 151553UL, 155653UL, 159763UL, 163841UL, 167953UL, 172031UL, 176129UL, 180233UL, 184321UL, 188417UL, 192529UL, 196613UL, 200713UL, 204803UL, 208907UL, 212999UL, 217111UL, 221197UL, 225287UL, 229393UL, 233477UL, 237571UL, 241663UL, 245759UL, 249857UL, 253951UL, 258061UL, 262147UL, 270337UL, 278543UL, 286721UL, 294911UL, 303119UL, 311299UL, 319489UL, 327689UL, 335879UL, 344083UL, 352267UL, 360457UL, 368647UL, 376837UL, 385027UL, 393241UL, 401407UL, 409609UL, 417793UL, 425987UL, 434179UL, 442367UL, 450563UL, 458789UL, 466951UL, 475141UL, 483337UL, 491527UL, 499711UL, 507907UL, 516127UL, 524287UL, 540677UL, 557057UL, 573451UL, 589829UL, 606223UL, 622603UL, 638977UL, 655373UL, 671743UL, 688133UL, 704521UL, 720899UL, 737279UL, 753677UL, 770047UL, 786431UL, 802829UL, 819229UL, 835591UL, 851971UL, 868369UL, 884743UL, 901133UL, 917503UL, 933893UL, 950281UL, 966659UL, 983063UL, 999431UL, 1015813UL, 1032191UL, 1048583UL, 1081351UL, 1114111UL, 1146881UL, 1179649UL, 1212427UL, 1245187UL, 1277957UL, 1310719UL, 1343491UL, 1376257UL, 1409027UL, 1441807UL, 1474559UL, 1507369UL, 1540109UL, 1572869UL, 1605631UL, 1638431UL, 1671191UL, 1703941UL, 1736711UL, 1769473UL, 1802239UL, 1835017UL, 1867783UL, 1900543UL, 1933331UL, 1966079UL, 1998881UL, 2031671UL, 2064389UL, 2097169UL, 2162717UL, 2228243UL, 2293771UL, 2359303UL, 2424833UL, 2490377UL, 2555911UL, 2621447UL, 2686979UL, 2752513UL, 2818103UL, 2883593UL, 2949119UL, 3014659UL, 3080237UL, 3145739UL, 3211279UL, 3276799UL, 3342341UL, 3407881UL, 3473419UL, 3538949UL, 3604481UL, 3670027UL, 3735553UL, 3801097UL, 3866623UL, 3932167UL, 3997723UL, 4063237UL, 4128767UL, 4194319UL, 4325389UL, 4456451UL, 4587533UL, 4718617UL, 4849687UL, 4980749UL, 5111833UL, 5242883UL, 5373971UL, 5505023UL, 5636123UL, 5767169UL, 5898253UL, 6029329UL, 6160391UL, 6291469UL, 6422531UL, 6553621UL, 6684673UL, 6815749UL, 6946817UL, 7077893UL, 7208977UL, 7340033UL, 7471127UL, 7602187UL, 7733251UL, 7864331UL, 7995391UL, 8126473UL, 8257537UL, 8388617UL, 8650753UL, 8912921UL, 9175057UL, 9437189UL, 9699331UL, 9961487UL, 10223617UL, 10485767UL, 10747903UL, 11010059UL, 11272193UL, 11534351UL, 11796503UL, 12058679UL, 12320773UL, 12582917UL, 12845069UL, 13107229UL, 13369399UL, 13631489UL, 13893637UL, 14155777UL, 14417927UL, 14680063UL, 14942209UL, 15204391UL, 15466499UL, 15728681UL, 15990791UL, 16252967UL, 16515073UL, 16777259UL, 17301517UL, 17825791UL, 18350093UL, 18874367UL, 19398727UL, 19922993UL, 20447239UL, 20971529UL, 21495809UL, 22020127UL, 22544387UL, 23068673UL, 23592967UL, 24117257UL, 24641543UL, 25165843UL, 25690121UL, 26214401UL, 26738687UL, 27262997UL, 27787267UL, 28311553UL, 28835857UL, 29360147UL, 29884417UL, 30408713UL, 30933011UL, 31457287UL, 31981567UL, 32505901UL, 33030163UL, 33554467UL, 34603013UL, 35651593UL, 36700159UL, 37748743UL, 38797379UL, 39845887UL, 40894481UL, 41943049UL, 42991621UL, 44040253UL, 45088781UL, 46137359UL, 47185967UL, 48234517UL, 49283083UL, 50331653UL, 51380233UL, 52428841UL, 53477453UL, 54525979UL, 55574567UL, 56623153UL, 57671683UL, 58720267UL, 59768831UL, 60817411UL, 61865989UL, 62914619UL, 63963149UL, 65011717UL, 66060311UL, 67108879UL, 69206017UL, 71303171UL, 73400329UL, 75497479UL, 77594641UL, 79691779UL, 81788929UL, 83886091UL, 85983239UL, 88080389UL, 90177541UL, 92274737UL, 94371863UL, 96469001UL, 98566147UL, 100663319UL, 102760453UL, 104857601UL, 106954759UL, 109051903UL, 111149057UL, 113246209UL, 115343383UL, 117440551UL, 119537689UL, 121634819UL, 123731977UL, 125829139UL, 127926307UL, 130023431UL, 132120577UL, 134217757UL, 138412031UL, 142606357UL, 146800649UL, 150994979UL, 155189249UL, 159383563UL, 163577857UL, 167772161UL, 171966481UL, 176160779UL, 180355079UL, 184549429UL, 188743679UL, 192937991UL, 197132293UL, 201326611UL, 205520911UL, 209715199UL, 213909503UL, 218103811UL, 222298127UL, 226492433UL, 230686721UL, 234881033UL, 239075327UL, 243269639UL, 247463939UL, 251658263UL, 255852593UL, 260046847UL, 264241223UL, 268435459UL, 276824071UL, 285212677UL, 293601283UL, 301989917UL, 310378501UL, 318767107UL, 327155743UL, 335544323UL, 343932959UL, 352321547UL, 360710167UL, 369098771UL, 377487361UL, 385876021UL, 394264613UL, 402653189UL, 411041831UL, 419430419UL, 427819031UL, 436207619UL, 444596227UL, 452984849UL, 461373449UL, 469762049UL, 478150661UL, 486539323UL, 494927929UL, 503316511UL, 511705091UL, 520093703UL, 528482347UL, 536870923UL, 553648171UL, 570425377UL, 587202571UL, 603979799UL, 620757019UL, 637534277UL, 654311423UL, 671088667UL, 687865859UL, 704643083UL, 721420307UL, 738197503UL, 754974721UL, 771751961UL, 788529191UL, 805306457UL, 822083597UL, 838860817UL, 855638023UL, 872415239UL, 889192471UL, 905969671UL, 922746883UL, 939524129UL, 956301317UL, 973078537UL, 989855747UL, 1006632983UL, 1023410207UL, 1040187403UL, 1056964619UL, 1073741827UL, 1107296257UL, 1140850699UL, 1174405129UL, 1207959559UL, 1241514007UL, 1275068423UL, 1308622877UL, 1342177283UL, 1375731737UL, 1409286161UL, 1442840579UL, 1476395029UL, 1509949451UL, 1543503881UL, 1577058331UL, 1610612741UL, 1644167233UL, 1677721631UL, 1711276033UL, 1744830469UL, 1778384921UL, 1811939329UL, 1845493777UL, 1879048201UL, 1912602623UL, 1946157079UL, 1979711497UL, 2013265921UL, 2046820351UL, 2080374797UL, 2113929217UL, 2147483647UL, 2214592529UL, 2281701377UL, 2348810279UL, 2415919109UL, 2483027969UL, 2550136861UL, 2617245707UL, 2684354591UL, 2751463433UL, 2818572287UL, 2885681153UL, 2952790033UL, 3019898923UL, 3087007751UL, 3154116619UL, 3221225473UL, 3288334369UL, 3355443229UL, 3422552069UL, 3489660929UL, 3556769813UL, 3623878669UL, 3690987527UL, 3758096383UL, 3825205247UL, 3892314113UL, 3959422979UL, 4026531853UL,
0729612002-04-30Martin Stjernholm  4093640729UL, 4160749601UL, 4227858463UL
851b962001-08-31Fredrik Hübinette (Hubbe)  }; int shift=16; unsigned long cmp=0x1fffff; unsigned long x=num;
0729612002-04-30Martin Stjernholm  unsigned int y=0;
851b962001-08-31Fredrik Hübinette (Hubbe)  if(x<32) {
0729612002-04-30Martin Stjernholm  static const unsigned long lowprimes[32]={
38efee2001-09-01Fredrik Hübinette (Hubbe)  1,1,2,3,
851b962001-08-31Fredrik Hübinette (Hubbe)  5,5,7,7, 11,11,11,11, 13,13,17,17, 17,17,19,19, 23,23,23,23, 29,29,29,29, 29,29,31,31 }; return lowprimes[x]; } while(shift) { if(x>cmp) { y+=shift; x>>=shift; } shift>>=1; cmp>>=shift; } /* For really large numbers, produce a number which is not * a prime, but hopefully good for hash tables, although I * seriously doubt anybody will use hashtables larger than * 1<<32 entries... /Hubbe */
0729612002-04-30Martin Stjernholm  y = (y<<5)|(x&31); if(y >= NELEM(primes)) return num|7;
851b962001-08-31Fredrik Hübinette (Hubbe) 
0729612002-04-30Martin Stjernholm  return primes[y];
851b962001-08-31Fredrik Hübinette (Hubbe) }