<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)
- 0:MeRet:Mobile_Explorer:Get_Type_Info:MobileExplorer*thiz,MeType*type:
- 1:MeRet:Mobile_Explorer:Get_Device_Info:MobileExplorer*thiz,MeDeviceInfo*info:
-
2:MeRet:Mobile_Explorer:Auth:MobileExplorer*thiz,constchar*user,constchar*passwd:
- 3:MeRet:Mobile_Explorer:Del_Objects:MobileExplorer*thiz,MePath*path:
- 4:MeRet:Mobile_Explorer:Add_Objects:MobileExplorer*thiz,MeObjects*objs:
- 5:MeRet:Mobile_Explorer:Update_Objects:MobileExplorer*thiz,MeObjects*objs:
- 6:MeRet:Mobile_Explorer:Get_Objects:MobileExplorer*thiz,MePath*path,MeObjects*hdrs:
- 7:MeRet:Mobile_Explorer:Get_ObjectsHdr:MobileExplorer*thiz,MePath*path,MeObjectsHdr*hdrs:
- 8:MeRet:Mobile_Explorer:Get_ObjectsAttr:MobileExplorer*thiz,MePath*path,MeObjectsAttr*attr:
-
9:MeRet:Mobile_Explorer:IME_Commit:MobileExplorer*thiz,constchar*text:
- 10:MeRet:Mobile_Explorer:Clipboard_Set_Data:MobileExplorer*thiz,MeData*data:
- 11:MeRet:Mobile_Explorer:Clipboard_Get_Data:MobileExplorer*thiz,MeData*data:
- 12:MeRet:Mobile_Explorer:Reg_Listener:MobileExplorer*thiz,MobileExplorerListener*listener:
- 13:MeRet:Mobile_Explorer:Destroy:MobileExplorer*thiz:
产生的代码
接口定义(mobile_explorer.h)
-
#include"mobile_explorer_types.h"
-
#include"mobile_explorer_listener.h"
-
#ifndefMOBILE_EXPLORER_H
-
#defineMOBILE_EXPLORER_H
- ME_DECLS_BEGIN
-
struct_MobileExplorer;
-
typedefstruct_MobileExplorerMobileExplorer;
-
typedefMeRet(*MobileExplorerGetTypeInfoFunc)(MobileExplorer*thiz,MeType*type);
-
typedefMeRet(*MobileExplorerGetDeviceInfoFunc)(MobileExplorer*thiz,MeDeviceInfo*info);
-
typedefMeRet(*MobileExplorerAuthFunc)(MobileExplorer*thiz,constchar*user,constchar*passwd);
-
typedefMeRet(*MobileExplorerDelObjectsFunc)(MobileExplorer*thiz,MePath*path);
-
typedefMeRet(*MobileExplorerAddObjectsFunc)(MobileExplorer*thiz,MeObjects*objs);
-
typedefMeRet(*MobileExplorerUpdateObjectsFunc)(MobileExplorer*thiz,MeObjects*objs);
-
typedefMeRet(*MobileExplorerGetObjectsFunc)(MobileExplorer*thiz,MePath*path,MeObjects*hdrs);
-
typedefMeRet(*MobileExplorerGetObjectsHdrFunc)(MobileExplorer*thiz,MePath*path,MeObjectsHdr*hdrs);
-
typedefMeRet(*MobileExplorerGetObjectsAttrFunc)(MobileExplorer*thiz,MePath*path,MeObjectsAttr*attr);
-
typedefMeRet(*MobileExplorerIMECommitFunc)(MobileExplorer*thiz,constchar*text);
-
typedefMeRet(*MobileExplorerClipboardSetDataFunc)(MobileExplorer*thiz,MeData*data);
-
typedefMeRet(*MobileExplorerClipboardGetDataFunc)(MobileExplorer*thiz,MeData*data);
-
typedefMeRet(*MobileExplorerRegListenerFunc)(MobileExplorer*thiz,MobileExplorerListener*listener);
-
typedefMeRet(*MobileExplorerDestroyFunc)(MobileExplorer*thiz);
-
struct_MobileExplorer
- {
- MobileExplorerGetTypeInfoFuncget_type_info;
- MobileExplorerGetDeviceInfoFuncget_device_info;
- MobileExplorerAuthFuncauth;
- MobileExplorerDelObjectsFuncdel_objects;
- MobileExplorerAddObjectsFuncadd_objects;
- MobileExplorerUpdateObjectsFuncupdate_objects;
- MobileExplorerGetObjectsFuncget_objects;
- MobileExplorerGetObjectsHdrFuncget_objectshdr;
- MobileExplorerGetObjectsAttrFuncget_objectsattr;
- MobileExplorerIMECommitFuncime_commit;
- MobileExplorerClipboardSetDataFuncclipboard_set_data;
- MobileExplorerClipboardGetDataFuncclipboard_get_data;
- MobileExplorerRegListenerFuncreg_listener;
- MobileExplorerDestroyFuncdestroy;
-
charpriv[0];
- };
-
staticinlineMeRetmobile_explorer_get_type_info(MobileExplorer*thiz,MeType*type)
- {
- me_return_val_if_fail(thiz!=NULL&&thiz->get_type_info!=NULL,ME_RET_PARAMS);
-
returnthiz->get_type_info(thiz,type);
- }
-
staticinlineMeRetmobile_explorer_get_device_info(MobileExplorer*thiz,MeDeviceInfo*info)
- {
- me_return_val_if_fail(thiz!=NULL&&thiz->get_device_info!=NULL,ME_RET_PARAMS);
-
returnthiz->get_device_info(thiz,info);
- }
-
staticinlineMeRetmobile_explorer_auth(MobileExplorer*thiz,constchar*user,constchar*passwd)
- {
- me_return_val_if_fail(thiz!=NULL&&thiz->auth!=NULL,ME_RET_PARAMS);
-
returnthiz->auth(thiz,user,passwd);
- }
-
staticinlineMeRetmobile_explorer_del_objects(MobileExplorer*thiz,MePath*path)
- {
- me_return_val_if_fail(thiz!=NULL&&thiz->del_objects!=NULL,ME_RET_PARAMS);
-
returnthiz->del_objects(thiz,path);
- }
-
staticinlineMeRetmobile_explorer_add_objects(MobileExplorer*thiz,MeObjects*objs)
- {
- me_return_val_if_fail(thiz!=NULL&&thiz->add_objects!=NULL,ME_RET_PARAMS);
-
returnthiz->add_objects(thiz,objs);
- }
-
staticinlineMeRetmobile_explorer_update_objects(MobileExplorer*thiz,MeObjects*objs)
- {
- me_return_val_if_fail(thiz!=NULL&&thiz->update_objects!=NULL,ME_RET_PARAMS);
-
returnthiz->update_objects(thiz,objs);
- }
-
staticinlineMeRetmobile_explorer_get_objects(MobileExplorer*thiz,MePath*path,MeObjects*hdrs)
- {
- me_return_val_if_fail(thiz!=NULL&&thiz->get_objects!=NULL,ME_RET_PARAMS);
-
returnthiz->get_objects(thiz,path,hdrs);
- }
-
staticinlineMeRetmobile_explorer_get_objectshdr(MobileExplorer*thiz,MePath*path,MeObjectsHdr*hdrs)
- {
- me_return_val_if_fail(thiz!=NULL&&thiz->get_objectshdr!=NULL,ME_RET_PARAMS);
-
returnthiz->get_objectshdr(thiz,path,hdrs);
- }
-
staticinlineMeRetmobile_explorer_get_objectsattr(MobileExplorer*thiz,MePath*path,MeObjectsAttr*attr)
- {
- me_return_val_if_fail(thiz!=NULL&&thiz->get_objectsattr!=NULL,ME_RET_PARAMS);
-
returnthiz->get_objectsattr(thiz,path,attr);
- }
-
staticinlineMeRetmobile_explorer_ime_commit(MobileExplorer*thiz,constchar*text)
- {
- me_return_val_if_fail(thiz!=NULL&&thiz->ime_commit!=NULL,ME_RET_PARAMS);
-
returnthiz->ime_commit(thiz,text);
- }
-
staticinlineMeRetmobile_explorer_clipboard_set_data(MobileExplorer*thiz,MeData*data)
- {
- me_return_val_if_fail(thiz!=NULL&&thiz->clipboard_set_data!=NULL,ME_RET_PARAMS);
-
returnthiz->clipboard_set_data(thiz,data);
- }
-
staticinlineMeRetmobile_explorer_clipboard_get_data(MobileExplorer*thiz,MeData*data)
- {
- me_return_val_if_fail(thiz!=NULL&&thiz->clipboard_get_data!=NULL,ME_RET_PARAMS);
-
returnthiz->clipboard_get_data(thiz,data);
- }
-
staticinlineMeRetmobile_explorer_reg_listener(MobileExplorer*thiz,MobileExplorerListener*listener)
- {
- me_return_val_if_fail(thiz!=NULL&&thiz->reg_listener!=NULL,ME_RET_PARAMS);
-
returnthiz->reg_listener(thiz,listener);
- }
-
staticinlineMeRetmobile_explorer_destroy(MobileExplorer*thiz)
- {
- me_return_val_if_fail(thiz!=NULL&&thiz->destroy!=NULL,ME_RET_PARAMS);
-
returnthiz->destroy(thiz);
- }
- ME_DECLS_END
-
#endif/*MOBILE_EXPLORER_H*/
-
接口实现头文件(mobile_explorer_host_xml.h)
-
#include<mobile_explorer.h>
-
#ifndefMOBILE_EXPLORER_HOST_XML_H
-
#defineMOBILE_EXPLORER_HOST_XML_H
- ME_DECLS_BEGIN
- MobileExplorer*mobile_explorer_host_xml_create();
- ME_DECLS_END
-
- #endif/*MOBILE_EXPLORER_HOST_XML_H*/
接口实现C文件(mobile_explorer_host_xml.c)
~~待续~~
分享到:
相关推荐
PHP项目开发全程实录代码
PHP项目开发实录-代码
Java项目开发全程实录-源代码.zip
android开发全程实录个章节源代码,全部齐全。
Python Web开发学习实录对应源代码
java项目开发全程实录PDF 和 代码全集
Java项目开发全程实录-源代码.rarJava项目开发全程实录-源代码.rarJava项目开发全程实录-源代码.rarJava项目开发全程实录-源代码.rar
C#项目开发全程实录源代码,这是书上的附带代码,应该说是比较有研究价值的。
C#项目开发全程实录(完整代码),绝对完整,欢迎下载共享。。。
PHP实力开发源码,包括数据库,配置,php项目开发全程实录源代码,适合学习PHP学习者,php项目开发全程实录源代码,php代码类资源
Java项目开发全程实录-源代码
asp.net项目开发全程实录asp.net项目开发全程实录asp.net项目开发全程实录asp.net项目开发全程实录asp.net项目开发全程实录asp.net项目开发全程实录asp.net项目开发全程实录asp.net项目开发全程实录asp.net项目开发...
明日科技《C#项目开发案例全程实录》(第二版) 源代码17个(12个例程+5个项目)
JAVA项目开发全程实录源代码, 初学者可以参考一下。
C#项目开发案例全程实录源代码C#项目开发案例全程实录源代码C#项目开发案例全程实录源代码C#项目开发案例全程实录源代码
php项目开发全程实录光盘源代码 DVD17小时语音视频详解 张仿彦 刘中华 杨丽 等编著
JAVA项目开发案例全程实录光盘源代码第一讲代码
Web服务开发学习实录(闫建强,王瑞敬编著)随书源代码
ASP.NET项目开发全程实录(源代码)包括随书光盘的所有案例源码 01供求信息网 02电子商务平台 03小区物业内部管理网 04图书馆管理系统 05企业办公自动化管理系统 06互动媒体学习社区 07在线考试网 08网上在线论坛 09...
教程名称:Android开发淘宝网手机客户端全程实录 视频教程课程目录:【】[Android应用实战淘宝网手机客户端全程实录(第一季)].MyTaoBao【】[Android应用实战淘宝网手机客户端全程实录(第一季)].MyTaoBao_final【】...