hschumann2/TempleOS-Source-Code
0847
1 2#define BORDER_CHARS 13 4U8 *buf;5I64 size,mp_not_done_flags;6CDoc *doc;7 8U0 PDNormalize()9{10 U8 *r=MAlloc(size+2*BORDER_CHARS),11 *src=buf,*dst=r;12 I64 ch;13 *dst++='['; //Border14 while (size--) {15 ch=*src++;16 if ('a'<=ch<='z') //lower is most common so do first17 *dst++=ch;18 else if ('A'<=ch<='Z')19 *dst++=ch+'a'-'A'; //Convert to lower20 }21 *dst++=']'; //Border22 Free(buf);23 buf=r;24 size=dst-r-2*BORDER_CHARS;25}26 27U0 PDAnswer(U8 *a,I64 len)28{29 DocLock(doc);30 a-=(len-1)/2;31 DocPrint(doc,"CPU%02X Len:%2d ",Gs->num,len);32 while (len--)33 DocPrint(doc,"%C",*a++); //%C is toupper char34 DocPrint(doc,"\n");35 DocUnlock(doc);36}37 38U0 MPPalindrome(I64 dummy=0)39{40 no_warn dummy;41 U8 *src=buf+BORDER_CHARS+size*Gs->num/mp_cnt,42 *f,*b;43 I64 len,best=0,44 my_size=(size+mp_cnt-1)/mp_cnt;45 while (my_size--) {46 47 //Odd48 f=src+1;49 b=src-1;50 while (*f==*b) {51 f++;52 b--;53 }54 len=f-b+1-2;55 if (len>best) {56 best=len;57 PDAnswer(src,len);58 }59 60 //Even61 f=src+1;62 b=src;63 while (*f==*b) {64 f++;65 b--;66 }67 len=f-b+1-2;68 if (len>best) {69 best=len;70 PDAnswer(src,len);71 }72 73 src++;74 }75 LBtr(&mp_not_done_flags,Gs->num);76}77 78U0 Palindrome(U8 *filename)79{80 I64 i;81 F64 t0=tS;82 83 buf=FileRead(filename,&size);84 PDNormalize;85 86 doc=DocPut;87 mp_not_done_flags=1<<mp_cnt-1;88 for (i=0;i<mp_cnt;i++)89 JobQue(&MPPalindrome,NULL,i);90 while (mp_not_done_flags)91 Yield;92 93 Free(buf);94 "Time:%9.5f\n",tS-t0;95}96 97Palindrome(BIBLE_FILENAME);98 