Re: libpthreads,libmpeg3 -> windows

From
Victor Krapivin (2:5080/1003)
To
Boris Rudakov ()
Date
2003-06-13T14:14:34Z
Area
CARBON.COPY
 * Forwarded from area 'RU.UNIX.PROG'
From: Victor Krapivin <v.krapivin@zaval.org>

> ХА ! "В моем понимании" !
> Ты в RTL посмотри, как они сделаны !!!

Да ладно тебе народ пугать. Вполне можно и CLib пользоваться. Если
помнить про грабли еще времен MS-DOS. Ну хотя бы такие

- --- cut ---
// Really crasy action; I hate Microsoft
setmode(1, _O_BINARY);
- --- cut ---

Лучше б рассказал, как эти грабли обходить. А то по твоей рекомендации
простейший 

while((readed=read(fd, buffer, length))>0) 
	write(fd, buffer, readed);

придется и тот переделывать, я уж не говорю о 

while((ch=getchar())!=EOF) if(ch!='\r') putchar(ch);

- этот вообще в кошмар превращается 8-)
 
> 1. Все виндозные RTL ВЫНУЖДЕНЫ не использовать напрямую хэндлы (дескрипторы, в
> вашей терминилогии) реальных файлов. Виновны: функция stat (информацию в том
> виде, в котором она должна быть представлена, в винде получить невозможно) 

stat - это чистейшей воды <IRP_MJ_DIRECTORY_CONTROL,
IRP_MN_QUERY_DIRECTORY, FileBothDirInformation>, что по Win32-API-шному
означает банальнейший FindFirstFile(), или readdir(), если угодно.

> Если ты откроешь (получишь извне) файл средствами API, ты никогда не
> сможешь его юзать средствами эмуляционного-юниксоидного слоя CLib. Для

int _open_osfhandle ( long osfhandle, int flags );

> 2. В Win32 ни stdin ни stdout ни stderr НЕТУ. 

Это называется "делай их сам". Хотя бы так

fclose(stdout);
*stdout = *fopen("my-cool-log-file", "a+b");

> инициализации, еще ДО передачи управления main/WinMain. А что делать, если я
> первой же строчкой хочу сменить их ? 

> совершенно различны (а у Мелкософта, как обычно, еще и недокумментированы).

#ifdef WIN32
dup2(_get_osfhandle(handle), 1);
#endif

8-)

> А теперь мы еще должны вспомнить, что в Виндах совершенно нормальное состояние,
> когда в рамках одного процесса работает туева хуча модулей, собранных вообще
> разными компайлерами, да еще и с разными вариантами RTL ! Однормеменно:

И что? Пусть работают, друг на друга они как правило не влияют. Или
очень хочется после вызова какой-нибудь самописной libkewl еще и errno
проинспектировать? 8-)))

> А теперь правильный вопрос: тебе все еще хочется под Виндами делать printf в
> то, что ты наивно считаешь "stdio" ? Ы ? Я бы не стал...

Для порта-то? Вполне, если уже походил на местные грабли. Времена
странного поведения winsock уже прошли 8-)
 
> эмуляционный слой сработает как надо. Но чуть что посложнее и все - амба. Нужно
> полностью ломать стереотипы, подписываться на виндозные эхи и работать с
> операционкой по ее правилам. 

Или иметь пачку тестов, которые проверяют правильность работы твоего
кода. И ожидать пакостей на ровном месте, ну как с флажком _O_BINARY.

> ЗЫЫ: И виноваты в этом засранстве, как ни странно, именно юниксоиды, требующие
> наличия определенных функций в составе стандартизированного CLib. А они
> полноценно - НЕРЕАЛИЗУЕМЫ. Сделать-то их сделали, но только для ЧАСТНЫХ СЛУЧАЕВ
> использования. Вот и получайте головняк при порте :)

У нас тоже есть головняк - winelib называется 8-)
 
--
Viktor
--- ifmail v.2.15dev5
 * Origin: Zaval CE (2:5080/1003@fidonet)