bernstein.inc 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628
  1. /**--------------------------------------------------------------------------**\
  2. ========================================
  3. y_stringhash - Fast string comparisons
  4. ========================================
  5. Description:
  6. Allows you to hash strings at compile time to use them in a switch.
  7. Legal:
  8. Version: MPL 1.1
  9. The contents of this file are subject to the Mozilla Public License Version
  10. 1.1 (the "License"); you may not use this file except in compliance with
  11. the License. You may obtain a copy of the License at
  12. http://www.mozilla.org/MPL/
  13. Software distributed under the License is distributed on an "AS IS" basis,
  14. WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  15. for the specific language governing rights and limitations under the
  16. License.
  17. The Original Code is the YSI stringhash include.
  18. The Initial Developer of the Original Code is Alex "Y_Less" Cole.
  19. Portions created by the Initial Developer are Copyright (C) 2011
  20. the Initial Developer. All Rights Reserved.
  21. Contributors:
  22. ZeeX, koolk, JoeBullet/Google63, g_aSlice/Slice
  23. Thanks:
  24. JoeBullet/Google63 - Handy arbitrary ASM jump code using SCTRL.
  25. ZeeX - Very productive conversations.
  26. koolk - IsPlayerinAreaEx code.
  27. TheAlpha - Danish translation.
  28. breadfish - German translation.
  29. Fireburn - Dutch translation.
  30. yom - French translation.
  31. 50p - Polish translation.
  32. Zamaroht - Spanish translation.
  33. Dracoblue, sintax, mabako, Xtreme, other coders - Producing other modes
  34. for me to strive to better.
  35. Pixels^ - Running XScripters where the idea was born.
  36. Matite - Pestering me to release it and using it.
  37. Very special thanks to:
  38. Thiadmer - PAWN, whose limits continue to amaze me!
  39. Kye/Kalcor - SA:MP.
  40. SA:MP Team past, present and future - SA:MP.
  41. Version:
  42. 2.0
  43. Changelog:
  44. 06/03/11:
  45. Changed the order of some letters to better support numbers in _I.
  46. 01/03/11:
  47. Rewrote compile-time hashes to not require commas.
  48. 25/10/10:
  49. Updated comments.
  50. Added to YSI 1.0.
  51. Added FNV1 and FNV1a hashes to avoid collisions.
  52. 19/08/10:
  53. First version.
  54. Functions:
  55. stock:
  56. YHash - Generate a string hash at run time.
  57. Definitions:
  58. _H - Generate a string hash at compile time.
  59. _I - Generate a case insensitive string hash at compile time.
  60. \**--------------------------------------------------------------------------**/
  61. /*
  62. 888b 88 ,ad8888ba, 88
  63. 8888b 88 d8"' `"8b 88
  64. 88 `8b 88 d8' 88
  65. 88 `8b 88 ,adPPYba, 8b db d8 88 ,adPPYYba, ,adPPYba, ,adPPYba, ,adPPYb,88
  66. 88 `8b 88 a8P_____88 `8b d88b d8' 88 "" `Y8 I8[ "" a8P_____88 a8" `Y88
  67. 88 `8b 88 8PP""""""" `8b d8'`8b d8' Y8, ,adPPPPP88 `"Y8ba, 8PP""""""" 8b 88
  68. 88 `8888 "8b, ,aa `8bd8' `8bd8' Y8a. .a8P 88, ,88 aa ]8I "8b, ,aa "8a, ,d88
  69. 88 `888 `"Ybbd8"' YP YP `"Y8888Y"' `"8bbdP"Y8 `"YbbdP"' `"Ybbd8"' `"8bbdP"Y8
  70. */
  71. // =============================
  72. // New syntax (case sensitive)
  73. // =============================
  74. #define hb:%9()
  75. // Scan prior string parts for the next letter, scan subsequent parts for the
  76. // same letter. The original string can be reconstructed by "%0%5%1".
  77. //
  78. // %0 - String before the current letter.
  79. // %1 - String after the current letter.
  80. //
  81. // %5 - The current letter.
  82. // %6 - The ASCII code for the current letter.
  83. //
  84. // %7 - Remainder.
  85. // %8 - Current sum.
  86. //
  87. #define H_Db(%0,%5,%1,%6) hb:H_Nb%5(%0)H_Sb:%6]hb:@B%5:H_Nb%5(%1)
  88. // Find the left-most pending sum component (will always be done first thanks to
  89. // pre-processor orderings) and add it on to the current running total.
  90. #define H_Sb:%6]%7|||%8||| %7|||(%8*33+%6)|||
  91. // Finish off the sum.
  92. #define H_Eb:|||%0||| %0
  93. // Test for the current character.
  94. #define @Ba:H_Nba(%1a%0)%7||| H_Db(%1,a,%0,97)%7|||
  95. #define @Bb:H_Nbb(%1b%0)%7||| H_Db(%1,b,%0,98)%7|||
  96. #define @Bc:H_Nbc(%1c%0)%7||| H_Db(%1,c,%0,99)%7|||
  97. #define @Bd:H_Nbd(%1d%0)%7||| H_Db(%1,d,%0,100)%7|||
  98. #define @Be:H_Nbe(%1e%0)%7||| H_Db(%1,e,%0,101)%7|||
  99. #define @Bf:H_Nbf(%1f%0)%7||| H_Db(%1,f,%0,102)%7|||
  100. #define @Bg:H_Nbg(%1g%0)%7||| H_Db(%1,g,%0,103)%7|||
  101. #define @Bh:H_Nbh(%1h%0)%7||| H_Db(%1,h,%0,104)%7|||
  102. #define @Bi:H_Nbi(%1i%0)%7||| H_Db(%1,i,%0,105)%7|||
  103. #define @Bj:H_Nbj(%1j%0)%7||| H_Db(%1,j,%0,106)%7|||
  104. #define @Bk:H_Nbk(%1k%0)%7||| H_Db(%1,k,%0,107)%7|||
  105. #define @Bl:H_Nbl(%1l%0)%7||| H_Db(%1,l,%0,108)%7|||
  106. #define @Bm:H_Nbm(%1m%0)%7||| H_Db(%1,m,%0,109)%7|||
  107. #define @Bn:H_Nbn(%1n%0)%7||| H_Db(%1,n,%0,110)%7|||
  108. #define @Bo:H_Nbo(%1o%0)%7||| H_Db(%1,o,%0,111)%7|||
  109. #define @Bp:H_Nbp(%1p%0)%7||| H_Db(%1,p,%0,112)%7|||
  110. #define @Bq:H_Nbq(%1q%0)%7||| H_Db(%1,q,%0,113)%7|||
  111. #define @Br:H_Nbr(%1r%0)%7||| H_Db(%1,r,%0,114)%7|||
  112. #define @Bs:H_Nbs(%1s%0)%7||| H_Db(%1,s,%0,115)%7|||
  113. #define @Bt:H_Nbt(%1t%0)%7||| H_Db(%1,t,%0,116)%7|||
  114. #define @Bu:H_Nbu(%1u%0)%7||| H_Db(%1,u,%0,117)%7|||
  115. #define @Bv:H_Nbv(%1v%0)%7||| H_Db(%1,v,%0,118)%7|||
  116. #define @Bw:H_Nbw(%1w%0)%7||| H_Db(%1,w,%0,119)%7|||
  117. #define @Bx:H_Nbx(%1x%0)%7||| H_Db(%1,x,%0,120)%7|||
  118. #define @By:H_Nby(%1y%0)%7||| H_Db(%1,y,%0,121)%7|||
  119. #define @Bz:H_Nbz(%1z%0)%7||| H_Db(%1,z,%0,122)%7|||
  120. #define @BA:H_NbA(%1A%0)%7||| H_Db(%1,A,%0,65)%7|||
  121. #define @BB:H_NbB(%1B%0)%7||| H_Db(%1,B,%0,66)%7|||
  122. #define @BC:H_NbC(%1C%0)%7||| H_Db(%1,C,%0,67)%7|||
  123. #define @BD:H_NbD(%1D%0)%7||| H_Db(%1,D,%0,68)%7|||
  124. #define @BE:H_NbE(%1E%0)%7||| H_Db(%1,E,%0,69)%7|||
  125. #define @BF:H_NbF(%1F%0)%7||| H_Db(%1,F,%0,70)%7|||
  126. #define @BG:H_NbG(%1G%0)%7||| H_Db(%1,G,%0,71)%7|||
  127. #define @BH:H_NbH(%1H%0)%7||| H_Db(%1,H,%0,72)%7|||
  128. #define @BI:H_NbI(%1I%0)%7||| H_Db(%1,I,%0,73)%7|||
  129. #define @BJ:H_NbJ(%1J%0)%7||| H_Db(%1,J,%0,74)%7|||
  130. #define @BK:H_NbK(%1K%0)%7||| H_Db(%1,K,%0,75)%7|||
  131. #define @BL:H_NbL(%1L%0)%7||| H_Db(%1,L,%0,76)%7|||
  132. #define @BM:H_NbM(%1M%0)%7||| H_Db(%1,M,%0,77)%7|||
  133. #define @BN:H_NbN(%1N%0)%7||| H_Db(%1,N,%0,78)%7|||
  134. #define @BO:H_NbO(%1O%0)%7||| H_Db(%1,O,%0,79)%7|||
  135. #define @BP:H_NbP(%1P%0)%7||| H_Db(%1,P,%0,80)%7|||
  136. #define @BQ:H_NbQ(%1Q%0)%7||| H_Db(%1,Q,%0,81)%7|||
  137. #define @BR:H_NbR(%1R%0)%7||| H_Db(%1,R,%0,82)%7|||
  138. #define @BS:H_NbS(%1S%0)%7||| H_Db(%1,S,%0,83)%7|||
  139. #define @BT:H_NbT(%1T%0)%7||| H_Db(%1,T,%0,84)%7|||
  140. #define @BU:H_NbU(%1U%0)%7||| H_Db(%1,U,%0,85)%7|||
  141. #define @BV:H_NbV(%1V%0)%7||| H_Db(%1,V,%0,86)%7|||
  142. #define @BW:H_NbW(%1W%0)%7||| H_Db(%1,W,%0,87)%7|||
  143. #define @BX:H_NbX(%1X%0)%7||| H_Db(%1,X,%0,88)%7|||
  144. #define @BY:H_NbY(%1Y%0)%7||| H_Db(%1,Y,%0,89)%7|||
  145. #define @BZ:H_NbZ(%1Z%0)%7||| H_Db(%1,Z,%0,90)%7|||
  146. #define @B0:H_Nb0(%10%0)%7||| H_Db(%1,0,%0,48)%7|||
  147. #define @B1:H_Nb1(%11%0)%7||| H_Db(%1,1,%0,49)%7|||
  148. #define @B2:H_Nb2(%12%0)%7||| H_Db(%1,2,%0,50)%7|||
  149. #define @B3:H_Nb3(%13%0)%7||| H_Db(%1,3,%0,51)%7|||
  150. #define @B4:H_Nb4(%14%0)%7||| H_Db(%1,4,%0,52)%7|||
  151. #define @B5:H_Nb5(%15%0)%7||| H_Db(%1,5,%0,53)%7|||
  152. #define @B6:H_Nb6(%16%0)%7||| H_Db(%1,6,%0,54)%7|||
  153. #define @B7:H_Nb7(%17%0)%7||| H_Db(%1,7,%0,55)%7|||
  154. #define @B8:H_Nb8(%18%0)%7||| H_Db(%1,8,%0,56)%7|||
  155. #define @B9:H_Nb9(%19%0)%7||| H_Db(%1,9,%0,57)%7|||
  156. #define @B_:H_Nb_(_%0)%7||| H_Db(,_,%0,95)%7|||
  157. // Find the next character to test.
  158. #define H_Nba(%0) @Bb:H_Nbb(%0)
  159. #define H_Nbb(%0) @Bc:H_Nbc(%0)
  160. #define H_Nbc(%0) @Bd:H_Nbd(%0)
  161. #define H_Nbd(%0) @Be:H_Nbe(%0)
  162. #define H_Nbe(%0) @Bf:H_Nbf(%0)
  163. #define H_Nbf(%0) @Bg:H_Nbg(%0)
  164. #define H_Nbg(%0) @Bh:H_Nbh(%0)
  165. #define H_Nbh(%0) @Bi:H_Nbi(%0)
  166. #define H_Nbi(%0) @Bj:H_Nbj(%0)
  167. #define H_Nbj(%0) @Bk:H_Nbk(%0)
  168. #define H_Nbk(%0) @Bl:H_Nbl(%0)
  169. #define H_Nbl(%0) @Bm:H_Nbm(%0)
  170. #define H_Nbm(%0) @Bn:H_Nbn(%0)
  171. #define H_Nbn(%0) @Bo:H_Nbo(%0)
  172. #define H_Nbo(%0) @Bp:H_Nbp(%0)
  173. #define H_Nbp(%0) @Bq:H_Nbq(%0)
  174. #define H_Nbq(%0) @Br:H_Nbr(%0)
  175. #define H_Nbr(%0) @Bs:H_Nbs(%0)
  176. #define H_Nbs(%0) @Bt:H_Nbt(%0)
  177. #define H_Nbt(%0) @Bu:H_Nbu(%0)
  178. #define H_Nbu(%0) @Bv:H_Nbv(%0)
  179. #define H_Nbv(%0) @Bw:H_Nbw(%0)
  180. #define H_Nbw(%0) @Bx:H_Nbx(%0)
  181. #define H_Nbx(%0) @By:H_Nby(%0)
  182. #define H_Nby(%0) @Bz:H_Nbz(%0)
  183. #define H_Nbz(%0) @B0:H_Nb0(%0)
  184. #define H_NbA(%0) @BB:H_NbB(%0)
  185. #define H_NbB(%0) @BC:H_NbC(%0)
  186. #define H_NbC(%0) @BD:H_NbD(%0)
  187. #define H_NbD(%0) @BE:H_NbE(%0)
  188. #define H_NbE(%0) @BF:H_NbF(%0)
  189. #define H_NbF(%0) @BG:H_NbG(%0)
  190. #define H_NbG(%0) @BH:H_NbH(%0)
  191. #define H_NbH(%0) @BI:H_NbI(%0)
  192. #define H_NbI(%0) @BJ:H_NbJ(%0)
  193. #define H_NbJ(%0) @BK:H_NbK(%0)
  194. #define H_NbK(%0) @BL:H_NbL(%0)
  195. #define H_NbL(%0) @BM:H_NbM(%0)
  196. #define H_NbM(%0) @BN:H_NbN(%0)
  197. #define H_NbN(%0) @BO:H_NbO(%0)
  198. #define H_NbO(%0) @BP:H_NbP(%0)
  199. #define H_NbP(%0) @BQ:H_NbQ(%0)
  200. #define H_NbQ(%0) @BR:H_NbR(%0)
  201. #define H_NbR(%0) @BS:H_NbS(%0)
  202. #define H_NbS(%0) @BT:H_NbT(%0)
  203. #define H_NbT(%0) @BU:H_NbU(%0)
  204. #define H_NbU(%0) @BV:H_NbV(%0)
  205. #define H_NbV(%0) @BW:H_NbW(%0)
  206. #define H_NbW(%0) @BX:H_NbX(%0)
  207. #define H_NbX(%0) @BY:H_NbY(%0)
  208. #define H_NbY(%0) @BZ:H_NbZ(%0)
  209. #define H_NbZ(%0) H_Eb:H_Rb
  210. #define H_Nb0(%0) @B1:H_Nb1(%0)
  211. #define H_Nb1(%0) @B2:H_Nb2(%0)
  212. #define H_Nb2(%0) @B3:H_Nb3(%0)
  213. #define H_Nb3(%0) @B4:H_Nb4(%0)
  214. #define H_Nb4(%0) @B5:H_Nb5(%0)
  215. #define H_Nb5(%0) @B6:H_Nb6(%0)
  216. #define H_Nb6(%0) @B7:H_Nb7(%0)
  217. #define H_Nb7(%0) @B8:H_Nb8(%0)
  218. #define H_Nb8(%0) @B9:H_Nb9(%0)
  219. #define H_Nb9(%0) @B_:H_Nb_(%0)
  220. #define H_Nb_(%0) @BA:H_NbA(%0)
  221. /*
  222. 888b 88 88
  223. 8888b 88 88
  224. 88 `8b 88 88
  225. 88 `8b 88 ,adPPYba, 8b db d8 88 ,adPPYb,d8 8b,dPPYba, ,adPPYba, 8b,dPPYba, ,adPPYba,
  226. 88 `8b 88 a8P_____88 `8b d88b d8' 88 a8" `Y88 88P' `"8a a8" "8a 88P' "Y8 a8P_____88
  227. 88 `8b 88 8PP""""""" `8b d8'`8b d8' 88 8b 88 88 88 8b d8 88 8PP"""""""
  228. 88 `8888 "8b, ,aa `8bd8' `8bd8' 88 "8a, ,d88 88 88 "8a, ,a8" 88 "8b, ,aa
  229. 88 `888 `"Ybbd8"' YP YP 88 `"YbbdP"Y8 88 88 `"YbbdP"' 88 `"Ybbd8"'
  230. aa, ,88
  231. "Y8bbdP"
  232. */
  233. // ===============================
  234. // New syntax (case insensitive)
  235. // ===============================
  236. #define hc:%9()
  237. // Scan prior string parts for the next letter, scan subsequent parts for the
  238. // same letter. The original string can be reconstructed by "%0%5%1".
  239. //
  240. // %0 - String before the current letter.
  241. // %1 - String after the current letter.
  242. //
  243. // %5 - The current letter.
  244. // %6 - The ASCII code for the current letter.
  245. //
  246. // %7 - Remainder.
  247. // %8 - Current sum.
  248. //
  249. #define H_Dc(%0,%5,%1,%6) hc:H_Nc%5(%0)H_Sc:%6]hc:@C%5:H_Nc%5(%1)
  250. #define H_Sc:%6]%7|||%8||| %7|||(%8*33+%6)|||
  251. #define H_Ec:|||%0||| %0
  252. // Test for the current character.
  253. #define @Ca:H_Nca(%0a%1)%7||| H_Dc(%0,a,%1,65)%7|||
  254. #define @Cb:H_Ncb(%0b%1)%7||| H_Dc(%0,b,%1,66)%7|||
  255. #define @Cc:H_Ncc(%0c%1)%7||| H_Dc(%0,c,%1,67)%7|||
  256. #define @Cd:H_Ncd(%0d%1)%7||| H_Dc(%0,d,%1,68)%7|||
  257. #define @Ce:H_Nce(%0e%1)%7||| H_Dc(%0,e,%1,69)%7|||
  258. #define @Cf:H_Ncf(%0f%1)%7||| H_Dc(%0,f,%1,70)%7|||
  259. #define @Cg:H_Ncg(%0g%1)%7||| H_Dc(%0,g,%1,71)%7|||
  260. #define @Ch:H_Nch(%0h%1)%7||| H_Dc(%0,h,%1,72)%7|||
  261. #define @Ci:H_Nci(%0i%1)%7||| H_Dc(%0,i,%1,73)%7|||
  262. #define @Cj:H_Ncj(%0j%1)%7||| H_Dc(%0,j,%1,74)%7|||
  263. #define @Ck:H_Nck(%0k%1)%7||| H_Dc(%0,k,%1,75)%7|||
  264. #define @Cl:H_Ncl(%0l%1)%7||| H_Dc(%0,l,%1,76)%7|||
  265. #define @Cm:H_Ncm(%0m%1)%7||| H_Dc(%0,m,%1,77)%7|||
  266. #define @Cn:H_Ncn(%0n%1)%7||| H_Dc(%0,n,%1,78)%7|||
  267. #define @Co:H_Nco(%0o%1)%7||| H_Dc(%0,o,%1,79)%7|||
  268. #define @Cp:H_Ncp(%0p%1)%7||| H_Dc(%0,p,%1,80)%7|||
  269. #define @Cq:H_Ncq(%0q%1)%7||| H_Dc(%0,q,%1,81)%7|||
  270. #define @Cr:H_Ncr(%0r%1)%7||| H_Dc(%0,r,%1,82)%7|||
  271. #define @Cs:H_Ncs(%0s%1)%7||| H_Dc(%0,s,%1,83)%7|||
  272. #define @Ct:H_Nct(%0t%1)%7||| H_Dc(%0,t,%1,84)%7|||
  273. #define @Cu:H_Ncu(%0u%1)%7||| H_Dc(%0,u,%1,85)%7|||
  274. #define @Cv:H_Ncv(%0v%1)%7||| H_Dc(%0,v,%1,86)%7|||
  275. #define @Cw:H_Ncw(%0w%1)%7||| H_Dc(%0,w,%1,87)%7|||
  276. #define @Cx:H_Ncx(%0x%1)%7||| H_Dc(%0,x,%1,88)%7|||
  277. #define @Cy:H_Ncy(%0y%1)%7||| H_Dc(%0,y,%1,89)%7|||
  278. #define @Cz:H_Ncz(%0z%1)%7||| H_Dc(%0,z,%1,90)%7|||
  279. #define @CA:H_NcA(%0A%1)%7||| H_Dc(%0,A,%1,65)%7|||
  280. #define @CB:H_NcB(%0B%1)%7||| H_Dc(%0,B,%1,66)%7|||
  281. #define @CC:H_NcC(%0C%1)%7||| H_Dc(%0,C,%1,67)%7|||
  282. #define @CD:H_NcD(%0D%1)%7||| H_Dc(%0,D,%1,68)%7|||
  283. #define @CE:H_NcE(%0E%1)%7||| H_Dc(%0,E,%1,69)%7|||
  284. #define @CF:H_NcF(%0F%1)%7||| H_Dc(%0,F,%1,70)%7|||
  285. #define @CG:H_NcG(%0G%1)%7||| H_Dc(%0,G,%1,71)%7|||
  286. #define @CH:H_NcH(%0H%1)%7||| H_Dc(%0,H,%1,72)%7|||
  287. #define @CI:H_NcI(%0I%1)%7||| H_Dc(%0,I,%1,73)%7|||
  288. #define @CJ:H_NcJ(%0J%1)%7||| H_Dc(%0,J,%1,74)%7|||
  289. #define @CK:H_NcK(%0K%1)%7||| H_Dc(%0,K,%1,75)%7|||
  290. #define @CL:H_NcL(%0L%1)%7||| H_Dc(%0,L,%1,76)%7|||
  291. #define @CM:H_NcM(%0M%1)%7||| H_Dc(%0,M,%1,77)%7|||
  292. #define @CN:H_NcN(%0N%1)%7||| H_Dc(%0,N,%1,78)%7|||
  293. #define @CO:H_NcO(%0O%1)%7||| H_Dc(%0,O,%1,79)%7|||
  294. #define @CP:H_NcP(%0P%1)%7||| H_Dc(%0,P,%1,80)%7|||
  295. #define @CQ:H_NcQ(%0Q%1)%7||| H_Dc(%0,Q,%1,81)%7|||
  296. #define @CR:H_NcR(%0R%1)%7||| H_Dc(%0,R,%1,82)%7|||
  297. #define @CS:H_NcS(%0S%1)%7||| H_Dc(%0,S,%1,83)%7|||
  298. #define @CT:H_NcT(%0T%1)%7||| H_Dc(%0,T,%1,84)%7|||
  299. #define @CU:H_NcU(%0U%1)%7||| H_Dc(%0,U,%1,85)%7|||
  300. #define @CV:H_NcV(%0V%1)%7||| H_Dc(%0,V,%1,86)%7|||
  301. #define @CW:H_NcW(%0W%1)%7||| H_Dc(%0,W,%1,87)%7|||
  302. #define @CX:H_NcX(%0X%1)%7||| H_Dc(%0,X,%1,88)%7|||
  303. #define @CY:H_NcY(%0Y%1)%7||| H_Dc(%0,Y,%1,89)%7|||
  304. #define @CZ:H_NcZ(%0Z%1)%7||| H_Dc(%0,Z,%1,90)%7|||
  305. #define @C0:H_Nc0(%00%1)%7||| H_Dc(%0,0,%1,48)%7|||
  306. #define @C1:H_Nc1(%01%1)%7||| H_Dc(%0,1,%1,49)%7|||
  307. #define @C2:H_Nc2(%02%1)%7||| H_Dc(%0,2,%1,50)%7|||
  308. #define @C3:H_Nc3(%03%1)%7||| H_Dc(%0,3,%1,51)%7|||
  309. #define @C4:H_Nc4(%04%1)%7||| H_Dc(%0,4,%1,52)%7|||
  310. #define @C5:H_Nc5(%05%1)%7||| H_Dc(%0,5,%1,53)%7|||
  311. #define @C6:H_Nc6(%06%1)%7||| H_Dc(%0,6,%1,54)%7|||
  312. #define @C7:H_Nc7(%07%1)%7||| H_Dc(%0,7,%1,55)%7|||
  313. #define @C8:H_Nc8(%08%1)%7||| H_Dc(%0,8,%1,56)%7|||
  314. #define @C9:H_Nc9(%09%1)%7||| H_Dc(%0,9,%1,57)%7|||
  315. #define @C_:H_Nc_(%0_%1)%7||| H_Dc(%0,_,%1,95)%7|||
  316. // Find the next character to test.
  317. #define H_Nca(%0) @Cb:H_Ncb(%0)
  318. #define H_Ncb(%0) @Cc:H_Ncc(%0)
  319. #define H_Ncc(%0) @Cd:H_Ncd(%0)
  320. #define H_Ncd(%0) @Ce:H_Nce(%0)
  321. #define H_Nce(%0) @Cf:H_Ncf(%0)
  322. #define H_Ncf(%0) @Cg:H_Ncg(%0)
  323. #define H_Ncg(%0) @Ch:H_Nch(%0)
  324. #define H_Nch(%0) @Ci:H_Nci(%0)
  325. #define H_Nci(%0) @Cj:H_Ncj(%0)
  326. #define H_Ncj(%0) @Ck:H_Nck(%0)
  327. #define H_Nck(%0) @Cl:H_Ncl(%0)
  328. #define H_Ncl(%0) @Cm:H_Ncm(%0)
  329. #define H_Ncm(%0) @Cn:H_Ncn(%0)
  330. #define H_Ncn(%0) @Co:H_Nco(%0)
  331. #define H_Nco(%0) @Cp:H_Ncp(%0)
  332. #define H_Ncp(%0) @Cq:H_Ncq(%0)
  333. #define H_Ncq(%0) @Cr:H_Ncr(%0)
  334. #define H_Ncr(%0) @Cs:H_Ncs(%0)
  335. #define H_Ncs(%0) @Ct:H_Nct(%0)
  336. #define H_Nct(%0) @Cu:H_Ncu(%0)
  337. #define H_Ncu(%0) @Cv:H_Ncv(%0)
  338. #define H_Ncv(%0) @Cw:H_Ncw(%0)
  339. #define H_Ncw(%0) @Cx:H_Ncx(%0)
  340. #define H_Ncx(%0) @Cy:H_Ncy(%0)
  341. #define H_Ncy(%0) @Cz:H_Ncz(%0)
  342. #define H_Ncz(%0) @C0:H_Nc0(%0)
  343. #define H_NcA(%0) @CB:H_NcB(%0)
  344. #define H_NcB(%0) @CC:H_NcC(%0)
  345. #define H_NcC(%0) @CD:H_NcD(%0)
  346. #define H_NcD(%0) @CE:H_NcE(%0)
  347. #define H_NcE(%0) @CF:H_NcF(%0)
  348. #define H_NcF(%0) @CG:H_NcG(%0)
  349. #define H_NcG(%0) @CH:H_NcH(%0)
  350. #define H_NcH(%0) @CI:H_NcI(%0)
  351. #define H_NcI(%0) @CJ:H_NcJ(%0)
  352. #define H_NcJ(%0) @CK:H_NcK(%0)
  353. #define H_NcK(%0) @CL:H_NcL(%0)
  354. #define H_NcL(%0) @CM:H_NcM(%0)
  355. #define H_NcM(%0) @CN:H_NcN(%0)
  356. #define H_NcN(%0) @CO:H_NcO(%0)
  357. #define H_NcO(%0) @CP:H_NcP(%0)
  358. #define H_NcP(%0) @CQ:H_NcQ(%0)
  359. #define H_NcQ(%0) @CR:H_NcR(%0)
  360. #define H_NcR(%0) @CS:H_NcS(%0)
  361. #define H_NcS(%0) @CT:H_NcT(%0)
  362. #define H_NcT(%0) @CU:H_NcU(%0)
  363. #define H_NcU(%0) @CV:H_NcV(%0)
  364. #define H_NcV(%0) @CW:H_NcW(%0)
  365. #define H_NcW(%0) @CX:H_NcX(%0)
  366. #define H_NcX(%0) @CY:H_NcY(%0)
  367. #define H_NcY(%0) @CZ:H_NcZ(%0)
  368. #define H_NcZ(%0) H_Ec:H_Rc
  369. #define H_Nc0(%0) @C1:H_Nc1(%0)
  370. #define H_Nc1(%0) @C2:H_Nc2(%0)
  371. #define H_Nc2(%0) @C3:H_Nc3(%0)
  372. #define H_Nc3(%0) @C4:H_Nc4(%0)
  373. #define H_Nc4(%0) @C5:H_Nc5(%0)
  374. #define H_Nc5(%0) @C6:H_Nc6(%0)
  375. #define H_Nc6(%0) @C7:H_Nc7(%0)
  376. #define H_Nc7(%0) @C8:H_Nc8(%0)
  377. #define H_Nc8(%0) @C9:H_Nc9(%0)
  378. #define H_Nc9(%0) @C_:H_Nc_(%0)
  379. #define H_Nc_(%0) @CA:H_NcA(%0)
  380. /*
  381. ,ad8888ba, 88 88 ,ad8888ba, 88
  382. d8"' `"8b 88 88 d8"' `"8b 88
  383. d8' `8b 88 88 d8' 88
  384. 88 88 88 ,adPPYb,88 88 ,adPPYYba, ,adPPYba, ,adPPYba, ,adPPYb,88
  385. 88 88 88 a8" `Y88 88 "" `Y8 I8[ "" a8P_____88 a8" `Y88
  386. Y8, ,8P 88 8b 88 Y8, ,adPPPPP88 `"Y8ba, 8PP""""""" 8b 88
  387. Y8a. .a8P 88 "8a, ,d88 Y8a. .a8P 88, ,88 aa ]8I "8b, ,aa "8a, ,d88
  388. `"Y8888Y"' 88 `"8bbdP"Y8 `"Y8888Y"' `"8bbdP"Y8 `"YbbdP"' `"Ybbd8"' `"8bbdP"Y8
  389. */
  390. // =============================
  391. // Old syntax (case sensitive)
  392. // =============================
  393. // Signify the end with two "@" symbols.
  394. #define HASH@bernstein(%0) _REHASH@b(%0,@,@)
  395. // Internal call.
  396. #define _REHASH@b(%0,%1) _HASH@b_%0(%1,)(-1)
  397. // The bit that actually does the work.
  398. #define _DOHASH@b(%0,%1,%2)(%8) _HASH@b_%1(%2)((%8*33+%0))
  399. // Space.
  400. #define _HASH@b_(%0)(%8) _DOHASH@b(32,%0)(%8)
  401. // Numbers.
  402. #define _HASH@b_0(%0)(%8) _DOHASH@b(48,%0)(%8)
  403. #define _HASH@b_1(%0)(%8) _DOHASH@b(49,%0)(%8)
  404. #define _HASH@b_2(%0)(%8) _DOHASH@b(50,%0)(%8)
  405. #define _HASH@b_3(%0)(%8) _DOHASH@b(51,%0)(%8)
  406. #define _HASH@b_4(%0)(%8) _DOHASH@b(52,%0)(%8)
  407. #define _HASH@b_5(%0)(%8) _DOHASH@b(53,%0)(%8)
  408. #define _HASH@b_6(%0)(%8) _DOHASH@b(54,%0)(%8)
  409. #define _HASH@b_7(%0)(%8) _DOHASH@b(55,%0)(%8)
  410. #define _HASH@b_8(%0)(%8) _DOHASH@b(56,%0)(%8)
  411. #define _HASH@b_9(%0)(%8) _DOHASH@b(57,%0)(%8)
  412. // Upper case letters.
  413. #define _HASH@b_A(%0)(%8) _DOHASH@b(65,%0)(%8)
  414. #define _HASH@b_B(%0)(%8) _DOHASH@b(66,%0)(%8)
  415. #define _HASH@b_C(%0)(%8) _DOHASH@b(67,%0)(%8)
  416. #define _HASH@b_D(%0)(%8) _DOHASH@b(68,%0)(%8)
  417. #define _HASH@b_E(%0)(%8) _DOHASH@b(69,%0)(%8)
  418. #define _HASH@b_F(%0)(%8) _DOHASH@b(70,%0)(%8)
  419. #define _HASH@b_G(%0)(%8) _DOHASH@b(71,%0)(%8)
  420. #define _HASH@b_H(%0)(%8) _DOHASH@b(72,%0)(%8)
  421. #define _HASH@b_I(%0)(%8) _DOHASH@b(73,%0)(%8)
  422. #define _HASH@b_J(%0)(%8) _DOHASH@b(74,%0)(%8)
  423. #define _HASH@b_K(%0)(%8) _DOHASH@b(75,%0)(%8)
  424. #define _HASH@b_L(%0)(%8) _DOHASH@b(76,%0)(%8)
  425. #define _HASH@b_M(%0)(%8) _DOHASH@b(77,%0)(%8)
  426. #define _HASH@b_N(%0)(%8) _DOHASH@b(78,%0)(%8)
  427. #define _HASH@b_O(%0)(%8) _DOHASH@b(79,%0)(%8)
  428. #define _HASH@b_P(%0)(%8) _DOHASH@b(80,%0)(%8)
  429. #define _HASH@b_Q(%0)(%8) _DOHASH@b(81,%0)(%8)
  430. #define _HASH@b_R(%0)(%8) _DOHASH@b(82,%0)(%8)
  431. #define _HASH@b_S(%0)(%8) _DOHASH@b(83,%0)(%8)
  432. #define _HASH@b_T(%0)(%8) _DOHASH@b(84,%0)(%8)
  433. #define _HASH@b_U(%0)(%8) _DOHASH@b(85,%0)(%8)
  434. #define _HASH@b_V(%0)(%8) _DOHASH@b(86,%0)(%8)
  435. #define _HASH@b_W(%0)(%8) _DOHASH@b(87,%0)(%8)
  436. #define _HASH@b_X(%0)(%8) _DOHASH@b(88,%0)(%8)
  437. #define _HASH@b_Y(%0)(%8) _DOHASH@b(89,%0)(%8)
  438. #define _HASH@b_Z(%0)(%8) _DOHASH@b(90,%0)(%8)
  439. // Underscore.
  440. #define _HASH@b__(%0)(%8) _DOHASH@b(95,%0)(%8)
  441. // Lower case letters.
  442. #define _HASH@b_a(%0)(%8) _DOHASH@b(97,%0)(%8)
  443. #define _HASH@b_b(%0)(%8) _DOHASH@b(98,%0)(%8)
  444. #define _HASH@b_c(%0)(%8) _DOHASH@b(99,%0)(%8)
  445. #define _HASH@b_d(%0)(%8) _DOHASH@b(100,%0)(%8)
  446. #define _HASH@b_e(%0)(%8) _DOHASH@b(101,%0)(%8)
  447. #define _HASH@b_f(%0)(%8) _DOHASH@b(102,%0)(%8)
  448. #define _HASH@b_g(%0)(%8) _DOHASH@b(103,%0)(%8)
  449. #define _HASH@b_h(%0)(%8) _DOHASH@b(104,%0)(%8)
  450. #define _HASH@b_i(%0)(%8) _DOHASH@b(105,%0)(%8)
  451. #define _HASH@b_j(%0)(%8) _DOHASH@b(106,%0)(%8)
  452. #define _HASH@b_k(%0)(%8) _DOHASH@b(107,%0)(%8)
  453. #define _HASH@b_l(%0)(%8) _DOHASH@b(108,%0)(%8)
  454. #define _HASH@b_m(%0)(%8) _DOHASH@b(109,%0)(%8)
  455. #define _HASH@b_n(%0)(%8) _DOHASH@b(110,%0)(%8)
  456. #define _HASH@b_o(%0)(%8) _DOHASH@b(111,%0)(%8)
  457. #define _HASH@b_p(%0)(%8) _DOHASH@b(112,%0)(%8)
  458. #define _HASH@b_q(%0)(%8) _DOHASH@b(113,%0)(%8)
  459. #define _HASH@b_r(%0)(%8) _DOHASH@b(114,%0)(%8)
  460. #define _HASH@b_s(%0)(%8) _DOHASH@b(115,%0)(%8)
  461. #define _HASH@b_t(%0)(%8) _DOHASH@b(116,%0)(%8)
  462. #define _HASH@b_u(%0)(%8) _DOHASH@b(117,%0)(%8)
  463. #define _HASH@b_v(%0)(%8) _DOHASH@b(118,%0)(%8)
  464. #define _HASH@b_w(%0)(%8) _DOHASH@b(119,%0)(%8)
  465. #define _HASH@b_x(%0)(%8) _DOHASH@b(120,%0)(%8)
  466. #define _HASH@b_y(%0)(%8) _DOHASH@b(121,%0)(%8)
  467. #define _HASH@b_z(%0)(%8) _DOHASH@b(122,%0)(%8)
  468. // String end.
  469. #define _HASH@b_@(%0)(%8) %8
  470. /*
  471. ,ad8888ba, 88 88 88
  472. d8"' `"8b 88 88 88
  473. d8' `8b 88 88 88
  474. 88 88 88 ,adPPYb,88 88 ,adPPYb,d8 8b,dPPYba, ,adPPYba, 8b,dPPYba, ,adPPYba,
  475. 88 88 88 a8" `Y88 88 a8" `Y88 88P' `"8a a8" "8a 88P' "Y8 a8P_____88
  476. Y8, ,8P 88 8b 88 88 8b 88 88 88 8b d8 88 8PP"""""""
  477. Y8a. .a8P 88 "8a, ,d88 88 "8a, ,d88 88 88 "8a, ,a8" 88 "8b, ,aa
  478. `"Y8888Y"' 88 `"8bbdP"Y8 88 `"YbbdP"Y8 88 88 `"YbbdP"' 88 `"Ybbd8"'
  479. aa, ,88
  480. "Y8bbdP"
  481. */
  482. // ===============================
  483. // Old syntax (case insensitive)
  484. // ===============================
  485. // Signify the end with two "@" symbols.
  486. #define HASHi@bernstein(%0) _REHASH@ib(%0,@,@)
  487. // Internal call.
  488. #define _REHASH@ib(%0,%1) _HASH@ib_%0(%1,)(-1)
  489. // The bit that actually does the work.
  490. #define _DOHASH@ib(%0,%1,%2)(%8) _HASH@ib_%1(%2)((%8*33+%0))
  491. // Space.
  492. #define _HASH@ib_(%0)(%8) _DOHASH@ib(32,%0)(%8)
  493. // Numbers.
  494. #define _HASH@ib_0(%0)(%8) _DOHASH@ib(48,%0)(%8)
  495. #define _HASH@ib_1(%0)(%8) _DOHASH@ib(49,%0)(%8)
  496. #define _HASH@ib_2(%0)(%8) _DOHASH@ib(50,%0)(%8)
  497. #define _HASH@ib_3(%0)(%8) _DOHASH@ib(51,%0)(%8)
  498. #define _HASH@ib_4(%0)(%8) _DOHASH@ib(52,%0)(%8)
  499. #define _HASH@ib_5(%0)(%8) _DOHASH@ib(53,%0)(%8)
  500. #define _HASH@ib_6(%0)(%8) _DOHASH@ib(54,%0)(%8)
  501. #define _HASH@ib_7(%0)(%8) _DOHASH@ib(55,%0)(%8)
  502. #define _HASH@ib_8(%0)(%8) _DOHASH@ib(56,%0)(%8)
  503. #define _HASH@ib_9(%0)(%8) _DOHASH@ib(57,%0)(%8)
  504. // Upper case letters.
  505. #define _HASH@ib_A(%0)(%8) _DOHASH@ib(65,%0)(%8)
  506. #define _HASH@ib_B(%0)(%8) _DOHASH@ib(66,%0)(%8)
  507. #define _HASH@ib_C(%0)(%8) _DOHASH@ib(67,%0)(%8)
  508. #define _HASH@ib_D(%0)(%8) _DOHASH@ib(68,%0)(%8)
  509. #define _HASH@ib_E(%0)(%8) _DOHASH@ib(69,%0)(%8)
  510. #define _HASH@ib_F(%0)(%8) _DOHASH@ib(70,%0)(%8)
  511. #define _HASH@ib_G(%0)(%8) _DOHASH@ib(71,%0)(%8)
  512. #define _HASH@ib_H(%0)(%8) _DOHASH@ib(72,%0)(%8)
  513. #define _HASH@ib_I(%0)(%8) _DOHASH@ib(73,%0)(%8)
  514. #define _HASH@ib_J(%0)(%8) _DOHASH@ib(74,%0)(%8)
  515. #define _HASH@ib_K(%0)(%8) _DOHASH@ib(75,%0)(%8)
  516. #define _HASH@ib_L(%0)(%8) _DOHASH@ib(76,%0)(%8)
  517. #define _HASH@ib_M(%0)(%8) _DOHASH@ib(77,%0)(%8)
  518. #define _HASH@ib_N(%0)(%8) _DOHASH@ib(78,%0)(%8)
  519. #define _HASH@ib_O(%0)(%8) _DOHASH@ib(79,%0)(%8)
  520. #define _HASH@ib_P(%0)(%8) _DOHASH@ib(80,%0)(%8)
  521. #define _HASH@ib_Q(%0)(%8) _DOHASH@ib(81,%0)(%8)
  522. #define _HASH@ib_R(%0)(%8) _DOHASH@ib(82,%0)(%8)
  523. #define _HASH@ib_S(%0)(%8) _DOHASH@ib(83,%0)(%8)
  524. #define _HASH@ib_T(%0)(%8) _DOHASH@ib(84,%0)(%8)
  525. #define _HASH@ib_U(%0)(%8) _DOHASH@ib(85,%0)(%8)
  526. #define _HASH@ib_V(%0)(%8) _DOHASH@ib(86,%0)(%8)
  527. #define _HASH@ib_W(%0)(%8) _DOHASH@ib(87,%0)(%8)
  528. #define _HASH@ib_X(%0)(%8) _DOHASH@ib(88,%0)(%8)
  529. #define _HASH@ib_Y(%0)(%8) _DOHASH@ib(89,%0)(%8)
  530. #define _HASH@ib_Z(%0)(%8) _DOHASH@ib(90,%0)(%8)
  531. // Underscore.
  532. #define _HASH@ib__(%0)(%8) _DOHASH@ib(95,%0)(%8)
  533. // Lower case letters.
  534. #define _HASH@ib_a(%0)(%8) _DOHASH@ib(65,%0)(%8)
  535. #define _HASH@ib_b(%0)(%8) _DOHASH@ib(66,%0)(%8)
  536. #define _HASH@ib_c(%0)(%8) _DOHASH@ib(67,%0)(%8)
  537. #define _HASH@ib_d(%0)(%8) _DOHASH@ib(68,%0)(%8)
  538. #define _HASH@ib_e(%0)(%8) _DOHASH@ib(69,%0)(%8)
  539. #define _HASH@ib_f(%0)(%8) _DOHASH@ib(70,%0)(%8)
  540. #define _HASH@ib_g(%0)(%8) _DOHASH@ib(71,%0)(%8)
  541. #define _HASH@ib_h(%0)(%8) _DOHASH@ib(72,%0)(%8)
  542. #define _HASH@ib_i(%0)(%8) _DOHASH@ib(73,%0)(%8)
  543. #define _HASH@ib_j(%0)(%8) _DOHASH@ib(74,%0)(%8)
  544. #define _HASH@ib_k(%0)(%8) _DOHASH@ib(75,%0)(%8)
  545. #define _HASH@ib_l(%0)(%8) _DOHASH@ib(76,%0)(%8)
  546. #define _HASH@ib_m(%0)(%8) _DOHASH@ib(77,%0)(%8)
  547. #define _HASH@ib_n(%0)(%8) _DOHASH@ib(78,%0)(%8)
  548. #define _HASH@ib_o(%0)(%8) _DOHASH@ib(79,%0)(%8)
  549. #define _HASH@ib_p(%0)(%8) _DOHASH@ib(80,%0)(%8)
  550. #define _HASH@ib_q(%0)(%8) _DOHASH@ib(81,%0)(%8)
  551. #define _HASH@ib_r(%0)(%8) _DOHASH@ib(82,%0)(%8)
  552. #define _HASH@ib_s(%0)(%8) _DOHASH@ib(83,%0)(%8)
  553. #define _HASH@ib_t(%0)(%8) _DOHASH@ib(84,%0)(%8)
  554. #define _HASH@ib_u(%0)(%8) _DOHASH@ib(85,%0)(%8)
  555. #define _HASH@ib_v(%0)(%8) _DOHASH@ib(86,%0)(%8)
  556. #define _HASH@ib_w(%0)(%8) _DOHASH@ib(87,%0)(%8)
  557. #define _HASH@ib_x(%0)(%8) _DOHASH@ib(88,%0)(%8)
  558. #define _HASH@ib_y(%0)(%8) _DOHASH@ib(89,%0)(%8)
  559. #define _HASH@ib_z(%0)(%8) _DOHASH@ib(90,%0)(%8)
  560. // String end.
  561. #define _HASH@ib_@(%0)(%8) %8