home *** CD-ROM | disk | FTP | other *** search
/ Total Destruction / Total_Destruction.iso / addons / Lccwin32.exe / Lccwin32 / lccpub / src / string.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-11-11  |  4.7 KB  |  125 lines

  1. #include "c.h"
  2.  
  3. static struct string {
  4.     char *str;
  5.     int len;
  6.     struct string *link;
  7. } *buckets[1024];
  8. static unsigned scatter[] = { /* Map characters to random values */
  9.      3376649973u, 2288603946u, 1954268477u, 2858154129u, 3254987376u,
  10.      1888560329u, 2079711150u, 1249903931u, 2056019508u, 3475721719u,
  11.      2183608578u, 1948585191u, 3510366957u,  479341015u,  137912281u,
  12.      1856397162u,  701025146u, 3777855647u, 3133726730u, 4113368641u,
  13.       251772918u, 2859869442u,  824540103u,  614317204u, 3085688794u,
  14.      1104489690u, 3600905459u, 1036657084u, 1960148944u, 2441465117u,
  15.      3633092952u, 1202079507u, 1804386472u, 3798190281u, 2511419699u,
  16.      1032473403u, 3235883220u, 2593233477u, 2484192352u, 1834174643u,
  17.      3630460796u, 3436981729u,  876656665u, 1144446061u, 2179315054u,
  18.      2142937421u, 1163901871u,  703364539u, 1635510196u, 1558480853u,
  19.      3800782692u,  604753589u, 3558571372u,  274373881u,  183696063u,
  20.      4013401969u, 3787387983u,  551169993u, 2706792174u,  475596077u,
  21.       784566245u, 2043924368u, 1567342084u, 3331009165u,  150886268u,
  22.       596437426u, 2420547845u, 2898343441u, 1643521607u, 1387052253u,
  23.       691524517u, 1709282085u, 2105726706u,  326318904u, 2270893751u,
  24.      1547094850u,  273913063u, 1180303327u, 1015098316u, 1122706416u,
  25.      1025137522u, 1445737386u, 3992079916u, 3230843455u, 3002906788u,
  26.      3543652723u, 1755107124u, 1921014418u,  683842306u, 2503306554u,
  27.      3688139822u, 3812611237u, 3363198012u, 1643682998u,  285631714u,
  28.      1910683492u, 4281003621u, 3709237568u, 2736065042u, 1422760317u,
  29.       862182498u, 2248178396u, 3197393735u, 3974531276u,  157092128u,
  30.      3859796014u,  851355354u, 2511336234u, 3700246600u,  572627716u,
  31.      1519995253u,  342913937u,  328362706u, 3497158594u,  739312110u,
  32.      1482159142u, 4059308452u, 1115275813u, 2279798033u, 3563459711u,
  33.       102382981u,  698626900u, 2506327534u, 2223405777u, 1827275406u,
  34.       159038005u, 4159863896u, 3470995235u,  130302168u, 1077990744u,
  35.      1441602901u, 2757433577u,  200115595u,  993264331u, 2598999266u,
  36.      3842878136u, 3530540372u, 1361428823u,  248277624u, 1339695154u,
  37.       432480863u, 2895143187u, 3166708344u, 2393286685u, 4271569970u,
  38.       869342786u,  473223354u,  126812611u, 3904940903u, 1637555894u,
  39.       996061127u, 1088298011u, 2952176066u, 2858912209u, 4228613491u,
  40.      4236158822u, 2582423590u, 2525024672u, 3677112391u, 3629698756u,
  41.      1496034522u, 2081171139u, 2352170546u,  176561938u, 3553901024u,
  42.      1142683711u, 2409311685u,  672560988u, 3693784086u,  689665476u,
  43.      1992869305u, 2102947696u, 1890679203u, 2387696458u, 1988263978u,
  44.      1536664131u,  768867302u, 2456175399u, 3136223828u,  202652382u,
  45.      4142812934u,  245277491u, 2630667112u,  240720193u, 2395371056u,
  46.       707955862u, 4095017737u, 3236774548u, 3681653056u, 3285235880u,
  47.       807411619u,  721125152u, 2671591148u, 4255706610u, 1694083953u,
  48.      3615121285u, 2744541524u, 2146568054u,  432941567u, 1070843254u,
  49.      2173029527u, 3630977578u, 3297023538u,   77429635u, 4131306785u,
  50.      1890732898u, 2010001485u, 1144304337u, 1673699809u, 1335369816u,
  51.      3596270401u, 3614930280u,  170584627u,  190006287u, 1491467787u,
  52.       821380901u,  196708749u,  986375533u, 3133295550u, 2991205574u,
  53.      3983654535u, 3338932148u, 2374084740u, 4292366978u, 3657247497u,
  54.      3856158535u, 1497347358u, 3204988225u, 2733738804u, 1120807021u,
  55.       450893717u, 2518878143u,   55245244u,  435713941u,  688959256u,
  56.      3878081060u, 3828717777u, 2111290183u, 3684667667u,  147090689u,
  57.       671188737u, 1379556449u, 1326383789u, 1628432838u,  462410620u,
  58.       544713991u, 1591539421u, 2938270133u, 1902128118u,  560215823u,
  59.      4293430683u, 1041753686u, 1365246147u, 2681506285u,  500008709u,
  60.      1129892475u
  61. };
  62. char *string(char *str)
  63. {
  64.     char *s;
  65.  
  66.     for (s = str; *s; s++)
  67.         ;
  68.     return stringn(str, s - str);
  69. }
  70. char *stringd(int n)
  71. {
  72.     char str[25], *s = str + sizeof (str);
  73.     unsigned m;
  74.  
  75.     if (n == INT_MIN)
  76.         m = (unsigned)INT_MAX + 1;
  77.     else if (n < 0)
  78.         m = -n;
  79.     else
  80.         m = n;
  81.     do
  82.         *--s = (char)(m%10 + '0');
  83.     while ((m /= 10) != 0);
  84.     if (n < 0)
  85.         *--s = '-';
  86.     return stringn(s, str + sizeof (str) - s);
  87. }
  88. char *stringn(char *str,int len)
  89. {
  90.     int i;
  91.     unsigned int h;
  92.     char *end;
  93.     struct string *p;
  94.  
  95.     assert(str);
  96.     for (h = 0, i = len, end = str; i > 0; i--)
  97.         h = (h>>1) ^ scatter[*(unsigned char *)end++];
  98.     h &= NELEMS(buckets)-1;
  99.     i = *str;
  100.     for (p = buckets[h]; p; p = p->link)
  101.         if (len == p->len &&
  102.             (char)i == *p->str &&
  103.             !memcmp(str,p->str,len)) {
  104.             return p->str;
  105.         }
  106.     {
  107.         static char *next, *strlimit;
  108.         if (next + len + 1 >= strlimit) {
  109.             int n = len + 4*1024;
  110.             next = allocate(n, PERM);
  111.             strlimit = next + n;
  112.         }
  113.         NEW(p, PERM);
  114.         p->len = len;
  115.         p->str = next;
  116.         memcpy(next,str,len);
  117.         next += len;
  118.         *next++ = 0;
  119.         p->link = buckets[h];
  120.         buckets[h] = p;
  121.         return p->str;
  122.     }
  123. }
  124.  
  125.