· Начало · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Header converters: to be or not to be?

<< . 1 . 2 . 3 . 4 . >>

Посл.отвђт Сообщенiе


Дата: Янв 11, 2004 15:52:52
Правка

Спасибо, volodya, всё теперь работает (правда, не знаю, отчего :))

Four-F
либо ты вообще забыл её в каталог кинуть!
msdia, что шла вместе с VS 7.0, я зарегистрировал.

Могу прислать работающую свя
У меня уже работает: pdbdump.exe взят с сайта, теперь всё нормально.
Правда, в каталоге с ним лежит библиотека, тоже с сайта.
Не знаю, что имеет приоритет: регистрация библиотеки как COM-сервера или простая её загрузка (LoadLibrary).
В примере, что идёт с MS DIA SDK, приоритет у СОМ…


Дата: Янв 11, 2004 15:57:36
Правка

Кстати, снова о конвертере:
пока доделываю свой, вот, набросал небольшой скриптик для причёсывания стандартных заголовочных файлов, что в MASM32.

Смысл скрипта: добавить директивы условной компиляции, чтобы не париться с Unicode: объявил макроконстанту — у тебя CreateWindowExW, нет — обычная версия.

Хотя остаются проблемы с сообщениями (спасибо, Toxic, что обратил внимание!), но подробнее в архиве…

_665729266__uniimp.zip


Дата: Июн 18, 2004 03:10:24

А я такой умный, думаю сейчас по-быстрому налобаю скриптик, который вытащит все структуры в другой файл попутно немного поправляя их под формат fasm, и обломался сразу же на второй структуре, хрен поймешь что за формат у этой MS :-(
#!/usr/bin/perl -w

$symbol="_";

foreach $f (<*.h>)
{
open(IN, "$f") or die "Can't open file: $!";
chop($f);
chop($f);

open(OUT, "+>$f$symbol.inc") or die "Can't open file out.inc for writing: $!";
 $i=0;
 while(<IN>)
  {
    if ($i==0)
     {
       if (/^typedef\s+(struc)t(\s+[a-zA-Z0-9_]+\s*{.*)/i)
        {
          print OUT "$1$2\n";
          $i++;
        }
     }
    elsif ($i>0)
     {
       if (/(.*{.*)/)
        {
          print OUT "$1\n";
          $i++;
        }
       elsif (/(.*}.*)/)
        {
          print OUT "$1\n";
          $i--;
        }
       else
        {
          print OUT $_;
        }
     }
  }
close(OUT);
close(IN);
}


Дата: Июн 18, 2004 03:19:23

Хотя сейчас смотрю и кажется мне что добавив ещё пару строк проблему удастся решить..


Дата: Июн 18, 2004 06:30:26 · Поправил: Asterix

Вобщем траблы эти из-за долбаных union'ов, из-за них количество '{' не соответствует количеству '}'
Как бы это помягче пофиксить пока не нашёл :-(


Дата: Июн 18, 2004 06:35:51

Asterix
Хочешь сказать есть непарные фигурные скобки?


Дата: Июн 18, 2004 06:54:23

Да, например вот в WINNT.h
typedef struct _LARGE_INTEGER {
#else // MIDL_PASS
typedef union _LARGE_INTEGER {
    struct {
        DWORD LowPart;
        LONG HighPart;
    };
    struct {
        DWORD LowPart;
        LONG HighPart;
    } u;
#endif //MIDL_PASS
    LONGLONG QuadPart;
} LARGE_INTEGER;


Дата: Июн 18, 2004 07:14:58

Asterix
из-за долбаных union'ов ... например вот в WINNT.h
Это проблема не union'ов, а условной компиляции.


Дата: Июн 18, 2004 07:51:32

Тогда дергать структуры в другой файл идея утопическая, т.к. сложно будет обработать логику условной компиляции.
Придётся модифицировать на месте всё что поддаётся, остальное - руками.


Дата: Июн 18, 2004 20:22:42

typedef убери, не нужен он. Вовсе не все структуры потом обзываются по нему.
       if (/(.*{.*)/)
        {
          print OUT "$1\n";
          $i++;
        }
       elsif (/(.*}.*)/)
        {
          print OUT "$1\n";
          $i--;
        }


Вот это меня тоже в восторг не приводит :(


Дата: Июн 18, 2004 23:09:02

> Вот это меня тоже в восторг не приводит :(

Меня тоже ;-) Поэтому решил сделать в таком стиле,
по крайней мере ничего нужного не испортим ;-):
#!/usr/bin/perl -w

foreach $f (<*.h>)
{
open(IN, "$f") or die "Can't open file: $!";
chop($f);
chop($f);

open(OUT, "+>$f\_.inc") or die "Can't open file out.inc for writing: $!";

while(<IN>)
{

s/\bBYTE\s+([a-zA-Z0-9_]+)\s*;(.*)/.$1  db  ?$2/ig;
s/\bWORD\s+([a-zA-Z0-9_]+)\s*;(.*)/.$1  dw  ?$2/ig;
s/\bDWORD\s+([a-zA-Z0-9_]+)\s*;(.*)/.$1  dd  ?$2/ig;
s/\bLONG\s+([a-zA-Z0-9_]+)\s*;(.*)/.$1  dd  ?$2/ig;
s/\bBYTE\s+([a-zA-Z0-9_]+)\[([0-9]+)\]\s*;(.*)/.$1  rb  $2$3/ig;
s/\bWORD\s+([a-zA-Z0-9_]+)\[([0-9]+)\]\s*;(.*)/.$1  rw  $2$3/ig;
s/\bDWORD\s+([a-zA-Z0-9_]+)\[([0-9]+)\]\s*;(.*)/.$1  rd  $2$3/ig;
s/\btypedef\s+(struc)t(\s+)_([a-zA-Z0-9_]+)(.*)/$1$2$3$4/ig;
s/^#define\s+([a-zA-Z0-9_]+)(\s+)([0-9]+\b)(.*)/$1$2= $3$4/ig;
s/^#define\s+([a-zA-Z0-9_]+)(\s+)0x([a-fA-F0-9]+\b)(.*)/$1$2= $3h$4/ig;
s/\/\//;/g;

print OUT $_;

}

close(OUT);
close(IN);
}


Дата: Июн 18, 2004 23:12:44

Я впечатлен :)
Сие не поймет даже сам создатель, если взглянет на этот код по протяжении некоторого промежутка времени.


Дата: Июн 19, 2004 00:05:15

Да ладно, всё понятно и прозрачно, а главное работает ;-)
Конвертирует простые структуры и константы в формат fasm'а, ну конечно ещё можно добавить кучу строк, но мне этого пока хватает.


Дата: Июн 19, 2004 14:18:03
Правка

volodya
Я впечатлен :)
Я вообще в отпаде :).

Asterix
Проблема условной компиляции решается подсчётом #ifdef/#if defined и т.п.

Причём для фасма в этом случае легче парсить. Но сложнее в другом - ему в структурах подавай основные типы данных,
LPTCSTR ? не прокатит, кажется.

Да, кстати, S_T_A_S_ говорил, что фасм научили "понимать" сишные заголовочные файлы. Причём сие - как "побочное действие" :). Я, правда, так и не нашёл.


Дата: Июн 19, 2004 14:59:28

IceStudent
> Проблема условной компиляции решается подсчётом #ifdef/#if defined и т.п.

Не, я этого делать не буду ;-)

<< . 1 . 2 . 3 . 4 . >>