y_stringhash.inc 55 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851
  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. #include "internal\y_version"
  62. #include "y_debug"
  63. // Note: H_a, H_b, H_c, H_d, H_f and H_g are defined here, H_e in y_amx, H_z in
  64. // y_masteronce, H_u in y_users, H_y in y_timers.
  65. // ===================
  66. // Determine version
  67. // ===================
  68. // Entry.
  69. #define _H (_:_H_0:_H_1
  70. #define _I (_:_H_2:_H_3
  71. // Old.
  72. #define _H_0:_H_1(%0) HASH@bernstein(%0))
  73. #define _H_2:_H_3(%0) HASHi@bernstein(%0))
  74. // New.
  75. #define _H_1<%0> _:H_Rb(%0)) //HASh@bernstein(%0)
  76. #define _H_3<%0> _:H_Rc(%0))
  77. // Entry.
  78. #define _H@b (_:_H0@b:_H1@b
  79. #define _I@b (_:_H2@b:_H3@b
  80. // Old.
  81. #define _H0@b:_H1@b(%0) HASH@bernstein(%0))
  82. #define _H2@b:_H3@b(%0) HASHi@bernstein(%0))
  83. // New.
  84. #define _H1@b<%0> _:H_Rb(%0))
  85. #define _H3@b<%0> _:H_Rc(%0))
  86. // Entry.
  87. #define _H@f (_:_H0@f:_H1@f
  88. #define _I@f (_:_H2@f:_H3@f
  89. // Old.
  90. #define _H0@f:_H1@f(%0) HASH@fnv1(%0))
  91. #define _H2@f:_H3@f(%0) HASHi@fnv1(%0))
  92. // New.
  93. #define _H1@f<%0> _:H_Rg(%0))
  94. #define _H3@f<%0> _:H_Rf(%0))
  95. // Entry.
  96. #define _H@a (_:_H0@a:_H1@a
  97. #define _I@a (_:_H2@a:_H3@a
  98. // Old.
  99. #define _H0@a:_H1@a(%0) HASH@fnv1a(%0))
  100. #define _H2@a:_H3@a(%0) HASHi@fnv1a(%0))
  101. // New.
  102. #define _H1@a<%0> _:H_Ra(%0))
  103. #define _H3@a<%0> _:H_Rd(%0))
  104. // Entry.
  105. #define HASH (_:_H_4:_H_5
  106. #define HASHi (_:_H_6:_H_7
  107. // Old.
  108. #define _H_4:_H_5(%0,%1) HASH@%0(%1))
  109. #define _H_6:_H_7(%0,%1) HASHi@%0(%1))
  110. // New.
  111. #define _H_5:%0<%1> HASh@%0(%1))
  112. #define _H_7:%0<%1> HAShi@%0(%1))
  113. #define HASh@bernstein(%0) (_:H_Rb(%0))
  114. #define HAShi@bernstein(%0) (_:H_Rc(%0))
  115. #define HASh@fnv1(%0) (_:H_Rg(%0))
  116. #define HAShi@fnv1(%0) (_:H_Rg(%0))
  117. #define HASh@fnv1a(%0) (_:H_Ra(%0))
  118. #define HAShi@fnv1a(%0) (_:H_Rd(%0))
  119. // =============
  120. // New version
  121. // =============
  122. // ================
  123. // Bernstein hash
  124. // ================
  125. // ================
  126. // Case sensitive
  127. // ================
  128. // Do the next character test as this one failed.
  129. #define H_Sb(%0,%1) H_Nb%1(%0)
  130. // End of string test failed.
  131. #define H_Eb(%0) @Ba:H_Sb(%0,a)
  132. // Do the single addition.
  133. #define H_Db(%0,%1) (_:H_Rb(%0)*33+%1)
  134. // Recurse through the string.
  135. #define H_Rb(%0) hb:H_Eb(%0)
  136. // Test for the end of a string.
  137. #define hb:H_Eb() -1
  138. // Find the length of a string at compile time.
  139. //#define LEN(%0) _:(H_R(%0))
  140. // Test for the current character.
  141. #define @Ba:H_Sb(a%0,%1) H_Db(%0,97)
  142. #define @Bb:H_Sb(b%0,%1) H_Db(%0,98)
  143. #define @Bc:H_Sb(c%0,%1) H_Db(%0,99)
  144. #define @Bd:H_Sb(d%0,%1) H_Db(%0,100)
  145. #define @Be:H_Sb(e%0,%1) H_Db(%0,101)
  146. #define @Bf:H_Sb(f%0,%1) H_Db(%0,102)
  147. #define @Bg:H_Sb(g%0,%1) H_Db(%0,103)
  148. #define @Bh:H_Sb(h%0,%1) H_Db(%0,104)
  149. #define @Bi:H_Sb(i%0,%1) H_Db(%0,105)
  150. #define @Bj:H_Sb(j%0,%1) H_Db(%0,106)
  151. #define @Bk:H_Sb(k%0,%1) H_Db(%0,107)
  152. #define @Bl:H_Sb(l%0,%1) H_Db(%0,108)
  153. #define @Bm:H_Sb(m%0,%1) H_Db(%0,109)
  154. #define @Bn:H_Sb(n%0,%1) H_Db(%0,110)
  155. #define @Bo:H_Sb(o%0,%1) H_Db(%0,111)
  156. #define @Bp:H_Sb(p%0,%1) H_Db(%0,112)
  157. #define @Bq:H_Sb(q%0,%1) H_Db(%0,113)
  158. #define @Br:H_Sb(r%0,%1) H_Db(%0,114)
  159. #define @Bs:H_Sb(s%0,%1) H_Db(%0,115)
  160. #define @Bt:H_Sb(t%0,%1) H_Db(%0,116)
  161. #define @Bu:H_Sb(u%0,%1) H_Db(%0,117)
  162. #define @Bv:H_Sb(v%0,%1) H_Db(%0,118)
  163. #define @Bw:H_Sb(w%0,%1) H_Db(%0,119)
  164. #define @Bx:H_Sb(x%0,%1) H_Db(%0,120)
  165. #define @By:H_Sb(y%0,%1) H_Db(%0,121)
  166. #define @Bz:H_Sb(z%0,%1) H_Db(%0,122)
  167. #define @BA:H_Sb(A%0,%1) H_Db(%0,65)
  168. #define @BB:H_Sb(B%0,%1) H_Db(%0,66)
  169. #define @BC:H_Sb(C%0,%1) H_Db(%0,67)
  170. #define @BD:H_Sb(D%0,%1) H_Db(%0,68)
  171. #define @BE:H_Sb(E%0,%1) H_Db(%0,69)
  172. #define @BF:H_Sb(F%0,%1) H_Db(%0,70)
  173. #define @BG:H_Sb(G%0,%1) H_Db(%0,71)
  174. #define @BH:H_Sb(H%0,%1) H_Db(%0,72)
  175. #define @BI:H_Sb(I%0,%1) H_Db(%0,73)
  176. #define @BJ:H_Sb(J%0,%1) H_Db(%0,74)
  177. #define @BK:H_Sb(K%0,%1) H_Db(%0,75)
  178. #define @BL:H_Sb(L%0,%1) H_Db(%0,76)
  179. #define @BM:H_Sb(M%0,%1) H_Db(%0,77)
  180. #define @BN:H_Sb(N%0,%1) H_Db(%0,78)
  181. #define @BO:H_Sb(O%0,%1) H_Db(%0,79)
  182. #define @BP:H_Sb(P%0,%1) H_Db(%0,80)
  183. #define @BQ:H_Sb(Q%0,%1) H_Db(%0,81)
  184. #define @BR:H_Sb(R%0,%1) H_Db(%0,82)
  185. #define @BS:H_Sb(S%0,%1) H_Db(%0,83)
  186. #define @BT:H_Sb(T%0,%1) H_Db(%0,84)
  187. #define @BU:H_Sb(U%0,%1) H_Db(%0,85)
  188. #define @BV:H_Sb(V%0,%1) H_Db(%0,86)
  189. #define @BW:H_Sb(W%0,%1) H_Db(%0,87)
  190. #define @BX:H_Sb(X%0,%1) H_Db(%0,88)
  191. #define @BY:H_Sb(Y%0,%1) H_Db(%0,89)
  192. #define @BZ:H_Sb(Z%0,%1) H_Db(%0,90)
  193. #define @B0:H_Sb(0%0,%1) H_Db(%0,48)
  194. #define @B1:H_Sb(1%0,%1) H_Db(%0,49)
  195. #define @B2:H_Sb(2%0,%1) H_Db(%0,50)
  196. #define @B3:H_Sb(3%0,%1) H_Db(%0,51)
  197. #define @B4:H_Sb(4%0,%1) H_Db(%0,52)
  198. #define @B5:H_Sb(5%0,%1) H_Db(%0,53)
  199. #define @B6:H_Sb(6%0,%1) H_Db(%0,54)
  200. #define @B7:H_Sb(7%0,%1) H_Db(%0,55)
  201. #define @B8:H_Sb(8%0,%1) H_Db(%0,56)
  202. #define @B9:H_Sb(9%0,%1) H_Db(%0,57)
  203. #define @B_:H_Sb(_%0,%1) H_Db(%0,95)
  204. //#define hb@:H_Sb(@%0,%1) H_Db(%0)
  205. // Find the next character to test.
  206. #define H_Nba(%0) @Bb:H_Sb(%0,b)
  207. #define H_Nbb(%0) @Bc:H_Sb(%0,c)
  208. #define H_Nbc(%0) @Bd:H_Sb(%0,d)
  209. #define H_Nbd(%0) @Be:H_Sb(%0,e)
  210. #define H_Nbe(%0) @Bf:H_Sb(%0,f)
  211. #define H_Nbf(%0) @Bg:H_Sb(%0,g)
  212. #define H_Nbg(%0) @Bh:H_Sb(%0,h)
  213. #define H_Nbh(%0) @Bi:H_Sb(%0,i)
  214. #define H_Nbi(%0) @Bj:H_Sb(%0,j)
  215. #define H_Nbj(%0) @Bk:H_Sb(%0,k)
  216. #define H_Nbk(%0) @Bl:H_Sb(%0,l)
  217. #define H_Nbl(%0) @Bm:H_Sb(%0,m)
  218. #define H_Nbm(%0) @Bn:H_Sb(%0,n)
  219. #define H_Nbn(%0) @Bo:H_Sb(%0,o)
  220. #define H_Nbo(%0) @Bp:H_Sb(%0,p)
  221. #define H_Nbp(%0) @Bq:H_Sb(%0,q)
  222. #define H_Nbq(%0) @Br:H_Sb(%0,r)
  223. #define H_Nbr(%0) @Bs:H_Sb(%0,s)
  224. #define H_Nbs(%0) @Bt:H_Sb(%0,t)
  225. #define H_Nbt(%0) @Bu:H_Sb(%0,u)
  226. #define H_Nbu(%0) @Bv:H_Sb(%0,v)
  227. #define H_Nbv(%0) @Bw:H_Sb(%0,w)
  228. #define H_Nbw(%0) @Bx:H_Sb(%0,x)
  229. #define H_Nbx(%0) @By:H_Sb(%0,y)
  230. #define H_Nby(%0) @Bz:H_Sb(%0,z)
  231. #define H_Nbz(%0) @BA:H_Sb(%0,0)
  232. #define H_NbA(%0) @BB:H_Sb(%0,B)
  233. #define H_NbB(%0) @BC:H_Sb(%0,C)
  234. #define H_NbC(%0) @BD:H_Sb(%0,D)
  235. #define H_NbD(%0) @BE:H_Sb(%0,E)
  236. #define H_NbE(%0) @BF:H_Sb(%0,F)
  237. #define H_NbF(%0) @BG:H_Sb(%0,G)
  238. #define H_NbG(%0) @BH:H_Sb(%0,H)
  239. #define H_NbH(%0) @BI:H_Sb(%0,I)
  240. #define H_NbI(%0) @BJ:H_Sb(%0,J)
  241. #define H_NbJ(%0) @BK:H_Sb(%0,K)
  242. #define H_NbK(%0) @BL:H_Sb(%0,L)
  243. #define H_NbL(%0) @BM:H_Sb(%0,M)
  244. #define H_NbM(%0) @BN:H_Sb(%0,N)
  245. #define H_NbN(%0) @BO:H_Sb(%0,O)
  246. #define H_NbO(%0) @BP:H_Sb(%0,P)
  247. #define H_NbP(%0) @BQ:H_Sb(%0,Q)
  248. #define H_NbQ(%0) @BR:H_Sb(%0,R)
  249. #define H_NbR(%0) @BS:H_Sb(%0,S)
  250. #define H_NbS(%0) @BT:H_Sb(%0,T)
  251. #define H_NbT(%0) @BU:H_Sb(%0,U)
  252. #define H_NbU(%0) @BV:H_Sb(%0,V)
  253. #define H_NbV(%0) @BW:H_Sb(%0,W)
  254. #define H_NbW(%0) @BX:H_Sb(%0,X)
  255. #define H_NbX(%0) @BY:H_Sb(%0,Y)
  256. #define H_NbY(%0) @BZ:H_Sb(%0,Z)
  257. #define H_NbZ(%0) -1
  258. #define H_Nb0(%0) @B1:H_Sb(%0,1)
  259. #define H_Nb1(%0) @B2:H_Sb(%0,2)
  260. #define H_Nb2(%0) @B3:H_Sb(%0,3)
  261. #define H_Nb3(%0) @B4:H_Sb(%0,4)
  262. #define H_Nb4(%0) @B5:H_Sb(%0,5)
  263. #define H_Nb5(%0) @B6:H_Sb(%0,6)
  264. #define H_Nb6(%0) @B7:H_Sb(%0,7)
  265. #define H_Nb7(%0) @B8:H_Sb(%0,8)
  266. #define H_Nb8(%0) @B9:H_Sb(%0,9)
  267. #define H_Nb9(%0) @B_:H_Sb(%0,_)
  268. #define H_Nb_(%0) @B_:H_Sb(%0,A)
  269. // ==================
  270. // Case insensitive
  271. // ==================
  272. // Do the next character test as this one failed.
  273. #define H_Sc(%0,%1) H_Nc%1(%0)
  274. // End of string test failed.
  275. #define H_Ec(%0) @Ca:H_Sc(%0,a)
  276. // Do the single addition.
  277. #define H_Dc(%0,%1) (_:H_Rc(%0)*33+%1)
  278. // Recurse through the string.
  279. #define H_Rc(%0) hc:H_Ec(%0)
  280. // Test for the end of a string.
  281. #define hc:H_Ec() -1
  282. // Find the length of a string at compile time.
  283. //#define LEN(%0) _:(I_R(%0))
  284. // Test for the current character.
  285. #define @Ca:H_Sc(a%0,%1) H_Dc(%0,65)
  286. #define @Cb:H_Sc(b%0,%1) H_Dc(%0,66)
  287. #define @Cc:H_Sc(c%0,%1) H_Dc(%0,67)
  288. #define @Cd:H_Sc(d%0,%1) H_Dc(%0,68)
  289. #define @Ce:H_Sc(e%0,%1) H_Dc(%0,69)
  290. #define @Cf:H_Sc(f%0,%1) H_Dc(%0,70)
  291. #define @Cg:H_Sc(g%0,%1) H_Dc(%0,71)
  292. #define @Ch:H_Sc(h%0,%1) H_Dc(%0,72)
  293. #define @Ci:H_Sc(i%0,%1) H_Dc(%0,73)
  294. #define @Cj:H_Sc(j%0,%1) H_Dc(%0,74)
  295. #define @Ck:H_Sc(k%0,%1) H_Dc(%0,75)
  296. #define @Cl:H_Sc(l%0,%1) H_Dc(%0,76)
  297. #define @Cm:H_Sc(m%0,%1) H_Dc(%0,77)
  298. #define @Cn:H_Sc(n%0,%1) H_Dc(%0,78)
  299. #define @Co:H_Sc(o%0,%1) H_Dc(%0,79)
  300. #define @Cp:H_Sc(p%0,%1) H_Dc(%0,80)
  301. #define @Cq:H_Sc(q%0,%1) H_Dc(%0,81)
  302. #define @Cr:H_Sc(r%0,%1) H_Dc(%0,82)
  303. #define @Cs:H_Sc(s%0,%1) H_Dc(%0,83)
  304. #define @Ct:H_Sc(t%0,%1) H_Dc(%0,84)
  305. #define @Cu:H_Sc(u%0,%1) H_Dc(%0,85)
  306. #define @Cv:H_Sc(v%0,%1) H_Dc(%0,86)
  307. #define @Cw:H_Sc(w%0,%1) H_Dc(%0,87)
  308. #define @Cx:H_Sc(x%0,%1) H_Dc(%0,88)
  309. #define @Cy:H_Sc(y%0,%1) H_Dc(%0,89)
  310. #define @Cz:H_Sc(z%0,%1) H_Dc(%0,90)
  311. #define @CA:H_Sc(A%0,%1) H_Dc(%0,65)
  312. #define @CB:H_Sc(B%0,%1) H_Dc(%0,66)
  313. #define @CC:H_Sc(C%0,%1) H_Dc(%0,67)
  314. #define @CD:H_Sc(D%0,%1) H_Dc(%0,68)
  315. #define @CE:H_Sc(E%0,%1) H_Dc(%0,69)
  316. #define @CF:H_Sc(F%0,%1) H_Dc(%0,70)
  317. #define @CG:H_Sc(G%0,%1) H_Dc(%0,71)
  318. #define @CH:H_Sc(H%0,%1) H_Dc(%0,72)
  319. #define @CI:H_Sc(I%0,%1) H_Dc(%0,73)
  320. #define @CJ:H_Sc(J%0,%1) H_Dc(%0,74)
  321. #define @CK:H_Sc(K%0,%1) H_Dc(%0,75)
  322. #define @CL:H_Sc(L%0,%1) H_Dc(%0,76)
  323. #define @CM:H_Sc(M%0,%1) H_Dc(%0,77)
  324. #define @CN:H_Sc(N%0,%1) H_Dc(%0,78)
  325. #define @CO:H_Sc(O%0,%1) H_Dc(%0,79)
  326. #define @CP:H_Sc(P%0,%1) H_Dc(%0,80)
  327. #define @CQ:H_Sc(Q%0,%1) H_Dc(%0,81)
  328. #define @CR:H_Sc(R%0,%1) H_Dc(%0,82)
  329. #define @CS:H_Sc(S%0,%1) H_Dc(%0,83)
  330. #define @CT:H_Sc(T%0,%1) H_Dc(%0,84)
  331. #define @CU:H_Sc(U%0,%1) H_Dc(%0,85)
  332. #define @CV:H_Sc(V%0,%1) H_Dc(%0,86)
  333. #define @CW:H_Sc(W%0,%1) H_Dc(%0,87)
  334. #define @CX:H_Sc(X%0,%1) H_Dc(%0,88)
  335. #define @CY:H_Sc(Y%0,%1) H_Dc(%0,89)
  336. #define @CZ:H_Sc(Z%0,%1) H_Dc(%0,90)
  337. #define @C0:H_Sc(0%0,%1) H_Dc(%0,48)
  338. #define @C1:H_Sc(1%0,%1) H_Dc(%0,49)
  339. #define @C2:H_Sc(2%0,%1) H_Dc(%0,50)
  340. #define @C3:H_Sc(3%0,%1) H_Dc(%0,51)
  341. #define @C4:H_Sc(4%0,%1) H_Dc(%0,52)
  342. #define @C5:H_Sc(5%0,%1) H_Dc(%0,53)
  343. #define @C6:H_Sc(6%0,%1) H_Dc(%0,54)
  344. #define @C7:H_Sc(7%0,%1) H_Dc(%0,55)
  345. #define @C8:H_Sc(8%0,%1) H_Dc(%0,56)
  346. #define @C9:H_Sc(9%0,%1) H_Dc(%0,57)
  347. #define @C_:H_Sc(_%0,%1) H_Dc(%0,95)
  348. //#define hc@:H_Sc(@%0,%1) H_Dc(%0)
  349. // Find the next character to test.
  350. #define H_Nca(%0) @Cb:H_Sc(%0,b)
  351. #define H_Ncb(%0) @Cc:H_Sc(%0,c)
  352. #define H_Ncc(%0) @Cd:H_Sc(%0,d)
  353. #define H_Ncd(%0) @Ce:H_Sc(%0,e)
  354. #define H_Nce(%0) @Cf:H_Sc(%0,f)
  355. #define H_Ncf(%0) @Cg:H_Sc(%0,g)
  356. #define H_Ncg(%0) @Ch:H_Sc(%0,h)
  357. #define H_Nch(%0) @Ci:H_Sc(%0,i)
  358. #define H_Nci(%0) @Cj:H_Sc(%0,j)
  359. #define H_Ncj(%0) @Ck:H_Sc(%0,k)
  360. #define H_Nck(%0) @Cl:H_Sc(%0,l)
  361. #define H_Ncl(%0) @Cm:H_Sc(%0,m)
  362. #define H_Ncm(%0) @Cn:H_Sc(%0,n)
  363. #define H_Ncn(%0) @Co:H_Sc(%0,o)
  364. #define H_Nco(%0) @Cp:H_Sc(%0,p)
  365. #define H_Ncp(%0) @Cq:H_Sc(%0,q)
  366. #define H_Ncq(%0) @Cr:H_Sc(%0,r)
  367. #define H_Ncr(%0) @Cs:H_Sc(%0,s)
  368. #define H_Ncs(%0) @Ct:H_Sc(%0,t)
  369. #define H_Nct(%0) @Cu:H_Sc(%0,u)
  370. #define H_Ncu(%0) @Cv:H_Sc(%0,v)
  371. #define H_Ncv(%0) @Cw:H_Sc(%0,w)
  372. #define H_Ncw(%0) @Cx:H_Sc(%0,x)
  373. #define H_Ncx(%0) @Cy:H_Sc(%0,y)
  374. #define H_Ncy(%0) @Cz:H_Sc(%0,z)
  375. #define H_Ncz(%0) @CA:H_Sc(%0,0)
  376. #define H_NcA(%0) @CB:H_Sc(%0,B)
  377. #define H_NcB(%0) @CC:H_Sc(%0,C)
  378. #define H_NcC(%0) @CD:H_Sc(%0,D)
  379. #define H_NcD(%0) @CE:H_Sc(%0,E)
  380. #define H_NcE(%0) @CF:H_Sc(%0,F)
  381. #define H_NcF(%0) @CG:H_Sc(%0,G)
  382. #define H_NcG(%0) @CH:H_Sc(%0,H)
  383. #define H_NcH(%0) @CI:H_Sc(%0,I)
  384. #define H_NcI(%0) @CJ:H_Sc(%0,J)
  385. #define H_NcJ(%0) @CK:H_Sc(%0,K)
  386. #define H_NcK(%0) @CL:H_Sc(%0,L)
  387. #define H_NcL(%0) @CM:H_Sc(%0,M)
  388. #define H_NcM(%0) @CN:H_Sc(%0,N)
  389. #define H_NcN(%0) @CO:H_Sc(%0,O)
  390. #define H_NcO(%0) @CP:H_Sc(%0,P)
  391. #define H_NcP(%0) @CQ:H_Sc(%0,Q)
  392. #define H_NcQ(%0) @CR:H_Sc(%0,R)
  393. #define H_NcR(%0) @CS:H_Sc(%0,S)
  394. #define H_NcS(%0) @CT:H_Sc(%0,T)
  395. #define H_NcT(%0) @CU:H_Sc(%0,U)
  396. #define H_NcU(%0) @CV:H_Sc(%0,V)
  397. #define H_NcV(%0) @CW:H_Sc(%0,W)
  398. #define H_NcW(%0) @CX:H_Sc(%0,X)
  399. #define H_NcX(%0) @CY:H_Sc(%0,Y)
  400. #define H_NcY(%0) @CZ:H_Sc(%0,Z)
  401. #define H_NcZ(%0) -1
  402. #define H_Nc0(%0) @C1:H_Sc(%0,1)
  403. #define H_Nc1(%0) @C2:H_Sc(%0,2)
  404. #define H_Nc2(%0) @C3:H_Sc(%0,3)
  405. #define H_Nc3(%0) @C4:H_Sc(%0,4)
  406. #define H_Nc4(%0) @C5:H_Sc(%0,5)
  407. #define H_Nc5(%0) @C6:H_Sc(%0,6)
  408. #define H_Nc6(%0) @C7:H_Sc(%0,7)
  409. #define H_Nc7(%0) @C8:H_Sc(%0,8)
  410. #define H_Nc8(%0) @C9:H_Sc(%0,9)
  411. #define H_Nc9(%0) @C_:H_Sc(%0,_)
  412. #define H_Nc_(%0) @C0:H_Sc(%0,A)
  413. // ===========
  414. // FNV1 hash
  415. // ===========
  416. // ================
  417. // Case sensitive
  418. // ================
  419. // Do the next character test as this one failed.
  420. #define H_Sg(%0,%1) H_Ng%1(%0)
  421. // End of string test failed.
  422. #define H_Eg(%0) @Ga:H_Sg(%0,a)
  423. // Do the single addition.
  424. #define H_Dg(%0,%1) (_:H_Rg(%0)*16777619^%1)
  425. // Recurse through the string.
  426. #define H_Rg(%0) hg:H_Eg(%0)
  427. // Test for the end of a string.
  428. #define hg:H_Eg() 2166136261
  429. // Find the length of a string at compile time.
  430. //#define LEN(%0) _:(H_R(%0))
  431. // Test for the current character.
  432. #define @Ga:H_Sg(a%0,%1) H_Dg(%0,97)
  433. #define @Gb:H_Sg(b%0,%1) H_Dg(%0,98)
  434. #define @Gc:H_Sg(c%0,%1) H_Dg(%0,99)
  435. #define @Gd:H_Sg(d%0,%1) H_Dg(%0,100)
  436. #define @Ge:H_Sg(e%0,%1) H_Dg(%0,101)
  437. #define @Gf:H_Sg(f%0,%1) H_Dg(%0,102)
  438. #define @Gg:H_Sg(g%0,%1) H_Dg(%0,103)
  439. #define @Gh:H_Sg(h%0,%1) H_Dg(%0,104)
  440. #define @Gi:H_Sg(i%0,%1) H_Dg(%0,105)
  441. #define @Gj:H_Sg(j%0,%1) H_Dg(%0,106)
  442. #define @Gk:H_Sg(k%0,%1) H_Dg(%0,107)
  443. #define @Gl:H_Sg(l%0,%1) H_Dg(%0,108)
  444. #define @Gm:H_Sg(m%0,%1) H_Dg(%0,109)
  445. #define @Gn:H_Sg(n%0,%1) H_Dg(%0,110)
  446. #define @Go:H_Sg(o%0,%1) H_Dg(%0,111)
  447. #define @Gp:H_Sg(p%0,%1) H_Dg(%0,112)
  448. #define @Gq:H_Sg(q%0,%1) H_Dg(%0,113)
  449. #define @Gr:H_Sg(r%0,%1) H_Dg(%0,114)
  450. #define @Gs:H_Sg(s%0,%1) H_Dg(%0,115)
  451. #define @Gt:H_Sg(t%0,%1) H_Dg(%0,116)
  452. #define @Gu:H_Sg(u%0,%1) H_Dg(%0,117)
  453. #define @Gv:H_Sg(v%0,%1) H_Dg(%0,118)
  454. #define @Gw:H_Sg(w%0,%1) H_Dg(%0,119)
  455. #define @Gx:H_Sg(x%0,%1) H_Dg(%0,120)
  456. #define @Gy:H_Sg(y%0,%1) H_Dg(%0,121)
  457. #define @Gz:H_Sg(z%0,%1) H_Dg(%0,122)
  458. #define @GA:H_Sg(A%0,%1) H_Dg(%0,65)
  459. #define @GB:H_Sg(B%0,%1) H_Dg(%0,66)
  460. #define @GC:H_Sg(C%0,%1) H_Dg(%0,67)
  461. #define @GD:H_Sg(D%0,%1) H_Dg(%0,68)
  462. #define @GE:H_Sg(E%0,%1) H_Dg(%0,69)
  463. #define @GF:H_Sg(F%0,%1) H_Dg(%0,70)
  464. #define @GG:H_Sg(G%0,%1) H_Dg(%0,71)
  465. #define @GH:H_Sg(H%0,%1) H_Dg(%0,72)
  466. #define @GI:H_Sg(I%0,%1) H_Dg(%0,73)
  467. #define @GJ:H_Sg(J%0,%1) H_Dg(%0,74)
  468. #define @GK:H_Sg(K%0,%1) H_Dg(%0,75)
  469. #define @GL:H_Sg(L%0,%1) H_Dg(%0,76)
  470. #define @GM:H_Sg(M%0,%1) H_Dg(%0,77)
  471. #define @GN:H_Sg(N%0,%1) H_Dg(%0,78)
  472. #define @GO:H_Sg(O%0,%1) H_Dg(%0,79)
  473. #define @GP:H_Sg(P%0,%1) H_Dg(%0,80)
  474. #define @GQ:H_Sg(Q%0,%1) H_Dg(%0,81)
  475. #define @GR:H_Sg(R%0,%1) H_Dg(%0,82)
  476. #define @GS:H_Sg(S%0,%1) H_Dg(%0,83)
  477. #define @GT:H_Sg(T%0,%1) H_Dg(%0,84)
  478. #define @GU:H_Sg(U%0,%1) H_Dg(%0,85)
  479. #define @GV:H_Sg(V%0,%1) H_Dg(%0,86)
  480. #define @GW:H_Sg(W%0,%1) H_Dg(%0,87)
  481. #define @GX:H_Sg(X%0,%1) H_Dg(%0,88)
  482. #define @GY:H_Sg(Y%0,%1) H_Dg(%0,89)
  483. #define @GZ:H_Sg(Z%0,%1) H_Dg(%0,90)
  484. #define @G0:H_Sg(0%0,%1) H_Dg(%0,48)
  485. #define @G1:H_Sg(1%0,%1) H_Dg(%0,49)
  486. #define @G2:H_Sg(2%0,%1) H_Dg(%0,50)
  487. #define @G3:H_Sg(3%0,%1) H_Dg(%0,51)
  488. #define @G4:H_Sg(4%0,%1) H_Dg(%0,52)
  489. #define @G5:H_Sg(5%0,%1) H_Dg(%0,53)
  490. #define @G6:H_Sg(6%0,%1) H_Dg(%0,54)
  491. #define @G7:H_Sg(7%0,%1) H_Dg(%0,55)
  492. #define @G8:H_Sg(8%0,%1) H_Dg(%0,56)
  493. #define @G9:H_Sg(9%0,%1) H_Dg(%0,57)
  494. #define @G_:H_Sg(_%0,%1) H_Dg(%0,95)
  495. //#define hg@:H_Sg(@%0,%1) H_Dg(%0)
  496. // Find the next character to test.
  497. #define H_Nga(%0) @Gb:H_Sg(%0,b)
  498. #define H_Ngb(%0) @Gc:H_Sg(%0,c)
  499. #define H_Ngc(%0) @Gd:H_Sg(%0,d)
  500. #define H_Ngd(%0) @Ge:H_Sg(%0,e)
  501. #define H_Nge(%0) @Gf:H_Sg(%0,f)
  502. #define H_Ngf(%0) @Gg:H_Sg(%0,g)
  503. #define H_Ngg(%0) @Gh:H_Sg(%0,h)
  504. #define H_Ngh(%0) @Gi:H_Sg(%0,i)
  505. #define H_Ngi(%0) @Gj:H_Sg(%0,j)
  506. #define H_Ngj(%0) @Gk:H_Sg(%0,k)
  507. #define H_Ngk(%0) @Gl:H_Sg(%0,l)
  508. #define H_Ngl(%0) @Gm:H_Sg(%0,m)
  509. #define H_Ngm(%0) @Gn:H_Sg(%0,n)
  510. #define H_Ngn(%0) @Go:H_Sg(%0,o)
  511. #define H_Ngo(%0) @Gp:H_Sg(%0,p)
  512. #define H_Ngp(%0) @Gq:H_Sg(%0,q)
  513. #define H_Ngq(%0) @Gr:H_Sg(%0,r)
  514. #define H_Ngr(%0) @Gs:H_Sg(%0,s)
  515. #define H_Ngs(%0) @Gt:H_Sg(%0,t)
  516. #define H_Ngt(%0) @Gu:H_Sg(%0,u)
  517. #define H_Ngu(%0) @Gv:H_Sg(%0,v)
  518. #define H_Ngv(%0) @Gw:H_Sg(%0,w)
  519. #define H_Ngw(%0) @Gx:H_Sg(%0,x)
  520. #define H_Ngx(%0) @Gy:H_Sg(%0,y)
  521. #define H_Ngy(%0) @Gz:H_Sg(%0,z)
  522. #define H_Ngz(%0) @GA:H_Sg(%0,0)
  523. #define H_NgA(%0) @GB:H_Sg(%0,B)
  524. #define H_NgB(%0) @GC:H_Sg(%0,C)
  525. #define H_NgC(%0) @GD:H_Sg(%0,D)
  526. #define H_NgD(%0) @GE:H_Sg(%0,E)
  527. #define H_NgE(%0) @GF:H_Sg(%0,F)
  528. #define H_NgF(%0) @GG:H_Sg(%0,G)
  529. #define H_NgG(%0) @GH:H_Sg(%0,H)
  530. #define H_NgH(%0) @GI:H_Sg(%0,I)
  531. #define H_NgI(%0) @GJ:H_Sg(%0,J)
  532. #define H_NgJ(%0) @GK:H_Sg(%0,K)
  533. #define H_NgK(%0) @GL:H_Sg(%0,L)
  534. #define H_NgL(%0) @GM:H_Sg(%0,M)
  535. #define H_NgM(%0) @GN:H_Sg(%0,N)
  536. #define H_NgN(%0) @GO:H_Sg(%0,O)
  537. #define H_NgO(%0) @GP:H_Sg(%0,P)
  538. #define H_NgP(%0) @GQ:H_Sg(%0,Q)
  539. #define H_NgQ(%0) @GR:H_Sg(%0,R)
  540. #define H_NgR(%0) @GS:H_Sg(%0,S)
  541. #define H_NgS(%0) @GT:H_Sg(%0,T)
  542. #define H_NgT(%0) @GU:H_Sg(%0,U)
  543. #define H_NgU(%0) @GV:H_Sg(%0,V)
  544. #define H_NgV(%0) @GW:H_Sg(%0,W)
  545. #define H_NgW(%0) @GX:H_Sg(%0,X)
  546. #define H_NgX(%0) @GY:H_Sg(%0,Y)
  547. #define H_NgY(%0) @GZ:H_Sg(%0,Z)
  548. #define H_NgZ(%0) 2166136261
  549. #define H_Ng0(%0) @G1:H_Sg(%0,1)
  550. #define H_Ng1(%0) @G2:H_Sg(%0,2)
  551. #define H_Ng2(%0) @G3:H_Sg(%0,3)
  552. #define H_Ng3(%0) @G4:H_Sg(%0,4)
  553. #define H_Ng4(%0) @G5:H_Sg(%0,5)
  554. #define H_Ng5(%0) @G6:H_Sg(%0,6)
  555. #define H_Ng6(%0) @G7:H_Sg(%0,7)
  556. #define H_Ng7(%0) @G8:H_Sg(%0,8)
  557. #define H_Ng8(%0) @G9:H_Sg(%0,9)
  558. #define H_Ng9(%0) @G_:H_Sg(%0,_)
  559. #define H_Ng_(%0) @G0:H_Sg(%0,A)
  560. // ==================
  561. // Case insensitive
  562. // ==================
  563. // Do the next character test as this one failed.
  564. #define H_Sf(%0,%1) H_Nf%1(%0)
  565. // End of string test failed.
  566. #define H_Ef(%0) @Fa:H_Sf(%0,a)
  567. // Do the single addition.
  568. #define H_Df(%0,%1) (_:H_Rf(%0)*16777619^%1)
  569. // Recurse through the string.
  570. #define H_Rf(%0) hf:H_Ef(%0)
  571. // Test for the end of a string.
  572. #define hf:H_Ef() 2166136261
  573. // Find the length of a string at compile time.
  574. //#define LEN(%0) _:(I_R(%0))
  575. // Test for the current character.
  576. #define @Fa:H_Sf(a%0,%1) H_Df(%0,65)
  577. #define @Fb:H_Sf(b%0,%1) H_Df(%0,66)
  578. #define @Fc:H_Sf(c%0,%1) H_Df(%0,67)
  579. #define @Fd:H_Sf(d%0,%1) H_Df(%0,68)
  580. #define @Fe:H_Sf(e%0,%1) H_Df(%0,69)
  581. #define @Ff:H_Sf(f%0,%1) H_Df(%0,70)
  582. #define @Fg:H_Sf(g%0,%1) H_Df(%0,71)
  583. #define @Fh:H_Sf(h%0,%1) H_Df(%0,72)
  584. #define @Fi:H_Sf(i%0,%1) H_Df(%0,73)
  585. #define @Fj:H_Sf(j%0,%1) H_Df(%0,74)
  586. #define @Fk:H_Sf(k%0,%1) H_Df(%0,75)
  587. #define @Fl:H_Sf(l%0,%1) H_Df(%0,76)
  588. #define @Fm:H_Sf(m%0,%1) H_Df(%0,77)
  589. #define @Fn:H_Sf(n%0,%1) H_Df(%0,78)
  590. #define @Fo:H_Sf(o%0,%1) H_Df(%0,79)
  591. #define @Fp:H_Sf(p%0,%1) H_Df(%0,80)
  592. #define @Fq:H_Sf(q%0,%1) H_Df(%0,81)
  593. #define @Fr:H_Sf(r%0,%1) H_Df(%0,82)
  594. #define @Fs:H_Sf(s%0,%1) H_Df(%0,83)
  595. #define @Ft:H_Sf(t%0,%1) H_Df(%0,84)
  596. #define @Fu:H_Sf(u%0,%1) H_Df(%0,85)
  597. #define @Fv:H_Sf(v%0,%1) H_Df(%0,86)
  598. #define @Fw:H_Sf(w%0,%1) H_Df(%0,87)
  599. #define @Fx:H_Sf(x%0,%1) H_Df(%0,88)
  600. #define @Fy:H_Sf(y%0,%1) H_Df(%0,89)
  601. #define @Fz:H_Sf(z%0,%1) H_Df(%0,90)
  602. #define @FA:H_Sf(A%0,%1) H_Df(%0,65)
  603. #define @FB:H_Sf(B%0,%1) H_Df(%0,66)
  604. #define @FC:H_Sf(C%0,%1) H_Df(%0,67)
  605. #define @FD:H_Sf(D%0,%1) H_Df(%0,68)
  606. #define @FE:H_Sf(E%0,%1) H_Df(%0,69)
  607. #define @FF:H_Sf(F%0,%1) H_Df(%0,70)
  608. #define @FG:H_Sf(G%0,%1) H_Df(%0,71)
  609. #define @FH:H_Sf(H%0,%1) H_Df(%0,72)
  610. #define @FI:H_Sf(I%0,%1) H_Df(%0,73)
  611. #define @FJ:H_Sf(J%0,%1) H_Df(%0,74)
  612. #define @FK:H_Sf(K%0,%1) H_Df(%0,75)
  613. #define @FL:H_Sf(L%0,%1) H_Df(%0,76)
  614. #define @FM:H_Sf(M%0,%1) H_Df(%0,77)
  615. #define @FN:H_Sf(N%0,%1) H_Df(%0,78)
  616. #define @FO:H_Sf(O%0,%1) H_Df(%0,79)
  617. #define @FP:H_Sf(P%0,%1) H_Df(%0,80)
  618. #define @FQ:H_Sf(Q%0,%1) H_Df(%0,81)
  619. #define @FR:H_Sf(R%0,%1) H_Df(%0,82)
  620. #define @FS:H_Sf(S%0,%1) H_Df(%0,83)
  621. #define @FT:H_Sf(T%0,%1) H_Df(%0,84)
  622. #define @FU:H_Sf(U%0,%1) H_Df(%0,85)
  623. #define @FV:H_Sf(V%0,%1) H_Df(%0,86)
  624. #define @FW:H_Sf(W%0,%1) H_Df(%0,87)
  625. #define @FX:H_Sf(X%0,%1) H_Df(%0,88)
  626. #define @FY:H_Sf(Y%0,%1) H_Df(%0,89)
  627. #define @FZ:H_Sf(Z%0,%1) H_Df(%0,90)
  628. #define @F0:H_Sf(0%0,%1) H_Df(%0,48)
  629. #define @F1:H_Sf(1%0,%1) H_Df(%0,49)
  630. #define @F2:H_Sf(2%0,%1) H_Df(%0,50)
  631. #define @F3:H_Sf(3%0,%1) H_Df(%0,51)
  632. #define @F4:H_Sf(4%0,%1) H_Df(%0,52)
  633. #define @F5:H_Sf(5%0,%1) H_Df(%0,53)
  634. #define @F6:H_Sf(6%0,%1) H_Df(%0,54)
  635. #define @F7:H_Sf(7%0,%1) H_Df(%0,55)
  636. #define @F8:H_Sf(8%0,%1) H_Df(%0,56)
  637. #define @F9:H_Sf(9%0,%1) H_Df(%0,57)
  638. #define @F_:H_Sf(_%0,%1) H_Df(%0,95)
  639. //#define hf@:H_Sf(@%0,%1) H_Df(%0)
  640. // Find the next character to test.
  641. #define H_Nfa(%0) @Fb:H_Sf(%0,b)
  642. #define H_Nfb(%0) @Fc:H_Sf(%0,c)
  643. #define H_Nfc(%0) @Fd:H_Sf(%0,d)
  644. #define H_Nfd(%0) @Fe:H_Sf(%0,e)
  645. #define H_Nfe(%0) @Ff:H_Sf(%0,f)
  646. #define H_Nff(%0) @Fg:H_Sf(%0,g)
  647. #define H_Nfg(%0) @Fh:H_Sf(%0,h)
  648. #define H_Nfh(%0) @Fi:H_Sf(%0,i)
  649. #define H_Nfi(%0) @Fj:H_Sf(%0,j)
  650. #define H_Nfj(%0) @Fk:H_Sf(%0,k)
  651. #define H_Nfk(%0) @Fl:H_Sf(%0,l)
  652. #define H_Nfl(%0) @Fm:H_Sf(%0,m)
  653. #define H_Nfm(%0) @Fn:H_Sf(%0,n)
  654. #define H_Nfn(%0) @Fo:H_Sf(%0,o)
  655. #define H_Nfo(%0) @Fp:H_Sf(%0,p)
  656. #define H_Nfp(%0) @Fq:H_Sf(%0,q)
  657. #define H_Nfq(%0) @Fr:H_Sf(%0,r)
  658. #define H_Nfr(%0) @Fs:H_Sf(%0,s)
  659. #define H_Nfs(%0) @Ft:H_Sf(%0,t)
  660. #define H_Nft(%0) @Fu:H_Sf(%0,u)
  661. #define H_Nfu(%0) @Fv:H_Sf(%0,v)
  662. #define H_Nfv(%0) @Fw:H_Sf(%0,w)
  663. #define H_Nfw(%0) @Fx:H_Sf(%0,x)
  664. #define H_Nfx(%0) @Fy:H_Sf(%0,y)
  665. #define H_Nfy(%0) @Fz:H_Sf(%0,z)
  666. #define H_Nfz(%0) @FA:H_Sf(%0,0)
  667. #define H_NfA(%0) @FB:H_Sf(%0,B)
  668. #define H_NfB(%0) @FC:H_Sf(%0,C)
  669. #define H_NfC(%0) @FD:H_Sf(%0,D)
  670. #define H_NfD(%0) @FE:H_Sf(%0,E)
  671. #define H_NfE(%0) @FF:H_Sf(%0,F)
  672. #define H_NfF(%0) @FG:H_Sf(%0,G)
  673. #define H_NfG(%0) @FH:H_Sf(%0,H)
  674. #define H_NfH(%0) @FI:H_Sf(%0,I)
  675. #define H_NfI(%0) @FJ:H_Sf(%0,J)
  676. #define H_NfJ(%0) @FK:H_Sf(%0,K)
  677. #define H_NfK(%0) @FL:H_Sf(%0,L)
  678. #define H_NfL(%0) @FM:H_Sf(%0,M)
  679. #define H_NfM(%0) @FN:H_Sf(%0,N)
  680. #define H_NfN(%0) @FO:H_Sf(%0,O)
  681. #define H_NfO(%0) @FP:H_Sf(%0,P)
  682. #define H_NfP(%0) @FQ:H_Sf(%0,Q)
  683. #define H_NfQ(%0) @FR:H_Sf(%0,R)
  684. #define H_NfR(%0) @FS:H_Sf(%0,S)
  685. #define H_NfS(%0) @FT:H_Sf(%0,T)
  686. #define H_NfT(%0) @FU:H_Sf(%0,U)
  687. #define H_NfU(%0) @FV:H_Sf(%0,V)
  688. #define H_NfV(%0) @FW:H_Sf(%0,W)
  689. #define H_NfW(%0) @FX:H_Sf(%0,X)
  690. #define H_NfX(%0) @FY:H_Sf(%0,Y)
  691. #define H_NfY(%0) @FZ:H_Sf(%0,Z)
  692. #define H_NfZ(%0) 2166136261
  693. #define H_Nf0(%0) @F1:H_Sf(%0,1)
  694. #define H_Nf1(%0) @F2:H_Sf(%0,2)
  695. #define H_Nf2(%0) @F3:H_Sf(%0,3)
  696. #define H_Nf3(%0) @F4:H_Sf(%0,4)
  697. #define H_Nf4(%0) @F5:H_Sf(%0,5)
  698. #define H_Nf5(%0) @F6:H_Sf(%0,6)
  699. #define H_Nf6(%0) @F7:H_Sf(%0,7)
  700. #define H_Nf7(%0) @F8:H_Sf(%0,8)
  701. #define H_Nf8(%0) @F9:H_Sf(%0,9)
  702. #define H_Nf9(%0) @F_:H_Sf(%0,_)
  703. #define H_Nf_(%0) @F0:H_Sf(%0,A)
  704. // ============
  705. // FNV1a hash
  706. // ============
  707. // ================
  708. // Case sensitive
  709. // ================
  710. // Do the next character test as this one failed.
  711. #define H_Sa(%0,%1) H_Na%1(%0)
  712. // End of string test failed.
  713. #define H_Ea(%0) @Aa:H_Sa(%0,a)
  714. // Do the single addition.
  715. #define H_Da(%0,%1) ((_:H_Ra(%0)^%1)*16777619)
  716. // Recurse through the string.
  717. #define H_Ra(%0) ha:H_Ea(%0)
  718. // Test for the end of a string.
  719. #define ha:H_Ea() 2166136261
  720. // Find the length of a string at compile time.
  721. //#define LEN(%0) _:(H_R(%0))
  722. // Test for the current character.
  723. #define @Aa:H_Sa(a%0,%1) H_Da(%0,97)
  724. #define @Ab:H_Sa(b%0,%1) H_Da(%0,98)
  725. #define @Ac:H_Sa(c%0,%1) H_Da(%0,99)
  726. #define @Ad:H_Sa(d%0,%1) H_Da(%0,100)
  727. #define @Ae:H_Sa(e%0,%1) H_Da(%0,101)
  728. #define @Af:H_Sa(f%0,%1) H_Da(%0,102)
  729. #define @Ag:H_Sa(g%0,%1) H_Da(%0,103)
  730. #define @Ah:H_Sa(h%0,%1) H_Da(%0,104)
  731. #define @Ai:H_Sa(i%0,%1) H_Da(%0,105)
  732. #define @Aj:H_Sa(j%0,%1) H_Da(%0,106)
  733. #define @Ak:H_Sa(k%0,%1) H_Da(%0,107)
  734. #define @Al:H_Sa(l%0,%1) H_Da(%0,108)
  735. #define @Am:H_Sa(m%0,%1) H_Da(%0,109)
  736. #define @An:H_Sa(n%0,%1) H_Da(%0,110)
  737. #define @Ao:H_Sa(o%0,%1) H_Da(%0,111)
  738. #define @Ap:H_Sa(p%0,%1) H_Da(%0,112)
  739. #define @Aq:H_Sa(q%0,%1) H_Da(%0,113)
  740. #define @Ar:H_Sa(r%0,%1) H_Da(%0,114)
  741. #define @As:H_Sa(s%0,%1) H_Da(%0,115)
  742. #define @At:H_Sa(t%0,%1) H_Da(%0,116)
  743. #define @Au:H_Sa(u%0,%1) H_Da(%0,117)
  744. #define @Av:H_Sa(v%0,%1) H_Da(%0,118)
  745. #define @Aw:H_Sa(w%0,%1) H_Da(%0,119)
  746. #define @Ax:H_Sa(x%0,%1) H_Da(%0,120)
  747. #define @Ay:H_Sa(y%0,%1) H_Da(%0,121)
  748. #define @Az:H_Sa(z%0,%1) H_Da(%0,122)
  749. #define @AA:H_Sa(A%0,%1) H_Da(%0,65)
  750. #define @AB:H_Sa(B%0,%1) H_Da(%0,66)
  751. #define @AC:H_Sa(C%0,%1) H_Da(%0,67)
  752. #define @AD:H_Sa(D%0,%1) H_Da(%0,68)
  753. #define @AE:H_Sa(E%0,%1) H_Da(%0,69)
  754. #define @AF:H_Sa(F%0,%1) H_Da(%0,70)
  755. #define @AG:H_Sa(G%0,%1) H_Da(%0,71)
  756. #define @AH:H_Sa(H%0,%1) H_Da(%0,72)
  757. #define @AI:H_Sa(I%0,%1) H_Da(%0,73)
  758. #define @AJ:H_Sa(J%0,%1) H_Da(%0,74)
  759. #define @AK:H_Sa(K%0,%1) H_Da(%0,75)
  760. #define @AL:H_Sa(L%0,%1) H_Da(%0,76)
  761. #define @AM:H_Sa(M%0,%1) H_Da(%0,77)
  762. #define @AN:H_Sa(N%0,%1) H_Da(%0,78)
  763. #define @AO:H_Sa(O%0,%1) H_Da(%0,79)
  764. #define @AP:H_Sa(P%0,%1) H_Da(%0,80)
  765. #define @AQ:H_Sa(Q%0,%1) H_Da(%0,81)
  766. #define @AR:H_Sa(R%0,%1) H_Da(%0,82)
  767. #define @AS:H_Sa(S%0,%1) H_Da(%0,83)
  768. #define @AT:H_Sa(T%0,%1) H_Da(%0,84)
  769. #define @AU:H_Sa(U%0,%1) H_Da(%0,85)
  770. #define @AV:H_Sa(V%0,%1) H_Da(%0,86)
  771. #define @AW:H_Sa(W%0,%1) H_Da(%0,87)
  772. #define @AX:H_Sa(X%0,%1) H_Da(%0,88)
  773. #define @AY:H_Sa(Y%0,%1) H_Da(%0,89)
  774. #define @AZ:H_Sa(Z%0,%1) H_Da(%0,90)
  775. #define @A0:H_Sa(0%0,%1) H_Da(%0,48)
  776. #define @A1:H_Sa(1%0,%1) H_Da(%0,49)
  777. #define @A2:H_Sa(2%0,%1) H_Da(%0,50)
  778. #define @A3:H_Sa(3%0,%1) H_Da(%0,51)
  779. #define @A4:H_Sa(4%0,%1) H_Da(%0,52)
  780. #define @A5:H_Sa(5%0,%1) H_Da(%0,53)
  781. #define @A6:H_Sa(6%0,%1) H_Da(%0,54)
  782. #define @A7:H_Sa(7%0,%1) H_Da(%0,55)
  783. #define @A8:H_Sa(8%0,%1) H_Da(%0,56)
  784. #define @A9:H_Sa(9%0,%1) H_Da(%0,57)
  785. #define @A_:H_Sa(_%0,%1) H_Da(%0,95)
  786. //#define ha@:H_Sa(@%0,%1) H_Da(%0)
  787. // Find the next character to test.
  788. #define H_Naa(%0) @Ab:H_Sa(%0,b)
  789. #define H_Nab(%0) @Ac:H_Sa(%0,c)
  790. #define H_Nac(%0) @Ad:H_Sa(%0,d)
  791. #define H_Nad(%0) @Ae:H_Sa(%0,e)
  792. #define H_Nae(%0) @Af:H_Sa(%0,f)
  793. #define H_Naf(%0) @Ag:H_Sa(%0,g)
  794. #define H_Nag(%0) @Ah:H_Sa(%0,h)
  795. #define H_Nah(%0) @Ai:H_Sa(%0,i)
  796. #define H_Nai(%0) @Aj:H_Sa(%0,j)
  797. #define H_Naj(%0) @Ak:H_Sa(%0,k)
  798. #define H_Nak(%0) @Al:H_Sa(%0,l)
  799. #define H_Nal(%0) @Am:H_Sa(%0,m)
  800. #define H_Nam(%0) @An:H_Sa(%0,n)
  801. #define H_Nan(%0) @Ao:H_Sa(%0,o)
  802. #define H_Nao(%0) @Ap:H_Sa(%0,p)
  803. #define H_Nap(%0) @Aq:H_Sa(%0,q)
  804. #define H_Naq(%0) @Ar:H_Sa(%0,r)
  805. #define H_Nar(%0) @As:H_Sa(%0,s)
  806. #define H_Nas(%0) @At:H_Sa(%0,t)
  807. #define H_Nat(%0) @Au:H_Sa(%0,u)
  808. #define H_Nau(%0) @Av:H_Sa(%0,v)
  809. #define H_Nav(%0) @Aw:H_Sa(%0,w)
  810. #define H_Naw(%0) @Ax:H_Sa(%0,x)
  811. #define H_Nax(%0) @Ay:H_Sa(%0,y)
  812. #define H_Nay(%0) @Az:H_Sa(%0,z)
  813. #define H_Naz(%0) @AA:H_Sa(%0,0)
  814. #define H_NaA(%0) @AB:H_Sa(%0,B)
  815. #define H_NaB(%0) @AC:H_Sa(%0,C)
  816. #define H_NaC(%0) @AD:H_Sa(%0,D)
  817. #define H_NaD(%0) @AE:H_Sa(%0,E)
  818. #define H_NaE(%0) @AF:H_Sa(%0,F)
  819. #define H_NaF(%0) @AG:H_Sa(%0,G)
  820. #define H_NaG(%0) @AH:H_Sa(%0,H)
  821. #define H_NaH(%0) @AI:H_Sa(%0,I)
  822. #define H_NaI(%0) @AJ:H_Sa(%0,J)
  823. #define H_NaJ(%0) @AK:H_Sa(%0,K)
  824. #define H_NaK(%0) @AL:H_Sa(%0,L)
  825. #define H_NaL(%0) @AM:H_Sa(%0,M)
  826. #define H_NaM(%0) @AN:H_Sa(%0,N)
  827. #define H_NaN(%0) @AO:H_Sa(%0,O)
  828. #define H_NaO(%0) @AP:H_Sa(%0,P)
  829. #define H_NaP(%0) @AQ:H_Sa(%0,Q)
  830. #define H_NaQ(%0) @AR:H_Sa(%0,R)
  831. #define H_NaR(%0) @AS:H_Sa(%0,S)
  832. #define H_NaS(%0) @AT:H_Sa(%0,T)
  833. #define H_NaT(%0) @AU:H_Sa(%0,U)
  834. #define H_NaU(%0) @AV:H_Sa(%0,V)
  835. #define H_NaV(%0) @AW:H_Sa(%0,W)
  836. #define H_NaW(%0) @AX:H_Sa(%0,X)
  837. #define H_NaX(%0) @AY:H_Sa(%0,Y)
  838. #define H_NaY(%0) @AZ:H_Sa(%0,Z)
  839. #define H_NaZ(%0) 2166136261
  840. #define H_Na0(%0) @A1:H_Sa(%0,1)
  841. #define H_Na1(%0) @A2:H_Sa(%0,2)
  842. #define H_Na2(%0) @A3:H_Sa(%0,3)
  843. #define H_Na3(%0) @A4:H_Sa(%0,4)
  844. #define H_Na4(%0) @A5:H_Sa(%0,5)
  845. #define H_Na5(%0) @A6:H_Sa(%0,6)
  846. #define H_Na6(%0) @A7:H_Sa(%0,7)
  847. #define H_Na7(%0) @A8:H_Sa(%0,8)
  848. #define H_Na8(%0) @A9:H_Sa(%0,9)
  849. #define H_Na9(%0) @A_:H_Sa(%0,_)
  850. #define H_Na_(%0) @A0:H_Sa(%0,A)
  851. // ==================
  852. // Case insensitive
  853. // ==================
  854. // Do the next character test as this one failed.
  855. #define H_Sd(%0,%1) H_Nd%1(%0)
  856. // End of string test failed.
  857. #define H_Ed(%0) @Da:H_Sd(%0,a)
  858. // Do the single addition.
  859. #define H_Dd(%0,%1) ((_:H_Rd(%0)^%1)*16777619)
  860. // Recurse through the string.
  861. #define H_Rd(%0) hd:H_Ed(%0)
  862. // Test for the end of a string.
  863. #define hd:H_Ed() 2166136261
  864. // Find the length of a string at compile time.
  865. //#define LEN(%0) _:(I_R(%0))
  866. // Test for the current character.
  867. #define @Da:H_Sd(a%0,%1) H_Dd(%0,65)
  868. #define @Db:H_Sd(b%0,%1) H_Dd(%0,66)
  869. #define @Dc:H_Sd(c%0,%1) H_Dd(%0,67)
  870. #define @Dd:H_Sd(d%0,%1) H_Dd(%0,68)
  871. #define @De:H_Sd(e%0,%1) H_Dd(%0,69)
  872. #define @Df:H_Sd(f%0,%1) H_Dd(%0,70)
  873. #define @Dg:H_Sd(g%0,%1) H_Dd(%0,71)
  874. #define @Dh:H_Sd(h%0,%1) H_Dd(%0,72)
  875. #define @Di:H_Sd(i%0,%1) H_Dd(%0,73)
  876. #define @Dj:H_Sd(j%0,%1) H_Dd(%0,74)
  877. #define @Dk:H_Sd(k%0,%1) H_Dd(%0,75)
  878. #define @Dl:H_Sd(l%0,%1) H_Dd(%0,76)
  879. #define @Dm:H_Sd(m%0,%1) H_Dd(%0,77)
  880. #define @Dn:H_Sd(n%0,%1) H_Dd(%0,78)
  881. #define @Do:H_Sd(o%0,%1) H_Dd(%0,79)
  882. #define @Dp:H_Sd(p%0,%1) H_Dd(%0,80)
  883. #define @Dq:H_Sd(q%0,%1) H_Dd(%0,81)
  884. #define @Dr:H_Sd(r%0,%1) H_Dd(%0,82)
  885. #define @Ds:H_Sd(s%0,%1) H_Dd(%0,83)
  886. #define @Dt:H_Sd(t%0,%1) H_Dd(%0,84)
  887. #define @Du:H_Sd(u%0,%1) H_Dd(%0,85)
  888. #define @Dv:H_Sd(v%0,%1) H_Dd(%0,86)
  889. #define @Dw:H_Sd(w%0,%1) H_Dd(%0,87)
  890. #define @Dx:H_Sd(x%0,%1) H_Dd(%0,88)
  891. #define @Dy:H_Sd(y%0,%1) H_Dd(%0,89)
  892. #define @Dz:H_Sd(z%0,%1) H_Dd(%0,90)
  893. #define @DA:H_Sd(A%0,%1) H_Dd(%0,65)
  894. #define @DB:H_Sd(B%0,%1) H_Dd(%0,66)
  895. #define @DC:H_Sd(C%0,%1) H_Dd(%0,67)
  896. #define @DD:H_Sd(D%0,%1) H_Dd(%0,68)
  897. #define @DE:H_Sd(E%0,%1) H_Dd(%0,69)
  898. #define @DF:H_Sd(F%0,%1) H_Dd(%0,70)
  899. #define @DG:H_Sd(G%0,%1) H_Dd(%0,71)
  900. #define @DH:H_Sd(H%0,%1) H_Dd(%0,72)
  901. #define @DI:H_Sd(I%0,%1) H_Dd(%0,73)
  902. #define @DJ:H_Sd(J%0,%1) H_Dd(%0,74)
  903. #define @DK:H_Sd(K%0,%1) H_Dd(%0,75)
  904. #define @DL:H_Sd(L%0,%1) H_Dd(%0,76)
  905. #define @DM:H_Sd(M%0,%1) H_Dd(%0,77)
  906. #define @DN:H_Sd(N%0,%1) H_Dd(%0,78)
  907. #define @DO:H_Sd(O%0,%1) H_Dd(%0,79)
  908. #define @DP:H_Sd(P%0,%1) H_Dd(%0,80)
  909. #define @DQ:H_Sd(Q%0,%1) H_Dd(%0,81)
  910. #define @DR:H_Sd(R%0,%1) H_Dd(%0,82)
  911. #define @DS:H_Sd(S%0,%1) H_Dd(%0,83)
  912. #define @DT:H_Sd(T%0,%1) H_Dd(%0,84)
  913. #define @DU:H_Sd(U%0,%1) H_Dd(%0,85)
  914. #define @DV:H_Sd(V%0,%1) H_Dd(%0,86)
  915. #define @DW:H_Sd(W%0,%1) H_Dd(%0,87)
  916. #define @DX:H_Sd(X%0,%1) H_Dd(%0,88)
  917. #define @DY:H_Sd(Y%0,%1) H_Dd(%0,89)
  918. #define @DZ:H_Sd(Z%0,%1) H_Dd(%0,90)
  919. #define @D0:H_Sd(0%0,%1) H_Dd(%0,48)
  920. #define @D1:H_Sd(1%0,%1) H_Dd(%0,49)
  921. #define @D2:H_Sd(2%0,%1) H_Dd(%0,50)
  922. #define @D3:H_Sd(3%0,%1) H_Dd(%0,51)
  923. #define @D4:H_Sd(4%0,%1) H_Dd(%0,52)
  924. #define @D5:H_Sd(5%0,%1) H_Dd(%0,53)
  925. #define @D6:H_Sd(6%0,%1) H_Dd(%0,54)
  926. #define @D7:H_Sd(7%0,%1) H_Dd(%0,55)
  927. #define @D8:H_Sd(8%0,%1) H_Dd(%0,56)
  928. #define @D9:H_Sd(9%0,%1) H_Dd(%0,57)
  929. #define @D_:H_Sd(_%0,%1) H_Dd(%0,95)
  930. //#define hd@:H_Sd(@%0,%1) H_Dd(%0)
  931. // Find the next character to test.
  932. #define H_Nda(%0) @Db:H_Sd(%0,b)
  933. #define H_Ndb(%0) @Dc:H_Sd(%0,c)
  934. #define H_Ndc(%0) @Dd:H_Sd(%0,d)
  935. #define H_Ndd(%0) @De:H_Sd(%0,e)
  936. #define H_Nde(%0) @Df:H_Sd(%0,f)
  937. #define H_Ndf(%0) @Dg:H_Sd(%0,g)
  938. #define H_Ndg(%0) @Dh:H_Sd(%0,h)
  939. #define H_Ndh(%0) @Di:H_Sd(%0,i)
  940. #define H_Ndi(%0) @Dj:H_Sd(%0,j)
  941. #define H_Ndj(%0) @Dk:H_Sd(%0,k)
  942. #define H_Ndk(%0) @Dl:H_Sd(%0,l)
  943. #define H_Ndl(%0) @Dm:H_Sd(%0,m)
  944. #define H_Ndm(%0) @Dn:H_Sd(%0,n)
  945. #define H_Ndn(%0) @Do:H_Sd(%0,o)
  946. #define H_Ndo(%0) @Dp:H_Sd(%0,p)
  947. #define H_Ndp(%0) @Dq:H_Sd(%0,q)
  948. #define H_Ndq(%0) @Dr:H_Sd(%0,r)
  949. #define H_Ndr(%0) @Ds:H_Sd(%0,s)
  950. #define H_Nds(%0) @Dt:H_Sd(%0,t)
  951. #define H_Ndt(%0) @Du:H_Sd(%0,u)
  952. #define H_Ndu(%0) @Dv:H_Sd(%0,v)
  953. #define H_Ndv(%0) @Dw:H_Sd(%0,w)
  954. #define H_Ndw(%0) @Dx:H_Sd(%0,x)
  955. #define H_Ndx(%0) @Dy:H_Sd(%0,y)
  956. #define H_Ndy(%0) @Dz:H_Sd(%0,z)
  957. #define H_Ndz(%0) @DA:H_Sd(%0,0)
  958. #define H_NdA(%0) @DB:H_Sd(%0,B)
  959. #define H_NdB(%0) @DC:H_Sd(%0,C)
  960. #define H_NdC(%0) @DD:H_Sd(%0,D)
  961. #define H_NdD(%0) @DE:H_Sd(%0,E)
  962. #define H_NdE(%0) @DF:H_Sd(%0,F)
  963. #define H_NdF(%0) @DG:H_Sd(%0,G)
  964. #define H_NdG(%0) @DH:H_Sd(%0,H)
  965. #define H_NdH(%0) @DI:H_Sd(%0,I)
  966. #define H_NdI(%0) @DJ:H_Sd(%0,J)
  967. #define H_NdJ(%0) @DK:H_Sd(%0,K)
  968. #define H_NdK(%0) @DL:H_Sd(%0,L)
  969. #define H_NdL(%0) @DM:H_Sd(%0,M)
  970. #define H_NdM(%0) @DN:H_Sd(%0,N)
  971. #define H_NdN(%0) @DO:H_Sd(%0,O)
  972. #define H_NdO(%0) @DP:H_Sd(%0,P)
  973. #define H_NdP(%0) @DQ:H_Sd(%0,Q)
  974. #define H_NdQ(%0) @DR:H_Sd(%0,R)
  975. #define H_NdR(%0) @DS:H_Sd(%0,S)
  976. #define H_NdS(%0) @DT:H_Sd(%0,T)
  977. #define H_NdT(%0) @DU:H_Sd(%0,U)
  978. #define H_NdU(%0) @DV:H_Sd(%0,V)
  979. #define H_NdV(%0) @DW:H_Sd(%0,W)
  980. #define H_NdW(%0) @DX:H_Sd(%0,X)
  981. #define H_NdX(%0) @DY:H_Sd(%0,Y)
  982. #define H_NdY(%0) @DZ:H_Sd(%0,Z)
  983. #define H_NdZ(%0) 2166136261
  984. #define H_Nd0(%0) @D1:H_Sd(%0,1)
  985. #define H_Nd1(%0) @D2:H_Sd(%0,2)
  986. #define H_Nd2(%0) @D3:H_Sd(%0,3)
  987. #define H_Nd3(%0) @D4:H_Sd(%0,4)
  988. #define H_Nd4(%0) @D5:H_Sd(%0,5)
  989. #define H_Nd5(%0) @D6:H_Sd(%0,6)
  990. #define H_Nd6(%0) @D7:H_Sd(%0,7)
  991. #define H_Nd7(%0) @D8:H_Sd(%0,8)
  992. #define H_Nd8(%0) @D9:H_Sd(%0,9)
  993. #define H_Nd9(%0) @D_:H_Sd(%0,_)
  994. #define H_Nd_(%0) @D0:H_Sd(%0,A)
  995. // =============
  996. // Old version
  997. // =============
  998. // ================
  999. // Case sensitive
  1000. // ================
  1001. // These are the default values
  1002. //#define HASH(%0,%1) HASH@%0(%1)
  1003. /*#define _H@b HASH@bernstein
  1004. #define _H@f HASH@fnv1
  1005. #define _H@a HASH@fnv1a*/
  1006. // ================
  1007. // Bernstein hash
  1008. // ================
  1009. // Signify the end with two "@" symbols.
  1010. #define HASH@bernstein(%0) _REHASH@b(%0,@,@)
  1011. // Internal call.
  1012. #define _REHASH@b(%0,%1) _HASH@b_%0(%1)
  1013. // The bit that actually does the work.
  1014. #define _DOHASH@b(%0,%1,%2) (_HASH@b_%1(%2)*33+%0)
  1015. // Space.
  1016. #define _HASH@b_(%0) _DOHASH@b(32,%0)
  1017. // Numbers.
  1018. #define _HASH@b_0(%0) _DOHASH@b(48,%0)
  1019. #define _HASH@b_1(%0) _DOHASH@b(49,%0)
  1020. #define _HASH@b_2(%0) _DOHASH@b(50,%0)
  1021. #define _HASH@b_3(%0) _DOHASH@b(51,%0)
  1022. #define _HASH@b_4(%0) _DOHASH@b(52,%0)
  1023. #define _HASH@b_5(%0) _DOHASH@b(53,%0)
  1024. #define _HASH@b_6(%0) _DOHASH@b(54,%0)
  1025. #define _HASH@b_7(%0) _DOHASH@b(55,%0)
  1026. #define _HASH@b_8(%0) _DOHASH@b(56,%0)
  1027. #define _HASH@b_9(%0) _DOHASH@b(57,%0)
  1028. // Upper case letters.
  1029. #define _HASH@b_A(%0) _DOHASH@b(65,%0)
  1030. #define _HASH@b_B(%0) _DOHASH@b(66,%0)
  1031. #define _HASH@b_C(%0) _DOHASH@b(67,%0)
  1032. #define _HASH@b_D(%0) _DOHASH@b(68,%0)
  1033. #define _HASH@b_E(%0) _DOHASH@b(69,%0)
  1034. #define _HASH@b_F(%0) _DOHASH@b(70,%0)
  1035. #define _HASH@b_G(%0) _DOHASH@b(71,%0)
  1036. #define _HASH@b_H(%0) _DOHASH@b(72,%0)
  1037. #define _HASH@b_I(%0) _DOHASH@b(73,%0)
  1038. #define _HASH@b_J(%0) _DOHASH@b(74,%0)
  1039. #define _HASH@b_K(%0) _DOHASH@b(75,%0)
  1040. #define _HASH@b_L(%0) _DOHASH@b(76,%0)
  1041. #define _HASH@b_M(%0) _DOHASH@b(77,%0)
  1042. #define _HASH@b_N(%0) _DOHASH@b(78,%0)
  1043. #define _HASH@b_O(%0) _DOHASH@b(79,%0)
  1044. #define _HASH@b_P(%0) _DOHASH@b(80,%0)
  1045. #define _HASH@b_Q(%0) _DOHASH@b(81,%0)
  1046. #define _HASH@b_R(%0) _DOHASH@b(82,%0)
  1047. #define _HASH@b_S(%0) _DOHASH@b(83,%0)
  1048. #define _HASH@b_T(%0) _DOHASH@b(84,%0)
  1049. #define _HASH@b_U(%0) _DOHASH@b(85,%0)
  1050. #define _HASH@b_V(%0) _DOHASH@b(86,%0)
  1051. #define _HASH@b_W(%0) _DOHASH@b(87,%0)
  1052. #define _HASH@b_X(%0) _DOHASH@b(88,%0)
  1053. #define _HASH@b_Y(%0) _DOHASH@b(89,%0)
  1054. #define _HASH@b_Z(%0) _DOHASH@b(90,%0)
  1055. // Underscore.
  1056. #define _HASH@b__(%0) _DOHASH@b(95,%0)
  1057. // Lower case letters.
  1058. #define _HASH@b_a(%0) _DOHASH@b(97,%0)
  1059. #define _HASH@b_b(%0) _DOHASH@b(98,%0)
  1060. #define _HASH@b_c(%0) _DOHASH@b(99,%0)
  1061. #define _HASH@b_d(%0) _DOHASH@b(100,%0)
  1062. #define _HASH@b_e(%0) _DOHASH@b(101,%0)
  1063. #define _HASH@b_f(%0) _DOHASH@b(102,%0)
  1064. #define _HASH@b_g(%0) _DOHASH@b(103,%0)
  1065. #define _HASH@b_h(%0) _DOHASH@b(104,%0)
  1066. #define _HASH@b_i(%0) _DOHASH@b(105,%0)
  1067. #define _HASH@b_j(%0) _DOHASH@b(106,%0)
  1068. #define _HASH@b_k(%0) _DOHASH@b(107,%0)
  1069. #define _HASH@b_l(%0) _DOHASH@b(108,%0)
  1070. #define _HASH@b_m(%0) _DOHASH@b(109,%0)
  1071. #define _HASH@b_n(%0) _DOHASH@b(110,%0)
  1072. #define _HASH@b_o(%0) _DOHASH@b(111,%0)
  1073. #define _HASH@b_p(%0) _DOHASH@b(112,%0)
  1074. #define _HASH@b_q(%0) _DOHASH@b(113,%0)
  1075. #define _HASH@b_r(%0) _DOHASH@b(114,%0)
  1076. #define _HASH@b_s(%0) _DOHASH@b(115,%0)
  1077. #define _HASH@b_t(%0) _DOHASH@b(116,%0)
  1078. #define _HASH@b_u(%0) _DOHASH@b(117,%0)
  1079. #define _HASH@b_v(%0) _DOHASH@b(118,%0)
  1080. #define _HASH@b_w(%0) _DOHASH@b(119,%0)
  1081. #define _HASH@b_x(%0) _DOHASH@b(120,%0)
  1082. #define _HASH@b_y(%0) _DOHASH@b(121,%0)
  1083. #define _HASH@b_z(%0) _DOHASH@b(122,%0)
  1084. // String end.
  1085. #define _HASH@b_@(%0) -1
  1086. // ===========
  1087. // FNV1 hash
  1088. // ===========
  1089. // Signify the end with two "@" symbols.
  1090. #define HASH@fnv1(%0) _REHASH@f(%0,@,@)
  1091. // Internal call.
  1092. #define _REHASH@f(%0,%1) _HASH@f_%0(%1)
  1093. // The bit that actually does the work.
  1094. #define _DOHASH@f(%0,%1,%2) (_HASH@f_%1(%2)*16777619^%0)
  1095. // Space.
  1096. #define _HASH@f_(%0) _DOHASH@f(32,%0)
  1097. // Numbers.
  1098. #define _HASH@f_0(%0) _DOHASH@f(48,%0)
  1099. #define _HASH@f_1(%0) _DOHASH@f(49,%0)
  1100. #define _HASH@f_2(%0) _DOHASH@f(50,%0)
  1101. #define _HASH@f_3(%0) _DOHASH@f(51,%0)
  1102. #define _HASH@f_4(%0) _DOHASH@f(52,%0)
  1103. #define _HASH@f_5(%0) _DOHASH@f(53,%0)
  1104. #define _HASH@f_6(%0) _DOHASH@f(54,%0)
  1105. #define _HASH@f_7(%0) _DOHASH@f(55,%0)
  1106. #define _HASH@f_8(%0) _DOHASH@f(56,%0)
  1107. #define _HASH@f_9(%0) _DOHASH@f(57,%0)
  1108. // Upper case letters.
  1109. #define _HASH@f_A(%0) _DOHASH@f(65,%0)
  1110. #define _HASH@f_B(%0) _DOHASH@f(66,%0)
  1111. #define _HASH@f_C(%0) _DOHASH@f(67,%0)
  1112. #define _HASH@f_D(%0) _DOHASH@f(68,%0)
  1113. #define _HASH@f_E(%0) _DOHASH@f(69,%0)
  1114. #define _HASH@f_F(%0) _DOHASH@f(70,%0)
  1115. #define _HASH@f_G(%0) _DOHASH@f(71,%0)
  1116. #define _HASH@f_H(%0) _DOHASH@f(72,%0)
  1117. #define _HASH@f_I(%0) _DOHASH@f(73,%0)
  1118. #define _HASH@f_J(%0) _DOHASH@f(74,%0)
  1119. #define _HASH@f_K(%0) _DOHASH@f(75,%0)
  1120. #define _HASH@f_L(%0) _DOHASH@f(76,%0)
  1121. #define _HASH@f_M(%0) _DOHASH@f(77,%0)
  1122. #define _HASH@f_N(%0) _DOHASH@f(78,%0)
  1123. #define _HASH@f_O(%0) _DOHASH@f(79,%0)
  1124. #define _HASH@f_P(%0) _DOHASH@f(80,%0)
  1125. #define _HASH@f_Q(%0) _DOHASH@f(81,%0)
  1126. #define _HASH@f_R(%0) _DOHASH@f(82,%0)
  1127. #define _HASH@f_S(%0) _DOHASH@f(83,%0)
  1128. #define _HASH@f_T(%0) _DOHASH@f(84,%0)
  1129. #define _HASH@f_U(%0) _DOHASH@f(85,%0)
  1130. #define _HASH@f_V(%0) _DOHASH@f(86,%0)
  1131. #define _HASH@f_W(%0) _DOHASH@f(87,%0)
  1132. #define _HASH@f_X(%0) _DOHASH@f(88,%0)
  1133. #define _HASH@f_Y(%0) _DOHASH@f(89,%0)
  1134. #define _HASH@f_Z(%0) _DOHASH@f(90,%0)
  1135. // Underscore.
  1136. #define _HASH@f__(%0) _DOHASH@f(95,%0)
  1137. // Lower case letters.
  1138. #define _HASH@f_a(%0) _DOHASH@f(97,%0)
  1139. #define _HASH@f_b(%0) _DOHASH@f(98,%0)
  1140. #define _HASH@f_c(%0) _DOHASH@f(99,%0)
  1141. #define _HASH@f_d(%0) _DOHASH@f(100,%0)
  1142. #define _HASH@f_e(%0) _DOHASH@f(101,%0)
  1143. #define _HASH@f_f(%0) _DOHASH@f(102,%0)
  1144. #define _HASH@f_g(%0) _DOHASH@f(103,%0)
  1145. #define _HASH@f_h(%0) _DOHASH@f(104,%0)
  1146. #define _HASH@f_i(%0) _DOHASH@f(105,%0)
  1147. #define _HASH@f_j(%0) _DOHASH@f(106,%0)
  1148. #define _HASH@f_k(%0) _DOHASH@f(107,%0)
  1149. #define _HASH@f_l(%0) _DOHASH@f(108,%0)
  1150. #define _HASH@f_m(%0) _DOHASH@f(109,%0)
  1151. #define _HASH@f_n(%0) _DOHASH@f(110,%0)
  1152. #define _HASH@f_o(%0) _DOHASH@f(111,%0)
  1153. #define _HASH@f_p(%0) _DOHASH@f(112,%0)
  1154. #define _HASH@f_q(%0) _DOHASH@f(113,%0)
  1155. #define _HASH@f_r(%0) _DOHASH@f(114,%0)
  1156. #define _HASH@f_s(%0) _DOHASH@f(115,%0)
  1157. #define _HASH@f_t(%0) _DOHASH@f(116,%0)
  1158. #define _HASH@f_u(%0) _DOHASH@f(117,%0)
  1159. #define _HASH@f_v(%0) _DOHASH@f(118,%0)
  1160. #define _HASH@f_w(%0) _DOHASH@f(119,%0)
  1161. #define _HASH@f_x(%0) _DOHASH@f(120,%0)
  1162. #define _HASH@f_y(%0) _DOHASH@f(121,%0)
  1163. #define _HASH@f_z(%0) _DOHASH@f(122,%0)
  1164. // String end.
  1165. #define _HASH@f_@(%0) 2166136261
  1166. // ============
  1167. // FNV1a hash
  1168. // ============
  1169. // Signify the end with two "@" symbols.
  1170. #define HASH@fnv1a(%0) _REHASH@a(%0,@,@)
  1171. // Internal call.
  1172. #define _REHASH@a(%0,%1) _HASH@a_%0(%1)
  1173. // The bit that actually does the work.
  1174. #define _DOHASH@a(%0,%1,%2) ((_HASH@a_%1(%2)^%0)*16777619)
  1175. // Space.
  1176. #define _HASH@a_(%0) _DOHASH@a(32,%0)
  1177. // Numbers.
  1178. #define _HASH@a_0(%0) _DOHASH@a(48,%0)
  1179. #define _HASH@a_1(%0) _DOHASH@a(49,%0)
  1180. #define _HASH@a_2(%0) _DOHASH@a(50,%0)
  1181. #define _HASH@a_3(%0) _DOHASH@a(51,%0)
  1182. #define _HASH@a_4(%0) _DOHASH@a(52,%0)
  1183. #define _HASH@a_5(%0) _DOHASH@a(53,%0)
  1184. #define _HASH@a_6(%0) _DOHASH@a(54,%0)
  1185. #define _HASH@a_7(%0) _DOHASH@a(55,%0)
  1186. #define _HASH@a_8(%0) _DOHASH@a(56,%0)
  1187. #define _HASH@a_9(%0) _DOHASH@a(57,%0)
  1188. // Upper case letters.
  1189. #define _HASH@a_A(%0) _DOHASH@a(65,%0)
  1190. #define _HASH@a_B(%0) _DOHASH@a(66,%0)
  1191. #define _HASH@a_C(%0) _DOHASH@a(67,%0)
  1192. #define _HASH@a_D(%0) _DOHASH@a(68,%0)
  1193. #define _HASH@a_E(%0) _DOHASH@a(69,%0)
  1194. #define _HASH@a_F(%0) _DOHASH@a(70,%0)
  1195. #define _HASH@a_G(%0) _DOHASH@a(71,%0)
  1196. #define _HASH@a_H(%0) _DOHASH@a(72,%0)
  1197. #define _HASH@a_I(%0) _DOHASH@a(73,%0)
  1198. #define _HASH@a_J(%0) _DOHASH@a(74,%0)
  1199. #define _HASH@a_K(%0) _DOHASH@a(75,%0)
  1200. #define _HASH@a_L(%0) _DOHASH@a(76,%0)
  1201. #define _HASH@a_M(%0) _DOHASH@a(77,%0)
  1202. #define _HASH@a_N(%0) _DOHASH@a(78,%0)
  1203. #define _HASH@a_O(%0) _DOHASH@a(79,%0)
  1204. #define _HASH@a_P(%0) _DOHASH@a(80,%0)
  1205. #define _HASH@a_Q(%0) _DOHASH@a(81,%0)
  1206. #define _HASH@a_R(%0) _DOHASH@a(82,%0)
  1207. #define _HASH@a_S(%0) _DOHASH@a(83,%0)
  1208. #define _HASH@a_T(%0) _DOHASH@a(84,%0)
  1209. #define _HASH@a_U(%0) _DOHASH@a(85,%0)
  1210. #define _HASH@a_V(%0) _DOHASH@a(86,%0)
  1211. #define _HASH@a_W(%0) _DOHASH@a(87,%0)
  1212. #define _HASH@a_X(%0) _DOHASH@a(88,%0)
  1213. #define _HASH@a_Y(%0) _DOHASH@a(89,%0)
  1214. #define _HASH@a_Z(%0) _DOHASH@a(90,%0)
  1215. // Underscore.
  1216. #define _HASH@a__(%0) _DOHASH@a(95,%0)
  1217. // Lower case letters.
  1218. #define _HASH@a_a(%0) _DOHASH@a(97,%0)
  1219. #define _HASH@a_b(%0) _DOHASH@a(98,%0)
  1220. #define _HASH@a_c(%0) _DOHASH@a(99,%0)
  1221. #define _HASH@a_d(%0) _DOHASH@a(100,%0)
  1222. #define _HASH@a_e(%0) _DOHASH@a(101,%0)
  1223. #define _HASH@a_f(%0) _DOHASH@a(102,%0)
  1224. #define _HASH@a_g(%0) _DOHASH@a(103,%0)
  1225. #define _HASH@a_h(%0) _DOHASH@a(104,%0)
  1226. #define _HASH@a_i(%0) _DOHASH@a(105,%0)
  1227. #define _HASH@a_j(%0) _DOHASH@a(106,%0)
  1228. #define _HASH@a_k(%0) _DOHASH@a(107,%0)
  1229. #define _HASH@a_l(%0) _DOHASH@a(108,%0)
  1230. #define _HASH@a_m(%0) _DOHASH@a(109,%0)
  1231. #define _HASH@a_n(%0) _DOHASH@a(110,%0)
  1232. #define _HASH@a_o(%0) _DOHASH@a(111,%0)
  1233. #define _HASH@a_p(%0) _DOHASH@a(112,%0)
  1234. #define _HASH@a_q(%0) _DOHASH@a(113,%0)
  1235. #define _HASH@a_r(%0) _DOHASH@a(114,%0)
  1236. #define _HASH@a_s(%0) _DOHASH@a(115,%0)
  1237. #define _HASH@a_t(%0) _DOHASH@a(116,%0)
  1238. #define _HASH@a_u(%0) _DOHASH@a(117,%0)
  1239. #define _HASH@a_v(%0) _DOHASH@a(118,%0)
  1240. #define _HASH@a_w(%0) _DOHASH@a(119,%0)
  1241. #define _HASH@a_x(%0) _DOHASH@a(120,%0)
  1242. #define _HASH@a_y(%0) _DOHASH@a(121,%0)
  1243. #define _HASH@a_z(%0) _DOHASH@a(122,%0)
  1244. // String end.
  1245. #define _HASH@a_@(%0) 2166136261
  1246. // ==================
  1247. // Case insensitive
  1248. // ==================
  1249. // These are the default values
  1250. //#define HASHi(%0,%1) HASHi@%0(%1)
  1251. //#define _I(%0) _REHASib(%0,@,@)
  1252. /*#define _I@b HASHi@bernstein
  1253. #define _I@f HASHi@fnv1
  1254. #define _I@a HASHi@fnv1a*/
  1255. // ================
  1256. // Bernstein hash
  1257. // ================
  1258. // Signify the end with two "@" symbols.
  1259. #define HASHi@bernstein(%0) _REHASH@ib(%0,@,@)
  1260. // Internal call.
  1261. #define _REHASH@ib(%0,%1) _HASH@ib_%0(%1)
  1262. // The bit that actually does the work.
  1263. #define _DOHASH@ib(%0,%1,%2) (_HASH@ib_%1(%2)*33+%0)
  1264. // Space.
  1265. #define _HASH@ib_(%0) _DOHASH@ib(32,%0)
  1266. // Numbers.
  1267. #define _HASH@ib_0(%0) _DOHASH@ib(48,%0)
  1268. #define _HASH@ib_1(%0) _DOHASH@ib(49,%0)
  1269. #define _HASH@ib_2(%0) _DOHASH@ib(50,%0)
  1270. #define _HASH@ib_3(%0) _DOHASH@ib(51,%0)
  1271. #define _HASH@ib_4(%0) _DOHASH@ib(52,%0)
  1272. #define _HASH@ib_5(%0) _DOHASH@ib(53,%0)
  1273. #define _HASH@ib_6(%0) _DOHASH@ib(54,%0)
  1274. #define _HASH@ib_7(%0) _DOHASH@ib(55,%0)
  1275. #define _HASH@ib_8(%0) _DOHASH@ib(56,%0)
  1276. #define _HASH@ib_9(%0) _DOHASH@ib(57,%0)
  1277. // Upper case letters.
  1278. #define _HASH@ib_A(%0) _DOHASH@ib(65,%0)
  1279. #define _HASH@ib_B(%0) _DOHASH@ib(66,%0)
  1280. #define _HASH@ib_C(%0) _DOHASH@ib(67,%0)
  1281. #define _HASH@ib_D(%0) _DOHASH@ib(68,%0)
  1282. #define _HASH@ib_E(%0) _DOHASH@ib(69,%0)
  1283. #define _HASH@ib_F(%0) _DOHASH@ib(70,%0)
  1284. #define _HASH@ib_G(%0) _DOHASH@ib(71,%0)
  1285. #define _HASH@ib_H(%0) _DOHASH@ib(72,%0)
  1286. #define _HASH@ib_I(%0) _DOHASH@ib(73,%0)
  1287. #define _HASH@ib_J(%0) _DOHASH@ib(74,%0)
  1288. #define _HASH@ib_K(%0) _DOHASH@ib(75,%0)
  1289. #define _HASH@ib_L(%0) _DOHASH@ib(76,%0)
  1290. #define _HASH@ib_M(%0) _DOHASH@ib(77,%0)
  1291. #define _HASH@ib_N(%0) _DOHASH@ib(78,%0)
  1292. #define _HASH@ib_O(%0) _DOHASH@ib(79,%0)
  1293. #define _HASH@ib_P(%0) _DOHASH@ib(80,%0)
  1294. #define _HASH@ib_Q(%0) _DOHASH@ib(81,%0)
  1295. #define _HASH@ib_R(%0) _DOHASH@ib(82,%0)
  1296. #define _HASH@ib_S(%0) _DOHASH@ib(83,%0)
  1297. #define _HASH@ib_T(%0) _DOHASH@ib(84,%0)
  1298. #define _HASH@ib_U(%0) _DOHASH@ib(85,%0)
  1299. #define _HASH@ib_V(%0) _DOHASH@ib(86,%0)
  1300. #define _HASH@ib_W(%0) _DOHASH@ib(87,%0)
  1301. #define _HASH@ib_X(%0) _DOHASH@ib(88,%0)
  1302. #define _HASH@ib_Y(%0) _DOHASH@ib(89,%0)
  1303. #define _HASH@ib_Z(%0) _DOHASH@ib(90,%0)
  1304. // Underscore.
  1305. #define _HASH@ib__(%0) _DOHASH@ib(95,%0)
  1306. // Lower case letters.
  1307. #define _HASH@ib_a(%0) _DOHASH@ib(65,%0)
  1308. #define _HASH@ib_b(%0) _DOHASH@ib(66,%0)
  1309. #define _HASH@ib_c(%0) _DOHASH@ib(67,%0)
  1310. #define _HASH@ib_d(%0) _DOHASH@ib(68,%0)
  1311. #define _HASH@ib_e(%0) _DOHASH@ib(69,%0)
  1312. #define _HASH@ib_f(%0) _DOHASH@ib(70,%0)
  1313. #define _HASH@ib_g(%0) _DOHASH@ib(71,%0)
  1314. #define _HASH@ib_h(%0) _DOHASH@ib(72,%0)
  1315. #define _HASH@ib_i(%0) _DOHASH@ib(73,%0)
  1316. #define _HASH@ib_j(%0) _DOHASH@ib(74,%0)
  1317. #define _HASH@ib_k(%0) _DOHASH@ib(75,%0)
  1318. #define _HASH@ib_l(%0) _DOHASH@ib(76,%0)
  1319. #define _HASH@ib_m(%0) _DOHASH@ib(77,%0)
  1320. #define _HASH@ib_n(%0) _DOHASH@ib(78,%0)
  1321. #define _HASH@ib_o(%0) _DOHASH@ib(79,%0)
  1322. #define _HASH@ib_p(%0) _DOHASH@ib(80,%0)
  1323. #define _HASH@ib_q(%0) _DOHASH@ib(81,%0)
  1324. #define _HASH@ib_r(%0) _DOHASH@ib(82,%0)
  1325. #define _HASH@ib_s(%0) _DOHASH@ib(83,%0)
  1326. #define _HASH@ib_t(%0) _DOHASH@ib(84,%0)
  1327. #define _HASH@ib_u(%0) _DOHASH@ib(85,%0)
  1328. #define _HASH@ib_v(%0) _DOHASH@ib(86,%0)
  1329. #define _HASH@ib_w(%0) _DOHASH@ib(87,%0)
  1330. #define _HASH@ib_x(%0) _DOHASH@ib(88,%0)
  1331. #define _HASH@ib_y(%0) _DOHASH@ib(89,%0)
  1332. #define _HASH@ib_z(%0) _DOHASH@ib(90,%0)
  1333. // String end.
  1334. #define _HASH@ib_@(%0) -1
  1335. // ===========
  1336. // FNV1 hash
  1337. // ===========
  1338. // Signify the end with two "@" symbols.
  1339. #define HASHi@fnv1(%0) _REHASH@if(%0,@,@)
  1340. // Internal call.
  1341. #define _REHASH@if(%0,%1) _HASH@if_%0(%1)
  1342. // The bit that actually does the work.
  1343. #define _DOHASH@if(%0,%1,%2) (_HASH@if_%1(%2)*16777619^%0)
  1344. // Space.
  1345. #define _HASH@if_(%0) _DOHASH@if(32,%0)
  1346. // Numbers.
  1347. #define _HASH@if_0(%0) _DOHASH@if(48,%0)
  1348. #define _HASH@if_1(%0) _DOHASH@if(49,%0)
  1349. #define _HASH@if_2(%0) _DOHASH@if(50,%0)
  1350. #define _HASH@if_3(%0) _DOHASH@if(51,%0)
  1351. #define _HASH@if_4(%0) _DOHASH@if(52,%0)
  1352. #define _HASH@if_5(%0) _DOHASH@if(53,%0)
  1353. #define _HASH@if_6(%0) _DOHASH@if(54,%0)
  1354. #define _HASH@if_7(%0) _DOHASH@if(55,%0)
  1355. #define _HASH@if_8(%0) _DOHASH@if(56,%0)
  1356. #define _HASH@if_9(%0) _DOHASH@if(57,%0)
  1357. // Upper case letters.
  1358. #define _HASH@if_A(%0) _DOHASH@if(65,%0)
  1359. #define _HASH@if_B(%0) _DOHASH@if(66,%0)
  1360. #define _HASH@if_C(%0) _DOHASH@if(67,%0)
  1361. #define _HASH@if_D(%0) _DOHASH@if(68,%0)
  1362. #define _HASH@if_E(%0) _DOHASH@if(69,%0)
  1363. #define _HASH@if_F(%0) _DOHASH@if(70,%0)
  1364. #define _HASH@if_G(%0) _DOHASH@if(71,%0)
  1365. #define _HASH@if_H(%0) _DOHASH@if(72,%0)
  1366. #define _HASH@if_I(%0) _DOHASH@if(73,%0)
  1367. #define _HASH@if_J(%0) _DOHASH@if(74,%0)
  1368. #define _HASH@if_K(%0) _DOHASH@if(75,%0)
  1369. #define _HASH@if_L(%0) _DOHASH@if(76,%0)
  1370. #define _HASH@if_M(%0) _DOHASH@if(77,%0)
  1371. #define _HASH@if_N(%0) _DOHASH@if(78,%0)
  1372. #define _HASH@if_O(%0) _DOHASH@if(79,%0)
  1373. #define _HASH@if_P(%0) _DOHASH@if(80,%0)
  1374. #define _HASH@if_Q(%0) _DOHASH@if(81,%0)
  1375. #define _HASH@if_R(%0) _DOHASH@if(82,%0)
  1376. #define _HASH@if_S(%0) _DOHASH@if(83,%0)
  1377. #define _HASH@if_T(%0) _DOHASH@if(84,%0)
  1378. #define _HASH@if_U(%0) _DOHASH@if(85,%0)
  1379. #define _HASH@if_V(%0) _DOHASH@if(86,%0)
  1380. #define _HASH@if_W(%0) _DOHASH@if(87,%0)
  1381. #define _HASH@if_X(%0) _DOHASH@if(88,%0)
  1382. #define _HASH@if_Y(%0) _DOHASH@if(89,%0)
  1383. #define _HASH@if_Z(%0) _DOHASH@if(90,%0)
  1384. // Underscore.
  1385. #define _HASH@if__(%0) _DOHASH@if(95,%0)
  1386. // Lower case letters.
  1387. #define _HASH@if_a(%0) _DOHASH@if(65,%0)
  1388. #define _HASH@if_b(%0) _DOHASH@if(66,%0)
  1389. #define _HASH@if_c(%0) _DOHASH@if(67,%0)
  1390. #define _HASH@if_d(%0) _DOHASH@if(68,%0)
  1391. #define _HASH@if_e(%0) _DOHASH@if(69,%0)
  1392. #define _HASH@if_f(%0) _DOHASH@if(70,%0)
  1393. #define _HASH@if_g(%0) _DOHASH@if(71,%0)
  1394. #define _HASH@if_h(%0) _DOHASH@if(72,%0)
  1395. #define _HASH@if_i(%0) _DOHASH@if(73,%0)
  1396. #define _HASH@if_j(%0) _DOHASH@if(74,%0)
  1397. #define _HASH@if_k(%0) _DOHASH@if(75,%0)
  1398. #define _HASH@if_l(%0) _DOHASH@if(76,%0)
  1399. #define _HASH@if_m(%0) _DOHASH@if(77,%0)
  1400. #define _HASH@if_n(%0) _DOHASH@if(78,%0)
  1401. #define _HASH@if_o(%0) _DOHASH@if(79,%0)
  1402. #define _HASH@if_p(%0) _DOHASH@if(80,%0)
  1403. #define _HASH@if_q(%0) _DOHASH@if(81,%0)
  1404. #define _HASH@if_r(%0) _DOHASH@if(82,%0)
  1405. #define _HASH@if_s(%0) _DOHASH@if(83,%0)
  1406. #define _HASH@if_t(%0) _DOHASH@if(84,%0)
  1407. #define _HASH@if_u(%0) _DOHASH@if(85,%0)
  1408. #define _HASH@if_v(%0) _DOHASH@if(86,%0)
  1409. #define _HASH@if_w(%0) _DOHASH@if(87,%0)
  1410. #define _HASH@if_x(%0) _DOHASH@if(88,%0)
  1411. #define _HASH@if_y(%0) _DOHASH@if(89,%0)
  1412. #define _HASH@if_z(%0) _DOHASH@if(90,%0)
  1413. // String end.
  1414. #define _HASH@if_@(%0) 2166136261
  1415. // ============
  1416. // FNV1a hash
  1417. // ============
  1418. // Signify the end with two "@" symbols.
  1419. #define HASHi@fnv1a(%0) _REHASH@ia(%0,@,@)
  1420. // Internal call.
  1421. #define _REHASH@ia(%0,%1) _HASH@ia_%0(%1)
  1422. // The bit that actually does the work.
  1423. #define _DOHASH@ia(%0,%1,%2) ((_HASH@ia_%1(%2)^%0)*16777619)
  1424. // Space.
  1425. #define _HASH@ia_(%0) _DOHASH@ia(32,%0)
  1426. // Numbers.
  1427. #define _HASH@ia_0(%0) _DOHASH@ia(48,%0)
  1428. #define _HASH@ia_1(%0) _DOHASH@ia(49,%0)
  1429. #define _HASH@ia_2(%0) _DOHASH@ia(50,%0)
  1430. #define _HASH@ia_3(%0) _DOHASH@ia(51,%0)
  1431. #define _HASH@ia_4(%0) _DOHASH@ia(52,%0)
  1432. #define _HASH@ia_5(%0) _DOHASH@ia(53,%0)
  1433. #define _HASH@ia_6(%0) _DOHASH@ia(54,%0)
  1434. #define _HASH@ia_7(%0) _DOHASH@ia(55,%0)
  1435. #define _HASH@ia_8(%0) _DOHASH@ia(56,%0)
  1436. #define _HASH@ia_9(%0) _DOHASH@ia(57,%0)
  1437. // Upper case letters.
  1438. #define _HASH@ia_A(%0) _DOHASH@ia(65,%0)
  1439. #define _HASH@ia_B(%0) _DOHASH@ia(66,%0)
  1440. #define _HASH@ia_C(%0) _DOHASH@ia(67,%0)
  1441. #define _HASH@ia_D(%0) _DOHASH@ia(68,%0)
  1442. #define _HASH@ia_E(%0) _DOHASH@ia(69,%0)
  1443. #define _HASH@ia_F(%0) _DOHASH@ia(70,%0)
  1444. #define _HASH@ia_G(%0) _DOHASH@ia(71,%0)
  1445. #define _HASH@ia_H(%0) _DOHASH@ia(72,%0)
  1446. #define _HASH@ia_I(%0) _DOHASH@ia(73,%0)
  1447. #define _HASH@ia_J(%0) _DOHASH@ia(74,%0)
  1448. #define _HASH@ia_K(%0) _DOHASH@ia(75,%0)
  1449. #define _HASH@ia_L(%0) _DOHASH@ia(76,%0)
  1450. #define _HASH@ia_M(%0) _DOHASH@ia(77,%0)
  1451. #define _HASH@ia_N(%0) _DOHASH@ia(78,%0)
  1452. #define _HASH@ia_O(%0) _DOHASH@ia(79,%0)
  1453. #define _HASH@ia_P(%0) _DOHASH@ia(80,%0)
  1454. #define _HASH@ia_Q(%0) _DOHASH@ia(81,%0)
  1455. #define _HASH@ia_R(%0) _DOHASH@ia(82,%0)
  1456. #define _HASH@ia_S(%0) _DOHASH@ia(83,%0)
  1457. #define _HASH@ia_T(%0) _DOHASH@ia(84,%0)
  1458. #define _HASH@ia_U(%0) _DOHASH@ia(85,%0)
  1459. #define _HASH@ia_V(%0) _DOHASH@ia(86,%0)
  1460. #define _HASH@ia_W(%0) _DOHASH@ia(87,%0)
  1461. #define _HASH@ia_X(%0) _DOHASH@ia(88,%0)
  1462. #define _HASH@ia_Y(%0) _DOHASH@ia(89,%0)
  1463. #define _HASH@ia_Z(%0) _DOHASH@ia(90,%0)
  1464. // Underscore.
  1465. #define _HASH@ia__(%0) _DOHASH@ia(95,%0)
  1466. // Lower case letters.
  1467. #define _HASH@ia_a(%0) _DOHASH@ia(65,%0)
  1468. #define _HASH@ia_b(%0) _DOHASH@ia(66,%0)
  1469. #define _HASH@ia_c(%0) _DOHASH@ia(67,%0)
  1470. #define _HASH@ia_d(%0) _DOHASH@ia(68,%0)
  1471. #define _HASH@ia_e(%0) _DOHASH@ia(69,%0)
  1472. #define _HASH@ia_f(%0) _DOHASH@ia(70,%0)
  1473. #define _HASH@ia_g(%0) _DOHASH@ia(71,%0)
  1474. #define _HASH@ia_h(%0) _DOHASH@ia(72,%0)
  1475. #define _HASH@ia_i(%0) _DOHASH@ia(73,%0)
  1476. #define _HASH@ia_j(%0) _DOHASH@ia(74,%0)
  1477. #define _HASH@ia_k(%0) _DOHASH@ia(75,%0)
  1478. #define _HASH@ia_l(%0) _DOHASH@ia(76,%0)
  1479. #define _HASH@ia_m(%0) _DOHASH@ia(77,%0)
  1480. #define _HASH@ia_n(%0) _DOHASH@ia(78,%0)
  1481. #define _HASH@ia_o(%0) _DOHASH@ia(79,%0)
  1482. #define _HASH@ia_p(%0) _DOHASH@ia(80,%0)
  1483. #define _HASH@ia_q(%0) _DOHASH@ia(81,%0)
  1484. #define _HASH@ia_r(%0) _DOHASH@ia(82,%0)
  1485. #define _HASH@ia_s(%0) _DOHASH@ia(83,%0)
  1486. #define _HASH@ia_t(%0) _DOHASH@ia(84,%0)
  1487. #define _HASH@ia_u(%0) _DOHASH@ia(85,%0)
  1488. #define _HASH@ia_v(%0) _DOHASH@ia(86,%0)
  1489. #define _HASH@ia_w(%0) _DOHASH@ia(87,%0)
  1490. #define _HASH@ia_x(%0) _DOHASH@ia(88,%0)
  1491. #define _HASH@ia_y(%0) _DOHASH@ia(89,%0)
  1492. #define _HASH@ia_z(%0) _DOHASH@ia(90,%0)
  1493. // String end.
  1494. #define _HASH@ia_@(%0) 2166136261
  1495. // ============
  1496. // Other code
  1497. // ============
  1498. enum e_HASH_TYPE
  1499. {
  1500. hash_bernstein,
  1501. hash_fnv1,
  1502. hash_fnv1a
  1503. }
  1504. /*----------------------------------------------------------------------------*\
  1505. Function:
  1506. Hash
  1507. Params:
  1508. str - The string to hash.
  1509. sensitive - Wether the hash is case sensitive or not.
  1510. Return:
  1511. The reverse Bernstein hash of the string.
  1512. Notes:
  1513. Based on Bernstein hash, but backwards to match the macros. The only
  1514. characters which can be used in the compile time version of this code are:
  1515. a-z, A-Z, 0-9, _ and space.
  1516. native Hash(str[]);
  1517. \*----------------------------------------------------------------------------*/
  1518. stock YHash(const str[], bool:sensitive = true, e_HASH_TYPE:type = hash_bernstein, len = -1, pack = false)
  1519. {
  1520. P:3("YHash called: \"%s\", %i, %i, %i, %i", str, _:sensitive, _:type, len, pack);
  1521. pack = str[0] > 255;
  1522. if (len == -1)
  1523. {
  1524. len = strlen(str);
  1525. }
  1526. if (pack)
  1527. {
  1528. switch (type)
  1529. {
  1530. case hash_bernstein:
  1531. {
  1532. new
  1533. hash = -1;
  1534. if (sensitive)
  1535. {
  1536. while (len--)
  1537. {
  1538. hash = hash * 33 + str{len};
  1539. }
  1540. }
  1541. else
  1542. {
  1543. while (len--)
  1544. {
  1545. new
  1546. ch = str{len};
  1547. if ('a' <= ch <= 'z')
  1548. {
  1549. ch &= ~0x20;
  1550. }
  1551. hash = hash * 33 + ch;
  1552. }
  1553. }
  1554. return hash;
  1555. }
  1556. case hash_fnv1:
  1557. {
  1558. new
  1559. hash = 2166136261;
  1560. if (sensitive)
  1561. {
  1562. while (len--)
  1563. {
  1564. hash = hash * 16777619 ^ str{len};
  1565. }
  1566. }
  1567. else
  1568. {
  1569. while (len--)
  1570. {
  1571. new
  1572. ch = str{len};
  1573. if ('a' <= ch <= 'z')
  1574. {
  1575. ch &= ~0x20;
  1576. }
  1577. hash = hash * 16777619 ^ ch;
  1578. }
  1579. }
  1580. return hash;
  1581. }
  1582. case hash_fnv1a:
  1583. {
  1584. new
  1585. hash = 2166136261;
  1586. if (sensitive)
  1587. {
  1588. while (len--)
  1589. {
  1590. hash = (hash ^ str{len}) * 16777619;
  1591. }
  1592. }
  1593. else
  1594. {
  1595. while (len--)
  1596. {
  1597. new
  1598. ch = str{len};
  1599. if ('a' <= ch <= 'z')
  1600. {
  1601. ch &= ~0x20;
  1602. }
  1603. hash = (hash ^ ch) * 16777619;
  1604. }
  1605. }
  1606. return hash;
  1607. }
  1608. }
  1609. }
  1610. else
  1611. {
  1612. switch (type)
  1613. {
  1614. case hash_bernstein:
  1615. {
  1616. new
  1617. hash = -1;
  1618. if (sensitive)
  1619. {
  1620. while (len--)
  1621. {
  1622. hash = hash * 33 + str[len];
  1623. }
  1624. }
  1625. else
  1626. {
  1627. while (len--)
  1628. {
  1629. new
  1630. ch = str[len];
  1631. if ('a' <= ch <= 'z')
  1632. {
  1633. ch &= ~0x20;
  1634. }
  1635. hash = hash * 33 + ch;
  1636. }
  1637. }
  1638. return hash;
  1639. }
  1640. case hash_fnv1:
  1641. {
  1642. new
  1643. hash = 2166136261;
  1644. if (sensitive)
  1645. {
  1646. while (len--)
  1647. {
  1648. hash = hash * 16777619 ^ str[len];
  1649. }
  1650. }
  1651. else
  1652. {
  1653. while (len--)
  1654. {
  1655. new
  1656. ch = str[len];
  1657. if ('a' <= ch <= 'z')
  1658. {
  1659. ch &= ~0x20;
  1660. }
  1661. hash = hash * 16777619 ^ ch;
  1662. }
  1663. }
  1664. return hash;
  1665. }
  1666. case hash_fnv1a:
  1667. {
  1668. new
  1669. hash = 2166136261;
  1670. if (sensitive)
  1671. {
  1672. while (len--)
  1673. {
  1674. hash = (hash ^ str[len]) * 16777619;
  1675. }
  1676. }
  1677. else
  1678. {
  1679. while (len--)
  1680. {
  1681. new
  1682. ch = str[len];
  1683. if ('a' <= ch <= 'z')
  1684. {
  1685. ch &= ~0x20;
  1686. }
  1687. hash = (hash ^ ch) * 16777619;
  1688. }
  1689. }
  1690. return hash;
  1691. }
  1692. }
  1693. }
  1694. return -1;
  1695. }