#pragma once enum { Runeself = 0x80, Runeerror = 0xfffd, Runemax = 0x10ffff, Runemask = 0x1fffff, UTFmax = 4, }; typedef u32int Rune; int chartorune(Rune *rune, const char *str) sl_nonnull(1, 2) sl_wr(1) sl_cstr(2) sl_rd(2); int runetochar(char *str, const Rune *rune) sl_nonnull(1, 2) sl_wr(1) sl_rd(2); int fullrune(const char *str, int n) sl_purefn sl_nonnull(1) sl_rd(1, 2); int runelen(Rune c) sl_constfn; Rune tolowerrune(Rune c) sl_constfn; Rune toupperrune(Rune c) sl_constfn; Rune totitlerune(Rune c) sl_constfn; int islowerrune(Rune c) sl_constfn; int isupperrune(Rune c) sl_constfn; int isalpharune(Rune c) sl_constfn; int istitlerune(Rune c) sl_constfn; int isspacerune(Rune c) sl_constfn; int isdigitrune(Rune c) sl_constfn; int utfnlen(const char *s, long m) sl_nonnull(1) sl_rd(1, 2); enum { Maxnormctx = 1+30 }; typedef struct Norm Norm; struct Norm { long (*getrune)(void*); void *ctx; struct { Rune *e; Rune a[Maxnormctx]; }ibuf, obuf; int compose; }; void norminit(Norm*, int, void*, long (*getrune)(void*)); long normpull(Norm*, Rune*, long, int); long runecomp(Rune*, long, Rune*, long); long runedecomp(Rune*, long, Rune*, long); long utfcomp(char*, long, char*, long); long utfdecomp(char*, long, char*, long); const Rune *runewbreak(const Rune*) sl_purefn; const char *utfwbreak(const char*) sl_cstr(1); const Rune *runegbreak(const Rune*) sl_purefn; const char *utfgbreak(const char*) sl_cstr(1);