#include <u.h>
#include <libc.h>
#include "runefold.h"
#include "runeunfold.h"
static Rune*
bsearch(Rune c, Rune *t, int n, int ne)
{
Rune *p;
int m;
while(n > 1) {
m = n/2;
p = t + m*ne;
if(c >= p[0]) {
t = p;
n = n-m;
} else
n = m;
}
if(n && c >= t[0])
return t;
return 0;
}
static Rune*
bsearchs(Rune c, Rune **t, int n, int ne)
{
Rune **p;
int m;
while(n > 1) {
m = n/2;
p = t + m*ne;
if(c >= p[0][0]) {
t = p;
n = n-m;
} else
n = m;
}
if(n && c >= t[0][0])
return t[0];
return 0;
}
Rune
tobaserune(Rune c)
{
Rune *p;
p = bsearch(c, __base2, nelem(__base2)/2, 2);
if(p && *p == c)
c = p[1];
return c;
}
Rune*
equivrune(Rune c)
{
Rune *p;
p = bsearchs(c, __unfoldbase, nelem(__unfoldbase), 1);
if(p && *p == c)
return p;
return nil;
}
|