97 lines
1.5 KiB
HolyC
Executable File
97 lines
1.5 KiB
HolyC
Executable File
#define BORDER_CHARS 1
|
|
|
|
U8 *buf;
|
|
I64 size,mp_not_done_flags;
|
|
CDoc *doc;
|
|
|
|
U0 PDNormalize()
|
|
{
|
|
U8 *r=MAlloc(size+2*BORDER_CHARS),
|
|
*src=buf,*dst=r;
|
|
I64 ch;
|
|
*dst++='['; //Border
|
|
while (size--) {
|
|
ch=*src++;
|
|
if ('a'<=ch<='z') //lower is most common so do first
|
|
*dst++=ch;
|
|
else if ('A'<=ch<='Z')
|
|
*dst++=ch+'a'-'A'; //Convert to lower
|
|
}
|
|
*dst++=']'; //Border
|
|
Free(buf);
|
|
buf=r;
|
|
size=dst-r-2*BORDER_CHARS;
|
|
}
|
|
|
|
U0 PDAnswer(U8 *a,I64 len)
|
|
{
|
|
DocLock(doc);
|
|
a-=(len-1)/2;
|
|
DocPrint(doc,"CPU%02X Len:%2d ",Gs->num,len);
|
|
while (len--)
|
|
DocPrint(doc,"%C",*a++); //%C is toupper char
|
|
DocPrint(doc,"\n");
|
|
DocUnlock(doc);
|
|
}
|
|
|
|
U0 MPPalindrome(I64 dummy=0)
|
|
{
|
|
no_warn dummy;
|
|
U8 *src=buf+BORDER_CHARS+size*Gs->num/mp_cnt,
|
|
*f,*b;
|
|
I64 len,best=0,
|
|
my_size=(size+mp_cnt-1)/mp_cnt;
|
|
while (my_size--) {
|
|
|
|
//Odd
|
|
f=src+1;
|
|
b=src-1;
|
|
while (*f==*b) {
|
|
f++;
|
|
b--;
|
|
}
|
|
len=f-b+1-2;
|
|
if (len>best) {
|
|
best=len;
|
|
PDAnswer(src,len);
|
|
}
|
|
|
|
//Even
|
|
f=src+1;
|
|
b=src;
|
|
while (*f==*b) {
|
|
f++;
|
|
b--;
|
|
}
|
|
len=f-b+1-2;
|
|
if (len>best) {
|
|
best=len;
|
|
PDAnswer(src,len);
|
|
}
|
|
|
|
src++;
|
|
}
|
|
LBtr(&mp_not_done_flags,Gs->num);
|
|
}
|
|
|
|
U0 Palindrome(U8 *filename)
|
|
{
|
|
I64 i;
|
|
F64 t0=tS;
|
|
|
|
buf=FileRead(filename,&size);
|
|
PDNormalize;
|
|
|
|
doc=DocPut;
|
|
mp_not_done_flags=1<<mp_cnt-1;
|
|
for (i=0;i<mp_cnt;i++)
|
|
JobQue(&MPPalindrome,NULL,i);
|
|
while (mp_not_done_flags)
|
|
Yield;
|
|
|
|
Free(buf);
|
|
"Time:%9.5f\n",tS-t0;
|
|
}
|
|
|
|
Palindrome(BIBLE_FILENAME);
|