`
jinghuainfo
  • 浏览: 1521221 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

手机探索者开发实录—代码产生器(上)

 
阅读更多
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="ProgId" content="Word.Document"> <meta name="Generator" content="Microsoft Word 11"> <meta name="Originator" content="Microsoft Word 11"> <link rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cjim%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"> <!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:PunctuationKerning/> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:Compatibility> <w:SpaceForUL/> <w:BalanceSingleByteDoubleByteWidth/> <w:DoNotLeaveBackslashAlone/> <w:ULTrailSpace/> <w:DoNotExpandShiftReturn/> <w:AdjustLineHeightInTable/> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:UseFELayout/> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]--><style> <!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:Calibri; panose-1:2 15 5 2 2 2 4 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1610611985 1073750139 0 0 159 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:11.0pt; font-family:Calibri; mso-fareast-font-family:宋体; mso-bidi-font-family:"Times New Roman"; mso-font-kerning:1.0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:42.55pt; mso-footer-margin:49.6pt; mso-paper-source:0; layout-grid:15.6pt;} div.Section1 {page:Section1;} --> </style> <!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} </style> <![endif]-->

手机探索者开发实录代码产生器(上)

转载时请注明出处和作者联系方式
作者联系方式:李先静 <xianjimli at hotmail dot com>


我喜欢C语言,因为它很简单。用C语言写程序时,通常不需要记忆什么,也不需要考虑语言本身的问题(当然对计算机原理应该比较熟悉才行)。不过有些地方用C语言来实现确实有点繁琐。比如在分离接口和实现时,我们先要声明一组函数指针,再定义一个结构,这个结构包含这组函数指针,再定义inline函数包装这组函数指针,在具体实现这个接口时,还要做些类似工作。

手机探索者中,所有接口的框架都是这样实现的。这样的代码写多了,人都会变傻,至少会变得机械,编程也会变得很无聊。正因为这样,我又喜欢上了awk,它经常帮我做些单调重复的工作,它甚至比C更简单,即使长时间不用它,只要看一下帮助,我也马上可以用它来编程。

这里我们用awk来写一个代码产生器,这里的代码产生器虽然有点复杂,不过它至少可以让我的工作更有趣一点,而且可以不同模块中重复使用,所以花点时间去写这个代码产生器完全值得。

接口描述(Mobile_Explorer.def)


  1. 0:MeRet:Mobile_Explorer:Get_Type_Info:MobileExplorer*thiz,MeType*type:
  2. 1:MeRet:Mobile_Explorer:Get_Device_Info:MobileExplorer*thiz,MeDeviceInfo*info:
  3. 2:MeRet:Mobile_Explorer:Auth:MobileExplorer*thiz,constchar*user,constchar*passwd:
  4. 3:MeRet:Mobile_Explorer:Del_Objects:MobileExplorer*thiz,MePath*path:
  5. 4:MeRet:Mobile_Explorer:Add_Objects:MobileExplorer*thiz,MeObjects*objs:
  6. 5:MeRet:Mobile_Explorer:Update_Objects:MobileExplorer*thiz,MeObjects*objs:
  7. 6:MeRet:Mobile_Explorer:Get_Objects:MobileExplorer*thiz,MePath*path,MeObjects*hdrs:
  8. 7:MeRet:Mobile_Explorer:Get_ObjectsHdr:MobileExplorer*thiz,MePath*path,MeObjectsHdr*hdrs:
  9. 8:MeRet:Mobile_Explorer:Get_ObjectsAttr:MobileExplorer*thiz,MePath*path,MeObjectsAttr*attr:
  10. 9:MeRet:Mobile_Explorer:IME_Commit:MobileExplorer*thiz,constchar*text:
  11. 10:MeRet:Mobile_Explorer:Clipboard_Set_Data:MobileExplorer*thiz,MeData*data:
  12. 11:MeRet:Mobile_Explorer:Clipboard_Get_Data:MobileExplorer*thiz,MeData*data:
  13. 12:MeRet:Mobile_Explorer:Reg_Listener:MobileExplorer*thiz,MobileExplorerListener*listener:
  14. 13:MeRet:Mobile_Explorer:Destroy:MobileExplorer*thiz:


产生的代码


接口定义(mobile_explorer.h)


  1. #include"mobile_explorer_types.h"
  2. #include"mobile_explorer_listener.h"
  3. #ifndefMOBILE_EXPLORER_H
  4. #defineMOBILE_EXPLORER_H
  5. ME_DECLS_BEGIN
  6. struct_MobileExplorer;
  7. typedefstruct_MobileExplorerMobileExplorer;
  8. typedefMeRet(*MobileExplorerGetTypeInfoFunc)(MobileExplorer*thiz,MeType*type);
  9. typedefMeRet(*MobileExplorerGetDeviceInfoFunc)(MobileExplorer*thiz,MeDeviceInfo*info);
  10. typedefMeRet(*MobileExplorerAuthFunc)(MobileExplorer*thiz,constchar*user,constchar*passwd);
  11. typedefMeRet(*MobileExplorerDelObjectsFunc)(MobileExplorer*thiz,MePath*path);
  12. typedefMeRet(*MobileExplorerAddObjectsFunc)(MobileExplorer*thiz,MeObjects*objs);
  13. typedefMeRet(*MobileExplorerUpdateObjectsFunc)(MobileExplorer*thiz,MeObjects*objs);
  14. typedefMeRet(*MobileExplorerGetObjectsFunc)(MobileExplorer*thiz,MePath*path,MeObjects*hdrs);
  15. typedefMeRet(*MobileExplorerGetObjectsHdrFunc)(MobileExplorer*thiz,MePath*path,MeObjectsHdr*hdrs);
  16. typedefMeRet(*MobileExplorerGetObjectsAttrFunc)(MobileExplorer*thiz,MePath*path,MeObjectsAttr*attr);
  17. typedefMeRet(*MobileExplorerIMECommitFunc)(MobileExplorer*thiz,constchar*text);
  18. typedefMeRet(*MobileExplorerClipboardSetDataFunc)(MobileExplorer*thiz,MeData*data);
  19. typedefMeRet(*MobileExplorerClipboardGetDataFunc)(MobileExplorer*thiz,MeData*data);
  20. typedefMeRet(*MobileExplorerRegListenerFunc)(MobileExplorer*thiz,MobileExplorerListener*listener);
  21. typedefMeRet(*MobileExplorerDestroyFunc)(MobileExplorer*thiz);
  22. struct_MobileExplorer
  23. {
  24. MobileExplorerGetTypeInfoFuncget_type_info;
  25. MobileExplorerGetDeviceInfoFuncget_device_info;
  26. MobileExplorerAuthFuncauth;
  27. MobileExplorerDelObjectsFuncdel_objects;
  28. MobileExplorerAddObjectsFuncadd_objects;
  29. MobileExplorerUpdateObjectsFuncupdate_objects;
  30. MobileExplorerGetObjectsFuncget_objects;
  31. MobileExplorerGetObjectsHdrFuncget_objectshdr;
  32. MobileExplorerGetObjectsAttrFuncget_objectsattr;
  33. MobileExplorerIMECommitFuncime_commit;
  34. MobileExplorerClipboardSetDataFuncclipboard_set_data;
  35. MobileExplorerClipboardGetDataFuncclipboard_get_data;
  36. MobileExplorerRegListenerFuncreg_listener;
  37. MobileExplorerDestroyFuncdestroy;
  38. charpriv[0];
  39. };
  40. staticinlineMeRetmobile_explorer_get_type_info(MobileExplorer*thiz,MeType*type)
  41. {
  42. me_return_val_if_fail(thiz!=NULL&&thiz->get_type_info!=NULL,ME_RET_PARAMS);
  43. returnthiz->get_type_info(thiz,type);
  44. }
  45. staticinlineMeRetmobile_explorer_get_device_info(MobileExplorer*thiz,MeDeviceInfo*info)
  46. {
  47. me_return_val_if_fail(thiz!=NULL&&thiz->get_device_info!=NULL,ME_RET_PARAMS);
  48. returnthiz->get_device_info(thiz,info);
  49. }
  50. staticinlineMeRetmobile_explorer_auth(MobileExplorer*thiz,constchar*user,constchar*passwd)
  51. {
  52. me_return_val_if_fail(thiz!=NULL&&thiz->auth!=NULL,ME_RET_PARAMS);
  53. returnthiz->auth(thiz,user,passwd);
  54. }
  55. staticinlineMeRetmobile_explorer_del_objects(MobileExplorer*thiz,MePath*path)
  56. {
  57. me_return_val_if_fail(thiz!=NULL&&thiz->del_objects!=NULL,ME_RET_PARAMS);
  58. returnthiz->del_objects(thiz,path);
  59. }
  60. staticinlineMeRetmobile_explorer_add_objects(MobileExplorer*thiz,MeObjects*objs)
  61. {
  62. me_return_val_if_fail(thiz!=NULL&&thiz->add_objects!=NULL,ME_RET_PARAMS);
  63. returnthiz->add_objects(thiz,objs);
  64. }
  65. staticinlineMeRetmobile_explorer_update_objects(MobileExplorer*thiz,MeObjects*objs)
  66. {
  67. me_return_val_if_fail(thiz!=NULL&&thiz->update_objects!=NULL,ME_RET_PARAMS);
  68. returnthiz->update_objects(thiz,objs);
  69. }
  70. staticinlineMeRetmobile_explorer_get_objects(MobileExplorer*thiz,MePath*path,MeObjects*hdrs)
  71. {
  72. me_return_val_if_fail(thiz!=NULL&&thiz->get_objects!=NULL,ME_RET_PARAMS);
  73. returnthiz->get_objects(thiz,path,hdrs);
  74. }
  75. staticinlineMeRetmobile_explorer_get_objectshdr(MobileExplorer*thiz,MePath*path,MeObjectsHdr*hdrs)
  76. {
  77. me_return_val_if_fail(thiz!=NULL&&thiz->get_objectshdr!=NULL,ME_RET_PARAMS);
  78. returnthiz->get_objectshdr(thiz,path,hdrs);
  79. }
  80. staticinlineMeRetmobile_explorer_get_objectsattr(MobileExplorer*thiz,MePath*path,MeObjectsAttr*attr)
  81. {
  82. me_return_val_if_fail(thiz!=NULL&&thiz->get_objectsattr!=NULL,ME_RET_PARAMS);
  83. returnthiz->get_objectsattr(thiz,path,attr);
  84. }
  85. staticinlineMeRetmobile_explorer_ime_commit(MobileExplorer*thiz,constchar*text)
  86. {
  87. me_return_val_if_fail(thiz!=NULL&&thiz->ime_commit!=NULL,ME_RET_PARAMS);
  88. returnthiz->ime_commit(thiz,text);
  89. }
  90. staticinlineMeRetmobile_explorer_clipboard_set_data(MobileExplorer*thiz,MeData*data)
  91. {
  92. me_return_val_if_fail(thiz!=NULL&&thiz->clipboard_set_data!=NULL,ME_RET_PARAMS);
  93. returnthiz->clipboard_set_data(thiz,data);
  94. }
  95. staticinlineMeRetmobile_explorer_clipboard_get_data(MobileExplorer*thiz,MeData*data)
  96. {
  97. me_return_val_if_fail(thiz!=NULL&&thiz->clipboard_get_data!=NULL,ME_RET_PARAMS);
  98. returnthiz->clipboard_get_data(thiz,data);
  99. }
  100. staticinlineMeRetmobile_explorer_reg_listener(MobileExplorer*thiz,MobileExplorerListener*listener)
  101. {
  102. me_return_val_if_fail(thiz!=NULL&&thiz->reg_listener!=NULL,ME_RET_PARAMS);
  103. returnthiz->reg_listener(thiz,listener);
  104. }
  105. staticinlineMeRetmobile_explorer_destroy(MobileExplorer*thiz)
  106. {
  107. me_return_val_if_fail(thiz!=NULL&&thiz->destroy!=NULL,ME_RET_PARAMS);
  108. returnthiz->destroy(thiz);
  109. }
  110. ME_DECLS_END
  111. #endif/*MOBILE_EXPLORER_H*/

接口实现头文件(mobile_explorer_host_xml.h)


  1. #include<mobile_explorer.h>
  2. #ifndefMOBILE_EXPLORER_HOST_XML_H
  3. #defineMOBILE_EXPLORER_HOST_XML_H
  4. ME_DECLS_BEGIN
  5. MobileExplorer*mobile_explorer_host_xml_create();
  6. ME_DECLS_END
  7. #endif/*MOBILE_EXPLORER_HOST_XML_H*/


接口实现C文件(mobile_explorer_host_xml.c)


  1. #include<mobile_explorer_host_xml.h>
  2. typedefstruct_PrivInfo
  3. {
  4. unsignedintdummy;
  5. }PrivInfo;
  6. staticMeRetmobile_explorer_host_xml_get_type_info(MobileExplorer*thiz,MeType*type)
  7. {
  8. me_return_val_if_fail(thiz!=NULL,ME_RET_PARAMS);
  9. PrivInfo*priv=(PrivInfo*)thiz->priv;
  10. return(MeRet)0;
  11. }
  12. staticMeRetmobile_explorer_host_xml_get_device_info(MobileExplorer*thiz,MeDeviceInfo*info)
  13. {
  14. me_return_val_if_fail(thiz!=NULL,ME_RET_PARAMS);
  15. PrivInfo*priv=(PrivInfo*)thiz->priv;
  16. return(MeRet)0;
  17. }
  18. staticMeRetmobile_explorer_host_xml_destroy(MobileExplorer*thiz)
  19. {
  20. me_return_val_if_fail(thiz!=NULL,ME_RET_PARAMS);
  21. PrivInfo*priv=(PrivInfo*)thiz->priv;
  22. return(MeRet)0;
  23. }
  24. MobileExplorer*mobile_explorer_host_xml_create()
  25. {
  26. MobileExplorer*thiz=(MobileExplorer*)malloc(sizeof(MobileExplorer)+sizeof(PrivInfo));
  27. if(thiz!=NULL)
  28. {
  29. thiz->get_type_info=mobile_explorer_host_xml_get_type_info;
  30. thiz->get_device_info=mobile_explorer_host_xml_get_device_info;
  31. thiz->auth=mobile_explorer_host_xml_auth;
  32. thiz->del_objects=mobile_explorer_host_xml_del_objects;
  33. thiz->add_objects=mobile_explorer_host_xml_add_objects;
  34. thiz->update_objects=mobile_explorer_host_xml_update_objects;
  35. thiz->get_objects=mobile_explorer_host_xml_get_objects;
  36. thiz->get_objectshdr=mobile_explorer_host_xml_get_objectshdr;
  37. thiz->get_objectsattr=mobile_explorer_host_xml_get_objectsattr;
  38. thiz->ime_commit=mobile_explorer_host_xml_ime_commit;
  39. thiz->clipboard_set_data=mobile_explorer_host_xml_clipboard_set_data;
  40. thiz->clipboard_get_data=mobile_explorer_host_xml_clipboard_get_data;
  41. thiz->reg_listener=mobile_explorer_host_xml_reg_listener;
  42. thiz->destroy=mobile_explorer_host_xml_destroy;
  43. }
  44. returnthiz;
  45. }
~~待续~~

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics