Пишу на ассемблере шпион для показа вызова методов Direct3D, нечто вроде моего kerberos API spy Нужно создать базу данных для него. Вопрос как на перле можно пропарсить из d3d9.h строку след. вида #define IDirect3D9_GetAdapterDisplayMode(p,a,b) (p)->lpVtbl->GetAdapterDisplayMode(p,a,b) чтобы получить такую xyz db "IDirect3D9_GetAdapterDisplayMode",0 dd offset xyz ,3 , где 3 - количество параметров в скобках
Хм, не знаю, может, можно обойтись только регулярками. Вот что у меня: Код (Text): # $s - исходная строка, приведённая выше $s =~ /#define (.+?)\((.*?)\).*$/; $f = $1; $p = $2; $p =~ s/,//g; #убираем запятые $l = length($p); #считаем кол-во символов в параметрах print("xyz db \"$f\",0\ndd offset xyz ,$l\n\n"); ограничение: параметры должны быть односимвольными.
параметры должны быть односимвольными А нельзя вместо удаления запятых сделать split, а потом подсчитать кол=во элементов в массиве?
век живи — век учись. я забыл про сплит. вот: Код (Text): $s =~ /#define (.+?)\((.*?)\).*$/; $l = scalar(split(/,/,$2)); print("xyz db \"$1\",0\ndd offset xyz ,$l\n\n");
Не совсем в тему, но: метод IDirect3D9::GetAdapterDisplayMode имеет 2 параметра. Все COM методы имееют конвенцию __thiscall и первым параметром всегда передаётся указатель на VTable объекта (this). Макрос #define IDirect3D9_GetAdapterDisplayMode(p,a,b) (p)->lpVtbl->GetAdapterDisplayMode(p,a,b) используется для совместимости с Си. IMHO лучше обратить на это внимание, поскольку в MSDN и DXSDK все описания даны из расчёта на С++ и из-за "лишнего" параметра возхможны заморочки с использованием шпиона в будующем.