Нашел решение, которое меня устраивает. Решение дешевое и сердитое
Решил не делать внешний препроцессор, так как потребуется реализовывать свой парсер, обработку выражений и т.д. Зачем? Если все это уже есть в языке Oberon-07. Можно написать программу, которая будет генерировать модуль WinApi для различных параметров. Программа выглядит примерно так:
Код:
MODULE WinApiPre;
IMPORT Out, p := PreProc;
PROCEDURE Do*;
BEGIN
Out.WriteLn('MODULE WinApi;');
Out.WriteLn('');
Out.WriteLn(' CONST');
...
Out.WriteLn(' WM_RBUTTONUP* = 0205H;');
Out.WriteLn(' WM_RBUTTONDBLCLK* = 0206H;');
Out.WriteLn(' WM_MBUTTONDOWN* = 0207H;');
Out.WriteLn(' WM_MBUTTONUP* = 0208H;');
Out.WriteLn(' WM_MBUTTONDBLCLK* = 0209H;');
IF p.IntGeq(p.Find("_WIN32_WINNT"), 0400H) OR p.IntGeq(p.Find("_WIN32_WINDOWS"), 0400H) THEN
Out.WriteLn(' WM_MOUSEWHEEL* = 020AH;');
END;
IF p.IntGeq(p.Find("_WIN32_WINNT"), 0500H) THEN
Out.WriteLn(' WM_XBUTTONDOWN* = 020BH;');
Out.WriteLn(' WM_XBUTTONUP* = 020CH;');
Out.WriteLn(' WM_XBUTTONDBLCLK* = 020DH;');
END;
IF p.IntGeq(p.Find("_WIN32_WINNT"), 0600H) THEN
Out.WriteLn(' WM_MOUSEHWHEEL* = 020EH;');
END;
IF p.IntGeq(p.Find("_WIN32_WINNT"), 0600H) THEN
Out.WriteLn(' WM_MOUSELAST* = 020EH;');
ELSIF p.IntGeq(p.Find("_WIN32_WINNT"), 0500H) THEN
Out.WriteLn(' WM_MOUSELAST* = 020DH;');
ELSIF p.IntGeq(p.Find("_WIN32_WINNT"), 0400H) OR p.IntGeq(p.Find("_WIN32_WINDOWS"), 0400H) THEN
Out.WriteLn(' WM_MOUSELAST* = 020AH;');
ELSE
Out.WriteLn(' WM_MOUSELAST* = 0209H;');
END;
Out.WriteLn(' WM_PARENTNOTIFY* = 0210H;');
Out.WriteLn(' WM_ENTERMENULOOP* = 0211H;');
Out.WriteLn(' WM_EXITMENULOOP* = 0212H;');
...
Out.WriteLn('');
Out.WriteLn('END WinApi.');
END Do;
END WinApiPre.
Параметры также задаются в модуле написанном на Oberon-07, внешний файл параметров не стал делать, так как потребуется его парсить.
Думаю, что гененировать модуль WinApi потребуется не очень часто, например, раз в пол года, и это решение вполне подходит для этого. При этом не потребуется создавать WinApi модуль с нуля для других определенных параметров, а просто изменить параметр внутри программы, перекомпилировать программу и запустить полученную программу, которая сгенерирует выходной файл с константами.