stb.c 122 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330
  1. /*
  2. * Unit tests for "stb.h"
  3. */
  4. #define _CRT_SECURE_NO_WARNINGS
  5. //#include <windows.h>
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <time.h>
  9. #include <assert.h>
  10. #include <stdlib.h>
  11. #ifdef _WIN32
  12. #include <crtdbg.h>
  13. #endif
  14. //#define STB_FASTMALLOC
  15. #ifdef _DEBUG
  16. #define STB_MALLOC_WRAPPER_DEBUG
  17. #endif
  18. #ifndef _M_AMD64
  19. #define STB_NPTR
  20. #endif
  21. #define STB_DEFINE
  22. #include "stb.h"
  23. //#include "stb_file.h"
  24. //#include "stb_pixel32.h"
  25. //#define DEBUG_BLOCK
  26. #ifdef DEBUG_BLOCK
  27. #include <conio.h>
  28. #endif
  29. #ifdef STB_FASTMALLOC
  30. #error "can't use FASTMALLOC with threads"
  31. #endif
  32. int count;
  33. void c(int truth, char *error)
  34. {
  35. if (!truth) {
  36. fprintf(stderr, "Test failed: %s\n", error);
  37. ++count;
  38. }
  39. }
  40. #if 0
  41. void show(void)
  42. {
  43. #ifdef _WIN32
  44. SYSTEM_INFO x;
  45. GetSystemInfo(&x);
  46. printf("%d\n", x.dwPageSize);
  47. #endif
  48. }
  49. #endif
  50. void test_classes(void)
  51. {
  52. unsigned char size_base[32], size_shift[32];
  53. int class_to_pages[256];
  54. int class_to_size[256], cl;
  55. int lg, size, wasted_pages;
  56. int kAlignShift = 3;
  57. int kAlignment = 1 << kAlignShift;
  58. int kMaxSize = 8 * 4096;
  59. int kPageShift = 12;
  60. int kPageSize = (1 << kPageShift);
  61. int next_class = 1;
  62. int alignshift = kAlignShift;
  63. int last_lg = -1;
  64. for (lg = 0; lg < kAlignShift; lg++) {
  65. size_base[lg] = 1;
  66. size_shift[lg] = kAlignShift;
  67. }
  68. for (size = kAlignment; size <= kMaxSize; size += (1 << alignshift)) {
  69. int lg = stb_log2_floor(size);
  70. if (lg > last_lg) {
  71. // Increase alignment every so often.
  72. //
  73. // Since we double the alignment every time size doubles and
  74. // size >= 128, this means that space wasted due to alignment is
  75. // at most 16/128 i.e., 12.5%. Plus we cap the alignment at 256
  76. // bytes, so the space wasted as a percentage starts falling for
  77. // sizes > 2K.
  78. if ((lg >= 7) && (alignshift < 8)) {
  79. alignshift++;
  80. }
  81. size_base[lg] = next_class - ((size-1) >> alignshift);
  82. size_shift[lg] = alignshift;
  83. }
  84. class_to_size[next_class] = size;
  85. last_lg = lg;
  86. next_class++;
  87. }
  88. // Initialize the number of pages we should allocate to split into
  89. // small objects for a given class.
  90. wasted_pages = 0;
  91. for (cl = 1; cl < next_class; cl++) {
  92. // Allocate enough pages so leftover is less than 1/8 of total.
  93. // This bounds wasted space to at most 12.5%.
  94. size_t psize = kPageSize;
  95. const size_t s = class_to_size[cl];
  96. while ((psize % s) > (psize >> 3)) {
  97. psize += kPageSize;
  98. }
  99. class_to_pages[cl] = (int) (psize >> kPageShift);
  100. wasted_pages += (int) psize;
  101. }
  102. printf("TCMalloc can waste as much as %d memory on one-shot allocations\n", wasted_pages);
  103. return;
  104. }
  105. #ifdef STB_STUA
  106. void test_script(void)
  107. {
  108. stua_run_script(
  109. "var g = (2+3)*5 + 3*(2+1) + ((7)); \n"
  110. "func sprint(x) _print(x) _print(' ') x end;\n"
  111. "func foo(y) var q = func(x) sprint(x) end; q end;\n "
  112. "var z=foo(5); z(77);\n"
  113. "func counter(z) func(x) z=z+1 end end\n"
  114. "var q=counter(0), p=counter(5);\n"
  115. "sprint(q()) sprint(p()) sprint(q()) sprint(p()) sprint(q()) sprint(p())\n"
  116. "var x=2222;\n"
  117. "if 1 == 2 then 3333 else 4444 end; => x; sprint(x);\n"
  118. "var x1 = sprint(1.5e3); \n"
  119. "var x2 = sprint(.5); \n"
  120. "var x3 = sprint(1.); \n"
  121. "var x4 = sprint(1.e3); \n"
  122. "var x5 = sprint(1e3); \n"
  123. "var x6 = sprint(0.5e3); \n"
  124. "var x7 = sprint(.5e3); \n"
  125. " func sum(x,y) x+y end \n"
  126. " func sumfunc(a) sum+{x=a} end \n"
  127. " var q = sumfunc(3) \n"
  128. " var p = sumfunc(20) \n"
  129. " var d = sprint(q(5)) - sprint(q(8)) \n"
  130. " var e = sprint(p(5)) - sprint(p(8)) \n"
  131. " func test3(x) \n"
  132. " sprint(x) \n"
  133. " x = x+3 \n"
  134. " sprint(x) \n"
  135. " x+5 \n"
  136. " end \n"
  137. " var y = test3(4); \n"
  138. " func fib(x) \n"
  139. " if x < 3 then \n"
  140. " 1 \n"
  141. " else \n"
  142. " fib(x-1) + fib(x-2); \n"
  143. " end \n"
  144. " end \n"
  145. " \n"
  146. " func fib2(x) \n"
  147. " var a=1 \n"
  148. " var b=1 \n"
  149. " sprint(a) \n"
  150. " sprint(b) \n"
  151. " while x > 2 do \n"
  152. " var c=a+b \n"
  153. " a=b \n"
  154. " b=c \n"
  155. " sprint(b) \n"
  156. " x=x-1 \n"
  157. " end \n"
  158. " b \n"
  159. " end \n"
  160. " \n"
  161. " func assign(z) \n"
  162. " var y = { 'this', 'is', 'a', 'lame', 'day', 'to', 'die'} \n"
  163. " y[3] = z \n"
  164. " var i = 0 \n"
  165. " while y[i] != nil do \n"
  166. " sprint(y[i]) \n"
  167. " i = i+1 \n"
  168. " end \n"
  169. " end \n"
  170. " \n"
  171. " sprint(fib(12)); \n"
  172. " assign(\"good\"); \n"
  173. " fib2(20); \n"
  174. " sprint('ok'); \n"
  175. " sprint(-5); \n"
  176. " // final comment with no newline"
  177. );
  178. }
  179. #endif
  180. #ifdef STB_THREADS
  181. extern void __stdcall Sleep(unsigned long);
  182. void * thread_1(void *x)
  183. {
  184. Sleep(80);
  185. printf("thread 1\n"); fflush(stdout);
  186. return (void *) 2;
  187. }
  188. void * thread_2(void *y)
  189. {
  190. stb_work(thread_1, NULL, y);
  191. Sleep(50);
  192. printf("thread 2\n"); fflush(stdout);
  193. return (void *) 3;
  194. }
  195. stb_semaphore stest;
  196. stb_mutex mutex;
  197. volatile int tc1, tc2;
  198. void *thread_3(void *p)
  199. {
  200. stb_mutex_begin(mutex);
  201. ++tc1;
  202. stb_mutex_end(mutex);
  203. stb_sem_waitfor(stest);
  204. stb_mutex_begin(mutex);
  205. ++tc2;
  206. stb_mutex_end(mutex);
  207. return NULL;
  208. }
  209. void test_threads(void)
  210. {
  211. volatile int a=0,b=0;
  212. //stb_work_numthreads(2);
  213. stb_work(thread_2, (void *) &a, (void *) &b);
  214. while (a==0 || b==0) {
  215. Sleep(10);
  216. //printf("a=%d b=%d\n", a, b);
  217. }
  218. c(a==2 && b == 3, "stb_thread");
  219. stb_work_numthreads(4);
  220. stest = stb_sem_new(8);
  221. mutex = stb_mutex_new();
  222. stb_work(thread_3, NULL, NULL);
  223. stb_work(thread_3, NULL, NULL);
  224. stb_work(thread_3, NULL, NULL);
  225. stb_work(thread_3, NULL, NULL);
  226. stb_work(thread_3, NULL, NULL);
  227. stb_work(thread_3, NULL, NULL);
  228. stb_work(thread_3, NULL, NULL);
  229. stb_work(thread_3, NULL, NULL);
  230. while (tc1 < 4)
  231. Sleep(10);
  232. c(tc1 == 4, "stb_work 1");
  233. stb_sem_release(stest);
  234. stb_sem_release(stest);
  235. stb_sem_release(stest);
  236. stb_sem_release(stest);
  237. stb_sem_release(stest);
  238. stb_sem_release(stest);
  239. stb_sem_release(stest);
  240. stb_sem_release(stest);
  241. Sleep(40);
  242. while (tc1 != 8 || tc2 != 8)
  243. Sleep(10);
  244. c(tc1 == 8 && tc2 == 8, "stb_work 2");
  245. stb_work_numthreads(2);
  246. stb_work(thread_3, NULL, NULL);
  247. stb_work(thread_3, NULL, NULL);
  248. stb_work(thread_3, NULL, NULL);
  249. stb_work(thread_3, NULL, NULL);
  250. while (tc1 < 10)
  251. Sleep(10);
  252. c(tc1 == 10, "stb_work 1");
  253. stb_sem_release(stest);
  254. stb_sem_release(stest);
  255. stb_sem_release(stest);
  256. stb_sem_release(stest);
  257. Sleep(100);
  258. stb_sem_delete(stest);
  259. stb_mutex_delete(mutex);
  260. }
  261. #else
  262. void test_threads(void)
  263. {
  264. }
  265. #endif
  266. void *thread4(void *p)
  267. {
  268. return NULL;
  269. }
  270. #ifdef STB_THREADS
  271. stb_threadqueue *tq;
  272. stb_sync synch;
  273. stb_mutex msum;
  274. volatile int thread_sum;
  275. void *consume1(void *p)
  276. {
  277. volatile int *q = (volatile int *) p;
  278. for(;;) {
  279. int z;
  280. stb_threadq_get_block(tq, &z);
  281. stb_mutex_begin(msum);
  282. thread_sum += z;
  283. *q += z;
  284. stb_mutex_end(msum);
  285. stb_sync_reach(synch);
  286. }
  287. }
  288. void test_threads2(void)
  289. {
  290. int array[256],i,n=0;
  291. volatile int which[4];
  292. synch = stb_sync_new();
  293. stb_sync_set_target(synch,2);
  294. stb_work_reach(thread4, NULL, NULL, synch);
  295. stb_sync_reach_and_wait(synch);
  296. printf("ok\n");
  297. tq = stb_threadq_new(4, 1, TRUE,TRUE);
  298. msum = stb_mutex_new();
  299. thread_sum = 0;
  300. stb_sync_set_target(synch, 65);
  301. for (i=0; i < 4; ++i) {
  302. which[i] = 0;
  303. stb_create_thread(consume1, (int *) &which[i]);
  304. }
  305. for (i=1; i <= 64; ++i) {
  306. array[i] = i;
  307. n += i;
  308. stb_threadq_add_block(tq, &array[i]);
  309. }
  310. stb_sync_reach_and_wait(synch);
  311. stb_barrier();
  312. c(thread_sum == n, "stb_threadq 1");
  313. c(which[0] + which[1] + which[2] + which[3] == n, "stb_threadq 2");
  314. printf("(Distribution: %d %d %d %d)\n", which[0], which[1], which[2], which[3]);
  315. stb_sync_delete(synch);
  316. stb_threadq_delete(tq);
  317. stb_mutex_delete(msum);
  318. }
  319. #else
  320. void test_threads2(void)
  321. {
  322. }
  323. #endif
  324. char tc[] = "testing compression test quick test voila woohoo what the hell";
  325. unsigned char storage1[1 << 23];
  326. int test_compression(unsigned char *buffer, int length)
  327. {
  328. unsigned char *storage2;
  329. int c_len = stb_compress(storage1, buffer, length);
  330. int dc_len;
  331. printf("Compressed %d to %d\n", length, c_len);
  332. dc_len = stb_decompress_length(storage1);
  333. storage2 = malloc(dc_len);
  334. dc_len = stb_decompress(storage2, storage1, c_len);
  335. if (dc_len != length) { free(storage2); return -1; }
  336. if (memcmp(buffer, storage2, length) != 0) { free(storage2); return -1; }
  337. free(storage2);
  338. return c_len;
  339. }
  340. #if 0
  341. int test_en_compression(char *buffer, int length)
  342. {
  343. int c_len = stb_en_compress(storage1, buffer, length);
  344. int dc_len;
  345. printf("Encompressed %d to %d\n", length, c_len);
  346. dc_len = stb_en_decompress(storage2, storage1, c_len);
  347. if (dc_len != length) return -1;
  348. if (memcmp(buffer, storage2, length) != 0) return -1;
  349. return c_len;
  350. }
  351. #endif
  352. #define STR_x "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  353. #define STR_y "yyyyyyyyyyyyyyyyyy"
  354. #define STR_xy STR_x STR_y
  355. #define STR_xyyxy STR_xy STR_y STR_xy
  356. #define STR_1 "testing"
  357. #define STR_2 STR_xyyxy STR_xy STR_xyyxy STR_xyyxy STR_xy STR_xyyxy
  358. #define STR_3 "buh"
  359. char buffer[] = STR_1 "\r\n" STR_2 STR_2 STR_2 "\n" STR_3;
  360. char str1[] = STR_1;
  361. char str2[] = STR_2 STR_2 STR_2;
  362. char str3[] = STR_3;
  363. int sum(short *s)
  364. {
  365. int i,total=0;
  366. for (i=0; i < stb_arr_len(s); ++i)
  367. total += s[i];
  368. return total;
  369. }
  370. stb_uint stb_adler32_old(stb_uint adler32, stb_uchar *buffer, stb_uint buflen)
  371. {
  372. const stb_uint ADLER_MOD = 65521;
  373. stb_uint s1 = adler32 & 0xffff;
  374. stb_uint s2 = adler32 >> 16;
  375. while (buflen-- > 0) { // NOTE: much faster implementations are possible!
  376. s1 += *buffer++; if (s1 > ADLER_MOD) s1 -= ADLER_MOD;
  377. s2 += s1 ; if (s2 > ADLER_MOD) s2 -= ADLER_MOD;
  378. }
  379. return (s2 << 16) + s1;
  380. }
  381. int sample_test[3][5] =
  382. {
  383. { 1,2,3,4,5 },
  384. { 6,7,8,9,10, },
  385. { 11,12,13,14,15 },
  386. };
  387. typedef struct { unsigned short x,y,z; } struct1;
  388. typedef struct { double a; int x,y,z; } struct2;
  389. char *args_raw[] = { "foo", "-dxrf", "bar", "-ts" };
  390. char *args[8];
  391. void do_compressor(int,char**);
  392. void test_sha1(void);
  393. int alloc_num, alloc_size;
  394. void dumpfunc(void *ptr, int sz, char *file, int line)
  395. {
  396. printf("%p (%6d) -- %3d:%s\n", ptr, sz, line, file);
  397. alloc_size += sz;
  398. alloc_num += 1;
  399. }
  400. char *expects(stb_matcher *m, char *s, int result, int len, char *str)
  401. {
  402. int res2,len2=0;
  403. res2 = stb_lex(m, s, &len2);
  404. c(result == res2 && len == len2, str);
  405. return s + len;
  406. }
  407. void test_lex(void)
  408. {
  409. stb_matcher *m = stb_lex_matcher();
  410. // tok_en5 .3 20.1 20. .20 .1
  411. char *s = "tok_en5.3 20.1 20. .20.1";
  412. stb_lex_item(m, "[a-zA-Z_][a-zA-Z0-9_]*", 1 );
  413. stb_lex_item(m, "[0-9]*\\.?[0-9]*" , 2 );
  414. stb_lex_item(m, "[\r\n\t ]+" , 3 );
  415. stb_lex_item(m, "." , -99 );
  416. s=expects(m,s,1,7, "stb_lex 1");
  417. s=expects(m,s,2,2, "stb_lex 2");
  418. s=expects(m,s,3,1, "stb_lex 3");
  419. s=expects(m,s,2,4, "stb_lex 4");
  420. s=expects(m,s,3,1, "stb_lex 5");
  421. s=expects(m,s,2,3, "stb_lex 6");
  422. s=expects(m,s,3,1, "stb_lex 7");
  423. s=expects(m,s,2,3, "stb_lex 8");
  424. s=expects(m,s,2,2, "stb_lex 9");
  425. s=expects(m,s,0,0, "stb_lex 10");
  426. stb_matcher_free(m);
  427. }
  428. typedef struct Btest
  429. {
  430. struct Btest stb_bst_fields(btest_);
  431. int v;
  432. } Btest;
  433. stb_bst(Btest, btest_, BT2,bt2,v, int, a - b)
  434. void bst_test(void)
  435. {
  436. Btest *root = NULL, *t;
  437. int items[500], sorted[500];
  438. int i,j,z;
  439. for (z=0; z < 10; ++z) {
  440. for (i=0; i < 500; ++i)
  441. items[i] = stb_rand() & 0xfffffff;
  442. // check for collisions, and retrry if so
  443. memcpy(sorted, items, sizeof(sorted));
  444. qsort(sorted, 500, sizeof(sorted[0]), stb_intcmp(0));
  445. for (i=1; i < 500; ++i)
  446. if (sorted[i-1] == sorted[i])
  447. break;
  448. if (i != 500) { --z; break; }
  449. for (i=0; i < 500; ++i) {
  450. t = malloc(sizeof(*t));
  451. t->v = items[i];
  452. root = btest_insert(root, t);
  453. #ifdef STB_DEBUG
  454. btest__validate(root,1);
  455. #endif
  456. for (j=0; j <= i; ++j)
  457. c(btest_find(root, items[j]) != NULL, "stb_bst 1");
  458. for ( ; j < 500; ++j)
  459. c(btest_find(root, items[j]) == NULL, "stb_bst 2");
  460. }
  461. t = btest_first(root);
  462. for (i=0; i < 500; ++i)
  463. t = btest_next(root,t);
  464. c(t == NULL, "stb_bst 5");
  465. t = btest_last(root);
  466. for (i=0; i < 500; ++i)
  467. t = btest_prev(root,t);
  468. c(t == NULL, "stb_bst 6");
  469. memcpy(sorted, items, sizeof(sorted));
  470. qsort(sorted, 500, sizeof(sorted[0]), stb_intcmp(0));
  471. t = btest_first(root);
  472. for (i=0; i < 500; ++i) {
  473. assert(t->v == sorted[i]);
  474. t = btest_next(root, t);
  475. }
  476. assert(t == NULL);
  477. if (z==1)
  478. stb_reverse(items, 500, sizeof(items[0]));
  479. else if (z)
  480. stb_shuffle(items, 500, sizeof(items[0]), stb_rand());
  481. for (i=0; i < 500; ++i) {
  482. t = btest_find(root, items[i]);
  483. assert(t != NULL);
  484. root = btest_remove(root, t);
  485. c(btest_find(root, items[i]) == NULL, "stb_bst 5");
  486. #ifdef STB_DEBUG
  487. btest__validate(root, 1);
  488. #endif
  489. for (j=0; j <= i; ++j)
  490. c(btest_find(root, items[j]) == NULL, "stb_bst 3");
  491. for ( ; j < 500; ++j)
  492. c(btest_find(root, items[j]) != NULL, "stb_bst 4");
  493. free(t);
  494. }
  495. }
  496. }
  497. extern void stu_uninit(void);
  498. stb_define_sort(sort_int, int, *a < *b)
  499. stb_rand_define(prime_rand, 1)
  500. void test_packed_floats(void);
  501. void test_parser_generator(void);
  502. void rec_print(stb_dirtree2 *d, int depth)
  503. {
  504. int i;
  505. for (i=0; i < depth; ++i) printf(" ");
  506. printf("%s (%d)\n", d->relpath, stb_arr_len(d->files));
  507. for (i=0; i < stb_arr_len(d->subdirs); ++i)
  508. rec_print(d->subdirs[i], depth+1);
  509. d->weight = (float) stb_arr_len(d->files);
  510. }
  511. #ifdef MAIN_TEST
  512. int main(int argc, char **argv)
  513. {
  514. char *z;
  515. stb__wchar buffer7[1024],buffer9[1024];
  516. char buffer8[4096];
  517. FILE *f;
  518. char *p1 = "foo/bar\\baz/test.xyz";
  519. char *p2 = "foo/.bar";
  520. char *p3 = "foo.bar";
  521. char *p4 = "foo/bar";
  522. char *wildcards[] = { "*foo*", "*bar", "baz", "*1*2*3*", "*/CVS/repository", "*oof*" };
  523. char **s;
  524. char buf[256], *p;
  525. int n,len2,*q,i;
  526. stb_matcher *mt=NULL;
  527. if (argc > 1) {
  528. do_compressor(argc,argv);
  529. return 0;
  530. }
  531. test_classes();
  532. //show();
  533. //stb_malloc_check_counter(2,2);
  534. //_CrtSetBreakAlloc(10398);
  535. stbprint("Checking {!if} the {$fancy} print function {#works}? - should\n");
  536. stbprint(" - align\n");
  537. stbprint("But {#3this}} {one}} - shouldn't\n");
  538. #if 0
  539. {
  540. int i;
  541. char **s = stb_readdir_recursive("/sean", NULL);
  542. stb_dirtree *d = stb_dirtree_from_files_relative("", s, stb_arr_len(s));
  543. stb_dirtree **e;
  544. rec_print(d, 0);
  545. e = stb_summarize_tree(d,12,4);
  546. for (i=0; i < stb_arr_len(e); ++i) {
  547. printf("%s\n", e[i]->fullpath);
  548. }
  549. stb_arr_free(e);
  550. stb_fatal("foo");
  551. }
  552. #endif
  553. stb_("Started stb.c");
  554. test_threads2();
  555. test_threads();
  556. for (i=0; i < 1023 && 5+77*i < 0xd800; ++i)
  557. buffer7[i] = 5+77*i;
  558. buffer7[i++] = 0xd801;
  559. buffer7[i++] = 0xdc02;
  560. buffer7[i++] = 0xdbff;
  561. buffer7[i++] = 0xdfff;
  562. buffer7[i] = 0;
  563. p = stb_to_utf8(buffer8, buffer7, sizeof(buffer8));
  564. c(p != NULL, "stb_to_utf8");
  565. if (p != NULL) {
  566. stb_from_utf8(buffer9, buffer8, sizeof(buffer9)/2);
  567. c(!memcmp(buffer7, buffer9, i*2), "stb_from_utf8");
  568. }
  569. z = "foo.*[bd]ak?r";
  570. c( stb_regex(z, "muggle man food is barfy") == 1, "stb_regex 1");
  571. c( stb_regex("foo.*bar", "muggle man food is farfy") == 0, "stb_regex 2");
  572. c( stb_regex("[^a-zA-Z]foo[^a-zA-Z]", "dfoobar xfood") == 0, "stb_regex 3");
  573. c( stb_regex(z, "muman foob is bakrfy") == 1, "stb_regex 4");
  574. z = "foo.*[bd]bk?r";
  575. c( stb_regex(z, "muman foob is bakrfy") == 0, "stb_regex 5");
  576. c( stb_regex(z, "muman foob is bbkrfy") == 1, "stb_regex 6");
  577. stb_regex(NULL,NULL);
  578. #if 0
  579. test_parser_generator();
  580. stb_wrapper_listall(dumpfunc);
  581. if (alloc_num)
  582. printf("Memory still in use: %d allocations of %d bytes.\n", alloc_num, alloc_size);
  583. #endif
  584. test_script();
  585. p = stb_file("sieve.stua", NULL);
  586. if (p) {
  587. stua_run_script(p);
  588. free(p);
  589. }
  590. stua_uninit();
  591. //stb_wrapper_listall(dumpfunc);
  592. printf("Memory still in use: %d allocations of %d bytes.\n", alloc_num, alloc_size);
  593. c(stb_alloc_count_alloc == stb_alloc_count_free, "stb_alloc 0");
  594. bst_test();
  595. c(stb_alloc_count_alloc == stb_alloc_count_free, "stb_alloc 0");
  596. #if 0
  597. // stb_block
  598. {
  599. int inuse=0, freespace=0;
  600. int *x = malloc(10000*sizeof(*x));
  601. stb_block *b = stb_block_new(1, 10000);
  602. #define BLOCK_COUNT 1000
  603. int *p = malloc(sizeof(*p) * BLOCK_COUNT);
  604. int *l = malloc(sizeof(*l) * BLOCK_COUNT);
  605. int i, n, k = 0;
  606. memset(x, 0, 10000 * sizeof(*x));
  607. n = 0;
  608. while (n < BLOCK_COUNT && k < 1000) {
  609. l[n] = 16 + (rand() & 31);
  610. p[n] = stb_block_alloc(b, l[n], 0);
  611. if (p[n] == 0)
  612. break;
  613. inuse += l[n];
  614. freespace = 0;
  615. for (i=0; i < b->len; ++i)
  616. freespace += b->freelist[i].len;
  617. assert(freespace + inuse == 9999);
  618. for (i=0; i < l[n]; ++i)
  619. x[ p[n]+i ] = p[n];
  620. ++n;
  621. if (k > 20) {
  622. int sz;
  623. i = (stb_rand() % n);
  624. sz = l[i];
  625. stb_block_free(b, p[i], sz);
  626. inuse -= sz;
  627. p[i] = p[n-1];
  628. l[i] = l[n-1];
  629. --n;
  630. freespace = 0;
  631. for (i=0; i < b->len; ++i)
  632. freespace += b->freelist[i].len;
  633. assert(freespace + inuse == 9999);
  634. }
  635. ++k;
  636. // validate
  637. if ((k % 50) == 0) {
  638. int j;
  639. for (j=0; j < n; ++j) {
  640. for (i=0; i < l[j]; ++i)
  641. assert(x[ p[j]+i ] == p[j]);
  642. }
  643. }
  644. if ((k % 200) == 0) {
  645. stb_block_compact_freelist(b);
  646. }
  647. }
  648. for (i=0; i < n; ++i)
  649. stb_block_free(b, p[i], l[i]);
  650. stb_block_destroy(b);
  651. free(p);
  652. free(l);
  653. free(x);
  654. }
  655. blockfile_test();
  656. #endif
  657. mt = stb_lex_matcher();
  658. for (i=0; i < 5; ++i)
  659. stb_lex_item_wild(mt, wildcards[i], i+1);
  660. c(1==stb_lex(mt, "this is a foo in the middle",NULL), "stb_matcher_match 1");
  661. c(0==stb_lex(mt, "this is a bar in the middle",NULL), "stb_matcher_match 2");
  662. c(0==stb_lex(mt, "this is a baz in the middle",NULL), "stb_matcher_match 3");
  663. c(2==stb_lex(mt, "this is a bar",NULL), "stb_matcher_match 4");
  664. c(0==stb_lex(mt, "this is a baz",NULL), "stb_matcher_match 5");
  665. c(3==stb_lex(mt, "baz",NULL), "stb_matcher_match 6");
  666. c(4==stb_lex(mt, "1_2_3_4",NULL), "stb_matcher_match 7");
  667. c(0==stb_lex(mt, "1 3 3 3 3 2 ",NULL), "stb_matcher_match 8");
  668. c(4==stb_lex(mt, "1 3 3 3 2 3 ",NULL), "stb_matcher_match 9");
  669. c(5==stb_lex(mt, "C:/sean/prj/old/gdmag/mipmap/hqp/adol-c/CVS/Repository",NULL), "stb_matcher_match 10");
  670. stb_matcher_free(mt);
  671. {
  672. #define SSIZE 500000
  673. static int arr[SSIZE],arr2[SSIZE];
  674. int i,good;
  675. for (i=0; i < SSIZE; ++i)
  676. arr2[i] = stb_rand();
  677. memcpy(arr,arr2,sizeof(arr));
  678. printf("stb_define_sort:\n");
  679. sort_int(arr, SSIZE);
  680. good = 1;
  681. for (i=0; i+1 < SSIZE; ++i)
  682. if (arr[i] > arr[i+1])
  683. good = 0;
  684. c(good, "stb_define_sort");
  685. printf("qsort:\n");
  686. qsort(arr2, SSIZE, sizeof(arr2[0]), stb_intcmp(0));
  687. printf("done\n");
  688. // check for bugs
  689. memset(arr, 0, sizeof(arr[0]) * 1000);
  690. sort_int(arr, 1000);
  691. }
  692. c(stb_alloc_count_alloc == stb_alloc_count_free, "stb_alloc -2");
  693. c( stb_is_prime( 2), "stb_is_prime 1");
  694. c( stb_is_prime( 3), "stb_is_prime 2");
  695. c( stb_is_prime( 5), "stb_is_prime 3");
  696. c( stb_is_prime( 7), "stb_is_prime 4");
  697. c(!stb_is_prime( 9), "stb_is_prime 5");
  698. c( stb_is_prime(11), "stb_is_prime 6");
  699. c(!stb_is_prime(25), "stb_is_prime 7");
  700. c(!stb_is_prime(27), "stb_is_prime 8");
  701. c( stb_is_prime(29), "stb_is_prime 9");
  702. c( stb_is_prime(31), "stb_is_prime a");
  703. c(!stb_is_prime(33), "stb_is_prime b");
  704. c(!stb_is_prime(35), "stb_is_prime c");
  705. c(!stb_is_prime(36), "stb_is_prime d");
  706. for (n=7; n < 64; n += 3) {
  707. int i;
  708. stb_perfect s;
  709. unsigned int *p = malloc(n * sizeof(*p));
  710. for (i=0; i < n; ++i)
  711. p[i] = i*i;
  712. c(stb_perfect_create(&s, p, n), "stb_perfect_hash 1");
  713. stb_perfect_destroy(&s);
  714. for (i=0; i < n; ++i)
  715. p[i] = stb_rand();
  716. c(stb_perfect_create(&s, p, n), "stb_perfect_hash 2");
  717. stb_perfect_destroy(&s);
  718. for (i=0; i < n; ++i)
  719. p[i] = (0x80000000 >> stb_log2_ceil(n>>1)) * i;
  720. c(stb_perfect_create(&s, p, n), "stb_perfect_hash 2");
  721. stb_perfect_destroy(&s);
  722. for (i=0; i < n; ++i)
  723. p[i] = (int) malloc(1024);
  724. c(stb_perfect_create(&s, p, n), "stb_perfect_hash 3");
  725. stb_perfect_destroy(&s);
  726. for (i=0; i < n; ++i)
  727. free((void *) p[i]);
  728. free(p);
  729. }
  730. printf("Maximum attempts required to find perfect hash: %d\n",
  731. stb_perfect_hash_max_failures);
  732. p = "abcdefghijklmnopqrstuvwxyz";
  733. c(stb_ischar('c', p), "stb_ischar 1");
  734. c(stb_ischar('x', p), "stb_ischar 2");
  735. c(!stb_ischar('#', p), "stb_ischar 3");
  736. c(!stb_ischar('X', p), "stb_ischar 4");
  737. p = "0123456789";
  738. c(!stb_ischar('c', p), "stb_ischar 5");
  739. c(!stb_ischar('x', p), "stb_ischar 6");
  740. c(!stb_ischar('#', p), "stb_ischar 7");
  741. c(!stb_ischar('X', p), "stb_ischar 8");
  742. p = "#####";
  743. c(!stb_ischar('c', p), "stb_ischar a");
  744. c(!stb_ischar('x', p), "stb_ischar b");
  745. c(stb_ischar('#', p), "stb_ischar c");
  746. c(!stb_ischar('X', p), "stb_ischar d");
  747. p = "xXyY";
  748. c(!stb_ischar('c', p), "stb_ischar e");
  749. c(stb_ischar('x', p), "stb_ischar f");
  750. c(!stb_ischar('#', p), "stb_ischar g");
  751. c(stb_ischar('X', p), "stb_ischar h");
  752. c(stb_alloc_count_alloc == stb_alloc_count_free, "stb_alloc 1");
  753. q = stb_wordwrapalloc(15, "How now brown cow. Testinglishously. Okey dokey");
  754. // How now brown
  755. // cow. Testinglis
  756. // hously. Okey
  757. // dokey
  758. c(stb_arr_len(q) == 8, "stb_wordwrap 8");
  759. c(q[2] == 14 && q[3] == 15, "stb_wordwrap 9");
  760. c(q[4] == 29 && q[5] == 12, "stb_wordwrap 10");
  761. stb_arr_free(q);
  762. q = stb_wordwrapalloc(20, "How now brown cow. Testinglishously. Okey dokey");
  763. // How now brown cow.
  764. // Testinglishously.
  765. // Okey dokey
  766. c(stb_arr_len(q) == 6, "stb_wordwrap 1");
  767. c(q[0] == 0 && q[1] == 18, "stb_wordwrap 2");
  768. c(q[2] == 19 && q[3] == 17, "stb_wordwrap 3");
  769. c(q[4] == 37 && q[5] == 10, "stb_wordwrap 4");
  770. stb_arr_free(q);
  771. q = stb_wordwrapalloc(12, "How now brown cow. Testinglishously. Okey dokey");
  772. // How now
  773. // brown cow.
  774. // Testinglisho
  775. // usly. Okey
  776. // dokey
  777. c(stb_arr_len(q) == 10, "stb_wordwrap 5");
  778. c(q[4] == 19 && q[5] == 12, "stb_wordwrap 6");
  779. c(q[6] == 31 && q[3] == 10, "stb_wordwrap 7");
  780. stb_arr_free(q);
  781. //test_script();
  782. //test_packed_floats();
  783. c(stb_alloc_count_alloc == stb_alloc_count_free, "stb_alloc 0");
  784. if (stb_alloc_count_alloc != stb_alloc_count_free) {
  785. printf("%d allocs, %d frees\n", stb_alloc_count_alloc, stb_alloc_count_free);
  786. }
  787. test_lex();
  788. mt = stb_regex_matcher(".*foo.*bar.*");
  789. c(stb_matcher_match(mt, "foobarx") == 1, "stb_matcher_match 1");
  790. c(stb_matcher_match(mt, "foobar") == 1, "stb_matcher_match 2");
  791. c(stb_matcher_match(mt, "foo bar") == 1, "stb_matcher_match 3");
  792. c(stb_matcher_match(mt, "fo foo ba ba bar ba") == 1, "stb_matcher_match 4");
  793. c(stb_matcher_match(mt, "fo oo oo ba ba bar foo") == 0, "stb_matcher_match 5");
  794. stb_free(mt);
  795. mt = stb_regex_matcher(".*foo.?bar.*");
  796. c(stb_matcher_match(mt, "abfoobarx") == 1, "stb_matcher_match 6");
  797. c(stb_matcher_match(mt, "abfoobar") == 1, "stb_matcher_match 7");
  798. c(stb_matcher_match(mt, "abfoo bar") == 1, "stb_matcher_match 8");
  799. c(stb_matcher_match(mt, "abfoo bar") == 0, "stb_matcher_match 9");
  800. c(stb_matcher_match(mt, "abfo foo ba ba bar ba") == 0, "stb_matcher_match 10");
  801. c(stb_matcher_match(mt, "abfo oo oo ba ba bar foo") == 0, "stb_matcher_match 11");
  802. stb_free(mt);
  803. mt = stb_regex_matcher(".*m((foo|bar)*baz)m.*");
  804. c(stb_matcher_match(mt, "abfoobarx") == 0, "stb_matcher_match 12");
  805. c(stb_matcher_match(mt, "a mfoofoofoobazm d") == 1, "stb_matcher_match 13");
  806. c(stb_matcher_match(mt, "a mfoobarbazfoom d") == 0, "stb_matcher_match 14");
  807. c(stb_matcher_match(mt, "a mbarbarfoobarbazm d") == 1, "stb_matcher_match 15");
  808. c(stb_matcher_match(mt, "a mfoobarfoo bazm d") == 0, "stb_matcher_match 16");
  809. c(stb_matcher_match(mt, "a mm foobarfoobarfoobar ") == 0, "stb_matcher_match 17");
  810. stb_free(mt);
  811. mt = stb_regex_matcher("f*|z");
  812. c(stb_matcher_match(mt, "fz") == 0, "stb_matcher_match 0a");
  813. c(stb_matcher_match(mt, "ff") == 1, "stb_matcher_match 0b");
  814. c(stb_matcher_match(mt, "z") == 1, "stb_matcher_match 0c");
  815. stb_free(mt);
  816. mt = stb_regex_matcher("m(f|z*)n");
  817. c(stb_matcher_match(mt, "mfzn") == 0, "stb_matcher_match 0d");
  818. c(stb_matcher_match(mt, "mffn") == 0, "stb_matcher_match 0e");
  819. c(stb_matcher_match(mt, "mzn") == 1, "stb_matcher_match 0f");
  820. c(stb_matcher_match(mt, "mn") == 1, "stb_matcher_match 0g");
  821. c(stb_matcher_match(mt, "mzfn") == 0, "stb_matcher_match 0f");
  822. c(stb_matcher_find(mt, "manmanmannnnnnnmmmmmmmmm ") == 0, "stb_matcher_find 1");
  823. c(stb_matcher_find(mt, "manmanmannnnnnnmmmmmmmmm ") == 0, "stb_matcher_find 2");
  824. c(stb_matcher_find(mt, "manmanmannnnnnnmmmmmmmmmffzzz ") == 0, "stb_matcher_find 3");
  825. c(stb_matcher_find(mt, "manmanmannnnnnnmmmmmmmmmnfzzz ") == 1, "stb_matcher_find 4");
  826. c(stb_matcher_find(mt, "mmmfn aanmannnnnnnmmmmmm fzzz ") == 1, "stb_matcher_find 5");
  827. c(stb_matcher_find(mt, "mmmzzn anmannnnnnnmmmmmm fzzz ") == 1, "stb_matcher_find 6");
  828. c(stb_matcher_find(mt, "mm anmannnnnnnmmmmmm fzmzznzz ") == 1, "stb_matcher_find 7");
  829. c(stb_matcher_find(mt, "mm anmannnnnnnmmmmmm fzmzzfnzz ") == 0, "stb_matcher_find 8");
  830. c(stb_matcher_find(mt, "manmfnmannnnnnnmmmmmmmmmffzzz ") == 1, "stb_matcher_find 9");
  831. stb_free(mt);
  832. mt = stb_regex_matcher(".*m((foo|bar)*|baz)m.*");
  833. c(stb_matcher_match(mt, "abfoobarx") == 0, "stb_matcher_match 18");
  834. c(stb_matcher_match(mt, "a mfoofoofoobazm d") == 0, "stb_matcher_match 19");
  835. c(stb_matcher_match(mt, "a mfoobarbazfoom d") == 0, "stb_matcher_match 20");
  836. c(stb_matcher_match(mt, "a mbazm d") == 1, "stb_matcher_match 21");
  837. c(stb_matcher_match(mt, "a mfoobarfoom d") == 1, "stb_matcher_match 22");
  838. c(stb_matcher_match(mt, "a mm foobarfoobarfoobar ") == 1, "stb_matcher_match 23");
  839. stb_free(mt);
  840. mt = stb_regex_matcher("[a-fA-F]..[^]a-zA-Z]");
  841. c(stb_matcher_match(mt, "Axx1") == 1, "stb_matcher_match 24");
  842. c(stb_matcher_match(mt, "Fxx1") == 1, "stb_matcher_match 25");
  843. c(stb_matcher_match(mt, "Bxx]") == 0, "stb_matcher_match 26");
  844. c(stb_matcher_match(mt, "Cxxz") == 0, "stb_matcher_match 27");
  845. c(stb_matcher_match(mt, "gxx[") == 0, "stb_matcher_match 28");
  846. c(stb_matcher_match(mt, "-xx0") == 0, "stb_matcher_match 29");
  847. stb_free(mt);
  848. c(stb_wildmatch("foo*bar", "foobarx") == 0, "stb_wildmatch 0a");
  849. c(stb_wildmatch("foo*bar", "foobar") == 1, "stb_wildmatch 1a");
  850. c(stb_wildmatch("foo*bar", "foo bar") == 1, "stb_wildmatch 2a");
  851. c(stb_wildmatch("foo*bar", "fo foo ba ba bar ba") == 0, "stb_wildmatch 3a");
  852. c(stb_wildmatch("foo*bar", "fo oo oo ba ba ar foo") == 0, "stb_wildmatch 4a");
  853. c(stb_wildmatch("*foo*bar*", "foobar") == 1, "stb_wildmatch 1b");
  854. c(stb_wildmatch("*foo*bar*", "foo bar") == 1, "stb_wildmatch 2b");
  855. c(stb_wildmatch("*foo*bar*", "fo foo ba ba bar ba") == 1, "stb_wildmatch 3b");
  856. c(stb_wildmatch("*foo*bar*", "fo oo oo ba ba ar foo") == 0, "stb_wildmatch 4b");
  857. c(stb_wildmatch("foo*bar*", "foobarx") == 1, "stb_wildmatch 1c");
  858. c(stb_wildmatch("foo*bar*", "foobabar") == 1, "stb_wildmatch 2c");
  859. c(stb_wildmatch("foo*bar*", "fo foo ba ba bar ba") == 0, "stb_wildmatch 3c");
  860. c(stb_wildmatch("foo*bar*", "fo oo oo ba ba ar foo") == 0, "stb_wildmatch 4c");
  861. c(stb_wildmatch("*foo*bar", "foobar") == 1, "stb_wildmatch 1d");
  862. c(stb_wildmatch("*foo*bar", "foo bar") == 1, "stb_wildmatch 2d");
  863. c(stb_wildmatch("*foo*bar", "fo foo ba ba bar ba") == 0, "stb_wildmatch 3d");
  864. c(stb_wildmatch("*foo*bar", "fo oo oo ba ba ar foo") == 0, "stb_wildmatch 4d");
  865. c(stb_wildfind("foo*bar", "xyfoobarx") == 2, "stb_wildfind 0a");
  866. c(stb_wildfind("foo*bar", "aaafoobar") == 3, "stb_wildfind 1a");
  867. c(stb_wildfind("foo*bar", "foo bar") == 0, "stb_wildfind 2a");
  868. c(stb_wildfind("foo*bar", "fo foo ba ba bar ba") == 3, "stb_wildfind 3a");
  869. c(stb_wildfind("foo*bar", "fo oo oo ba ba ar foo") == -1, "stb_wildfind 4a");
  870. c(stb_wildmatch("*foo*;*bar*", "foobar") == 1, "stb_wildmatch 1e");
  871. c(stb_wildmatch("*foo*;*bar*", "afooa") == 1, "stb_wildmatch 2e");
  872. c(stb_wildmatch("*foo*;*bar*", "abara") == 1, "stb_wildmatch 3e");
  873. c(stb_wildmatch("*foo*;*bar*", "abaza") == 0, "stb_wildmatch 4e");
  874. c(stb_wildmatch("*foo*;*bar*", "foboar") == 0, "stb_wildmatch 5e");
  875. test_sha1();
  876. n = sizeof(args_raw)/sizeof(args_raw[0]);
  877. memcpy(args, args_raw, sizeof(args_raw));
  878. s = stb_getopt(&n, args);
  879. c(n >= 1 && !strcmp(args[1], "bar" ), "stb_getopt 1");
  880. c(stb_arr_len(s) >= 2 && !strcmp(s[2] , "r" ), "stb_getopt 2");
  881. stb_getopt_free(s);
  882. n = sizeof(args_raw)/sizeof(args_raw[0]);
  883. memcpy(args, args_raw, sizeof(args_raw));
  884. s = stb_getopt_param(&n, args, "f");
  885. c(stb_arr_len(s) >= 3 && !strcmp(s[3] , "fbar"), "stb_getopt 3");
  886. stb_getopt_free(s);
  887. n = sizeof(args_raw)/sizeof(args_raw[0]);
  888. memcpy(args, args_raw, sizeof(args_raw));
  889. s = stb_getopt_param(&n, args, "x");
  890. c(stb_arr_len(s) >= 2 && !strcmp(s[1] , "xrf" ), "stb_getopt 4");
  891. stb_getopt_free(s);
  892. n = sizeof(args_raw)/sizeof(args_raw[0]);
  893. memcpy(args, args_raw, sizeof(args_raw));
  894. s = stb_getopt_param(&n, args, "s");
  895. c(s == NULL && n == 0 , "stb_getopt 5");
  896. stb_getopt_free(s);
  897. #if 0
  898. c(*stb_csample_int(sample_test[0], 1, 5, 5, 3, -1, -1) == 1, "stb_csample_int 1");
  899. c(*stb_csample_int(sample_test[0], 1, 5, 5, 3, 1, -3) == 2, "stb_csample_int 2");
  900. c(*stb_csample_int(sample_test[0], 1, 5, 5, 3, 12, -2) == 5, "stb_csample_int 3");
  901. c(*stb_csample_int(sample_test[0], 1, 5, 5, 3, 15, 1) == 10, "stb_csample_int 4");
  902. c(*stb_csample_int(sample_test[0], 1, 5, 5, 3, 5, 4) == 15, "stb_csample_int 5");
  903. c(*stb_csample_int(sample_test[0], 1, 5, 5, 3, 3, 3) == 14, "stb_csample_int 6");
  904. c(*stb_csample_int(sample_test[0], 1, 5, 5, 3, -2, 5) == 11, "stb_csample_int 7");
  905. c(*stb_csample_int(sample_test[0], 1, 5, 5, 3, -7, 0) == 1, "stb_csample_int 8");
  906. c(*stb_csample_int(sample_test[0], 1, 5, 5, 3, 2, 1) == 8, "stb_csample_int 9");
  907. #endif
  908. c(!strcmp(stb_splitpath(buf, p1, STB_PATH ), "foo/bar\\baz/"), "stb_splitpath 1");
  909. c(!strcmp(stb_splitpath(buf, p1, STB_FILE ), "test"), "stb_splitpath 2");
  910. c(!strcmp(stb_splitpath(buf, p1, STB_EXT ), ".xyz"), "stb_splitpath 3");
  911. c(!strcmp(stb_splitpath(buf, p1, STB_PATH_FILE ), "foo/bar\\baz/test"), "stb_splitpath 4");
  912. c(!strcmp(stb_splitpath(buf, p1, STB_FILE_EXT ), "test.xyz"), "stb_splitpath 5");
  913. c(!strcmp(stb_splitpath(buf, p2, STB_PATH ), "foo/"), "stb_splitpath 6");
  914. c(!strcmp(stb_splitpath(buf, p2, STB_FILE ), ""), "stb_splitpath 7");
  915. c(!strcmp(stb_splitpath(buf, p2, STB_EXT ), ".bar"), "stb_splitpath 8");
  916. c(!strcmp(stb_splitpath(buf, p2, STB_PATH_FILE ), "foo/"), "stb_splitpath 9");
  917. c(!strcmp(stb_splitpath(buf, p2, STB_FILE_EXT ), ".bar"), "stb_splitpath 10");
  918. c(!strcmp(stb_splitpath(buf, p3, STB_PATH ), "./"), "stb_splitpath 11");
  919. c(!strcmp(stb_splitpath(buf, p3, STB_FILE ), "foo"), "stb_splitpath 12");
  920. c(!strcmp(stb_splitpath(buf, p3, STB_EXT ), ".bar"), "stb_splitpath 13");
  921. c(!strcmp(stb_splitpath(buf, p3, STB_PATH_FILE ), "foo"), "stb_splitpath 14");
  922. c(!strcmp(stb_splitpath(buf, p4, STB_PATH ), "foo/"), "stb_splitpath 16");
  923. c(!strcmp(stb_splitpath(buf, p4, STB_FILE ), "bar"), "stb_splitpath 17");
  924. c(!strcmp(stb_splitpath(buf, p4, STB_EXT ), ""), "stb_splitpath 18");
  925. c(!strcmp(stb_splitpath(buf, p4, STB_PATH_FILE ), "foo/bar"), "stb_splitpath 19");
  926. c(!strcmp(stb_splitpath(buf, p4, STB_FILE_EXT ), "bar"), "stb_splitpath 20");
  927. c(!strcmp(p=stb_dupreplace("testfootffooo foo fox", "foo", "brap"), "testbraptfbrapo brap fox"), "stb_dupreplace 1"); free(p);
  928. c(!strcmp(p=stb_dupreplace("testfootffooo foo fox", "foo", "" ), "testtfo fox" ), "stb_dupreplace 2"); free(p);
  929. c(!strcmp(p=stb_dupreplace("abacab", "a", "aba"), "abababacabab" ), "stb_dupreplace 3"); free(p);
  930. #if 0
  931. m = stb_mml_parse("<a><b><c>x</c><d>y</d></b><e>&lt;&amp;f&gt;</e></a>");
  932. c(m != NULL, "stb_mml_parse 1");
  933. if (m) {
  934. c(!strcmp(m->child[0]->child[0]->child[1]->tag, "d"), "stb_mml_parse 2");
  935. c(!strcmp(m->child[0]->child[1]->leaf_data, "<&f>"), "stb_mml_parse 3");
  936. }
  937. if (m)
  938. stb_mml_free(m);
  939. c(stb_alloc_count_alloc == stb_alloc_count_free, "stb_alloc 1");
  940. if (stb_alloc_count_alloc != stb_alloc_count_free) {
  941. printf("%d allocs, %d frees\n", stb_alloc_count_alloc, stb_alloc_count_free);
  942. }
  943. #endif
  944. c(stb_linear_remap(3.0f,0,8,1,2) == 1.375, "stb_linear_remap()");
  945. c(stb_bitreverse(0x1248fec8) == 0x137f1248, "stb_bitreverse() 1");
  946. c(stb_bitreverse8(0x4e) == 0x72, "stb_bitreverse8() 1");
  947. c(stb_bitreverse8(0x31) == 0x8c, "stb_bitreverse8() 2");
  948. for (n=1; n < 255; ++n) {
  949. unsigned int m = stb_bitreverse8((uint8) n);
  950. c(stb_bitreverse8((uint8) m) == (unsigned int) n, "stb_bitreverse8() 3");
  951. }
  952. for (n=2; n <= 31; ++n) {
  953. c(stb_is_pow2 ((1 << n) ) == 1 , "stb_is_pow2() 1");
  954. c(stb_is_pow2 ((1 << n)+1) == 0 , "stb_is_pow2() 2");
  955. c(stb_is_pow2 ((1 << n)-1) == 0 , "stb_is_pow2() 3");
  956. c(stb_log2_floor((1 << n) ) == n , "stb_log2_floor() 1");
  957. c(stb_log2_floor((1 << n)+1) == n , "stb_log2_floor() 2");
  958. c(stb_log2_floor((1 << n)-1) == n-1, "stb_log2_floor() 3");
  959. c(stb_log2_ceil ((1 << n) ) == n , "stb_log2_ceil() 1");
  960. c(stb_log2_ceil ((1 << n)+1) == n+1, "stb_log2_ceil() 2");
  961. c(stb_log2_ceil ((1 << n)-1) == n , "stb_log2_ceil() 3");
  962. c(stb_bitreverse(1 << n) == 1U << (31-n), "stb_bitreverse() 2");
  963. }
  964. c(stb_log2_floor(0) == -1, "stb_log2_floor() 4");
  965. c(stb_log2_ceil (0) == -1, "stb_log2_ceil () 4");
  966. c(stb_log2_floor(-1) == 31, "stb_log2_floor() 5");
  967. c(stb_log2_ceil (-1) == 32, "stb_log2_ceil () 5");
  968. c(stb_bitcount(0xffffffff) == 32, "stb_bitcount() 1");
  969. c(stb_bitcount(0xaaaaaaaa) == 16, "stb_bitcount() 2");
  970. c(stb_bitcount(0x55555555) == 16, "stb_bitcount() 3");
  971. c(stb_bitcount(0x00000000) == 0, "stb_bitcount() 4");
  972. c(stb_lowbit8(0xf0) == 4, "stb_lowbit8 1");
  973. c(stb_lowbit8(0x10) == 4, "stb_lowbit8 2");
  974. c(stb_lowbit8(0xf3) == 0, "stb_lowbit8 3");
  975. c(stb_lowbit8(0xf8) == 3, "stb_lowbit8 4");
  976. c(stb_lowbit8(0x60) == 5, "stb_lowbit8 5");
  977. for (n=0; n < sizeof(buf); ++n)
  978. buf[n] = 0;
  979. for (n = 0; n < 200000; ++n) {
  980. unsigned int k = stb_rand();
  981. int i,z=0;
  982. for (i=0; i < 32; ++i)
  983. if (k & (1 << i)) ++z;
  984. c(stb_bitcount(k) == z, "stb_bitcount() 5");
  985. buf[k >> 24] = 1;
  986. if (k != 0) {
  987. if (stb_is_pow2(k)) {
  988. c(stb_log2_floor(k) == stb_log2_ceil(k), "stb_is_pow2() 1");
  989. c(k == 1U << stb_log2_floor(k), "stb_is_pow2() 2");
  990. } else {
  991. c(stb_log2_floor(k) == stb_log2_ceil(k)-1, "stb_is_pow2() 3");
  992. }
  993. }
  994. c(stb_bitreverse(stb_bitreverse(n)) == (uint32) n, "stb_bitreverse() 3");
  995. }
  996. // make sure reasonable coverage from stb_rand()
  997. for (n=0; n < sizeof(buf); ++n)
  998. c(buf[n] != 0, "stb_rand()");
  999. for (n=0; n < sizeof(buf); ++n)
  1000. buf[n] = 0;
  1001. for (n=0; n < 60000; ++n) {
  1002. float z = (float) stb_frand();
  1003. int n = (int) (z * sizeof(buf));
  1004. c(z >= 0 && z < 1, "stb_frand() 1");
  1005. c(n >= 0 && n < sizeof(buf), "stb_frand() 2");
  1006. buf[n] = 1;
  1007. }
  1008. // make sure reasonable coverage from stb_frand(),
  1009. // e.g. that the range remap isn't incorrect
  1010. for (n=0; n < sizeof(buf); ++n)
  1011. c(buf[n] != 0, "stb_frand()");
  1012. // stb_arr
  1013. {
  1014. short *s = NULL;
  1015. c(sum(s) == 0, "stb_arr 1");
  1016. stb_arr_add(s); s[0] = 3;
  1017. stb_arr_push(s,7);
  1018. c( stb_arr_valid(s,1), "stb_arr 2");
  1019. c(!stb_arr_valid(s,2), "stb_arr 3");
  1020. // force a realloc
  1021. stb_arr_push(s,0);
  1022. stb_arr_push(s,0);
  1023. stb_arr_push(s,0);
  1024. stb_arr_push(s,0);
  1025. c(sum(s) == 10, "stb_arr 4");
  1026. stb_arr_push(s,0);
  1027. s[0] = 1; s[1] = 5; s[2] = 20;
  1028. c(sum(s) == 26, "stb_arr 5");
  1029. stb_arr_setlen(s,2);
  1030. c(sum(s) == 6, "stb_arr 6");
  1031. stb_arr_setlen(s,1);
  1032. c(sum(s) == 1, "stb_arr 7");
  1033. stb_arr_setlen(s,0);
  1034. c(sum(s) == 0, "stb_arr 8");
  1035. stb_arr_push(s,3);
  1036. stb_arr_push(s,4);
  1037. stb_arr_push(s,5);
  1038. stb_arr_push(s,6);
  1039. stb_arr_push(s,7);
  1040. stb_arr_deleten(s,1,3);
  1041. c(stb_arr_len(s)==2 && sum(s) == 10, "stb_arr_9");
  1042. stb_arr_push(s,2);
  1043. // 3 7 2
  1044. stb_arr_insertn(s,2,2);
  1045. // 3 7 x x 2
  1046. s[2] = 5;
  1047. s[3] = 6;
  1048. c(s[0]==3 && s[1] == 7 && s[2] == 5 && s[3] == 6 && s[4] == 2, "stb_arr 10");
  1049. stb_arr_free(s);
  1050. }
  1051. #if 1
  1052. f= stb_fopen("data/stb.test", "wb");
  1053. fwrite(buffer, 1, sizeof(buffer)-1, f);
  1054. stb_fclose(f, stb_keep_yes);
  1055. #ifndef WIN32
  1056. sleep(1); // andLinux has some synchronization problem here
  1057. #endif
  1058. #else
  1059. f= fopen("data/stb.test", "wb");
  1060. fwrite(buffer, 1, sizeof(buffer)-1, f);
  1061. fclose(f);
  1062. #endif
  1063. if (!stb_fexists("data/stb.test")) {
  1064. fprintf(stderr, "Error: couldn't open file just written, or stb_fexists() is broken.\n");
  1065. }
  1066. f = fopen("data/stb.test", "rb");
  1067. // f = NULL; // test stb_fatal()
  1068. if (!f) { stb_fatal("Error: couldn't open file just written\n"); }
  1069. else {
  1070. char temp[4];
  1071. int len1 = stb_filelen(f), len2;
  1072. int n1,n2;
  1073. if (fread(temp,1,4,f) == 0) {
  1074. int n = ferror(f);
  1075. if (n) { stb_fatal("Error reading from stream: %d", n); }
  1076. if (feof(f)) stb_fatal("Weird, read 0 bytes and hit eof");
  1077. stb_fatal("Read 0, but neither feof nor ferror is true");
  1078. }
  1079. fclose(f);
  1080. p = stb_file("data/stb.test", &len2);
  1081. if (p == NULL) stb_fatal("Error: stb_file() failed");
  1082. c(len1 == sizeof(buffer)-1, "stb_filelen()");
  1083. c(len2 == sizeof(buffer)-1, "stb_file():n");
  1084. c(memcmp(p, buffer, sizeof(buffer)-1) == 0, "stb_file()");
  1085. c(strcmp(p, buffer)==0, "stb_file() terminated");
  1086. free(p);
  1087. s = stb_stringfile("data/stb.test", &n1);
  1088. c(n1 == 3, "stb_stringfile():n");
  1089. n2 = 0;
  1090. while (s[n2]) ++n2;
  1091. c(n1 == n2, "stb_stringfile():n length matches the non-NULL strings");
  1092. if (n2 == 3) {
  1093. c(strcmp(s[0],str1)==0, "stb_stringfile()[0]");
  1094. c(strcmp(s[1],str2)==0, "stb_stringfile()[1]");
  1095. c(strcmp(s[2],str3)==0, "stb_stringfile()[2] (no terminating newlines)");
  1096. }
  1097. free(s);
  1098. f = fopen("data/stb.test", "rb");
  1099. stb_fgets(buf, sizeof(buf), f);
  1100. //c(strcmp(buf, str1)==0, "stb_fgets()");
  1101. p = stb_fgets_malloc(f);
  1102. n1 = strlen(p);
  1103. n2 = strlen(str2);
  1104. c(strcmp(p, str2)==0, "stb_fgets_malloc()");
  1105. free(p);
  1106. stb_fgets(buf, sizeof(buf), f);
  1107. c(strcmp(buf, str3)==0, "stb_fgets()3");
  1108. }
  1109. c( stb_prefix("foobar", "foo"), "stb_prefix() 1");
  1110. c(!stb_prefix("foo", "foobar"), "stb_prefix() 2");
  1111. c( stb_prefix("foob", "foob" ), "stb_prefix() 3");
  1112. stb_strncpy(buf, "foobar", 6); c(strcmp(buf,"fooba" )==0, "stb_strncpy() 1");
  1113. stb_strncpy(buf, "foobar", 8); c(strcmp(buf,"foobar")==0, "stb_strncpy() 2");
  1114. c(!strcmp(p=stb_duplower("FooBar"), "foobar"), "stb_duplower()"); free(p);
  1115. strcpy(buf, "FooBar");
  1116. stb_tolower(buf);
  1117. c(!strcmp(buf, "foobar"), "stb_tolower()");
  1118. p = stb_strtok(buf, "foo=ba*r", "#=*");
  1119. c(!strcmp(buf, "foo" ), "stb_strtok() 1");
  1120. c(!strcmp(p , "ba*r"), "stb_strtok() 2");
  1121. p = stb_strtok(buf, "foobar", "#=*");
  1122. c(*p == 0, "stb_strtok() 3");
  1123. c(!strcmp(stb_skipwhite(" \t\n foo"), "foo"), "stb_skipwhite()");
  1124. s = stb_tokens("foo == ba*r", "#=*", NULL);
  1125. c(!strcmp(s[0], "foo "), "stb_tokens() 1");
  1126. c(!strcmp(s[1], " ba"), "stb_tokens() 2");
  1127. c(!strcmp(s[2], "r"), "stb_tokens() 3");
  1128. c(s[3] == 0, "stb_tokens() 4");
  1129. free(s);
  1130. s = stb_tokens_allowempty("foo == ba*r", "#=*", NULL);
  1131. c(!strcmp(s[0], "foo "), "stb_tokens_allowempty() 1");
  1132. c(!strcmp(s[1], "" ), "stb_tokens_allowempty() 2");
  1133. c(!strcmp(s[2], " ba"), "stb_tokens_allowempty() 3");
  1134. c(!strcmp(s[3], "r"), "stb_tokens_allowempty() 4");
  1135. c(s[4] == 0, "stb_tokens_allowempty() 5");
  1136. free(s);
  1137. s = stb_tokens_stripwhite("foo == ba*r", "#=*", NULL);
  1138. c(!strcmp(s[0], "foo"), "stb_tokens_stripwhite() 1");
  1139. c(!strcmp(s[1], "" ), "stb_tokens_stripwhite() 2");
  1140. c(!strcmp(s[2], "ba"), "stb_tokens_stripwhite() 3");
  1141. c(!strcmp(s[3], "r"), "stb_tokens_stripwhite() 4");
  1142. c(s[4] == 0, "stb_tokens_stripwhite() 5");
  1143. free(s);
  1144. s = stb_tokens_quoted("foo =\"=\" ba*\"\"r \" foo\" bah ", "#=*", NULL);
  1145. c(!strcmp(s[0], "foo"), "stb_tokens_quoted() 1");
  1146. c(!strcmp(s[1], "= ba"), "stb_tokens_quoted() 2");
  1147. c(!strcmp(s[2], "\"r foo bah"), "stb_tokens_quoted() 3");
  1148. c(s[3] == 0, "stb_tokens_quoted() 4");
  1149. free(s);
  1150. p = stb_file("stb.h", &len2);
  1151. if (p) {
  1152. uint32 z = stb_adler32_old(1, p, len2);
  1153. uint32 x = stb_adler32 (1, p, len2);
  1154. c(z == x, "stb_adler32() 1");
  1155. memset(p,0xff,len2);
  1156. z = stb_adler32_old((65520<<16) + 65520, p, len2);
  1157. x = stb_adler32 ((65520<<16) + 65520, p, len2);
  1158. c(z == x, "stb_adler32() 2");
  1159. free(p);
  1160. }
  1161. // stb_hheap
  1162. {
  1163. #define HHEAP_COUNT 100000
  1164. void **p = malloc(sizeof(*p) * HHEAP_COUNT);
  1165. int i, j;
  1166. #if 0
  1167. stb_hheap *h2, *h = stb_newhheap(sizeof(struct1),0);
  1168. for (i=0; i < HHEAP_COUNT; ++i)
  1169. p[i] = stb_halloc(h);
  1170. stb_shuffle(p, HHEAP_COUNT, sizeof(*p), stb_rand());
  1171. for (i=0; i < HHEAP_COUNT; ++i)
  1172. stb_hfree(p[i]);
  1173. c(h->num_alloc == 0, "stb_hheap 1");
  1174. stb_delhheap(h);
  1175. h = stb_newhheap(sizeof(struct1),0);
  1176. h2 = stb_newhheap(sizeof(struct2),8);
  1177. for (i=0; i < HHEAP_COUNT; ++i) {
  1178. if (i & 1)
  1179. p[i] = stb_halloc(h);
  1180. else {
  1181. p[i] = stb_halloc(h2);
  1182. c((((int) p[i]) & 4) == 0, "stb_hheap 2");
  1183. }
  1184. }
  1185. stb_shuffle(p, HHEAP_COUNT, sizeof(*p), stb_rand());
  1186. for (i=0; i < HHEAP_COUNT; ++i)
  1187. stb_hfree(p[i]);
  1188. c(h->num_alloc == 0, "stb_hheap 3");
  1189. c(h2->num_alloc == 0, "stb_hheap 4");
  1190. stb_delhheap(h);
  1191. stb_delhheap(h2);
  1192. #else
  1193. for (i=0; i < HHEAP_COUNT; ++i)
  1194. p[i] = malloc(32);
  1195. stb_shuffle(p, HHEAP_COUNT, sizeof(*p), stb_rand());
  1196. for (i=0; i < HHEAP_COUNT; ++i)
  1197. free(p[i]);
  1198. #endif
  1199. // now use the same array of pointers to do pointer set operations
  1200. for (j=100; j < HHEAP_COUNT; j += 25000) {
  1201. stb_ps *ps = NULL;
  1202. for (i=0; i < j; ++i)
  1203. ps = stb_ps_add(ps, p[i]);
  1204. for (i=0; i < HHEAP_COUNT; ++i)
  1205. c(stb_ps_find(ps, p[i]) == (i < j), "stb_ps 1");
  1206. c(stb_ps_count(ps) == j, "stb_ps 1b");
  1207. for (i=j; i < HHEAP_COUNT; ++i)
  1208. ps = stb_ps_add(ps, p[i]);
  1209. for (i=0; i < j; ++i)
  1210. ps = stb_ps_remove(ps, p[i]);
  1211. for (i=0; i < HHEAP_COUNT; ++i)
  1212. c(stb_ps_find(ps, p[i]) == !(i < j), "stb_ps 2");
  1213. stb_ps_delete(ps);
  1214. }
  1215. #define HHEAP_COUNT2 100
  1216. // now use the same array of pointers to do pointer set operations
  1217. for (j=1; j < 40; ++j) {
  1218. stb_ps *ps = NULL;
  1219. for (i=0; i < j; ++i)
  1220. ps = stb_ps_add(ps, p[i]);
  1221. for (i=0; i < HHEAP_COUNT2; ++i)
  1222. c(stb_ps_find(ps, p[i]) == (i < j), "stb_ps 3");
  1223. c(stb_ps_count(ps) == j, "stb_ps 3b");
  1224. for (i=j; i < HHEAP_COUNT2; ++i)
  1225. ps = stb_ps_add(ps, p[i]);
  1226. for (i=0; i < j; ++i)
  1227. ps = stb_ps_remove(ps, p[i]);
  1228. for (i=0; i < HHEAP_COUNT2; ++i)
  1229. c(stb_ps_find(ps, p[i]) == !(i < j), "stb_ps 4");
  1230. stb_ps_delete(ps);
  1231. }
  1232. free(p);
  1233. }
  1234. n = test_compression(tc, sizeof(tc));
  1235. c(n >= 0, "stb_compress()/stb_decompress() 1");
  1236. p = stb_file("stb.h", &len2);
  1237. if (p) {
  1238. FILE *f = fopen("data/stb_h.z", "wb");
  1239. if (stb_compress_stream_start(f)) {
  1240. int i;
  1241. void *q;
  1242. int len3;
  1243. for (i=0; i < len2; ) {
  1244. int n = stb_rand() % 10;
  1245. if (n <= 6) n = 1 + stb_rand()%16;
  1246. else if (n <= 8) n = 20 + stb_rand() % 1000;
  1247. else n = 15000;
  1248. if (i + n > len2) n = len2 - i;
  1249. stb_write(p + i, n);
  1250. i += n;
  1251. }
  1252. stb_compress_stream_end(1);
  1253. q = stb_decompress_fromfile("data/stb_h.z", &len3);
  1254. c(len3 == len2, "stb_compress_stream 2");
  1255. if (len2 == len3)
  1256. c(!memcmp(p,q,len2), "stb_compress_stream 3");
  1257. if (q) free(q);
  1258. } else {
  1259. c(0, "stb_compress_stream 1");
  1260. }
  1261. free(p);
  1262. stb_compress_window(65536*4);
  1263. }
  1264. p = stb_file("stb.h", &len2);
  1265. if (p) {
  1266. n = test_compression(p, len2);
  1267. c(n >= 0, "stb_compress()/stb_decompress() 2");
  1268. #if 0
  1269. n = test_en_compression(p, len2);
  1270. c(n >= 0, "stb_en_compress()/stb_en_decompress() 2");
  1271. #endif
  1272. free(p);
  1273. } else {
  1274. fprintf(stderr, "No stb.h to compression test.\n");
  1275. }
  1276. p = stb_file("data/test.bmp", &len2);
  1277. if (p) {
  1278. n = test_compression(p, len2);
  1279. c(n == 106141, "stb_compress()/stb_decompress() 4");
  1280. #if 0
  1281. n = test_en_compression(p, len2);
  1282. c(n >= 0, "stb_en_compress()/stb_en_decompress() 4");
  1283. #endif
  1284. free(p);
  1285. }
  1286. // the hardcoded compressed lengths being verified _could_
  1287. // change if you changed the compressor parameters; but pure
  1288. // performance optimizations shouldn't change them
  1289. p = stb_file("data/cantrbry.zip", &len2);
  1290. if (p) {
  1291. n = test_compression(p, len2);
  1292. c(n == 642787, "stb_compress()/stb_decompress() 3");
  1293. #if 0
  1294. n = test_en_compression(p, len2);
  1295. c(n >= 0, "stb_en_compress()/stb_en_decompress() 3");
  1296. #endif
  1297. free(p);
  1298. }
  1299. p = stb_file("data/bible.txt", &len2);
  1300. if (p) {
  1301. n = test_compression(p, len2);
  1302. c(n == 2022520, "stb_compress()/stb_decompress() 4");
  1303. #if 0
  1304. n = test_en_compression(p, len2);
  1305. c(n >= 0, "stb_en_compress()/stb_en_decompress() 4");
  1306. #endif
  1307. free(p);
  1308. }
  1309. {
  1310. int len = 1 << 25, o=0; // 32MB
  1311. char *buffer = malloc(len);
  1312. int i;
  1313. for (i=0; i < 8192; ++i)
  1314. buffer[o++] = (char) stb_rand();
  1315. for (i=0; i < (1 << 15); ++i)
  1316. buffer[o++] = 1;
  1317. for (i=0; i < 64; ++i)
  1318. buffer[o++] = buffer[i];
  1319. for (i=0; i < (1 << 21); ++i)
  1320. buffer[o++] = 2;
  1321. for (i=0; i < 64; ++i)
  1322. buffer[o++] = buffer[i];
  1323. for (i=0; i < (1 << 21); ++i)
  1324. buffer[o++] = 3;
  1325. for (i=0; i < 8192; ++i)
  1326. buffer[o++] = buffer[i];
  1327. for (i=0; i < (1 << 21); ++i)
  1328. buffer[o++] = 4;
  1329. assert(o < len);
  1330. stb_compress_window(1 << 24);
  1331. i = test_compression(buffer, len);
  1332. c(n >= 0, "stb_compress() 6");
  1333. free(buffer);
  1334. }
  1335. #ifdef STB_THREADS
  1336. stb_thread_cleanup();
  1337. #endif
  1338. stb_ischar(0,NULL);
  1339. stb_wrapper_listall(dumpfunc);
  1340. printf("Memory still in use: %d allocations of %d bytes.\n", alloc_num, alloc_size);
  1341. // force some memory checking
  1342. for (n=1; n < 20; ++n)
  1343. malloc(1 << n);
  1344. printf("Finished stb.c with %d errors.\n", count);
  1345. #ifdef _MSC_VER
  1346. if (count)
  1347. __asm int 3;
  1348. #endif
  1349. return 0;
  1350. }
  1351. #endif
  1352. // NIST test vectors
  1353. struct
  1354. {
  1355. int length;
  1356. char *message;
  1357. char *digest;
  1358. } sha1_tests[] =
  1359. {
  1360. { 24,
  1361. "616263",
  1362. "a9993e364706816aba3e25717850c26c9cd0d89d",
  1363. },{
  1364. 1304,
  1365. "ec29561244ede706b6eb30a1c371d74450a105c3f9735f7fa9fe38cf67f304a5736a106e"
  1366. "92e17139a6813b1c81a4f3d3fb9546ab4296fa9f722826c066869edacd73b25480351858"
  1367. "13e22634a9da44000d95a281ff9f264ecce0a931222162d021cca28db5f3c2aa24945ab1"
  1368. "e31cb413ae29810fd794cad5dfaf29ec43cb38d198fe4ae1da2359780221405bd6712a53"
  1369. "05da4b1b737fce7cd21c0eb7728d08235a9011",
  1370. "970111c4e77bcc88cc20459c02b69b4aa8f58217",
  1371. },{
  1372. 2096,
  1373. "5fc2c3f6a7e79dc94be526e5166a238899d54927ce470018fbfd668fd9dd97cbf64e2c91"
  1374. "584d01da63be3cc9fdff8adfefc3ac728e1e335b9cdc87f069172e323d094b47fa1e652a"
  1375. "fe4d6aa147a9f46fda33cacb65f3aa12234746b9007a8c85fe982afed7815221e43dba55"
  1376. "3d8fe8a022cdac1b99eeeea359e5a9d2e72e382dffa6d19f359f4f27dc3434cd27daeeda"
  1377. "8e38594873398678065fbb23665aba9309d946135da0e4a4afdadff14db18e85e71dd93c"
  1378. "3bf9faf7f25c8194c4269b1ee3d9934097ab990025d9c3aaf63d5109f52335dd3959d38a"
  1379. "e485050e4bbb6235574fc0102be8f7a306d6e8de6ba6becf80f37415b57f9898a5824e77"
  1380. "414197422be3d36a6080",
  1381. "0423dc76a8791107d14e13f5265b343f24cc0f19",
  1382. },{
  1383. 2888,
  1384. "0f865f46a8f3aed2da18482aa09a8f390dc9da07d51d1bd10fe0bf5f3928d5927d08733d"
  1385. "32075535a6d1c8ac1b2dc6ba0f2f633dc1af68e3f0fa3d85e6c60cb7b56c239dc1519a00"
  1386. "7ea536a07b518ecca02a6c31b46b76f021620ef3fc6976804018380e5ab9c558ebfc5cb1"
  1387. "c9ed2d974722bf8ab6398f1f2b82fa5083f85c16a5767a3a07271d67743f00850ce8ec42"
  1388. "8c7f22f1cf01f99895c0c844845b06a06cecb0c6cf83eb55a1d4ebc44c2c13f6f7aa5e0e"
  1389. "08abfd84e7864279057abc471ee4a45dbbb5774afa24e51791a0eada11093b88681fe30b"
  1390. "aa3b2e94113dc63342c51ca5d1a6096d0897b626e42cb91761058008f746f35465465540"
  1391. "ad8c6b8b60f7e1461b3ce9e6529625984cb8c7d46f07f735be067588a0117f23e34ff578"
  1392. "00e2bbe9a1605fde6087fb15d22c5d3ac47566b8c448b0cee40373e5ba6eaa21abee7136"
  1393. "6afbb27dbbd300477d70c371e7b8963812f5ed4fb784fb2f3bd1d3afe883cdd47ef32bea"
  1394. "ea",
  1395. "6692a71d73e00f27df976bc56df4970650d90e45",
  1396. },{
  1397. 3680,
  1398. "4893f1c763625f2c6ce53aacf28026f14b3cd8687e1a1d3b60a81e80fcd1e2b038f9145a"
  1399. "b64a0718f948f7c3c9ac92e3d86fb669a5257da1a18c776291653688338210a3242120f1"
  1400. "01788e8acc9110db9258b1554bf3d26602516ea93606a25a7f566c0c758fb39ecd9d876b"
  1401. "c5d8abc1c3205095382c2474cb1f8bbdb45c2c0e659cb0fc703ec607a5de6bcc7a28687d"
  1402. "b1ee1c8f34797bb2441d5706d210df8c2d7d65dbded36414d063c117b52a51f7a4eb9cac"
  1403. "0782e008b47459ed5acac0bc1f20121087f992ad985511b33c866d18e63f585478ee5a5e"
  1404. "654b19d81231d98683ae3f0533565aba43dce408d7e3c4c6be11d8f05165f29c9dcb2030"
  1405. "c4ee31d3a04e7421aa92c3231a1fc07e50e95fea7389a5e65891afaba51cf55e36a9d089"
  1406. "bf293accb356d5d06547307d6e41456d4ed146a056179971c56521c83109bf922866186e"
  1407. "184a99a96c7bb96df8937e35970e438412a2b8d744cf2ad87cb605d4232e976f9f151697"
  1408. "76e4e5b6b786132c966b25fc56d815c56c819af5e159aa39f8a93d38115f5580cda93bc0"
  1409. "73c30b39920e726fe861b72483a3f886269ab7a8eefe952f35d25c4eb7f443f4f3f26e43"
  1410. "d51fb54591e6a6dad25fcdf5142033084e5624bdd51435e77dea86b8",
  1411. "dc5859dd5163c4354d5d577b855fa98e37f04384",
  1412. },{
  1413. 4472,
  1414. "cf494c18a4e17bf03910631471bca5ba7edea8b9a63381e3463517961749848eb03abefd"
  1415. "4ce676dece3740860255f57c261a558aa9c7f11432f549a9e4ce31d8e17c79450ce2ccfc"
  1416. "148ad904aedfb138219d7052088520495355dadd90f72e6f69f9c6176d3d45f113f275b7"
  1417. "fbc2a295784d41384cd7d629b23d1459a22e45fd5097ec9bf65fa965d3555ec77367903c"
  1418. "32141065fc24da5c56963d46a2da3c279e4035fb2fb1c0025d9dda5b9e3443d457d92401"
  1419. "a0d3f58b48469ecb1862dc975cdbe75ca099526db8b0329b03928206f084c633c04eef5e"
  1420. "8e377f118d30edf592504be9d2802651ec78aeb02aea167a03fc3e23e5fc907c324f283f"
  1421. "89ab37e84687a9c74ccf055402db95c29ba2c8d79b2bd4fa96459f8e3b78e07e923b8119"
  1422. "8267492196ecb71e01c331f8df245ec5bdf8d0e05c91e63bb299f0f6324895304dda721d"
  1423. "39410458f117c87b7dd6a0ee734b79fcbe482b2c9e9aa0cef03a39d4b0c86de3bc34b4aa"
  1424. "dabfa373fd2258f7c40c187744d237080762382f547a36adb117839ca72f8ebbc5a20a07"
  1425. "e86f4c8bb923f5787698d278f6db0040e76e54645bb0f97083995b34b9aa445fc4244550"
  1426. "58795828dd00c32471ec402a307f5aa1b37b1a86d6dae3bcbfbe9ba41cab0beeabf489af"
  1427. "0073d4b3837d3f14b815120bc3602d072b5aeefcdec655fe756b660eba7dcf34675acbce"
  1428. "317746270599424b9248791a0780449c1eabbb9459cc1e588bfd74df9b1b711c85c09d8a"
  1429. "a171b309281947e8f4b6ac438753158f4f36fa",
  1430. "4c17926feb6e87f5bca7890d8a5cde744f231dab",
  1431. },{
  1432. 5264,
  1433. "8236153781bd2f1b81ffe0def1beb46f5a70191142926651503f1b3bb1016acdb9e7f7ac"
  1434. "ced8dd168226f118ff664a01a8800116fd023587bfba52a2558393476f5fc69ce9c65001"
  1435. "f23e70476d2cc81c97ea19caeb194e224339bcb23f77a83feac5096f9b3090c51a6ee6d2"
  1436. "04b735aa71d7e996d380b80822e4dfd43683af9c7442498cacbea64842dfda238cb09992"
  1437. "7c6efae07fdf7b23a4e4456e0152b24853fe0d5de4179974b2b9d4a1cdbefcbc01d8d311"
  1438. "b5dda059136176ea698ab82acf20dd490be47130b1235cb48f8a6710473cfc923e222d94"
  1439. "b582f9ae36d4ca2a32d141b8e8cc36638845fbc499bce17698c3fecae2572dbbd4705524"
  1440. "30d7ef30c238c2124478f1f780483839b4fb73d63a9460206824a5b6b65315b21e3c2f24"
  1441. "c97ee7c0e78faad3df549c7ca8ef241876d9aafe9a309f6da352bec2caaa92ee8dca3928"
  1442. "99ba67dfed90aef33d41fc2494b765cb3e2422c8e595dabbfaca217757453fb322a13203"
  1443. "f425f6073a9903e2dc5818ee1da737afc345f0057744e3a56e1681c949eb12273a3bfc20"
  1444. "699e423b96e44bd1ff62e50a848a890809bfe1611c6787d3d741103308f849a790f9c015"
  1445. "098286dbacfc34c1718b2c2b77e32194a75dda37954a320fa68764027852855a7e5b5274"
  1446. "eb1e2cbcd27161d98b59ad245822015f48af82a45c0ed59be94f9af03d9736048570d6e3"
  1447. "ef63b1770bc98dfb77de84b1bb1708d872b625d9ab9b06c18e5dbbf34399391f0f8aa26e"
  1448. "c0dac7ff4cb8ec97b52bcb942fa6db2385dcd1b3b9d567aaeb425d567b0ebe267235651a"
  1449. "1ed9bf78fd93d3c1dd077fe340bb04b00529c58f45124b717c168d07e9826e33376988bc"
  1450. "5cf62845c2009980a4dfa69fbc7e5a0b1bb20a5958ca967aec68eb31dd8fccca9afcd30a"
  1451. "26bab26279f1bf6724ff",
  1452. "11863b483809ef88413ca9b0084ac4a5390640af",
  1453. },{
  1454. 6056,
  1455. "31ec3c3636618c7141441294fde7e72366a407fa7ec6a64a41a7c8dfda150ca417fac868"
  1456. "1b3c5be253e3bff3ab7a5e2c01b72790d95ee09b5362be835b4d33bd20e307c3c702aa15"
  1457. "60cdc97d190a1f98b1c78e9230446e31d60d25155167f73e33ed20cea27b2010514b57ba"
  1458. "b05ed16f601e6388ea41f714b0f0241d2429022e37623c11156f66dd0fa59131d8401dba"
  1459. "f502cffb6f1d234dcb53e4243b5cf9951688821586a524848123a06afa76ab8058bcfa72"
  1460. "27a09ce30d7e8cb100c8877bb7a81b615ee6010b8e0daced7cc922c971940b757a9107de"
  1461. "60b8454dda3452e902092e7e06faa57c20aadc43c8012b9d28d12a8cd0ba0f47ab4b377f"
  1462. "316902e6dff5e4f2e4a9b9de1e4359f344e66d0565bd814091e15a25d67d89cf6e30407b"
  1463. "36b2654762bbe53a6f204b855a3f9108109e351825cf9080c89764c5f74fb4afef89d804"
  1464. "e7f7d097fd89d98171d63eaf11bd719df44c5a606be0efea358e058af2c265b2da2623fd"
  1465. "afc62b70f0711d0150625b55672060cea6a253c590b7db1427a536d8a51085756d1e6ada"
  1466. "41d9d506b5d51bcae41249d16123b7df7190e056777a70feaf7d9f051fdbbe45cbd60fc6"
  1467. "295dda84d4ebbd7284ad44be3ee3ba57c8883ead603519b8ad434e3bf630734a9243c00a"
  1468. "a07366b8f88621ec6176111f0418c66b20ff9a93009f43432aaea899dad0f4e3ae72e9ab"
  1469. "a3f678f140118eb7117230c357a5caa0fe36c4e6cf1957bbe7499f9a68b0f1536e476e53"
  1470. "457ed826d9dea53a6ded52e69052faaa4d3927b9a3f9e8b435f424b941bf2d9cd6849874"
  1471. "42a44d5acaa0da6d9f390d1a0dd6c19af427f8bb7c082ae405a8dd535dea76aa360b4faa"
  1472. "d786093e113424bb75b8cc66c41af637a7b2acdca048a501417919cf9c5cd3b2fa668860"
  1473. "d08b6717eea6f125fa1b0bae1dbb52aafce8ae2deaf92aeb5be003fb9c09fedbc286ffb5"
  1474. "e16ad8e07e725faa46ebc35500cf205fc03250075ddc050c263814b8d16d141db4ca289f"
  1475. "386719b28a09a8e5934722202beb3429899b016dfeb972fee487cdd8d18f8a681042624f"
  1476. "51",
  1477. "f43937922444421042f76756fbed0338b354516f",
  1478. },{
  1479. 6848,
  1480. "21b9a9686ec200456c414f2e6963e2d59e8b57e654eced3d4b57fe565b51c9045c697566"
  1481. "44c953178f0a64a6e44d1b46f58763c6a71ce4c373b0821c0b3927a64159c32125ec916b"
  1482. "6edd9bf41c3d80725b9675d6a97c8a7e3b662fac9dbcf6379a319a805b5341a8d360fe00"
  1483. "5a5c9ac1976094fea43566d66d220aee5901bd1f2d98036b2d27eb36843e94b2e5d1f09c"
  1484. "738ec826de6e0034cf8b1dca873104c5c33704cae290177d491d65f307c50a69b5c81936"
  1485. "a050e1fe2b4a6f296e73549323b6a885c3b54ee5eca67aa90660719126b590163203909e"
  1486. "470608f157f033f017bcf48518bf17d63380dabe2bc9ac7d8efe34aedcae957aeb68f10c"
  1487. "8ad02c4465f1f2b029d5fbb8e8538d18be294394b54b0ee6e67a79fce11731604f3ac4f8"
  1488. "d6ffa9ef3d2081f3d1c99ca107a7bf3d624324a7978ec38af0bcd0d7ee568572328b212b"
  1489. "9dc831efb7880e3f4d6ca7e25f8e80d73913fb8edfffd758ae4df61b4140634a92f49314"
  1490. "6138ebdcdaa083ea72d52a601230aa6f77874dcad9479f5bcac3763662cc30cb99823c5f"
  1491. "f469dcbd64c028286b0e579580fd3a17b56b099b97bf62d555798f7a250e08b0e4f238c3"
  1492. "fcf684198bd48a68c208a6268be2bb416eda3011b523388bce8357b7f26122640420461a"
  1493. "bcabcb5004519adfa2d43db718bce7d0c8f1b4645c89315c65df1f0842e5741244bba3b5"
  1494. "10801d2a446818635d0e8ffcd80c8a6f97ca9f878793b91780ee18eb6c2b99ffac3c38ef"
  1495. "b7c6d3af0478317c2b9c421247eba8209ea677f984e2398c7c243696a12df2164417f602"
  1496. "d7a1d33809c865b73397550ff33fe116166ae0ddbccd00e2b6fc538733830ac39c328018"
  1497. "bcb87ac52474ad3cce8780d6002e14c6734f814cb551632bcc31965c1cd23d048b9509a4"
  1498. "e22ab88f76a6dba209d5dd2febd1413a64d32be8574a22341f2a14e4bd879abb35627ef1"
  1499. "35c37be0f80843006a7cc7158d2bb2a71bf536b36de20ca09bb5b674e5c408485106e6fa"
  1500. "966e4f2139779b46f6010051615b5b41cda12d206d48e436b9f75d7e1398a656abb0087a"
  1501. "a0eb453368fc1ecc71a31846080f804d7b67ad6a7aa48579c3a1435eff7577f4e6004d46"
  1502. "aac4130293f6f62ae6d50c0d0c3b9876f0728923a94843785966a27555dd3ce68602e7d9"
  1503. "0f7c7c552f9bda4969ec2dc3e30a70620db6300e822a93e633ab9a7a",
  1504. "5d4d18b24b877092188a44be4f2e80ab1d41e795",
  1505. },{
  1506. 7640,
  1507. "1c87f48f4409c3682e2cf34c63286dd52701b6c14e08669851a6dc8fa15530ad3bef692c"
  1508. "7d2bf02238644561069df19bdec3bccae5311fce877afc58c7628d08d32d9bd2dc1df0a6"
  1509. "24360e505944219d211f33bff62e9ff2342ac86070240a420ccaf14908e6a93c1b27b6e2"
  1510. "0324e522199e83692805cc4c7f3ea66f45a490a50d4dd558aa8e052c45c1a5dfad452674"
  1511. "edc7149024c09024913f004ceee90577ff3eaec96a1eebbdc98b440ffeb0cad9c6224efc"
  1512. "9267d2c192b53dc012fb53010926e362ef9d4238d00df9399f6cbb9acc389a7418007a6c"
  1513. "a926c59359e3608b548bdeece213f4e581d02d273781dffe26905ec161956f6dfe1c008d"
  1514. "6da8165d08f8062eea88e80c055b499f6ff8204ffdb303ab132d9b0cba1e5675f3525bbe"
  1515. "4cf2c3f2b00506f58336b36aefd865d37827f2fad7d1e59105b52f1596ea19f848037dfe"
  1516. "dc9136e824ead5505e2995d4c0769276548835430667f333fc77375125b29c1b1535602c"
  1517. "10fe161864f49a98fc274ae7335a736be6bf0a98cd019d120b87881103f86c0a6efadd8c"
  1518. "aa405b6855c384141b4f8751cc42dc0cb2913382210baaa84fe242ca66679472d815c08b"
  1519. "f3d1a7c6b5705a3de17ad157522de1eb90c568a8a1fbcbb422cca293967bb14bfdd91bc5"
  1520. "a9c4d2774dee524057e08f937f3e2bd8a04ced0fc7b16fb78a7b16ee9c6447d99e53d846"
  1521. "3726c59066af25c317fc5c01f5dc9125809e63a55f1cd7bdf7f995ca3c2655f4c7ab940f"
  1522. "2aa48bc3808961eb48b3a03c731ce627bb67dd0037206c5f2c442fc72704258548c6a9db"
  1523. "e16da45e40da009dc8b2600347620eff8361346116b550087cb9e2ba6b1d6753622e8b22"
  1524. "85589b90a8e93902aa17530104455699a1829efef153327639b2ae722d5680fec035575c"
  1525. "3b48d9ec8c8e9550e15338cc76b203f3ab597c805a8c6482676deabc997a1e4ba857a889"
  1526. "97ceba32431443c53d4d662dd5532aa177b373c93bf93122b72ed7a3189e0fa171dfabf0"
  1527. "520edf4b9d5caef595c9a3a13830c190cf84bcf9c3596aadb2a674fbc2c951d135cb7525"
  1528. "3ee6c59313444f48440a381e4b95f5086403beb19ff640603394931f15d36b1cc9f3924f"
  1529. "794c965d4449bfbdd8b543194335bdf70616dc986b49582019ac2bf8e68cfd71ec67e0aa"
  1530. "dff63db39e6a0ef207f74ec6108fae6b13f08a1e6ae01b813cb7ee40961f95f5be189c49"
  1531. "c43fbf5c594f5968e4e820a1d38f105f2ff7a57e747e4d059ffb1d0788b7c3c772b9bc1f"
  1532. "e147c723aca999015230d22c917730b935e902092f83e0a8e6db9a75d2626e0346e67e40"
  1533. "8d5b815439dab8ccb8ea23f828fff6916c4047",
  1534. "32e0f5d40ceec1fbe45ddd151c76c0b3fef1c938",
  1535. },{
  1536. 8432,
  1537. "084f04f8d44b333dca539ad2f45f1d94065fbb1d86d2ccf32f9486fe98f7c64011160ec0"
  1538. "cd66c9c7478ed74fde7945b9c2a95cbe14cedea849978cc2d0c8eb0df48d4834030dfac2"
  1539. "b043e793b6094a88be76b37f836a4f833467693f1aa331b97a5bbc3dbd694d96ce19d385"
  1540. "c439b26bc16fc64919d0a5eab7ad255fbdb01fac6b2872c142a24aac69b9a20c4f2f07c9"
  1541. "923c9f0220256b479c11c90903193d4e8f9e70a9dbdf796a49ca5c12a113d00afa844694"
  1542. "de942601a93a5c2532031308ad63c0ded048633935f50a7e000e9695c1efc1e59c426080"
  1543. "a7d1e69a93982a408f1f6a4769078f82f6e2b238b548e0d4af271adfa15aa02c5d7d7052"
  1544. "6e00095ffb7b74cbee4185ab54385f2707e8362e8bd1596937026f6d95e700340b6338ce"
  1545. "ba1ee854a621ce1e17a016354016200b1f98846aa46254ab15b7a128b1e840f494b2cdc9"
  1546. "daccf14107c1e149a7fc27d33121a5cc31a4d74ea6945816a9b7a83850dc2c11d26d767e"
  1547. "ec44c74b83bfd2ef8a17c37626ed80be10262fe63cf9f804b8460c16d62ae63c8dd0d124"
  1548. "1d8aaac5f220e750cb68d8631b162d80afd6b9bf929875bf2e2bc8e2b30e05babd8336be"
  1549. "31e41842673a66a68f0c5acd4d7572d0a77970f42199a4da26a56df6aad2fe420e0d5e34"
  1550. "448eb2ed33afbfb35dffaba1bf92039df89c038bae3e11c02ea08aba5240c10ea88a45a1"
  1551. "d0a8631b269bec99a28b39a3fc5b6b5d1381f7018f15638cc5274ab8dc56a62b2e9e4fee"
  1552. "f172be20170b17ec72ff67b81c15299f165810222f6a001a281b5df1153a891206aca89e"
  1553. "e7baa761a5af7c0493a3af840b9219e358b1ec1dd301f35d4d241b71ad70337bda42f0ea"
  1554. "dc9434a93ed28f96b6ea073608a314a7272fefd69d030cf22ee6e520b848fa705ed6160f"
  1555. "e54bd3bf5e89608506e882a16aced9c3cf80657cd03749f34977ced9749caa9f52b683e6"
  1556. "4d96af371b293ef4e5053a8ea9422df9dd8be45d5574730f660e79bf4cbaa5f3c93a79b4"
  1557. "0f0e4e86e0fd999ef4f26c509b0940c7a3eaf1f87c560ad89aff43cd1b9d4863aa3ebc41"
  1558. "a3dd7e5b77372b6953dae497fc7f517efe99e553052e645e8be6a3aeb362900c75ce712d"
  1559. "fcba712c4c25583728db9a883302939655ef118d603e13fcf421d0cea0f8fb7c49224681"
  1560. "d013250defa7d4fd64b69b0b52e95142e4cc1fb6332486716a82a3b02818b25025ccd283"
  1561. "198b07c7d9e08519c3c52c655db94f423912b9dc1c95f2315e44be819477e7ff6d2e3ccd"
  1562. "daa6da27722aaadf142c2b09ce9472f7fd586f68b64d71fc653decebb4397bf7af30219f"
  1563. "25c1d496514e3c73b952b8aa57f4a2bbf7dcd4a9e0456aaeb653ca2d9fa7e2e8a532b173"
  1564. "5c4609e9c4f393dd70901393e898ed704db8e9b03b253357f333a66aba24495e7c3d1ad1"
  1565. "b5200b7892554b59532ac63af3bdef590b57bd5df4fbf38d2b3fa540fa5bf89455802963"
  1566. "036bd173fe3967ed1b7d",
  1567. "ee976e4ad3cad933b283649eff9ffdb41fcccb18",
  1568. },{
  1569. 9224,
  1570. "bd8320703d0cac96a96aeefa3abf0f757456bf42b3e56f62070fc03e412d3b8f4e4e427b"
  1571. "c47c4600bb423b96de6b4910c20bc5c476c45feb5b429d4b35088813836fa5060ceb26db"
  1572. "bb9162e4acd683ef879a7e6a0d6549caf0f0482de8e7083d03ed2f583de1b3ef505f4b2c"
  1573. "cd8a23d86c09d47ba05093c56f21a82c815223d777d0cabb7ee4550423b5deb6690f9394"
  1574. "1862ae41590ea7a580dda79229d141a786215d75f77e74e1db9a03c9a7eb39eb35adf302"
  1575. "5e26eb31ca2d2ca507edca77d9e7cfcfd136784f2117a2afafa87fa468f08d07d720c933"
  1576. "f61820af442d260d172a0a113494ca169d33a3aeaacdcc895b356398ed85a871aba769f6"
  1577. "071abd31e9f2f5834721d0fef6f6ee0fc0e38760b6835dfcc7dbefb592e1f0c3793af7ad"
  1578. "f748786d3364f3cfd5686b1a18711af220e3637d8fad08c553ce9d5dc1183d48e8337b16"
  1579. "1fe69b50e1920316dbffec07425b5d616a805a699576590e0939f5c965bce6c7342d314a"
  1580. "c37b9c4d30166567c4f633f182de4d6b00e20a1c762789f915eaa1c89ac31b85222b1f05"
  1581. "403dedd94db9ce75ff4e49923d1999d032695fa0a1c595617830c3c9a7ab758732fcec26"
  1582. "85ae14350959b6a5f423ef726587e186b055a8daf6fa8fdefa02841b2fdbca1616dcee78"
  1583. "c685fc6dcc09f24a36097572eba3c37a3eabe98bc23836085f63ef71a54b4488615d83b2"
  1584. "6ed28c9fce78852df9b6cf8a75ca3899a7567298e91bc4ffdd04ffab0066b43b8286a4bb"
  1585. "555c78808496b252c6e0e4d153631f11f68baf88630e052acc2af5d2af2e22e4f23bb630"
  1586. "314c561a577455f86b6727bcad3c19d3e271404dec30af3d9dd0ed63cd9fa708aadfa12a"
  1587. "500ef2d99a6b71e137b56ba90036975b88004b45f577ef800f0fb3cf97577dc9da37253b"
  1588. "8675e5c8bb7e0bd26564f19eca232fb25f280f82e014424c9fbdd1411d7556e5d7906bb8"
  1589. "62206316ba03385cd820c54c82ed35b36735bc486b1885d84053eba036c1ebfb5422d93d"
  1590. "a71c53deda7f74db07cd4959cdfa898ba37080d76b564d344b124dd7b80cd70ed3b52a6c"
  1591. "f9c9a32695d134bd39eb11ddeecdac86c808e469bd8a7995b667c452e7d9a54d5c85bcf6"
  1592. "d5ffdc27d491bc06f438f02c7cf018073431587c78ba08d18a8daccb2d3b26136f612ade"
  1593. "c673f3cd5eb83412b29652d55a10d0d6238d0b5365db272c917349450aff062c36191cfc"
  1594. "d45660819083f89cd42ecae9e26934a020cafeb9b2b68d544edf59574c0ca159fd195dbf"
  1595. "3e3e74244d942fffdbd4ed7f626219bab88b5a07e50b09a832d3e8ad82091114e54f2c35"
  1596. "6b48e55e36589ebad3ac6077cb7b1827748b00670df65bbf0a2e65caad3f8a97d654d64e"
  1597. "1c7dad171cafbc37110d2f7ca66524dc08fe60593e914128bd95f41137bfe819b5ca835f"
  1598. "e5741344b5c907ce20a35f4f48726141c6398e753ed9d46d3692050628c78859d5014fe4"
  1599. "dd3708e58d4d9807f8dac540492e32fa579491717ad4145c9efc24cf95605660b2e09b89"
  1600. "9369b74d3ebff41e707917ff314d93e6ac8dfd643ef2c087cd9912005b4b2681da01a369"
  1601. "42a756a3e22123cbf38c429373c6a8663130c24b24b2690b000013960b1c46a32d1d5397"
  1602. "47",
  1603. "2df09b10933afedfcd3f2532dfd29e7cb6213859",
  1604. },{
  1605. 10016,
  1606. "7a94978bec7f5034b12c96b86498068db28cd2726b676f54d81d8d7350804cc106bead8a"
  1607. "252b465a1f413b1c41e5697f8cece49ec0dea4dfb9fa7b1bfe7a4a00981875b420d094bb"
  1608. "1ce86c1b8c2e1dbebf819c176b926409fdec69042e324e71d7a8d75006f5a11f512811fe"
  1609. "6af88a12f450e327950b18994dfc3f740631beda6c78bca5fe23d54e6509120e05cd1842"
  1610. "d3639f1466cf26585030e5b4aefe0404fe900afc31e1980f0193579085342f1803c1ba27"
  1611. "0568f80eaf92440c4f2186b736f6ab9dc7b7522ccdcfc8cf12b6375a2d721aa89b5ef482"
  1612. "112a42c31123aebabcb485d0e72d6b6b70c44e12d2da98d1f87fa9df4f37847e1ffec823"
  1613. "1b8be3d737d282ddb9cc4b95937acfa0f028ba450def4d134a7d0fc88119bf7296e18cd4"
  1614. "4f56890b661b5b72ddfa34c29228067e13caf08eb3b7fd29de800df9a9ae137aad4a81a4"
  1615. "16a301c9f74b66c0e163e243b3187996b36eb569de3d9c007d78df91f9b554eef0eaa663"
  1616. "88754ce20460b75d95e2d0747229a1502a5652cf39ca58e1daa0e9321d7ab3093981cd70"
  1617. "23a7ee956030dd70177028a66ad619ad0629e631f91228b7c5db8e81b276d3b168c1edb1"
  1618. "bc0888d1cbcbb23245c2d8e40c1ff14bfe13f9c70e93a1939a5c45eef9351e795374b9e1"
  1619. "b5c3a7bd642477ba7233e1f590ab44a8232c53099a3c0a6ffe8be8b7ca7b58e6fedf700f"
  1620. "6f03dd7861ee1ef857e3f1a32a2e0baa591d0c7ca04cb231cc254d29cda873f00d68f465"
  1621. "00d6101cfdc2e8004c1f333d8007325d06ffe6b0ff7b80f24ba51928e65aa3cb78752028"
  1622. "27511207b089328bb60264595a2cebfc0b84d9899f5eca7ea3e1d2f0f053b4e67f975500"
  1623. "7ff3705ca4178ab9c15b29dd99494135f35befbcec05691d91f6361cad9c9a32e0e65577"
  1624. "f14d8dc66515081b51d09e3f6c25eea868cf519a83e80c935968cae6fce949a646ad53c5"
  1625. "6ee1f07dda23daef3443310bc04670afedb1a0132a04cb64fa84b4af4b3dc501044849cd"
  1626. "dd4adb8d733d1eac9c73afa4f7d75864c87787f4033ffe5ba707cbc14dd17bd1014b8b61"
  1627. "509c1f55a25cf6c0cbe49e4ddcc9e4de3fa38f7203134e4c7404ee52ef30d0b3f4e69bcc"
  1628. "7d0b2e4d8e60d9970e02cc69d537cfbc066734eb9f690a174e0194ca87a6fadad3883d91"
  1629. "6bd1700a052b26deee832701590d67e6f78938eac7c4beef3061a3474dd90dd588c1cd6e"
  1630. "6a4cda85b110fd08a30dcd85a3ebde910283366a17a100db920885600db7578be46bcfa6"
  1631. "4765ba9a8d6d5010cb1766d5a645e48365ed785e4b1d8c7c233c76291c92ef89d70bc77f"
  1632. "bf37d7ce9996367e5b13b08242ce73971f1e0c6ff2d7920fb9c821768a888a7fe0734908"
  1633. "33efb854cbf482aed5cb594fb715ec82a110130664164db488666d6198279006c1aa521f"
  1634. "9cf04250476c934eba0914fd586f62d6c5825b8cf82cd7ef915d93106c506ea6760fd8b0"
  1635. "bf39875cd1036b28417de54783173446026330ef701c3a6e5b6873b2025a2c1666bb9e41"
  1636. "a40adb4a81c1052047dabe2ad092df2ae06d6d67b87ac90be7d826ca647940c4da264cad"
  1637. "43c32a2bb8d5e27f87414e6887561444a80ed879ce91af13e0fbd6af1b5fa497ad0cbd2e"
  1638. "7f0f898f52f9e4710de2174e55ad07c45f8ead3b02cac6c811becc51e72324f2439099a0"
  1639. "5740090c1b165ecae7dec0b341d60a88f46d7ad8624aac231a90c93fad61fcfbbea12503"
  1640. "59fcd203862a6b0f1d71ac43db6c58a6b60c2c546edc12dd658998e8",
  1641. "f32e70862a16e3e8b199e9d81a9949d66f812cad",
  1642. },{
  1643. 10808,
  1644. "88dd7f273acbe799219c23184782ac0b07bade2bc46b4f8adbd25ed3d59c0fd3e2931638"
  1645. "837d31998641bbb7374c7f03d533ca60439ac4290054ff7659cc519bdda3dff2129a7bdb"
  1646. "66b3300068931ade382b7b813c970c8e15469187d25cb04b635403dc50ea6c65ab38a97c"
  1647. "431f28a41ae81c16192bd0c103f03b8fa815d6ea5bf0aa7fa534ad413b194eb12eb74f5d"
  1648. "62b3d3a7411eb8c8b09a261542bf6880acbdfb617a42e577009e482992253712f8d4c8bd"
  1649. "1c386bad068c7aa10a22111640041f0c35dabd0de00ebf6cd82f89cbc49325df12419278"
  1650. "ec0d5ebb670577b2fe0c3e0840c5dd0dc5b3da00669eed8ead380f968b00d42f4967faec"
  1651. "c131425fce1f7edb01cbec7e96d3c26fa6390a659e0ab069ef3edadc07e077bb816f1b22"
  1652. "98830a0fe2b393693bb79f41feca89577c5230e0a6c34b860dc1fdb10d85aa054481082c"
  1653. "494779d59ba798fcd817116c3059b7831857d0364352b354ce3b960fbb61a1b8a04d47ca"
  1654. "a0ead52a9bea4bada2646cdbaec211f391dac22f2c5b8748e36bfc3d4e8ea45131ca7f52"
  1655. "af09df21babe776fcecbb5c5dfa352c790ab27b9a5e74242bbd23970368dbefd7c3c74d1"
  1656. "61ae01c7e13c65b415f38aa660f51b69ea1c9a504fe1ad31987cb9b26a4db2c37d7b326c"
  1657. "50dbc8c91b13925306ff0e6098532dee7282a99c3ddf99f9e1024301f76e31e58271870b"
  1658. "d94b9356e892a6a798d422a48c7fd5b80efe855a4925cc93b8cf27badec5498338e2b538"
  1659. "70758b45d3e7a2fa059ed88df320a65e0a7cf87fa7e63b74cea1b7371e221f8004726642"
  1660. "30d4d57945a85b23d58f248c8cd06ccfabfa969ab8cb78317451fab60e4fdfa796e2e2a8"
  1661. "b46405839a91266d37e8d38bae545fb4060c357923b86d62f5d59d7bef5af20fbb9c7fb4"
  1662. "2c6fd487748ed3b9973dbf4b1f2c9615129fa10d21cc49c622842c37c01670be71715765"
  1663. "a98814634efbdee66bf3420f284dbd3efafc8a9117a8b9a72d9b81aa53ded78c409f3f90"
  1664. "bad6e30d5229e26f4f0cea7ee82c09e3b60ec0e768f35a7fb9007b869f9bfc49c518f648"
  1665. "3c951d3b6e22505453266ec4e7fe6a80dbe6a2458a1d6cd93044f2955607412091009c7d"
  1666. "6cd81648a3b0603c92bfdff9ec3c0104b07ed2105962ca7c56ede91cb932073c337665e2"
  1667. "409387549f9a46da05bc21c5126bd4b084bc2c06ab1019c51df30581aa4464ab92978c13"
  1668. "f6d7c7ac8d30a78f982b9a43181bbe3c3eb9f7a1230b3e53b98a3c2a028317827fbe8cf6"
  1669. "ec5e3e6b2a084d517d472b25f72fab3a34415bba488f14e7f621cfa72396ba40890e8c60"
  1670. "b04815601a0819c9bebc5e18b95e04be3f9c156bd7375d8cc8a97c13ce0a3976123419fa"
  1671. "592631317ca638c1182be06886f9663d0e8e6839573df8f52219eeb5381482a6a1681a64"
  1672. "173660bfbb6d98bf06ee31e601ee99b4b99b5671ed0253260b3077ed5b977c6a79b4ff9a"
  1673. "08efd3cba5c39bec1a1e9807d40bbf0c988e0fd071cf2155ed7b014c88683cd869783a95"
  1674. "4cbfced9c0e80c3a92d45b508985cbbc533ba868c0dc4f112e99400345cf7524e42bf234"
  1675. "5a129e53da4051c429af2ef09aba33ae3c820ec1529132a203bd2b81534f2e865265f55c"
  1676. "9395caf0e0d3e1762c95eaaec935e765dc963b3e0d0a04b28373ab560fa9ba5ca71ced5d"
  1677. "17bb8b56f314f6f0d0bc8104b3f1835eca7eaac15adf912cf9a6945cfd1de392342dd596"
  1678. "d67e7ffcb7e086a6c1ea318aa2e0c2b5c2da079078232c637de0d317a1f26640bc1dac5b"
  1679. "e8699b53edc86e4bfdfaf797a2ae350bf4ea29790face675c4d2e85b8f37a694c91f6a14"
  1680. "1fd561274392ee6ee1a14424d5c134a69bcb4333079400f03615952fc4c99bf03f5733a8"
  1681. "dc71524269fc5c648371f5f3098314d9d10258",
  1682. "08632c75676571a5db5971f5d99cb8de6bf1792a",
  1683. },{
  1684. 11600,
  1685. "85d43615942fcaa449329fd1fe9efb17545eb252cac752228f1e9d90955a3cf4e72cb116"
  1686. "3c3d8e93ccb7e4826206ff58b3e05009ee82ab70943db3f18a32925d6d5aed1525c91673"
  1687. "bd33846571af815b09bb236466807d935b5816a8be8e9becbe65d05d765bcc0bc3ae66c2"
  1688. "5320ebe9fff712aa5b4931548b76b0fd58f6be6b83554435587b1725873172e130e1a3ca"
  1689. "3d9d0425f4632d79cca0683780f266a0633230e4f3b25f87b0c390092f7b13c66ab5e31b"
  1690. "5a58dbcac8dd26a0600bf85507057bb36e870dfae76da8847875a1a52e4596d5b4b0a211"
  1691. "2435d27e1dc8dd5016d60feaf2838746d436a2983457b72e3357059b2bf1e9148bb0551a"
  1692. "e2b27d5a39abd3d1a62c36331e26668e8baabc2a1ef218b5e7a51a9ca35795bcd54f403a"
  1693. "188eafafb30d82896e45ddaea4f418629a1fb76a0f539c7114317bac1e2a8fba5a868bce"
  1694. "40abd40f6b9ced3fa8c0329b4de5ca03cc84d75b8746ef31e6c8d0a0a79b4f747690928e"
  1695. "be327f8bbe9374a0df4c39c845bf3322a49fda9455b36db5a9d6e4ea7d4326cf0e0f7cd8"
  1696. "0ff74538f95cec01a38c188d1243221e9272ccc1053e30787c4cf697043cca6fc3730d2a"
  1697. "431ecbf60d73ee667a3ab114c68d578c66dc1c659b346cb148c053980190353f6499bfef"
  1698. "acfd1d73838d6dc1188c74dd72b690fb0481eee481a3fd9af1d4233f05d5ae33a7b10d7d"
  1699. "d643406cb1f88d7dd1d77580dcbee6f757eeb2bfbcc940f2cddb820b2718264b1a64115c"
  1700. "b85909352c44b13d4e70bbb374a8594d8af7f41f65b221bf54b8d1a7f8f9c7da563550cb"
  1701. "2b062e7a7f21d5e07dd9da8d82e5a89074627597551c745718094c2eb316ca077526d27f"
  1702. "9a589c461d891dc7cd1bc20ba3f464da53c97924219c87a0f683dfb3b3ac8793c59e78ac"
  1703. "fac109439221ac599a6fd8d2754946d6bcba60784805f7958c9e34ff287ad1dbbc888848"
  1704. "fa80cc4200dbb8c5e4224535906cbffdd0237a77a906c10ced740f9c0ce7821f2dbf8c8d"
  1705. "7d41ecfcc7dfdc0846b98c78b765d01fb1eb15ff39149ab592e5dd1152665304bba85bbf"
  1706. "4705751985aaaf31245361554d561a2337e3daeef58a826492fd886d5f18ef568c1e772e"
  1707. "f6461170407695e3254eb7bf0c683811ddde5960140d959114998f08bdb24a104095987d"
  1708. "3255d590e0dbd41ae32b1ae4f4ea4a4f011de1388034231e034756870c9f2d9f23788723"
  1709. "27055a7de2b5e931dfb53e7780b6d4294bf094e08567025b026db9203b681565a1d52f30"
  1710. "318d0ebe49471b22ba5fd62e1ed6c8966c99b853c9062246a1ace51ef7523c7bf93bef53"
  1711. "d8a9cb96d6a04f0da1eca888df66e0380a72525a7ecc6115d08569a66248f6ba34e2341b"
  1712. "fd01a78f7b3c1cfe0754e0d26cba2fa3f951ef14d5749ff8933b8aba06fa40fb570b467c"
  1713. "54ce0d3f0bed21e998e5a36b3bc2f9e1ae29c4bab59c121af6fad67c0b45959cd6a86194"
  1714. "14b90b4535fb95f86ca7e64502acc135eff4f8a3abe9dde84238fab7a7d402454a3f07ad"
  1715. "ec05ec94b2891e0879037fae6acaa31dcecf3f85236ade946f5ad69ad4077beb65099285"
  1716. "38ee09f2bc38e5704da67b5006b5e39cd765aafcd740c7dadb99d0c547126e1324610fcb"
  1717. "7353dac2c110e803fca2b17485b1c4b78690bc4f867e6f043b2568889f67985a465a48eb"
  1718. "ee915200589e915756d4968d26529c3ffe3dbe70e84c682ad08a0c68db571634fbb0210d"
  1719. "c1b16b8b725886465c8c51f36a5e27d0f78e5643e051d3bddd512ce511f6bdf3dfe42759"
  1720. "00c5fea9d248c2b3f36911ed0ff41a19f6445521f251724657ea8f795b3ead0928a1657f"
  1721. "308dd7c7c1e7e490d9849df43becfa5cc25ed09ef614fd69ddc7e5e3147623901d647876"
  1722. "fb60077ffc48c51ed7d02b35f6802e3715fc708a0c88b82fe9cba0a442d38d09ca5ae483"
  1723. "21487bdef1794e7636bf7457dd2b51a391880c34d229438347e5fec8555fe263f08ba87b"
  1724. "b16dcde529248a477628067d13d0cb3bf51776f4d39fb3fbc5f669e91019323e40360e4b"
  1725. "78b6584f077bf9e03b66",
  1726. "ab7213f6becb980d40dc89fbda0ca39f225a2d33",
  1727. },{
  1728. 12392,
  1729. "7ae3ca60b3a96be914d24980fb5652eb68451fed5fa47abe8e771db8301fbd5331e64753"
  1730. "93d96a4010d6551701e5c23f7ecb33bec7dd7bade21381e9865d410c383a139cb4863082"
  1731. "8e9372bd197c5b5788b6599853e8487bddfd395e537772fdd706b6a1de59c695d63427da"
  1732. "0dc3261bce2e1ae3cd6de90ec45ecd7e5f14580f5672b6ccd8f9336330dffcd6a3612a74"
  1733. "975afc08fb136450e25dc6b071ddfc28fca89d846c107fd2e4bd7a19a4ff6f482d62896d"
  1734. "a583c3277e23ab5e537a653112cdf2306043b3cc39f5280bd744fe81d66f497b95650e7d"
  1735. "dfd704efcb929b13e00c3e3a7d3cd53878af8f1506d9de05dba9c39a92604b394ea25acb"
  1736. "a2cda7b4ae8b08098ba3f0fdea15359df76517be84377f33631c844313ac335aa0d590fe"
  1737. "c472d805521f0905d44ca40d7391b292184105acd142c083761c1a038c4f5ed869ea3696"
  1738. "99592a37817f64cb4205b66be1f1de6fa47a08e1bf1a94312fe61a29e71bab242af95a7b"
  1739. "38d4fb412c682b30256d91e2a46b634535d02b495240cbdb842cbe17cba6a2b94073f3d5"
  1740. "f9621ac92ddda66f98bed997216466b4bb0579d58945f8d7450808d9e285d4f1709d8a1d"
  1741. "416aa57d4a1a72bfcbfecdda33de2cff3e90e0cc60c897c4663224fc5bbe8316a83c1773"
  1742. "802837a57bc7e9238173ed41ea32fe5fe38e546014a16d5e80700d9bac7a84bb03902f31"
  1743. "79e641f86f6bc383d656daf69801499633fb367ea7593195934c72bc9bf9624c0c845ebf"
  1744. "c36eb7ad4b22fdfb45ca7d4f0d6708c69a21f6eaa6db6bde0f0bd9dc7ec9c6e24626d0a7"
  1745. "8fbeeed4b391f871e80e6a9d207165832d4ff689296f9bca15dc03c7c0381659ea5335eb"
  1746. "aafdc3e50d18e46b00f1844870d09c25afcdb0ff1ae69dd8f94f91aca6095ba6f2b6e594"
  1747. "c4acfe9903485d21b684e31a6acc2162d40e1a7bb8114a860a07e76f5265666555f2418d"
  1748. "f11ef8f7499656d12215f5da8d7d041ac72648d15d7661ad93b24f3f071334b0921d5bb0"
  1749. "6f2c7ab09f5034518b5ae21cec379373e87d51c77d44a70c2337606aadeb9036716fd920"
  1750. "a824e7ae18ce3de9f0ec3456f3454027d8c476b3f1854b240c309f6f9786fa8a073915d9"
  1751. "7a019ce99aec3260c5f6b6346cd9c41cb9267f4475958e45289965548238c6b9f91a8784"
  1752. "b4e0957ba8b73956012c9a2fc3428434b1c1679f6ed2a3e8e2c90238df428622046f668e"
  1753. "e2b053f55e64ffd45600e05a885e3264af573bacee93d23d72a0222b5442ac80bc0a8b79"
  1754. "4c2afcf3bc881d20c111f57e3450b50a703f3db1fc5de2076a006f3b7eed694b93269874"
  1755. "3b03c2ed2684bad445e69a692e744c7ac3a04f1e0e52b7a6708076d1fbffdb3f1c995828"
  1756. "7d5f884e29407030f2db06811092efd80ae08da9daec39744c5ecd3ca771663b8f4968d4"
  1757. "2a88c2c9821c73ae2a5a4d9e2551f82c03583b9c4dea775423b4748d24eb604e8ee3159b"
  1758. "a6de9bea5b22eed6264e011734ed02b2c74ce06dda890b8604ed7ba49e7bf30e28c9871b"
  1759. "e90f5cead67eaf52b5d3181c822b10701219b28ef6f6bebfa278e38acf863e2a1d4b1e40"
  1760. "fd8a0ac6ce31054446301046148bf10dc3ae3385e2026e7762bdc8003ffebc4263191a59"
  1761. "c72f4f90db03e7d52808506b33bfe1dfa53f1a3daa152e83974fbe56cfd4e8f4e7f7806a"
  1762. "084b9d0795b858100eced0b5355a72446f37779d6c67ade60a627b8077ae1f3996b03bc3"
  1763. "a5c290651c8609f0d879fbf578cbab35086e1159dd6ddbe3bf7fb5654edcc8f09e4f80d0"
  1764. "258c9376d7c53fb68f78d333b18b70170d9a11070790c956f5744c78c986b1baf08b7631"
  1765. "7a65c5f07ae6f57eb0e65488659324d29709e3735623d0426e90aa8c4629bb080881150c"
  1766. "02be1c004da84414ac001c2eb6138c26388f5a36d594f3acef0e69e2cb43b870efa84da0"
  1767. "cff9c923a9880202aed64ad76260f53c45bb1584b3e388a909d13586094b924680006a1d"
  1768. "25d4dd36c579a8ec9d3fa63c082d977a5a5021440b5314b51850f2daa6e6af6ae88cb5b1"
  1769. "44242bceb1d4771e641101f8abfc3a9b19f2de64e35e76458ad22072ba57925d73015de5"
  1770. "66c66fcaa28fdc656f90de967ad51afd331e246d74ed469d63dd7d219935c59984bd9629"
  1771. "09d1af296eb3121d782650e7d038063bab5fa854aac77de5ffebeb53d263f521e3fc02ac"
  1772. "70",
  1773. "b0e15d39025f5263e3efa255c1868d4a37041382",
  1774. },{
  1775. 13184,
  1776. "fa922061131282d91217a9ff07463843ae34ff7f8c28b6d93b23f1ea031d5020aa92f660"
  1777. "8c3d3df0ee24a8958fd41af880ee454e36e26438defb2de8f09c018607c967d2f0e8b80a"
  1778. "00c91c0eabe5b4c253e319b45e6106ff8bf0516f866020e5ba3f59fd669c5aeff310ebb3"
  1779. "85007069d01c64f72d2b02f4ec0b45c5ecf313056afcb52b17e08b666d01fecc42adb5b4"
  1780. "9ea00c60cacac2e0a953f1324bdd44aec00964a22a3cb33916a33da10d74ec6c6577fb37"
  1781. "5dc6ac8a6ad13e00cba419a8636d4daac8383a2e98fe90790cde7b59cfaa17c410a52abc"
  1782. "d68b127593d2fcbafd30578d195d890e981ae09e6772cb4382404a4e09f1a33c958b57db"
  1783. "ccee54ae335b6c91443206a0c100135647b844f226417a1f70317fd350d9f3789d81894a"
  1784. "aff4730072401aaeb8b713ead4394e2e64b6917d6eee2549af7bd0952f12035719065320"
  1785. "ca0d2dfe2847c6a2357c52bee4a676b12bafff66597bd479aa29299c1896f63a7523a85a"
  1786. "b7b916c5930ab66b4d191103cefc74f2f7e0e96e354f65e355ae43959a0af1880d14ea9d"
  1787. "1569e4fd47174aba7f5decb430b3f6baf80a1ef27855227b62487250d3602970e423423c"
  1788. "7ca90920685bcf75adfbe2a61ce5bd9228947b32f567927cb1a5bd8727c03aef91d6367b"
  1789. "ae7d86fd15c0977ac965a88b0d7236037aefb8d24eec8d2a07c633e031a7b9147c4c7714"
  1790. "110bfc7e261448a5d0f73c3619664e1c533c81a0acbf95d502227a33f84f0b8249e3f9fa"
  1791. "5c7905a8192b7313fc56bb20679e81333d32c797ac5162204a0eaa0e64507635921c485b"
  1792. "8f17c4e2484667a733197529e2a833eed83c57229b11bd820b5a5b78f1867787dbc217ea"
  1793. "28bfba785fb545cbc5a840a12eea428213e1aaa4e50a900ba13efcf4a5345574c2481c5d"
  1794. "927ada610bba567a55630c89d905db3d9b67fe36c9cc3d6a947664c83e69f51c74711a33"
  1795. "df66dd3ff6af9b7c1605b614d4798b4192b9a4b1508f2e2ec5aaad7eaea1ee8867353db9"
  1796. "b8d7d9a6f16aa5f339492073238c979082879aee7f94ac4be8133eaacbaedfb044e2ad4e"
  1797. "93ba0fa071dea615a5cd80d1d2678f4f93ae5a4bc9cdf3df345a29ec41d8febb23805ce4"
  1798. "2541036f3f05c63ae736f79a29802045fad9f370cabf843458c1b636ca41f387fd7821c9"
  1799. "1abbd1946afcb9186b936403233f28a5b467595131a6bc07b0873e51a08de66b5d7709a6"
  1800. "02c1bd0e7f6e8f4beb0579c51bda0e0c738ef876fcd9a40ab7873c9c31c1d63a588eebc7"
  1801. "8d9a0ae6fa35cd1a269e0d2bc68252cbd7c08d79e96f0aa6be22a016136a2b8abe9d3c9c"
  1802. "f9d60eeafe3dbc76d489b24d68c36167df4c38cf2b21cf03dc5e659e39018c3490f1237e"
  1803. "ca3f85b742ab0045d86a899c4126ad60a147cbc95b71814c274d6478668df41eb32acfb4"
  1804. "bbf024fb4e3d6be0b60653a0471afc3037ab67dcb00a2b2e24b26911e1880136e56106b7"
  1805. "f3c570fbe6f311d94624cb001914ff96fbbf481f71686aa17be0850568058fc1ee8900b4"
  1806. "7af5cf51c5ed9e00a8b532c131f42513f6b8df14a9bbc2e9ede5a560681184d41a147552"
  1807. "edfbdef98d95e6a7793229d25ba9b0b395a020aa1c0731de89e662246d59ec22e5d8f4b4"
  1808. "6fbc048efcffbc234744c5c66417070f9c751c81788f04691ccb1a09d60c46f6f73375bf"
  1809. "e2e646cf6290069541a8dfe216374c925e94d06ece72e851e81d3e8acd011f82526c2f9f"
  1810. "55955c6752dc10e93153ab58627e30fa2c573e4042954337982eec1f741be058c85bad86"
  1811. "bf3a02ed96d3201dadd48bd4de8105200dfcbcc400c3c3dd717abfc562ebe338b14b1eb5"
  1812. "ecbe9227661e49c58bf8233770d813faafc78b05711135adcc4ce4c65095ca0bdc1debc0"
  1813. "b6e5d195dbc582ce94b3afa14a422edf9b69abd7ae869a78c3a26fb50ef7122ec5af8d0c"
  1814. "78ef082ca114f8817c3d93b31809870caea2eb9533fa767c2954efb9ba07e4f1077e9f9b"
  1815. "be845661eabea2c91079321477a7c167c7234528d63d6aabbe723e0e337b2e61138a310a"
  1816. "3fd04368aa4215b7af9d0334a8a74681bcb86b4af87a0329a1ed9dc7c9aef14521785eda"
  1817. "0eeb97bdff8c9945fd0ee04e84d0dae091a69c0bfcdcd4150878fed839c0db6565fc1fed"
  1818. "0e7d6ae2efde7a59d58a9fb3b07e6f7cea51ba93f771c18b2eafa252d7fe171085776052"
  1819. "a6a17e6858f0a20b7e8be54413523989bf20a028a84d9ce98b78e6ee0b8362df49de5344"
  1820. "b409cc322354672a21ea383e870d047551a3af71aaf2f44f49a859cf001e61b592dd036f"
  1821. "c6625bf7b91ea0fb78c1563cceb8c4345bf4a9fbe6ee2b6bf5e81083",
  1822. "8b6d59106f04300cb57c7c961945cd77f3536b0a",
  1823. },{
  1824. 13976,
  1825. "162cca41155de90f6e4b76a34261be6666ef65bdb92b5831b47604ce42e0c6c8d2eda265"
  1826. "ab9a3716809bf2e745e7831a41768d0f6349a268d9ac6e6adfb832a5d51b75d7951cf60e"
  1827. "03d9e40de6d351f1f6ade5143531cf32839401ca6dfb9dc7473daa607aeb0c3d1e8eb3db"
  1828. "cc2f1231ad1dd394d7eac9d8dab726b895b1ee774fdcabc8031063ecfa41c71a9f03ad23"
  1829. "904cc056f17c76a1059c43faffe30dfd157fdfd7d792e162bf7a889109550a0fc4c41523"
  1830. "2af0c0d72dcbc2595299e1a1c2aeae549f7970e994c15e0ab02f113d740d38c32a4d8ec0"
  1831. "79cd099d37d954ab7ef2800902cdf7c7a19fb14b3c98aaf4c6ad93fe9a9bc7a61229828e"
  1832. "55ad4d6270d1bdbca9975d450f9be91e5699bd7ee22e8c9c22e355cf1f6793f3551cb510"
  1833. "c1d5cd363bdf8cab063e6e49a6383221f1188d64692c1f84c910a696de2e72fb9886193f"
  1834. "61ab6b41ad0ea894d37ff1261bf1fd1f187e0d0c38ab223d99ec6d6b1e6b079fc305e24e"
  1835. "2d9500c98676e2d587434495d6e107b193c06fb12d5d8eaa7b0c001d08f4d91cae5bdcae"
  1836. "6624ee755e95ca8e4c5ef5b903d7f5ba438abeffd6f16d82d88138f157e7a50d1c91fb50"
  1837. "c770f6d222fcbf6daf791b1f8379e3b157a3b496ddb2e71650c1c4ac4fc5f2aceb5b3228"
  1838. "ffc44e15c02d4baa9434e60928a93f21bc91cfd3c2719f53a8c9bcd2f2dee65a8bbc88f9"
  1839. "5d7ced211fc3b04f6e8b74eb2026d66fd57fa0cccea43f0a0381782e6fee5660afed674d"
  1840. "cb2c28cb54d2bdbbaf78e534b0742ede6b5e659b46cd516d5362a194dd0822f6417935c4"
  1841. "ff05815b118fe5687cd8b050240015cfe449d9dfde1f4fdb105586e429b2c1849aac2791"
  1842. "ef73bc54603190eba39037ec057e784bb92d497e705dfcde2addb3514b4f1926f12d5440"
  1843. "850935779019b23bd0f2977a8c9478c424a7eaaeec04f3743a77bee2bec3937412e707bc"
  1844. "92a070046e2f9c35fe5cc3f755bbb91a182e683591ab7e8cff40633730546e81522f588f"
  1845. "07bdf142b78e115d2a22d2eb5664fcdb7574c1ee5ba9abd307d7d29078cd5223c222fc69"
  1846. "60324c40cc639be84dad96b01059efce7b08538ebef89bafab834609c7e82774a14e5be6"
  1847. "62067edba6111efa8ae270f5066442b17e3f31a793581c8a3f96d92921ec26981594e28a"
  1848. "08987d020b97ad2ba5c662836e35fd3fd954bcec52b579528913959d0d942fbf1c4b9910"
  1849. "ba010c3700359a4eb7616541257f0f7727cc71b580cc903f718ecc408a315b6bbfa7f6e3"
  1850. "beb9d258804bd2731ee2fb75e763281baf1effc4690a23d5f952ab5d4311d4f5885af2eb"
  1851. "f27cad9f6d84692cb903064bbd11ca751f919b4811b7722c6ec80c360521e34d357b5c8b"
  1852. "ba6d42e5c632730f53add99ab8aa9c607b6796216753086ede158bc670d04900aca66ce8"
  1853. "357bd72d19fb147b5fde8ee4df6a0184573a2e65ba3fd3a0cb04dac5eb36d17d2f639a6e"
  1854. "b602645f3ab4da9de4c9999d6506e8e242a5a3216f9e79a4202558ecdc74249ad3caaf90"
  1855. "71b4e653338b48b3ba3e9daf1e51e49384268d63f37ce87c6335de79175cdf542d661bcd"
  1856. "74b8f5107d6ab492f54b7c3c31257ecb0b426b77ed2e2ed22bbfdaf49653e1d54e5988fa"
  1857. "d71397546f9955659f22b3a4117fc823a1e87d6fb6fb8ab7d302a1316975e8baf0c0adbd"
  1858. "35455655f6a596b6ac3be7c9a8ea34166119d5e70dfbc1aa6e14ff98eff95e94ef576656"
  1859. "5d368ec8857fb0b029bcb990d420a5ca6bc7ab08053eb4dbfc4612a345d56faefc5e03a4"
  1860. "43520b224de776a5b618e1aa16edc513d5fcefcd413031b0ddc958a6fca45d108fbde065"
  1861. "3cf2d11cb00a71cd35f57993875598b4e33e2384623a0986859105d511c717c21d6534bf"
  1862. "69fd3d7cf1682e4fc25298d90df951e77a316996beac61bb7078988118c906548af92cfe"
  1863. "72cd4b102ffad584e5e721a0cdb5621ed07dda8955d84bea57a5afa4ba06289ddfac3a9e"
  1864. "765538fd9392fc7904cedb65e38cd90967f01845ff819777a22d199f608e62c13e6ba98b"
  1865. "40824b38c784bdb41d62c4014fc7e8d93be52695e975e54d1ff92b412f451177143d74a6"
  1866. "bde0ee53a986043ab465a1ef315ac4c538e775ef4178fde5f2ea560a364de18b8fe9578a"
  1867. "ad80027c3fd32dcf0967d9d03789b1cdf19040762f626289cf3af8afe5a8e0a152d9258e"
  1868. "981872c1ec95cd7f8d65812e55cb5cbd8db61b3f068a23d9652372dfbf18d43a663c5a0d"
  1869. "026b0898e383ce5c95b0ba7fb5ed6b7304c7c9d3ba64f38d1dc579465148ccfa7271f2e3"
  1870. "e0e97e9ddac7c0874f0f396cf07851638a734df393687b7b0343afd1652ff32a2da17b3a"
  1871. "4c99d79c02256c73f32625527e5666594a8a42a12135eddb022e743371b3ab7b12ad6785"
  1872. "7635eed03558ac673d17280769b2368056276d5d72f5dbc75525f8a7558bd90b544aa6cb"
  1873. "dd964e6c70be79441969bfdf471f17a2dc0c92",
  1874. "6144c4786145852e2a01b20604c369d1b9721019",
  1875. },{
  1876. 14768,
  1877. "c9bed88d93806b89c2d028866842e6542ab88c895228c96c1f9f05125f8697c7402538b0"
  1878. "6465b7ae33daef847500f73d20c598c86e4804e633e1c4466e61f3ed1e9baadc5723bbed"
  1879. "9455a2ff4f99b852cfe6aa3442852ade0b18e4995ddab4250928165a9441de108d4a293d"
  1880. "1d95935de022aa17f366a31d4f4c4c54557a4235a9d56473444787ddc5c06c87087aef24"
  1881. "fa8280b7ac74d76ba685e4be7dc705e5a8a97c6c8fbd201ee5bf522438d23371c60c155d"
  1882. "93352f8fb8cc9421fe4b66ffabad46909c2c1099944fc55ed424c90aecca4f50d0331153"
  1883. "2e2844c3ff8ecb495de7ab26941cbf177b79ad7b05f918b713c417da8cf6e67db0a2dcee"
  1884. "a9179d8d636191759e13955f4244f0c4f2d88842e3015641ef0417d6e54144e8246e4591"
  1885. "6823e2c6e39bfa3b90b97781c44981710689f2ce20e70a26760d65f9971b291e12338461"
  1886. "8b3b56710dde2afaa2d46b0e2164d5c9482729350a0e256b2aa6b3fb099b618ebd7c11ca"
  1887. "62bdf176b502aedfdf9be57a8e4adbca4a4d6d8407984af2f6635f95a1e4930e375eb53f"
  1888. "245ab2ade5340c281bda87afded1268e537955c9819168bd60fd440533c75c9b1865e03f"
  1889. "de3a301d165f97aa6da236cf39cf3e49512f6350224f8d76ff02d0d3b9a99e5f70b23b9f"
  1890. "a85f72849fc98790df246c3a0f4437940e60d42b4317f72e2eb055d343a614f7f9648005"
  1891. "1e4dff186dff476462d9ced24dbb82eaa60cbbf6a0026e64001da36d30f529f48f3688b1"
  1892. "0ce9378ef3f50f5106e5007cd0eb037136254fda4f20d048769bd51a9d8d09a1e469a482"
  1893. "6aa0e25b6267b5a96abcb6e919a362fdd7b683d2f2dcec40ee5969311c07f6066ee22f36"
  1894. "89ca08381c85bea470040e9541e7a451cd43d62c2aa292a9dc4b95e3a7c4de2ba29663f3"
  1895. "8d5002eb64ceba6934bb1b0e2e55fba7fa706b514ebeeae1be4dd882d6512da066246a05"
  1896. "1d8bd042593bd0513e9cc47806ccdc7097e75bc75b8603834c85cd084e0ade3cc2c2b7e8"
  1897. "586eac62249f9769f5bdcd50e24e515f257548762db9adf3ee0846d67cfcd723d85d9588"
  1898. "09e6dd406f4c2637557c356fc52490a2a0763429ee298a1c72c098bb810e740c15faffc6"
  1899. "1e80cf6e18f86dc0e29bc150ce43ca71f5729356cd966277fd8b32366f6263c3a761b13d"
  1900. "544a631a25e1c4c8dea8d794abed47ccb4069d20f1dcb54e40a673ffb5f7b2eb31fb7d44"
  1901. "36fd8252f92dc35bb9a18fc55099b17e0807e79caf4f9641ee4bbbc2d6922508bcfae236"
  1902. "475bf78bc796548bc8d60659e816af68e5e43352fa64b5086c97c22c60ddcbbbefb9d9ef"
  1903. "7cd57c64454604793910f4f90aedb4fb824a86061a93bb79c9b0272a1ad0d24e8165f099"
  1904. "ef6f14a6a4fea09845f280022e061804090d7ab79f7bddcbef264b6f7d4e9971eddb9ca7"
  1905. "d0e79a8dbe7cff2fa59f514a608d66ae8c44d5e69745aa1b19995e366812064567d3ca20"
  1906. "9e12994c901d1b1f489be7253615f7c339b5581afd4d262e879ab8480ecb18990d3db61f"
  1907. "96895dcde9c065e645f52baafefcbe34d072dba373fd1c786fd56c3f3284be7260eaff9a"
  1908. "6a8348b762ed59e20ea443313b1164db53c3989c32fcae5b366f190b9548e8cff46df961"
  1909. "350369b490354ed8e530a91f5072967eff45c63540862fb2deab02b3ae05deac65414368"
  1910. "ac3549f277da92b692947de47cba9c1579526931e31c3490c1d3605f9bafcf468c2e9b47"
  1911. "981407ea40b0b59754621943095a2d4f4ba266ac545fe7447e54f69555a7ac9ff1e8f001"
  1912. "834fa65f2d4523061726e4d3bf4680519032dc21b7389e9f3229e4c2295d354482f8b803"
  1913. "b06ca3a8cb3ff786e60f6bc59dd3a5bfed63b0aa493bab78e97bbefb6633534d84de826f"
  1914. "4e2ccc3069050d50a2caace6c9de15ffc2656988d94b736e5688df0351a3a6a4c875cd99"
  1915. "ef304f3cc7a0585df2b0b3e6c62f86bba0d43de47b80c4eec1c4f98e60a36188219919cf"
  1916. "36dc10ee11e174a67d226ad9e71f02a7fca26ad67a4862773f3defc6a747545314063e5f"
  1917. "ce7a3f890ec57daa5532acfd027739832437c8a58dcbe11c2842e60e8ca64979d081fbd5"
  1918. "a1a028f59317212fb5869abc689a156171d69e4f4c93b949c3459904c00192d3603cd184"
  1919. "48d64b843c57f34aee7830f313e58e2abc41b44be46a96c845ffebcb7120e21d1d751046"
  1920. "c072adf65dd901a39c8019742054be5e159ea88d0885ee05fcd4c189bafe5abb68603186"
  1921. "5dc570b9342fa7f41fd5c1c87e68371ab19a83c82ae1d890c678102d5da8e6c29845657c"
  1922. "027ba07362cba4d24950ab38e747925e22ce8df9eaec1ae2c6d23374b360c8352feb6cb9"
  1923. "913e4fc49bde6caf5293030d0d234a8ecd616023cc668262591f812de208738e5336a9e6"
  1924. "9f9be2479b86be1e1369761518dfc93797ed3a55308878a944581eba50bc9c7f7a0e75c7"
  1925. "6a28acd95b277857726f3f684eefc215e0a696f47d65d30431d710d957c08ef96682b385"
  1926. "0ee5ba1c8417aafc1af2846a127ec155b4b7fb369e90eb3a5c3793a3389bbc6b532ca32b"
  1927. "f5e1f03c2280e71c6e1ae21312d4ff163eee16ebb1fdee8e887bb0d453829b4e6ed5fa70"
  1928. "8f2053f29b81e277be46",
  1929. "a757ead499a6ec3d8ab9814f839117354ae563c8"
  1930. }
  1931. };
  1932. void test_sha1(void)
  1933. {
  1934. unsigned char buffer[4000];
  1935. int i;
  1936. for (i=0; i < sizeof(sha1_tests) / sizeof(sha1_tests[0]); ++i) {
  1937. stb_uint len = sha1_tests[i].length / 8;
  1938. unsigned char digest[20], fdig[20];
  1939. unsigned int h;
  1940. assert(len <= sizeof(buffer));
  1941. assert(strlen(sha1_tests[i].message) == len*2);
  1942. assert(strlen(sha1_tests[i].digest) == 20 * 2);
  1943. for (h=0; h < len; ++h) {
  1944. char v[3];
  1945. v[0] = sha1_tests[i].message[h*2];
  1946. v[1] = sha1_tests[i].message[h*2+1];
  1947. v[2] = 0;
  1948. buffer[h] = (unsigned char) strtol(v, NULL, 16);
  1949. }
  1950. stb_sha1(digest, buffer, len);
  1951. for (h=0; h < 20; ++h) {
  1952. char v[3];
  1953. int res;
  1954. v[0] = sha1_tests[i].digest[h*2];
  1955. v[1] = sha1_tests[i].digest[h*2+1];
  1956. v[2] = 0;
  1957. res = digest[h] == strtol(v, NULL, 16);
  1958. c(res, sha1_tests[i].digest);
  1959. if (!res)
  1960. break;
  1961. }
  1962. {
  1963. int z;
  1964. FILE *f = fopen("data/test.bin", "wb");
  1965. if (!f) stb_fatal("Couldn't write to test.bin");
  1966. fwrite(buffer, len, 1, f);
  1967. fclose(f);
  1968. #ifdef _WIN32
  1969. z = stb_sha1_file(fdig, "data/test.bin");
  1970. if (!z) stb_fatal("Couldn't digest test.bin");
  1971. c(memcmp(digest, fdig, 20)==0, "stb_sh1_file");
  1972. #endif
  1973. }
  1974. }
  1975. }
  1976. #if 0
  1977. stb__obj zero, one;
  1978. void test_packed_floats(void)
  1979. {
  1980. stb__obj *p;
  1981. float x,y,*q;
  1982. clock_t a,b,c;
  1983. int i;
  1984. stb_float_init();
  1985. for (i=-10; i < 10; ++i) {
  1986. float f = (float) pow(10,i);
  1987. float g = f * 10;
  1988. float delta = (g - f) / 10000;
  1989. while (f < g) {
  1990. stb__obj z = stb_float(f);
  1991. float k = stb_getfloat(z);
  1992. float p = stb_getfloat_table(z);
  1993. assert((z & 1) == 1);
  1994. assert(f == k);
  1995. assert(k == p);
  1996. f += delta;
  1997. }
  1998. }
  1999. zero = stb_float(0);
  2000. one = stb_float(1);
  2001. p = malloc(8192 * 4);
  2002. for (i=0; i < 8192; ++i)
  2003. p[i] = stb_rand();
  2004. for (i=0; i < 8192; ++i)
  2005. if ((stb_rand() & 31) < 28)
  2006. p[i] = zero;
  2007. q = malloc(4 * 1024);
  2008. a = clock();
  2009. x = y = 0;
  2010. for (i=0; i < 200000000; ++i)
  2011. q[i&1023] = stb_getfloat_table(p[i&8191]);
  2012. b = clock();
  2013. for (i=0; i < 200000000; ++i)
  2014. q[i&1023] = stb_getfloat_table2(p[i&8191]);
  2015. c = clock();
  2016. free(p);
  2017. free(q);
  2018. printf("Table: %d\nIFs: %d\n", b-a, c-b);
  2019. }
  2020. #endif
  2021. void do_compressor(int argc,char**argv)
  2022. {
  2023. char *p;
  2024. size_t slen;
  2025. unsigned int len;
  2026. int window;
  2027. if (argc == 2) {
  2028. p = stb_file(argv[1], &slen);
  2029. len = (unsigned int) slen;
  2030. if (p) {
  2031. unsigned int dlen, clen = stb_compress_tofile("data/dummy.bin", p, len);
  2032. char *q = stb_decompress_fromfile("data/dummy.bin", &dlen);
  2033. if (len != dlen) {
  2034. printf("FAILED %d -> %d\n", len, clen);
  2035. } else {
  2036. int z = memcmp(q,p,dlen);
  2037. if (z != 0)
  2038. printf("FAILED %d -> %d\n", len, clen);
  2039. else
  2040. printf("%d -> %d\n", len, clen);
  2041. }
  2042. }
  2043. return;
  2044. }
  2045. window = atoi(argv[1]);
  2046. if (window && argc == 4) {
  2047. p = stb_file(argv[3], &slen);
  2048. len = (int) slen;
  2049. if (p) {
  2050. stb_compress_hashsize(window);
  2051. stb_compress_tofile(argv[2], p, len);
  2052. }
  2053. } else if (argc == 3) {
  2054. p = stb_decompress_fromfile(argv[2], &len);
  2055. if (p) {
  2056. FILE *f = fopen(argv[1], "wb");
  2057. fwrite(p,1,len,f);
  2058. fclose(f);
  2059. } else {
  2060. fprintf(stderr, "FAILED.\n");
  2061. }
  2062. } else {
  2063. fprintf(stderr, "Usage: stb <hashsize> <output> <filetocompress>\n"
  2064. " or stb <output> <filetodecompress>\n");
  2065. }
  2066. }
  2067. #if 0
  2068. // naive backtracking implementation
  2069. int wildmatch(char *expr, char *candidate)
  2070. {
  2071. while(*expr) {
  2072. if (*expr == '?') {
  2073. if (!*candidate) return 0;
  2074. ++candidate;
  2075. ++expr;
  2076. } else if (*expr == '*') {
  2077. ++expr;
  2078. while (*expr == '*' || *expr =='?') ++expr;
  2079. // '*' at end of expression matches anything
  2080. if (!*expr) return 1;
  2081. // now scan candidate 'til first match
  2082. while (*candidate) {
  2083. if (*candidate == *expr) {
  2084. // check this candidate
  2085. if (stb_wildmatch(expr+1, candidate+1))
  2086. return 1;
  2087. // if not, then backtrack
  2088. }
  2089. ++candidate;
  2090. }
  2091. } else {
  2092. if (*expr != *candidate)
  2093. return 0;
  2094. ++expr, ++candidate;
  2095. }
  2096. }
  2097. return *candidate != 0;
  2098. }
  2099. int stb_matcher_find_slow(stb_matcher *m, char *str)
  2100. {
  2101. int result = 1;
  2102. int i,j,y,z;
  2103. uint16 *previous = NULL;
  2104. uint16 *current = NULL;
  2105. uint16 *temp;
  2106. stb_arr_setsize(previous, 4);
  2107. stb_arr_setsize(current, 4);
  2108. previous = stb__add_if_inactive(m, previous, m->start_node);
  2109. previous = stb__eps_closure(m,previous);
  2110. if (stb__clear_goalcheck(m, previous))
  2111. goto done;
  2112. while (*str) {
  2113. y = stb_arr_len(previous);
  2114. for (i=0; i < y; ++i) {
  2115. stb_nfa_node *n = &m->nodes[previous[i]];
  2116. z = stb_arr_len(n->out);
  2117. for (j=0; j < z; ++j) {
  2118. if (n->out[j].match == *str)
  2119. current = stb__add_if_inactive(m, current, n->out[j].node);
  2120. else if (n->out[j].match == -1) {
  2121. if (*str != '\n')
  2122. current = stb__add_if_inactive(m, current, n->out[j].node);
  2123. } else if (n->out[j].match < -1) {
  2124. int z = -n->out[j].match - 2;
  2125. if (m->charset[(uint8) *str] & (1 << z))
  2126. current = stb__add_if_inactive(m, current, n->out[j].node);
  2127. }
  2128. }
  2129. }
  2130. ++str;
  2131. stb_arr_setlen(previous, 0);
  2132. temp = previous;
  2133. previous = current;
  2134. current = temp;
  2135. if (!m->match_start)
  2136. previous = stb__add_if_inactive(m, previous, m->start_node);
  2137. previous = stb__eps_closure(m,previous);
  2138. if (stb__clear_goalcheck(m, previous))
  2139. goto done;
  2140. }
  2141. result=0;
  2142. done:
  2143. stb_arr_free(previous);
  2144. stb_arr_free(current);
  2145. return result;
  2146. }
  2147. #endif
  2148. #if 0 // parser generator
  2149. //////////////////////////////////////////////////////////////////////////
  2150. //
  2151. // stb_parser
  2152. //
  2153. // Generates an LR(1) parser from a grammar, and can parse with it
  2154. // Symbol representations
  2155. //
  2156. // Client: Internal:
  2157. // - c=0 e aka epsilon
  2158. // - c=1 $ aka end of string
  2159. // > 0 2<=c<M terminals (note these are remapped from a sparse layout)
  2160. // < 0 M<=c<N non-terminals
  2161. #define END 1
  2162. #define EPS 0
  2163. short encode_term[4096]; // @TODO: malloc these
  2164. short encode_nonterm[4096];
  2165. int first_nonterm, num_symbols, symset;
  2166. #define encode_term(x) encode_term[x]
  2167. #define encode_nonterm(x) encode_nonterm[~(x)]
  2168. #define encode_symbol(x) ((x) >= 0 ? encode_term(x) : encode_nonterm(x))
  2169. stb_bitset **compute_first(short ** productions)
  2170. {
  2171. int i, changed;
  2172. stb_bitset **first = malloc(sizeof(*first) * num_symbols);
  2173. assert(symset);
  2174. for (i=0; i < num_symbols; ++i)
  2175. first[i] = stb_bitset_new(0, symset);
  2176. for (i=END; i < first_nonterm; ++i)
  2177. stb_bitset_setbit(first[i], i);
  2178. for (i=0; i < stb_arr_len(productions); ++i) {
  2179. if (productions[i][2] == 0) {
  2180. int nt = encode_nonterm(productions[i][0]);
  2181. stb_bitset_setbit(first[nt], EPS);
  2182. }
  2183. }
  2184. do {
  2185. changed = 0;
  2186. for (i=0; i < stb_arr_len(productions); ++i) {
  2187. int j, nt = encode_nonterm(productions[i][0]);
  2188. for (j=2; productions[i][j]; ++j) {
  2189. int z = encode_symbol(productions[i][j]);
  2190. changed |= stb_bitset_unioneq_changed(first[nt], first[z], symset);
  2191. if (!stb_bitset_testbit(first[z], EPS))
  2192. break;
  2193. }
  2194. if (!productions[i][j] && !stb_bitset_testbit(first[nt], EPS)) {
  2195. stb_bitset_setbit(first[nt], EPS);
  2196. changed = 1;
  2197. }
  2198. }
  2199. } while (changed);
  2200. return first;
  2201. }
  2202. stb_bitset **compute_follow(short ** productions, stb_bitset **first, int start)
  2203. {
  2204. int i,j,changed;
  2205. stb_bitset **follow = malloc(sizeof(*follow) * num_symbols);
  2206. assert(symset);
  2207. for (i=0; i < num_symbols; ++i)
  2208. follow[i] = (i >= first_nonterm ? stb_bitset_new(0, symset) : NULL);
  2209. stb_bitset_setbit(follow[start], END);
  2210. do {
  2211. changed = 0;
  2212. for (i=0; i < stb_arr_len(productions); ++i) {
  2213. int nt = encode_nonterm(productions[i][0]);
  2214. for (j=2; productions[i][j]; ++j) {
  2215. if (productions[i][j] < 0) {
  2216. int k,z = encode_nonterm(productions[i][j]);
  2217. for (k=j+1; productions[i][k]; ++k) {
  2218. int q = encode_symbol(productions[i][k]);
  2219. changed |= stb_bitset_unioneq_changed(follow[z], first[q], symset);
  2220. if (!stb_bitset_testbit(first[q], EPS))
  2221. break;
  2222. }
  2223. if (!productions[i][k] == 0)
  2224. changed |= stb_bitset_unioneq_changed(follow[z], follow[nt], symset);
  2225. }
  2226. }
  2227. }
  2228. } while (changed);
  2229. for (i=first_nonterm; i < num_symbols; ++i)
  2230. stb_bitset_clearbit(follow[i], EPS);
  2231. return follow;
  2232. }
  2233. void first_for_prod_plus_sym(stb_bitset **first, stb_bitset *out, short *prod, int symbol)
  2234. {
  2235. stb_bitset_clearall(out, symset);
  2236. for(;*prod;++prod) {
  2237. int z = encode_symbol(*prod);
  2238. stb_bitset_unioneq_changed(out, first[z], symset);
  2239. if (!stb_bitset_testbit(first[z], EPS))
  2240. return;
  2241. }
  2242. stb_bitset_unioneq_changed(out, first[symbol], symset);
  2243. }
  2244. #define Item(p,c,t) ((void *) (size_t) (((t) << 18) + ((c) << 12) + ((p) << 2)))
  2245. #define ItemProd(i) ((((uint32) (size_t) (i)) >> 2) & 1023)
  2246. #define ItemCursor(i) ((((uint32) (size_t) (i)) >> 12) & 63)
  2247. #define ItemLookahead(i) (((uint32) (size_t) (i)) >> 18)
  2248. static void pc(stb_ps *p)
  2249. {
  2250. }
  2251. typedef struct
  2252. {
  2253. short *prod;
  2254. int prod_num;
  2255. } ProdRef;
  2256. typedef struct
  2257. {
  2258. stb_bitset **first;
  2259. stb_bitset **follow;
  2260. short ** prod;
  2261. ProdRef ** prod_by_nt;
  2262. } Grammar;
  2263. stb_ps *itemset_closure(Grammar g, stb_ps *set)
  2264. {
  2265. stb_bitset *lookahead;
  2266. int changed,i,j,k, list_len;
  2267. if (set == NULL) return set;
  2268. lookahead = stb_bitset_new(0, symset);
  2269. do {
  2270. void **list = stb_ps_getlist(set, &list_len);
  2271. changed = 0;
  2272. for (i=0; i < list_len; ++i) {
  2273. ProdRef *prod;
  2274. int nt, *looklist;
  2275. int p = ItemProd(list[i]), c = ItemCursor(list[i]), t = ItemLookahead(list[i]);
  2276. if (g.prod[p][c] >= 0) continue;
  2277. nt = encode_nonterm(g.prod[p][c]);
  2278. first_for_prod_plus_sym(g.first, lookahead, g.prod[p]+c+1, t);
  2279. looklist = stb_bitset_getlist(lookahead, 1, first_nonterm);
  2280. prod = g.prod_by_nt[nt];
  2281. for (j=0; j < stb_arr_len(prod); ++j) {
  2282. assert(prod[j].prod[0] == g.prod[p][c]);
  2283. // matched production; now iterate terminals
  2284. for (k=0; k < stb_arr_len(looklist); ++k) {
  2285. void *item = Item(prod[j].prod_num,2,looklist[k]);
  2286. if (!stb_ps_find(set, item)) {
  2287. changed = 1;
  2288. set = stb_ps_add(set, item);
  2289. pc(set);
  2290. }
  2291. }
  2292. }
  2293. stb_arr_free(looklist);
  2294. }
  2295. free(list);
  2296. } while (changed);
  2297. free(lookahead);
  2298. return set;
  2299. }
  2300. stb_ps *itemset_goto(Grammar g, stb_ps *set, int sym)
  2301. {
  2302. int i, listlen;
  2303. void **list = stb_ps_fastlist(set, &listlen);
  2304. stb_ps *out = NULL;
  2305. for (i=0; i < listlen; ++i) {
  2306. int p,c;
  2307. if (!stb_ps_fastlist_valid(list[i])) continue;
  2308. p = ItemProd(list[i]), c = ItemCursor(list[i]);
  2309. if (encode_symbol(g.prod[p][c]) == sym) {
  2310. void *z = Item(p,c+1,ItemLookahead(list[i]));
  2311. if (!stb_ps_find(out, z))
  2312. out = stb_ps_add(out, z);
  2313. pc(out);
  2314. }
  2315. }
  2316. return itemset_closure(g, out);
  2317. }
  2318. void itemset_all_nextsym(Grammar g, stb_bitset *out, stb_ps *set)
  2319. {
  2320. int i, listlen;
  2321. void **list = stb_ps_fastlist(set, &listlen);
  2322. stb_bitset_clearall(out, symset);
  2323. pc(set);
  2324. for (i=0; i < listlen; ++i) {
  2325. if (stb_ps_fastlist_valid(list[i])) {
  2326. int p = ItemProd(list[i]);
  2327. int c = ItemCursor(list[i]);
  2328. if (g.prod[p][c])
  2329. stb_bitset_setbit(out, encode_symbol(g.prod[p][c]));
  2330. }
  2331. }
  2332. }
  2333. stb_ps ** generate_items(Grammar g, int start_prod)
  2334. {
  2335. stb_ps ** all=NULL;
  2336. int i,j,k;
  2337. stb_bitset *try = stb_bitset_new(0,symset);
  2338. stb_ps *set = NULL;
  2339. void *item = Item(start_prod, 2, END);
  2340. set = stb_ps_add(set, item);
  2341. pc(set);
  2342. set = itemset_closure(g, set);
  2343. pc(set);
  2344. stb_arr_push(all, set);
  2345. for (i = 0; i < stb_arr_len(all); ++i) {
  2346. // only try symbols that appear in all[i]... there's a smarter way to do this,
  2347. // which is to take all[i], and divide it up by symbol
  2348. pc(all[i]);
  2349. itemset_all_nextsym(g, try, all[i]);
  2350. for (j = 1; j < num_symbols; ++j) {
  2351. if (stb_bitset_testbit(try, j)) {
  2352. stb_ps *out;
  2353. if (stb_arr_len(all) > 4) pc(all[4]);
  2354. if (i == 1 && j == 29) {
  2355. if (stb_arr_len(all) > 4) pc(all[4]);
  2356. out = itemset_goto(g, all[i], j);
  2357. if (stb_arr_len(all) > 4) pc(all[4]);
  2358. } else
  2359. out = itemset_goto(g, all[i], j);
  2360. pc(out);
  2361. if (stb_arr_len(all) > 4) pc(all[4]);
  2362. if (out != NULL) {
  2363. // add it to the array if it's not already there
  2364. for (k=0; k < stb_arr_len(all); ++k)
  2365. if (stb_ps_eq(all[k], out))
  2366. break;
  2367. if (k == stb_arr_len(all)) {
  2368. stb_arr_push(all, out);
  2369. pc(out);
  2370. if (stb_arr_len(all) > 4) pc(all[4]);
  2371. } else
  2372. stb_ps_delete(out);
  2373. }
  2374. }
  2375. }
  2376. }
  2377. free(try);
  2378. return all;
  2379. }
  2380. typedef struct
  2381. {
  2382. int num_stack;
  2383. int function;
  2384. } Reduction;
  2385. typedef struct
  2386. {
  2387. short *encode_term;
  2388. Reduction *reductions;
  2389. short **action_goto; // terminals are action, nonterminals are goto
  2390. int start;
  2391. int end_term;
  2392. } Parser;
  2393. enum
  2394. {
  2395. A_error, A_accept, A_shift, A_reduce, A_conflict
  2396. };
  2397. typedef struct
  2398. {
  2399. uint8 type;
  2400. uint8 cursor;
  2401. short prod;
  2402. short value;
  2403. } Action;
  2404. Parser *parser_create(short **productions, int num_prod, int start_nt, int end_term)
  2405. {
  2406. short *mini_rule = malloc(4 * sizeof(mini_rule[0]));
  2407. Action *actions;
  2408. Grammar g;
  2409. stb_ps ** sets;
  2410. Parser *p = malloc(sizeof(*p));
  2411. int i,j,n;
  2412. stb_bitset *mapped;
  2413. int min_s=0, max_s=0, termset, ntset, num_states, num_reductions, init_prod;
  2414. int synth_start;
  2415. // remap sparse terminals and nonterminals
  2416. for (i=0; i < num_prod; ++i) {
  2417. for (j=2; productions[i][j]; ++j) {
  2418. if (productions[i][j] < min_s) min_s = productions[i][j];
  2419. if (productions[i][j] > max_s) max_s = productions[i][j];
  2420. }
  2421. }
  2422. synth_start = --min_s;
  2423. termset = (max_s + 32) >> 5;
  2424. ntset = (~min_s + 32) >> 5;
  2425. memset(encode_term, 0, sizeof(encode_term));
  2426. memset(encode_nonterm, 0, sizeof(encode_nonterm));
  2427. mapped = stb_bitset_new(0, termset);
  2428. n = 2;
  2429. for (i=0; i < num_prod; ++i)
  2430. for (j=2; productions[i][j]; ++j)
  2431. if (productions[i][j] > 0)
  2432. if (!stb_bitset_testbit(mapped, productions[i][j])) {
  2433. stb_bitset_setbit(mapped, productions[i][j]);
  2434. encode_term[productions[i][j]] = n++;
  2435. }
  2436. free(mapped);
  2437. first_nonterm = n;
  2438. mapped = stb_bitset_new(0, ntset);
  2439. for (i=0; i < num_prod; ++i)
  2440. for (j=2; productions[i][j]; ++j)
  2441. if (productions[i][j] < 0)
  2442. if (!stb_bitset_testbit(mapped, ~productions[i][j])) {
  2443. stb_bitset_setbit(mapped, ~productions[i][j]);
  2444. encode_nonterm[~productions[i][j]] = n++;
  2445. }
  2446. free(mapped);
  2447. // add a special start state for internal processing
  2448. p->start = n++;
  2449. encode_nonterm[synth_start] = p->start;
  2450. mini_rule[0] = synth_start;
  2451. mini_rule[1] = -32768;
  2452. mini_rule[2] = start_nt;
  2453. mini_rule[3] = 0;
  2454. p->end_term = end_term;
  2455. num_symbols = n;
  2456. // create tables
  2457. g.prod = NULL;
  2458. g.prod_by_nt = malloc(num_symbols * sizeof(g.prod_by_nt[0]));
  2459. for (i=0; i < num_symbols; ++i)
  2460. g.prod_by_nt[i] = NULL;
  2461. for (i=0; i < num_prod; ++i) {
  2462. stb_arr_push(g.prod, productions[i]);
  2463. }
  2464. init_prod = stb_arr_len(g.prod);
  2465. stb_arr_push(g.prod, mini_rule);
  2466. num_reductions = stb_arr_len(g.prod);
  2467. p->reductions = malloc(num_reductions * sizeof(*p->reductions));
  2468. symset = (num_symbols + 31) >> 5;
  2469. g.first = compute_first(g.prod);
  2470. g.follow = compute_follow(g.prod, g.first, p->start);
  2471. for (i=0; i < stb_arr_len(g.prod); ++i) {
  2472. ProdRef pr = { g.prod[i], i };
  2473. stb_arr_push(g.prod_by_nt[encode_nonterm(g.prod[i][0])], pr);
  2474. }
  2475. sets = generate_items(g, init_prod);
  2476. num_states = stb_arr_len(sets);
  2477. // now generate tables
  2478. actions = malloc(sizeof(*actions) * first_nonterm);
  2479. p->action_goto = (short **) stb_array_block_alloc(num_states, sizeof(short) * num_symbols);
  2480. for (i=0; i < num_states; ++i) {
  2481. int j,n;
  2482. void **list = stb_ps_getlist(sets[i], &n);
  2483. memset(actions, 0, sizeof(*actions) * first_nonterm);
  2484. for (j=0; j < n; ++j) {
  2485. int p = ItemProd(list[j]), c = ItemCursor(list[j]), t = ItemLookahead(list[j]);
  2486. if (g.prod[p][c] == 0) {
  2487. if (p == init_prod) {
  2488. // @TODO: check for conflicts
  2489. assert(actions[t].type == A_error || actions[t].type == A_accept);
  2490. actions[t].type = A_accept;
  2491. } else {
  2492. // reduce production p
  2493. if (actions[t].type == A_reduce) {
  2494. // is it the same reduction we already have?
  2495. if (actions[t].prod != p) {
  2496. // no, it's a reduce-reduce conflict!
  2497. printf("Reduce-reduce conflict for rule %d and %d, lookahead %d\n", p, actions[t].prod, t);
  2498. // @TODO: use precedence
  2499. actions[t].type = A_conflict;
  2500. }
  2501. } else if (actions[t].type == A_shift) {
  2502. printf("Shift-reduce conflict for rule %d and %d, lookahead %d\n", actions[t].prod, p, t);
  2503. actions[t].type = A_conflict;
  2504. } else if (actions[t].type == A_accept) {
  2505. assert(0);
  2506. } else if (actions[t].type == A_error) {
  2507. actions[t].type = A_reduce;
  2508. actions[t].prod = p;
  2509. }
  2510. }
  2511. } else if (g.prod[p][c] > 0) {
  2512. int a = encode_symbol(g.prod[p][c]), k;
  2513. stb_ps *out = itemset_goto(g, sets[i], a);
  2514. for (k=0; k < stb_arr_len(sets); ++k)
  2515. if (stb_ps_eq(sets[k], out))
  2516. break;
  2517. assert(k < stb_arr_len(sets));
  2518. // shift k
  2519. if (actions[a].type == A_shift) {
  2520. if (actions[a].value != k) {
  2521. printf("Shift-shift conflict! Rule %d and %d with lookahead %d/%d\n", actions[a].prod, p, a,t);
  2522. actions[a].type = A_conflict;
  2523. }
  2524. } else if (actions[a].type == A_reduce) {
  2525. printf("Shift-reduce conflict for rule %d and %d, lookahead %d/%d\n", p, actions[a].prod, a,t);
  2526. actions[a].type = A_conflict;
  2527. } else if (actions[a].type == A_accept) {
  2528. assert(0);
  2529. } else if (actions[a].type == A_error) {
  2530. actions[a].type = A_shift;
  2531. actions[a].prod = p;
  2532. actions[a].cursor = c;
  2533. actions[a].value = k;
  2534. }
  2535. }
  2536. }
  2537. // @TODO: recompile actions into p->action_goto
  2538. }
  2539. free(mini_rule);
  2540. stb_pointer_array_free(g.first , num_symbols); free(g.first );
  2541. stb_pointer_array_free(g.follow, num_symbols); free(g.follow);
  2542. stb_arr_free(g.prod);
  2543. for (i=0; i < num_symbols; ++i)
  2544. stb_arr_free(g.prod_by_nt[i]);
  2545. free(g.prod_by_nt);
  2546. for (i=0; i < stb_arr_len(sets); ++i)
  2547. stb_ps_delete(sets[i]);
  2548. stb_arr_free(sets);
  2549. return p;
  2550. }
  2551. void parser_destroy(Parser *p)
  2552. {
  2553. free(p);
  2554. }
  2555. #if 0
  2556. enum nonterm
  2557. {
  2558. N_globals = -50,
  2559. N_global, N_vardef, N_varinitlist, N_varinit, N_funcdef, N_optid, N_optparamlist,
  2560. N_paramlist, N_param, N_optinit, N_optcomma, N_statements, N_statement,
  2561. N_optexpr, N_assign, N_if, N_ifcore, N_else, N_dictdef, N_dictdef2,
  2562. N_dictdefitem, N_expr,
  2563. N__last
  2564. };
  2565. short grammar[][10] =
  2566. {
  2567. { N_globals , 0, N_globals, N_global },
  2568. { N_globals , 0 },
  2569. { N_global , 0, N_vardef },
  2570. { N_global , 0, N_funcdef },
  2571. { N_vardef , 0, ST_var, N_varinitlist, },
  2572. { N_varinitlist, 0, N_varinitlist, ',', N_varinit },
  2573. { N_varinitlist, 0, N_varinit, },
  2574. { N_varinit , 0, ST_id, N_optinit, },
  2575. { N_funcdef , 0, ST_func, N_optid, '(', N_optparamlist, ')', N_statements, ST_end },
  2576. { N_optid , 0, ST_id },
  2577. { N_optid , 0, },
  2578. { N_optparamlist, 0, },
  2579. { N_optparamlist, 0, N_paramlist, N_optcomma },
  2580. { N_paramlist , 0, N_paramlist, ',', N_param },
  2581. { N_paramlist , 0, N_param },
  2582. { N_param , 0, ST_id, N_optinit },
  2583. { N_optinit , 0, '=', N_expr },
  2584. { N_optinit , 0, },
  2585. { N_optcomma , 0, ',' },
  2586. { N_optcomma , 0, },
  2587. { N_statements , 0, N_statements, N_statement },
  2588. { N_statement , 0, N_statement, ';' },
  2589. { N_statement , 0, N_varinit },
  2590. { N_statement , 0, ST_return, N_expr },
  2591. { N_statement , 0, ST_break , N_optexpr },
  2592. { N_optexpr , 0, N_expr },
  2593. { N_optexpr , 0, },
  2594. { N_statement , 0, ST_continue },
  2595. { N_statement , 0, N_assign },
  2596. { N_assign , 0, N_expr, '=', N_assign },
  2597. //{ N_assign , 0, N_expr },
  2598. { N_statement , 0, ST_while, N_expr, N_statements, ST_end },
  2599. { N_statement , 0, ST_if, N_if, },
  2600. { N_if , 0, N_ifcore, ST_end, },
  2601. { N_ifcore , 0, N_expr, ST_then, N_statements, N_else, ST_end },
  2602. { N_else , 0, ST_elseif, N_ifcore },
  2603. { N_else , 0, ST_else, N_statements },
  2604. { N_else , 0, },
  2605. { N_dictdef , 0, N_dictdef2, N_optcomma },
  2606. { N_dictdef2 , 0, N_dictdef2, ',', N_dictdefitem },
  2607. { N_dictdef2 , 0, N_dictdefitem },
  2608. { N_dictdefitem, 0, ST_id, '=', N_expr },
  2609. { N_dictdefitem, 0, N_expr },
  2610. { N_expr , 0, ST_number },
  2611. { N_expr , 0, ST_string },
  2612. { N_expr , 0, ST_id },
  2613. { N_expr , 0, N_funcdef },
  2614. { N_expr , 0, '-', N_expr },
  2615. { N_expr , 0, '{', N_dictdef, '}' },
  2616. { N_expr , 0, '(', N_expr, ')' },
  2617. { N_expr , 0, N_expr, '.', ST_id },
  2618. { N_expr , 0, N_expr, '[', N_expr, ']' },
  2619. { N_expr , 0, N_expr, '(', N_dictdef, ')' },
  2620. #if 0
  2621. #define BINOP(op) { N_expr, 0, N_expr, op, N_expr }
  2622. BINOP(ST_and), BINOP(ST_or), BINOP(ST_eq), BINOP(ST_ne),
  2623. BINOP(ST_le), BINOP(ST_ge), BINOP('>') , BINOP('<' ),
  2624. BINOP('&'), BINOP('|'), BINOP('^'), BINOP('+'), BINOP('-'),
  2625. BINOP('*'), BINOP('/'), BINOP('%'),
  2626. #undef BINOP
  2627. #endif
  2628. };
  2629. short *grammar_list[stb_arrcount(grammar)];
  2630. void test_parser_generator(void)
  2631. {
  2632. Parser *p;
  2633. int i;
  2634. assert(N__last <= 0);
  2635. for (i=0; i < stb_arrcount(grammar); ++i)
  2636. grammar_list[i] = grammar[i];
  2637. p = parser_create(grammar_list, stb_arrcount(grammar), N_globals, 0);
  2638. parser_destroy(p);
  2639. }
  2640. #endif
  2641. #endif // parser generator
  2642. #if 0
  2643. // stb_threadtest.c
  2644. #include <windows.h>
  2645. #define STB_DEFINE
  2646. //#define STB_THREAD_TEST
  2647. #include "../stb.h"
  2648. #define NUM_WORK 100
  2649. void *work_consumer(void *p)
  2650. {
  2651. stb__thread_sleep(20);
  2652. return NULL;
  2653. }
  2654. int pass;
  2655. stb_threadqueue *tq1, *tq2, *tq3, *tq4;
  2656. volatile float t1,t2;
  2657. // with windows.h
  2658. // Worked correctly with 100,000,000 enqueue/dequeue WAITLESS
  2659. // (770 passes, 170000 per pass)
  2660. // Worked correctly with 2,500,000 enqueue/dequeue !WAITLESS
  2661. // (15 passes, 170000 per pass)
  2662. // Worked correctly with 1,500,000 enqueue/dequeue WAITLESS && STB_THREAD_TEST
  2663. // (9 passes, 170000 per pass)
  2664. // without windows.h
  2665. // Worked correctly with 1,000,000 enqueue/dequeue WAITLESS && STB_THREAD_TEST
  2666. // (6 passes, 170000 per pass)
  2667. // Worked correctly with 500,000 enqueue/dequeue !WAITLESS && STB_THREAD_TEST
  2668. // (3 passes, 170000 per pass)
  2669. // Worked correctly with 1,000,000 enqueue/dequeue WAITLESS
  2670. // (15 passes, 170000 per pass)
  2671. #define WAITLESS
  2672. volatile int table[1000*1000*10];
  2673. void wait(int n)
  2674. {
  2675. #ifndef WAITLESS
  2676. int j;
  2677. float y;
  2678. for (j=0; j < n; ++j)
  2679. y += 1 / (t1+j);
  2680. t2 = y;
  2681. #endif
  2682. }
  2683. void *tq1_consumer(void *p)
  2684. {
  2685. for(;;) {
  2686. int z;
  2687. float y = 0;
  2688. stb_threadq_get_block(tq1, &z);
  2689. wait(5000);
  2690. table[z] = pass;
  2691. }
  2692. }
  2693. void *tq2_consumer(void *p)
  2694. {
  2695. for(;;) {
  2696. int z;
  2697. if (stb_threadq_get(tq2, &z))
  2698. table[z] = pass;
  2699. wait(1000);
  2700. }
  2701. }
  2702. void *tq3_consumer(void *p)
  2703. {
  2704. for(;;) {
  2705. int z;
  2706. stb_threadq_get_block(tq3, &z);
  2707. table[z] = pass;
  2708. wait(500);
  2709. }
  2710. }
  2711. void *tq4_consumer(void *p)
  2712. {
  2713. for (;;) {
  2714. int z;
  2715. stb_threadq_get_block(tq4, &z);
  2716. table[z] = pass;
  2717. wait(500);
  2718. }
  2719. }
  2720. typedef struct
  2721. {
  2722. int start, end;
  2723. stb_threadqueue *tq;
  2724. int delay;
  2725. } write_data;
  2726. void *writer(void *q)
  2727. {
  2728. int i;
  2729. write_data *p = (write_data *) q;
  2730. for (i=p->start; i < p->end; ++i) {
  2731. stb_threadq_add_block(p->tq, &i);
  2732. #ifndef WAITLESS
  2733. if (p->delay) stb__thread_sleep(p->delay);
  2734. else {
  2735. int j;
  2736. float z = 0;
  2737. for (j=0; j <= 20; ++j)
  2738. z += 1 / (t1+j);
  2739. t2 = z;
  2740. }
  2741. #endif
  2742. }
  2743. return NULL;
  2744. }
  2745. write_data info[256];
  2746. int pos;
  2747. void start_writer(int z, int count, stb_threadqueue *tq, int delay)
  2748. {
  2749. info[z].start = pos;
  2750. info[z].end = pos+count;
  2751. info[z].tq = tq;
  2752. info[z].delay = delay;
  2753. stb_create_thread(writer, &info[z]);
  2754. pos += count;
  2755. }
  2756. int main(int argc, char **argv)
  2757. {
  2758. int i;
  2759. stb_sync s = stb_sync_new();
  2760. stb_sync_set_target(s, NUM_WORK+1);
  2761. stb_work_numthreads(2);
  2762. for (i=0; i < NUM_WORK; ++i) {
  2763. stb_work_reach(work_consumer, NULL, NULL, s);
  2764. }
  2765. printf("Started stb_work test.\n");
  2766. t1 = 1;
  2767. // create the queues
  2768. tq1 = stb_threadq_new(4, 4, TRUE , TRUE);
  2769. tq2 = stb_threadq_new(4, 4, TRUE , FALSE);
  2770. tq3 = stb_threadq_new(4, 4, FALSE, TRUE);
  2771. tq4 = stb_threadq_new(4, 4, FALSE, FALSE);
  2772. // start the consumers
  2773. stb_create_thread(tq1_consumer, NULL);
  2774. stb_create_thread(tq1_consumer, NULL);
  2775. stb_create_thread(tq1_consumer, NULL);
  2776. stb_create_thread(tq2_consumer, NULL);
  2777. stb_create_thread(tq3_consumer, NULL);
  2778. stb_create_thread(tq3_consumer, NULL);
  2779. stb_create_thread(tq3_consumer, NULL);
  2780. stb_create_thread(tq3_consumer, NULL);
  2781. stb_create_thread(tq3_consumer, NULL);
  2782. stb_create_thread(tq3_consumer, NULL);
  2783. stb_create_thread(tq3_consumer, NULL);
  2784. stb_create_thread(tq4_consumer, NULL);
  2785. for (pass=1; pass <= 5000; ++pass) {
  2786. int z = 0;
  2787. int last_n = -1;
  2788. int identical = 0;
  2789. pos = 0;
  2790. start_writer(z++, 50000, tq1, 0);
  2791. start_writer(z++, 50000, tq1, 0);
  2792. start_writer(z++, 50000, tq1, 0);
  2793. start_writer(z++, 5000, tq2, 1);
  2794. start_writer(z++, 3000, tq2, 3);
  2795. start_writer(z++, 2000, tq2, 5);
  2796. start_writer(z++, 5000, tq3, 3);
  2797. start_writer(z++, 5000, tq4, 3);
  2798. #ifndef WAITLESS
  2799. stb__thread_sleep(8000);
  2800. #endif
  2801. for(;;) {
  2802. int n =0;
  2803. for (i=0; i < pos; ++i) {
  2804. if (table[i] == pass)
  2805. ++n;
  2806. }
  2807. if (n == pos) break;
  2808. if (n == last_n) {
  2809. ++identical;
  2810. if (identical == 3) {
  2811. printf("Problem slots:\n");
  2812. for (i=0; i < pos; ++i) {
  2813. if (table[i] != pass) printf("%d ", i);
  2814. }
  2815. printf("\n");
  2816. } else {
  2817. if (identical < 3)
  2818. printf("Processed %d of %d\n", n, pos);
  2819. else
  2820. printf(".");
  2821. }
  2822. } else {
  2823. identical = 0;
  2824. printf("Processed %d of %d\n", n, pos);
  2825. }
  2826. last_n = n;
  2827. #ifdef WAITLESS
  2828. stb__thread_sleep(750);
  2829. #else
  2830. stb__thread_sleep(3000);
  2831. #endif
  2832. }
  2833. printf("Finished pass %d\n", pass);
  2834. }
  2835. stb_sync_reach_and_wait(s);
  2836. printf("stb_work test completed ok.\n");
  2837. return 0;
  2838. }
  2839. #endif
  2840. #if 0
  2841. //////////////////////////////////////////////////////////////////////////////
  2842. //
  2843. // collapse tree leaves up to parents until we only have N nodes
  2844. // useful for cmirror summaries
  2845. typedef struct stb_summary_tree
  2846. {
  2847. struct stb_summary_tree **children;
  2848. int num_children;
  2849. float weight;
  2850. } stb_summary_tree;
  2851. STB_EXTERN void *stb_summarize_tree(void *tree, int limit, float reweight);
  2852. #ifdef STB_DEFINE
  2853. typedef struct stb_summary_tree2
  2854. {
  2855. STB__ARR(struct stb_summary_tree2 *) children;
  2856. int num_children;
  2857. float weight;
  2858. float weight_with_all_children;
  2859. float makes_target_weight;
  2860. float weight_at_target;
  2861. stb_summary_tree *original;
  2862. struct stb_summary_tree2 *target;
  2863. STB__ARR(struct stb_summary_tree2 *) targeters;
  2864. } stb_summary_tree2;
  2865. static stb_summary_tree2 *stb__summarize_clone(stb_summary_tree *t)
  2866. {
  2867. int i;
  2868. stb_summary_tree2 *s;
  2869. s = (stb_summary_tree2 *) malloc(sizeof(*s));
  2870. s->original = t;
  2871. s->weight = t->weight;
  2872. s->weight_with_all_children = 0;
  2873. s->weight_at_target = 0;
  2874. s->target = NULL;
  2875. s->targeters = NULL;
  2876. s->num_children = t->num_children;
  2877. s->children = NULL;
  2878. for (i=0; i < s->num_children; ++i)
  2879. stb_arr_push(s->children, stb__summarize_clone(t->children[i]));
  2880. return s;
  2881. }
  2882. static float stb__summarize_compute_targets(stb_summary_tree2 *parent, stb_summary_tree2 *node, float reweight, float weight)
  2883. {
  2884. float total = 0;
  2885. if (node->weight == 0 && node->num_children == 1 && parent) {
  2886. node->target = parent;
  2887. return stb__summarize_compute_targets(parent, node->children[0], reweight, weight*reweight);
  2888. } else {
  2889. float total=0;
  2890. int i;
  2891. for (i=0; i < node->num_children; ++i)
  2892. total += stb__summarize_compute_targets(node, node->children[i], reweight, reweight);
  2893. node->weight_with_all_children = total + node->weight;
  2894. if (parent && node->weight_with_all_children) {
  2895. node->target = parent;
  2896. node->weight_at_target = node->weight_with_all_children * weight;
  2897. node->makes_target_weight = node->weight_at_target + parent->weight;
  2898. stb_arr_push(parent->targeters, node);
  2899. } else {
  2900. node->target = NULL;
  2901. node->weight_at_target = node->weight;
  2902. node->makes_target_weight = 0;
  2903. }
  2904. return node->weight_with_all_children * weight;
  2905. }
  2906. }
  2907. static stb_summary_tree2 ** stb__summarize_make_array(STB__ARR(stb_summary_tree2 *) all, stb_summary_tree2 *tree)
  2908. {
  2909. int i;
  2910. stb_arr_push(all, tree);
  2911. for (i=0; i < tree->num_children; ++i)
  2912. all = stb__summarize_make_array(all, tree->children[i]);
  2913. return all;
  2914. }
  2915. typedef stb_summary_tree2 * stb__stree2;
  2916. stb_define_sort(stb__summarysort, stb__stree2, (*a)->makes_target_weight < (*b)->makes_target_weight)
  2917. void *stb_summarize_tree(void *tree, int limit, float reweight)
  2918. {
  2919. int i,j,k;
  2920. STB__ARR(stb_summary_tree *) ret=NULL;
  2921. STB__ARR(stb_summary_tree2 *) all=NULL;
  2922. // first clone the tree so we can manipulate it
  2923. stb_summary_tree2 *t = stb__summarize_clone((stb_summary_tree *) tree);
  2924. if (reweight < 1) reweight = 1;
  2925. // now compute how far up the tree each node would get pushed
  2926. // there's no value in pushing a node up to an empty node with
  2927. // only one child, so we keep pushing it up
  2928. stb__summarize_compute_targets(NULL, t, reweight, 1);
  2929. all = stb__summarize_make_array(all, t);
  2930. // now we want to iteratively find the smallest 'makes_target_weight',
  2931. // update that, and then fix all the others (which will be all descendents)
  2932. // to do this efficiently, we need a heap or a sorted binary tree
  2933. // what we have is an array. maybe we can insertion sort the array?
  2934. stb__summarysort(all, stb_arr_len(all));
  2935. for (i=0; i < stb_arr_len(all) - limit; ++i) {
  2936. stb_summary_tree2 *src, *dest;
  2937. src = all[i];
  2938. dest = all[i]->target;
  2939. if (src->makes_target_weight == 0) continue;
  2940. assert(dest != NULL);
  2941. for (k=0; k < stb_arr_len(all); ++k)
  2942. if (all[k] == dest)
  2943. break;
  2944. assert(k != stb_arr_len(all));
  2945. assert(i < k);
  2946. // move weight from all[i] to target
  2947. src->weight = dest->makes_target_weight;
  2948. src->weight = 0;
  2949. src->makes_target_weight = 0;
  2950. // recompute effect of other descendents
  2951. for (j=0; j < stb_arr_len(dest->targeters); ++j) {
  2952. if (dest->targeters[j]->weight) {
  2953. dest->targeters[j]->makes_target_weight = dest->weight + dest->targeters[j]->weight_at_target;
  2954. assert(dest->targeters[j]->makes_target_weight <= dest->weight_with_all_children);
  2955. }
  2956. }
  2957. STB_(stb__summarysort,_ins_sort)(all+i, stb_arr_len(all)-i);
  2958. }
  2959. // now the elements in [ i..stb_arr_len(all) ) are the relevant ones
  2960. for (; i < stb_arr_len(all); ++i)
  2961. stb_arr_push(ret, all[i]->original);
  2962. // now free all our temp data
  2963. for (i=0; i < stb_arr_len(all); ++i) {
  2964. stb_arr_free(all[i]->children);
  2965. free(all[i]);
  2966. }
  2967. stb_arr_free(all);
  2968. return ret;
  2969. }
  2970. #endif
  2971. #endif