วันอังคารที่ 25 มีนาคม พ.ศ. 2557

C, Token-parsing preprocessor

ระหว่างปี 1995-1997 เป็นช่วงเปลี่ยนถ่ายจาก 16bit เป็น 32bit ในโลกของ Windows (ก่อนเป็น Win32) หลายท่านอาจจำได้ ปัญหาใหญ่ๆ ของ "C" โปรแกรมเมอร์หลายคนก็คือ การนำ Code เก่า หรือ DLL เก่าที่เป็น 16bit port มาเป็น 32bit ถ้ามีเวลาก็ค่อยๆ port โดยเริ่มจาก GlobalAlloc, GlobalLock, GlobalFree etc. แทนที่ด้วย malloc, free แบบที่ใช้ในปัจจุบัน

หลายคนที่มี code ใหญ่ๆ หรือมี DLL ที่ไม่มี code ไม่สามารถ port ได้ แต่ต้องการทำ Application ให้เป็น Win32 ก็มีทางเลือกอีกทางคือการใช้ Thunk layer ในการ เรียก 16bit API ด้วย 32bit app หรือ 16bit app เรียก 32bit API (อย่างหลังนี่ไม่ค่อยเห็น)

ซึ่งผมก็เป็นหนึ่งในนั้น....

เรื่องที่จะเล่าไม่ใช่เรื่อง Thunk layer หรือ Interoperability ของ Win16 กับ Win32 แต่เป็น Technique ที่ผมทำเอามาจาก Microsoft Excel source code (95) มาใช้กับการสร้าง Thunk layer ณ. เวลานั้น

Technique ที่ว่าคือ การทำ Token-parsing preprocessor, ซึ่งมีประโยชน์มากในการ define ชื่อ API ที่ทำให้เราสามารถจัดกลุ่มของ API ที่จะเรียกใช้เป็นหมวดหมู่ได้ง่าย (ดูตัวอย่างครับ)

#include <stdio.h>

#define GROUP_FIRST     _1_
#define GROUP_SECOND    _2_
#define TYPE_16         16
#define TYPE_32         32

#define METHOD_HELPER(a, b, c) a##b##c
#define METHOD(a, b, c) METHOD_HELPER(a, b, c)

int method_1_16(int x) {
   printf("method_1_16 : %d\n", x);
}

int method_2_16(int x) {
   printf("method_2_16 : %d\n", x);
}

int method_1_32(int x) {
   printf("method_1_32 : %d\n", x);
}

int method_2_32(int x) {
   printf("method_2_32 : %d\n", x);
}

int main() {
   METHOD(method, GROUP_FIRST, TYPE_32);
   METHOD(method, GROUP_SECOND, TYPE_16);
   return 0;
}


Happy hacking!!! :)

ไม่มีความคิดเห็น:

แสดงความคิดเห็น