vak: (Default)
Serge Vakulenko ([personal profile] vak) wrote2025-04-12 02:13 am

Древний printf

Компилятор Би для БЭСМ-6 маленько подрос и уже способен правильно сгенерить функцию printf(). Вот как она выглядела в районе 1969 года.
printf(fmt, args) {
auto ap, a, c, i, n;

i = 0;
ap = &args;
loop:
while ((c = char(fmt, i)) != '%') {
if (c == '*0')
return;
writeb(c);
i = i + 1;
}
i = i + 1;
c = char(fmt, i);
if (c == '%') {
writeb('%');
i = i + 1;
goto loop;
}
a = *ap;
if (c == 'd') {
printd(a);
} else if (c == 'o') {
printo(a);
} else if (c == 'c') {
write(a);
} else if (c == 's') {
n = 0;
while ((c = char(a, n)) != '*0') {
writeb(c);
n = n + 1;
}
} else {
/* bad format specification, ignore */
goto loop;
}
i = i + 1;
ap = ap + 1;
goto loop;
}
Напишем тест, задействуя все форматы.
main() {
printf("Hello, World!*n");
printf("%% %% %%%%*n");
printf("format %%d: %d %d*n", 123, -123);
printf("format %%o: %o %o*n", 234, -234);
printf("format %%c: %c %c*n", 'foo', 'bar');
printf("format %%s: *"%s*" *"%s*"*n", "Hello", "World");
}
Компилируем, запускаем.
$ bbesm < test.b > test.assem 
$ besmc test.assem libb.obj
$ ./test.exe
Hello, World!
% % %%
format %d: 123 -123
format %o: 352 -352
format %c: foo bar
format %s: "Hello" "World"
Фунциклирует в лучшем виде однако.
juan_gandhi: (Default)

[personal profile] juan_gandhi 2025-04-12 09:31 am (UTC)(link)
Мило. Дёшево и сердито. Только смешно литералы выглядят, c == '*0'.
juan_gandhi: (Default)

[personal profile] juan_gandhi 2025-04-13 07:43 am (UTC)(link)
Ох не встречался... Припоминаю ещё наши на эсэмках.
ufm: (Default)

[personal profile] ufm 2025-04-12 10:02 am (UTC)(link)
Что-то я туплю/ А чем строка 'string' отличается от строки "string"?

[personal profile] sassa_nf 2025-04-12 11:03 am (UTC)(link)
'char' vs "string"
ufm: (Default)

[personal profile] ufm 2025-04-12 11:58 am (UTC)(link)
Продолжаю тупить - многобайтовый char?

[personal profile] sassa_nf 2025-04-12 12:07 pm (UTC)(link)
Да многобайтовьіх вроде нема. '*0' == '\0'
ufm: (Default)

[personal profile] ufm 2025-04-12 12:43 pm (UTC)(link)
Тогда что значит
printf("format %%c: %c %c*n", 'foo', 'bar');
и его вывод:
format %c: foo bar

[personal profile] sassa_nf 2025-04-12 01:19 pm (UTC)(link)
Ok, I didn't notice 'foo', 'bar'
ufm: (Default)

[personal profile] ufm 2025-04-12 06:45 pm (UTC)(link)
О как.
ufm: (Default)

[personal profile] ufm 2025-04-13 12:07 am (UTC)(link)
Но в современном gcc не работает.
ufm: (Default)

[personal profile] ufm 2025-04-13 12:20 pm (UTC)(link)
putchar тоже не выводит. Я собственно именно это под "не работает" и имел в виду.
ufm: (Default)

[personal profile] ufm 2025-04-13 06:39 pm (UTC)(link)
Вроде как тип char в сях - это всегда байт. А вот тип у 'a' (по крайней мере в гцц) - int.
Прикольно.

P.S. Больше 30 лет на сях не писал, забыл всё совсем.
ufm: (Default)

[personal profile] ufm 2025-04-13 06:44 pm (UTC)(link)
собственно об этом в стандарте написано.
x86128: (Default)

[personal profile] x86128 2025-04-12 10:34 am (UTC)(link)
Хорошо