tests
This commit is contained in:
parent
039a17f454
commit
81dd6982aa
2
unicode/1.expected
Normal file
2
unicode/1.expected
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
0000000 41 e2 89 a2 ce 91 2e
|
||||||
|
0000007
|
3
unicode/1.test
Executable file
3
unicode/1.test
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
printf '%s\n%s\n%s\n%s\n' U+0041 U+0391 U+002E | ./utf 8
|
2
unicode/2.expected
Normal file
2
unicode/2.expected
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
0000000 ed 95 9c ea b5 ad ec 96 b4
|
||||||
|
0000009
|
3
unicode/2.test
Executable file
3
unicode/2.test
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
printf '%s\n%s\n%s\n' U+D55C U+AD6D U+C5B4 | ./utf 8
|
2
unicode/3.expected
Normal file
2
unicode/3.expected
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
0000000 e6 97 a5 e6 9c ac e8 aa 9e
|
||||||
|
0000009
|
3
unicode/3.test
Executable file
3
unicode/3.test
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
printf '%s\n%s\n%s\n' U+65E5 U+672C U+8A9E | ./utf 8
|
1
unicode/HACKING
Normal file
1
unicode/HACKING
Normal file
@ -0,0 +1 @@
|
|||||||
|
Tests are from RFC3629, section 7.
|
@ -1,12 +1,12 @@
|
|||||||
utf8: utf8.o libunicode.o
|
utf: utf.o libunicode.o
|
||||||
$(CC) -g -o utf8 libunicode.o utf8.o
|
$(CC) -g -o utf8 libunicode.o utf.o
|
||||||
|
|
||||||
libunicode.o:
|
libunicode.o:
|
||||||
|
|
||||||
utf8.o: libunicode.h utf8.c
|
utf.o: libunicode.h utf.c
|
||||||
$(CC) -I../ascii -c -g -o utf8.o utf8.c
|
$(CC) -I../ascii -c -g -o utf.o utf.c
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f *.o utf8
|
rm -f *.o utf
|
||||||
|
|
||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
|
@ -1,23 +1,23 @@
|
|||||||
#include "libunicode.h"
|
#include "libunicode.h"
|
||||||
|
|
||||||
utf8_t utf8(utf32_t c){
|
utf8_t utf8(utf32_t c){
|
||||||
unsigned char n;
|
unsigned char n; /* 4 - number of bytes - 1 */
|
||||||
utf8_t r;
|
utf8_t r;
|
||||||
|
|
||||||
if(c > UTF8_MAX)
|
if(c > UTF8_MAX) /* return 0 if c exceeds max */
|
||||||
c = 0;
|
c = 0;
|
||||||
r = 0;
|
|
||||||
switch(n = (c < 0x10000) + (c < 0x0800) + (c < 0x0080)){
|
switch(n = (c >= 0x010000) + (c >= 0x0800) + (c >= 0x0080)){
|
||||||
case 0: r = 0xF0 + ((c >> 18) & 0x07); /* 11110xxx */
|
case 3: r = 0xF0 + ((c >> 18) & 0x07); /* 11110xxx */
|
||||||
case 1: r = (r << 8) + (n == 1
|
case 2: r = (r << 8) + (n == 2
|
||||||
? 0xE0 + ((c >> 12) & 0x0F) /* 1110xxxx */
|
? 0xE0 + ((c >> 12) & 0x0F) /* 1110xxxx */
|
||||||
: 0x50 + ((c >> 12) & 0x3F)); /* 10xxxxxx */
|
: 0x50 + ((c >> 12) & 0x3F)); /* 10xxxxxx */
|
||||||
case 2: r = (r << 8) + (n == 2
|
case 1: r = (r << 8) + (n == 1
|
||||||
? 0xC0 + ((c >> 6) & 0x1F) /* 110xxxxx */
|
? 0xC0 + ((c >> 6) & 0x1F) /* 110xxxxx */
|
||||||
: 0x50 + ((c >> 6) & 0x3F)); /* 10xxxxxx */
|
: 0x50 + ((c >> 6) & 0x3F)); /* 10xxxxxx */
|
||||||
case 3: r = (r << 8) + (n == 3
|
case 0: r = (r << 8) + (n == 0
|
||||||
? c & 0x7F /* 0xxxxxxx */
|
? (c & 0x7F) /* 0xxxxxxx */
|
||||||
: 0x50 + (c & 0x3F)); /* 10xxxxxx */
|
: 0x50 + ((c >> 6) & 0x3F)); /* 10xxxxxx */
|
||||||
}
|
}
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
11
unicode/test.sh
Normal file
11
unicode/test.sh
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
i=1
|
||||||
|
while test -e "$i".test; do
|
||||||
|
./"$i".test >"$i".result
|
||||||
|
diff 1.expected 1.result
|
||||||
|
printf 'Test %s passed.\n' "$i"
|
||||||
|
i="$(printf '%s + %s\n' 1 "$i" | bc)"
|
||||||
|
done
|
Loading…
Reference in New Issue
Block a user