scan: use wide char functions

pull/1/merge
Christian Neukirchen 8 years ago
parent b319493901
commit 606b7d1cdf

@ -1,3 +1,5 @@
#define _GNU_SOURCE
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/types.h> #include <sys/types.h>
@ -8,20 +10,32 @@
#include <string.h> #include <string.h>
#include <time.h> #include <time.h>
#include <unistd.h> #include <unistd.h>
#include <wchar.h>
#include <locale.h>
#include "blaze822.h" #include "blaze822.h"
wchar_t replacement = '?';
void void
u8putstr(FILE *out, char *s, size_t l, int pad) u8putstr(FILE *out, char *s, size_t l, int pad)
{ {
while (*s && l) { while (*s && l) {
putc(*s, out); if (*s >= 32 && *s < 127) {
// elongate by utf8 overhead putc(*s, out);
if ((*s & 0xf0) == 0xf0) l += 3; s++;
else if ((*s & 0xe0) == 0xe0) l += 2; l--;
else if ((*s & 0xc0) == 0xc0) l += 1; } else {
l--; wchar_t wc;
s++; int r = mbtowc(&wc, s, 4);
if (r < 0) {
r = 1;
wc = replacement;
}
s += r;
fprintf(out, "%lc", wc);
l -= wcwidth(wc);
}
} }
if (pad) if (pad)
while (l-- > 0) while (l-- > 0)
@ -134,6 +148,10 @@ oneline(char *file)
int int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
setlocale(LC_ALL, ""); // for wcwidth later
if (wcwidth(0xFFFD) > 0)
replacement = 0xFFFD;
char *seqmap = blaze822_seq_open(0); char *seqmap = blaze822_seq_open(0);
blaze822_seq_load(seqmap); blaze822_seq_load(seqmap);
cur = blaze822_seq_cur(); cur = blaze822_seq_cur();

Loading…
Cancel
Save