@@ -1,185 +0,0 @@ | |||
.file "fasit.c" | |||
.text | |||
.globl writebyte | |||
.type writebyte, @function | |||
writebyte: | |||
.LFB5: | |||
.cfi_startproc | |||
pushl %ebp | |||
.cfi_def_cfa_offset 8 | |||
.cfi_offset 5, -8 | |||
movl %esp, %ebp | |||
.cfi_def_cfa_register 5 | |||
subl $24, %esp | |||
movl 12(%ebp), %eax | |||
movb %al, -12(%ebp) | |||
pushl 8(%ebp) | |||
pushl $1 | |||
pushl $1 | |||
leal -12(%ebp), %eax | |||
pushl %eax | |||
call fwrite | |||
addl $16, %esp | |||
nop | |||
leave | |||
.cfi_restore 5 | |||
.cfi_def_cfa 4, 4 | |||
ret | |||
.cfi_endproc | |||
.LFE5: | |||
.size writebyte, .-writebyte | |||
.globl writeutf8char | |||
.type writeutf8char, @function | |||
writeutf8char: | |||
.LFB6: | |||
.cfi_startproc | |||
pushl %ebp | |||
.cfi_def_cfa_offset 8 | |||
.cfi_offset 5, -8 | |||
movl %esp, %ebp | |||
.cfi_def_cfa_register 5 | |||
subl $24, %esp | |||
cmpl $127, 12(%ebp) | |||
ja .L3 | |||
movl 12(%ebp), %eax | |||
movzbl %al, %eax | |||
subl $8, %esp | |||
pushl %eax | |||
pushl 8(%ebp) | |||
call writebyte | |||
addl $16, %esp | |||
jmp .L2 | |||
.L3: | |||
cmpl $65535, 12(%ebp) | |||
jbe .L5 | |||
movl $18, -12(%ebp) | |||
movl -12(%ebp), %eax | |||
movl 12(%ebp), %edx | |||
movl %eax, %ecx | |||
shrl %cl, %edx | |||
movl %edx, %eax | |||
andl $7, %eax | |||
orl $-16, %eax | |||
movzbl %al, %eax | |||
subl $8, %esp | |||
pushl %eax | |||
pushl 8(%ebp) | |||
call writebyte | |||
addl $16, %esp | |||
jmp .L6 | |||
.L5: | |||
cmpl $2047, 12(%ebp) | |||
jbe .L7 | |||
movl $12, -12(%ebp) | |||
movl -12(%ebp), %eax | |||
movl 12(%ebp), %edx | |||
movl %eax, %ecx | |||
shrl %cl, %edx | |||
movl %edx, %eax | |||
andl $15, %eax | |||
orl $-32, %eax | |||
movzbl %al, %eax | |||
subl $8, %esp | |||
pushl %eax | |||
pushl 8(%ebp) | |||
call writebyte | |||
addl $16, %esp | |||
jmp .L6 | |||
.L7: | |||
movl $6, -12(%ebp) | |||
movl -12(%ebp), %eax | |||
movl 12(%ebp), %edx | |||
movl %eax, %ecx | |||
shrl %cl, %edx | |||
movl %edx, %eax | |||
andl $31, %eax | |||
orl $-64, %eax | |||
movzbl %al, %eax | |||
subl $8, %esp | |||
pushl %eax | |||
pushl 8(%ebp) | |||
call writebyte | |||
addl $16, %esp | |||
.L6: | |||
subl $6, -12(%ebp) | |||
movl -12(%ebp), %eax | |||
movl 12(%ebp), %edx | |||
movl %eax, %ecx | |||
shrl %cl, %edx | |||
movl %edx, %eax | |||
andl $63, %eax | |||
orl $-128, %eax | |||
movzbl %al, %eax | |||
subl $8, %esp | |||
pushl %eax | |||
pushl 8(%ebp) | |||
call writebyte | |||
addl $16, %esp | |||
cmpl $0, -12(%ebp) | |||
jg .L6 | |||
.L2: | |||
leave | |||
.cfi_restore 5 | |||
.cfi_def_cfa 4, 4 | |||
ret | |||
.cfi_endproc | |||
.LFE6: | |||
.size writeutf8char, .-writeutf8char | |||
.globl readbyte | |||
.type readbyte, @function | |||
readbyte: | |||
.LFB7: | |||
.cfi_startproc | |||
pushl %ebp | |||
.cfi_def_cfa_offset 8 | |||
.cfi_offset 5, -8 | |||
movl %esp, %ebp | |||
.cfi_def_cfa_register 5 | |||
subl $24, %esp | |||
pushl 8(%ebp) | |||
pushl $1 | |||
pushl $1 | |||
leal -13(%ebp), %eax | |||
pushl %eax | |||
call fread | |||
addl $16, %esp | |||
movl %eax, -12(%ebp) | |||
cmpl $0, -12(%ebp) | |||
jg .L9 | |||
movl $-1, %eax | |||
jmp .L11 | |||
.L9: | |||
movzbl -13(%ebp), %eax | |||
movzbl %al, %eax | |||
.L11: | |||
leave | |||
.cfi_restore 5 | |||
.cfi_def_cfa 4, 4 | |||
ret | |||
.cfi_endproc | |||
.LFE7: | |||
.size readbyte, .-readbyte | |||
.globl readutf8char | |||
.type readutf8char, @function | |||
readutf8char: | |||
.LFB8: | |||
.cfi_startproc | |||
pushl %ebp | |||
.cfi_def_cfa_offset 8 | |||
.cfi_offset 5, -8 | |||
movl %esp, %ebp | |||
.cfi_def_cfa_register 5 | |||
subl $8, %esp | |||
subl $12, %esp | |||
pushl 8(%ebp) | |||
call readbyte | |||
addl $16, %esp | |||
leave | |||
.cfi_restore 5 | |||
.cfi_def_cfa 4, 4 | |||
ret | |||
.cfi_endproc | |||
.LFE8: | |||
.size readutf8char, .-readutf8char | |||
.ident "GCC: (GNU) 6.3.1 20170306" | |||
.section .note.GNU-stack,"",@progbits |
@@ -1,54 +0,0 @@ | |||
.extern fread, fwrite | |||
.text | |||
.globl readbyte | |||
# Navn: readbyte | |||
# Synopsis: Leser en byte fra en binærfil. | |||
# C-signatur: int readbyte (FILE *f) | |||
# Registre: | |||
readbyte: | |||
pushl %ebp # Standard funksjonsstart | |||
movl %esp,%ebp # | |||
rb_x: popl %ebp # Standard | |||
ret # retur. | |||
.globl readutf8char | |||
# Navn: readutf8char | |||
# Synopsis: Leser et Unicode-tegn fra en binærfil. | |||
# C-signatur: long readutf8char (FILE *f) | |||
# Registre: | |||
readutf8char: | |||
pushl %ebp # Standard funksjonsstart | |||
movl %esp,%ebp # | |||
popl %ebp # Standard | |||
ret # retur. | |||
.globl writebyte | |||
# Navn: writebyte | |||
# Synopsis: Skriver en byte til en binærfil. | |||
# C-signatur: void writebyte (FILE *f, unsigned char b) | |||
# Registre: | |||
writebyte: | |||
pushl %ebp # Standard funksjonsstart | |||
movl %esp,%ebp # | |||
popl %ebp # Standard | |||
ret # retur. | |||
.globl writeutf8char | |||
# Navn: writeutf8char | |||
# Synopsis: Skriver et tegn kodet som UTF-8 til en binærfil. | |||
# C-signatur: void writeutf8char (FILE *f, unsigned long u) | |||
# Registre: | |||
writeutf8char: | |||
pushl %ebp # Standard funksjonsstart | |||
movl %esp,%ebp # | |||
wu8_x: popl %ebp # Standard | |||
ret # retur. |
@@ -1,86 +0,0 @@ | |||
#include <stdio.h> | |||
#include <stdlib.h> | |||
typedef unsigned char byte; | |||
typedef unsigned long unicode; | |||
// The minimum value of the first `char` to indicate n bytes | |||
#define C4bytes 0xF0 | |||
#define C3bytes 0xE0 | |||
#define C2bytes 0xC0 | |||
// The minimum value for the vm_var_char for the utf8 equivalent to be n bytes | |||
#define U4bytes 0x10000 | |||
#define U3bytes 0x0800 | |||
#define U2bytes 0x0080 | |||
void writebyte(FILE *f, byte b) | |||
{ | |||
fwrite(&b, 1, 1, f); | |||
} | |||
void writeutf8char(FILE *f, unicode u) | |||
{ | |||
if (u >= U4bytes) | |||
{ | |||
writebyte(f, 0b11110000 | ((u >> 18) & 0b00000111)); | |||
writebyte(f, 0b10000000 | ((u >> 12) & 0b00111111)); | |||
writebyte(f, 0b10000000 | ((u >> 6) & 0b00111111)); | |||
writebyte(f, 0b10000000 | (u & 0b00111111)); | |||
} | |||
else if (u >= U3bytes) | |||
{ | |||
writebyte(f, 0b11100000 | ((u >> 12) & 0b00001111)); | |||
writebyte(f, 0b10000000 | ((u >> 6) & 0b00111111)); | |||
writebyte(f, 0b10000000 | (u & 0b00111111)); | |||
} | |||
else if (u >= U2bytes) | |||
{ | |||
writebyte(f, 0b11000000 | ((u >> 6) & 0b00011111)); | |||
writebyte(f, 0b10000000 | (u & 0b00111111)); | |||
} | |||
else | |||
{ | |||
writebyte(f, u); | |||
} | |||
} | |||
int readbyte(FILE *f) | |||
{ | |||
int status; | |||
byte c; | |||
status = fread(&c, 1, 1, f); | |||
if (status <= 0) return -1; | |||
return (int)c; | |||
} | |||
long readutf8char(FILE *f) | |||
{ | |||
byte first = readbyte(f); | |||
unicode u = 0; | |||
if (first >= C4bytes) | |||
{ | |||
u |= (first & 0b00000111) << 18; | |||
u |= (readbyte(f) & 0b00111111) << 12; | |||
u |= (readbyte(f) & 0b00111111) << 6; | |||
u |= readbyte(f) & 0b00111111; | |||
} | |||
else if (first >= C3bytes) | |||
{ | |||
u |= (first & 0b00001111) << 12; | |||
u |= (readbyte(f) & 0b00111111) << 6; | |||
u |= readbyte(f) & 0b00111111; | |||
} | |||
else if (first >= C2bytes) | |||
{ | |||
u |= (first & 0b00011111) << 6; | |||
u |= readbyte(f) & 0b00111111; | |||
} | |||
else | |||
{ | |||
u |= first; | |||
} | |||
return u; | |||
} |