53 lines
1.4 KiB
C
53 lines
1.4 KiB
C
// stdvv.c - реализация русского ввода/вывода
|
||
#include "stdvv.h"
|
||
|
||
|
||
|
||
long syscall3(long number, long arg1, long arg2, long arg3) {
|
||
asm("mov %rcx, %r10");
|
||
asm("mov %rdi, %rax");
|
||
asm("mov %rsi, %rdi");
|
||
asm("mov %rdx, %rsi");
|
||
asm("mov %r10, %rdx");
|
||
asm("syscall");
|
||
}
|
||
|
||
long длина_строки(const char *s) {
|
||
long len = 0;
|
||
while (s[len]) len++;
|
||
return len;
|
||
}
|
||
|
||
int печатьф(const char *формат, ...) {
|
||
long len = длина_строки(формат);
|
||
return (int)syscall3(1, 1, (long)формат, len);
|
||
}
|
||
|
||
int печать(const char *строка) {
|
||
long len = длина_строки(строка);
|
||
return (int)syscall3(1, 1, (long)строка, len);
|
||
}
|
||
|
||
int вывод_строки(const char *строка) {
|
||
int result = печать(строка);
|
||
симв_вывод('\n');
|
||
return result;
|
||
}
|
||
|
||
int симв_вывод(int c) {
|
||
char ch = (char)c;
|
||
return (int)syscall3(1, 1, (long)&ch, 1);
|
||
}
|
||
|
||
void завершение(int код) {
|
||
syscall3(60, код, 0, 0);
|
||
for (;;) {}
|
||
}
|
||
|
||
// assert - проверка условия для тестов
|
||
void assert(int expected, int actual, char *code) {
|
||
if (expected != actual) {
|
||
printf("ОШИБКА: ожидалось %d, получено %d (%s)\n", expected, actual, code);
|
||
завершение(1);
|
||
}
|
||
} |