﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-socketref-随笔分类-C++/Boost/STL/Template</title><link>http://www.cppblog.com/socketref/category/459.html</link><description>opensource in my life!
Technical Engineer</description><language>zh-cn</language><lastBuildDate>Thu, 03 Jul 2008 18:48:51 GMT</lastBuildDate><pubDate>Thu, 03 Jul 2008 18:48:51 GMT</pubDate><ttl>60</ttl><item><title>WINCE 设置环境变量-系统加载路径</title><link>http://www.cppblog.com/socketref/archive/2008/07/04/55279.html</link><dc:creator>放屁啊狗</dc:creator><author>放屁啊狗</author><pubDate>Thu, 03 Jul 2008 17:24:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2008/07/04/55279.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/55279.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2008/07/04/55279.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/55279.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/55279.html</trackback:ping><description><![CDATA[{<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; TCHAR pText[] = _T("\\Windows\\0\\NandFlashPartition\\MediaLib\0\\Storage Card\\MediaLib\0\0");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; CString strText(pText,sizeof(pText));<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SaveMultString(HKEY_LOCAL_MACHINE,_T("Loader"),_T("SystemPath"),strText,sizeof(pText));<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DeleteKey(HKEY_LOCAL_MACHINE,_T("SOFTWARE\\sample\\PLAY"));<br>&nbsp;&nbsp;&nbsp; }<br><img src ="http://www.cppblog.com/socketref/aggbug/55279.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁啊狗</a> 2008-07-04 01:24 <a href="http://www.cppblog.com/socketref/archive/2008/07/04/55279.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>wxWidget的多语言</title><link>http://www.cppblog.com/socketref/archive/2008/07/04/55272.html</link><dc:creator>放屁啊狗</dc:creator><author>放屁啊狗</author><pubDate>Thu, 03 Jul 2008 17:19:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2008/07/04/55272.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/55272.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2008/07/04/55272.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/55272.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/55272.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: wxlocale 初始化字符语言种类&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; locale.Init(wxLANGUAGE_CHINESE );//&nbsp;&nbsp;&nbsp; locale.Init(wxLANGUAGE_FRENCH );&nbsp;&nbsp;&nbsp; wxLocale::AddCatalogLookupPathPrefix(wx...&nbsp;&nbsp;<a href='http://www.cppblog.com/socketref/archive/2008/07/04/55272.html'>阅读全文</a><img src ="http://www.cppblog.com/socketref/aggbug/55272.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁啊狗</a> 2008-07-04 01:19 <a href="http://www.cppblog.com/socketref/archive/2008/07/04/55272.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>函数char2Hex()</title><link>http://www.cppblog.com/socketref/archive/2008/06/23/54318.html</link><dc:creator>放屁啊狗</dc:creator><author>放屁啊狗</author><pubDate>Sun, 22 Jun 2008 16:58:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2008/06/23/54318.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/54318.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2008/06/23/54318.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/54318.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/54318.html</trackback:ping><description><![CDATA[string Char2Hex(char a)<br>{<br>&nbsp;&nbsp;&nbsp; string str = "";<br>&nbsp;&nbsp;&nbsp; int n = a;<br>&nbsp;&nbsp;&nbsp; for (int i=2*sizeof(char) - 1; i&gt;=0; i--)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str += "0123456789ABCDEF"[((n &gt;&gt; i*4) &amp; 0xF)];<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return str;<br>}<br><img src ="http://www.cppblog.com/socketref/aggbug/54318.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁啊狗</a> 2008-06-23 00:58 <a href="http://www.cppblog.com/socketref/archive/2008/06/23/54318.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>lua-快速阅读</title><link>http://www.cppblog.com/socketref/archive/2008/05/13/49689.html</link><dc:creator>放屁啊狗</dc:creator><author>放屁啊狗</author><pubDate>Mon, 12 May 2008 19:13:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2008/05/13/49689.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/49689.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2008/05/13/49689.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/49689.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/49689.html</trackback:ping><description><![CDATA[<br>table 是个怪物，有很多facets,类似array,map,struct,整个是个混合物，用起来也比较怪异。<br>t={1,2,3,a="gen",b=100}<br>t={[0]=1;["name"]="ultra"}<br>t.a, t.b , t[0] , t["name"]<br><br>表操作函数: <br>ipairs,pairs迭代函数<br>table.getn(t)&nbsp;&nbsp;  len of table<br><br>================================================================<br>function() 可以接受任意多的参数，如果实参数过多将丢弃，过少将默认设置为nil<br>同样可以返回多个参数<br>a,b=foo()<br><br>表作为参数传递到function<br>function rename( arg ) os.rename(arg.old,arg.new) end<br>rename{old="";new=""}<br><br>匿名函数(lambda in python )<br>foo = function(x) return x*2 end<br>局部函数 local f=function(x) ... end<br>================================================================<br>for n=start,end,step do ... end<br>while b do&nbsp;&nbsp; ... end<br>repeat do .... until<br><br>if then .. elseif then ...&nbsp; end;<br><br>有意思的语法表达式: <br>&nbsp;&nbsp;&nbsp; print a or b or c&nbsp;&nbsp; 如果a=false,尝试b...<br><br>注释: --&nbsp;&nbsp;&nbsp;&nbsp; --{ --}&nbsp; <br><br><br>字符串操作:&nbsp;&nbsp;&nbsp; .. 连接<br><br>==================================================<br>io 函数: <br>loadfile('test.lua')()&nbsp;&nbsp;&nbsp; execute external lua script<br>loadstring('print 100')()<br><br><br>代码测试: <br>=======================<br><span style="color: red;">c程序调用lua函数</span><br>c 程序:<br>void call_lua_func(){<br>&nbsp;&nbsp;&nbsp; lua_State *s = lua_open();<br>&nbsp;&nbsp;&nbsp; luaL_openlibs(s);<br>&nbsp;&nbsp;&nbsp; int c = lua_gettop(s);<br>&nbsp;&nbsp;&nbsp; luaL_dofile(s,"/nandflashpartition/test1.lua");<br>&nbsp;&nbsp;&nbsp; lua_getglobal(s,"add");<br>&nbsp;&nbsp;&nbsp; lua_pushnumber(s,0.25);<br>&nbsp;&nbsp;&nbsp; lua_pushnumber(s,8);<br>&nbsp;&nbsp;&nbsp; if( lua_pcall(s,2,1,0)){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; std::cout&lt;&lt; lua_tostring(s,-1)&lt;&lt;std::endl;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; double r;<br>&nbsp;&nbsp;&nbsp; r = lua_tonumber(s,-1);<br>&nbsp;&nbsp;&nbsp; lua_close(s);<br>}<br>lua程序:<br>function add(x,y)<br>&nbsp;&nbsp;&nbsp; return x*y<br>end<br>--------------------------------<br><span style="color: red;">lua访问c程序空间变量</span><br><br>1.定义变量student.h<br>extern char * gender;<br>extern int class_count;<br><br>2.创建pkg文件 student.pkg<br>$#include "student.h"<br>extern char * gender;<br>extern int class_count;<br><br>3.产生tolua++存根框架<br>tolua++ -o student.pkg<br><br>4.创建lua测试代码 call_c.lua<br>print(gender)<br>print(class_count)&nbsp; 访问c 空间的变量<br><br>5.c测试代码<br>char * gender;<br>int class_count;<br>void lua_call_c(){<br>&nbsp;&nbsp;&nbsp; int&nbsp; tolua_student_open (lua_State* tolua_S);<br>&nbsp;&nbsp;&nbsp; lua_State * s = lua_open();<br>&nbsp;&nbsp;&nbsp; luaopen_base(s);<br><br>&nbsp;&nbsp;&nbsp; gender ="my gender is male!";<br>&nbsp;&nbsp;&nbsp; class_count = 100;<br>&nbsp;&nbsp;&nbsp; tolua_student_open(s);<br>&nbsp;&nbsp;&nbsp; luaL_dofile(s,"/nandflashpartition/call_c.lua");<br>&nbsp;&nbsp;&nbsp; lua_close(s);<br>}<br><br>6.build &amp;&amp; test it!<br><br><br><br>   <img src ="http://www.cppblog.com/socketref/aggbug/49689.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁啊狗</a> 2008-05-13 03:13 <a href="http://www.cppblog.com/socketref/archive/2008/05/13/49689.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用 C 封装 串口数据协议，可用于流式传输</title><link>http://www.cppblog.com/socketref/archive/2007/02/23/18931.html</link><dc:creator>放屁啊狗</dc:creator><author>放屁啊狗</author><pubDate>Fri, 23 Feb 2007 14:54:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2007/02/23/18931.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/18931.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2007/02/23/18931.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/18931.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/18931.html</trackback:ping><description><![CDATA[#define OUT<br />#define INOUT<br />#define IN<br /><br />#define INIT_LIST_HEAD(x)    <br /><br />#define btsc_TRUE     0<br />#define btsc_FALSE    1<br />#define btsc_NULL     0<br /><br />struct list_head{<br />    struct list_head* prev,*next;<br />};<br /><br /><br />struct btsc_Property{<br />    char *         name;<br />    char *         value;        <br />};<br /><br /><br />struct btsc_Packet{<br />    /*struct list_head    list;*/<br />    struct btsc_Property**     properties; <br />    int                size;<br />    int                capacity;<br />    struct btsc_Context    *    ctx;<br />};<br /><br />struct btsc_Packet*     btsc_Packet_Alloc(struct btsc_Context* );<br />void                    btsc_Packet_Free(struct btsc_Packet*);<br /><br />struct btsc_Property*    btsc_Property_Alloc(struct btsc_Context* ,char * name,char * value);<br />void                    btsc_Property_Free(struct btsc_Property*);<br /><br /><br />struct btsc_Property*     btsc_Property_Get(struct btsc_Packet* packet,char * name);     <br />void                    btsc_Property_Append(struct btsc_Packet* packet,struct btsc_Property * );<br /><br /><br />struct btsc_Context{<br />    void (*tx)(struct btsc_Context*,unsigned char * data,int len);        <br />    int (*notifier)(struct btsc_Packet* packet);/*外部释放packet,返回NULL*/        <br />    int        packet_cached_size;<br />    int        recv_cached_capacity;                        <br />    char*    recv_buff;                                    <br />    int        recv_size;        <br />    void*    user;    // 外部数据传递                            <br />};<br /><br /><br />int     btsc_init(struct btsc_Context* IN ctx);    <br />void     btsc_cleanup(struct btsc_Context* IN ctx);<br />int        btsc_Pack(struct btsc_Context* IN ctx,struct btsc_Packet* packet,unsigned char * INOUT buff,int* INOUT size);    <br />void    btsc_Parse(struct btsc_Context* , char * data,int len);<br /><br /><br />#define BTSC_PACKET_BEGIN(ctx) {\<br />                                struct btsc_Context* _ctx_internel;\<br />                                struct btsc_Packet * _pkt ;\<br />                                _ctx_internel= (ctx);\<br />                                _pkt = btsc_Packet_Alloc(_ctx_internel);<br />                                <br />/* key is not suitable for vairable*/                                <br />#define BTSC_NEW_PROPERTY(key,value)    {\<br />                                            struct btsc_Property * _ppt =btsc_Property_Alloc(_ctx_internel,key,value);\<br />                                            btsc_Property_Append(_pkt,_ppt);\<br />                                        }<br />#define BTSC_PACKET_END()        btsc_Pack(_ctx_internel,_pkt,btsc_NULL,0);\<br />                                btsc_Packet_Free(_pkt);\<br />                                }<br /><br />#define BTSC_FOREACH(packet,ppt)    {\<br />                                    int n;\<br />                                    for(n=0;n&lt;packet-&gt;size;n++){\<br />                                        ppt = packet-&gt;properties[n];<br />#define BTSC_END_FOREACH()            }\<br />                                }<br /><br /><br /><br /><br /><br /><br /><br /><br />/*<br />    name:            btsc<br />                    serial communicating  with bluetooth and app-user<br />    desc:            pair parameter codec<br />    <br />        packet=[ key:name,...]<br />        <br />    implemented:     zhangbin ,  3 hours occupied<br />    date:            2007-01-26<br />*/<br /><br />#include &lt;stdio.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;string.h&gt;<br />#ifdef _UNIX<br />#include &lt;unistd.h&gt;<br />#endif<br />#include "btsc.h"<br /><br />#define PACKET_HEAD        '&lt;'<br />#define PACKET_TAIL        '&gt;'<br />#define PROPERTY_DELIMITER    ','<br />#define PAIR_DELIMITER        '='<br />#define ESCAPE_CHAR            '\\'<br /><br /><br />int calcEscapleLength(char * str);<br />char* escape_copy(char * dest,char * src);<br />void trim_escape_copy(char * dest,char * src,int size);<br />int  calcPacketLength(struct btsc_Packet* pkt);<br />int    is_escape_char(char c);<br />void parseProperty(struct btsc_Packet * pkt,char * s,char * e);<br />void parsePacket(struct btsc_Context* ctx,char * s,char* e);<br />char*     __memchr(char * s,char* e,char c);<br /><br />char escape_ch_table[]={PACKET_HEAD,PACKET_TAIL,PROPERTY_DELIMITER,PAIR_DELIMITER,ESCAPE_CHAR,'\0'};<br /><br />struct btsc_Packet*     btsc_Packet_Alloc(struct btsc_Context* ctx){    <br />    struct btsc_Packet * pt = malloc(sizeof(struct btsc_Packet));        <br />    pt-&gt;size = 0;<br />    pt-&gt;capacity = ctx-&gt;packet_cached_size;<br />    pt-&gt;properties=malloc(pt-&gt;capacity*sizeof(struct btsc_Property*));    <br />    pt-&gt;ctx = ctx;<br />    return pt;    <br />}<br /><br />void    btsc_Packet_Free(struct btsc_Packet* pt){    <br />    struct btsc_Property** tmp;<br />    if( !pt )     return ;<br />    tmp = pt-&gt;properties;<br />    while(pt-&gt;size--){<br />        btsc_Property_Free(*tmp++);                <br />    }        <br />    if( pt-&gt;properties){<br />        free(pt-&gt;properties);  <br />    }<br />    free(pt);<br />}<br /><br /><br />struct btsc_Property*    btsc_Property_Alloc(struct btsc_Context* ctx,char * name,char * value){<br />    struct btsc_Property * ppt;<br />    printf("enter btsc_Property_Alloc()\n");<br />    ppt = malloc( sizeof( struct btsc_Property) );<br />    if(!ppt)    printf("error: malloc failed (s1)\n");<br />    ppt-&gt;name = malloc( strlen(name)+1);<br />    if( !ppt-&gt;name ) printf("error: malloc failed (s2)\n");<br />    strcpy(ppt-&gt;name,name);    <br />    ppt-&gt;value = malloc( strlen(value)+1);<br />    if( !ppt-&gt;value) printf("error: malloc failed (s3),str:%s, len: %d\n",value,strlen(value)+1);<br />    strcpy( ppt-&gt;value,value);<br />    return ppt;<br />}<br /><br />void        btsc_Property_Free(struct btsc_Property* ppt){<br />    if( !ppt )    return;<br />    free( ppt-&gt;name);<br />    free( ppt-&gt;value);<br />    free( ppt);<br />}<br /><br />/* scan pointer array */<br />struct btsc_Property*     btsc_Property_Get(struct btsc_Packet* pkt,char * name){<br />    int size;<br />    struct btsc_Property* ppt;<br />    size = pkt-&gt;size;<br />    while(size--){<br />        ppt = pkt-&gt;properties[size];<br />        if( !strcmp( name, ppt-&gt;name ) ){<br />            return ppt;/*that's ok */<br />        }<br />    }<br />    return btsc_NULL;<br />}<br /><br />/* low effeciency, memory allocation,more costs*/<br />void    btsc_Property_Append(struct btsc_Packet* pt,struct btsc_Property * ppt){<br />    struct btsc_Property** tmpppt;<br />    if( pt-&gt;size==pt-&gt;capacity){         <br />        pt-&gt;capacity += pt-&gt;ctx-&gt;packet_cached_size;    <br />        tmpppt = pt-&gt;properties;        <br />        pt-&gt;properties = malloc( pt-&gt;capacity * sizeof( struct btsc_Property**) ); <br />        memcpy( pt-&gt;properties, tmpppt, pt-&gt;size * sizeof( struct btsc_Property**));<br />        free( tmpppt); <br />    }<br />    pt-&gt;properties[pt-&gt;size++]=ppt;    <br />}<br /><br />int     btsc_init(struct btsc_Context* ctx){    <br />    ctx-&gt;packet_cached_size = 10;    <br />    if( ctx-&gt;recv_cached_capacity==0){<br />        ctx-&gt;recv_cached_capacity = 1024*2;    <br />    }<br />    ctx-&gt;recv_buff = malloc( ctx-&gt;recv_cached_capacity );<br />    ctx-&gt;recv_size = 0;<br />    return btsc_TRUE;<br />}<br /><br />void     btsc_cleanup(struct btsc_Context* ctx){<br />    free(ctx-&gt;recv_buff);    <br />}<br /><br />/*<br />**    name:    calcEscapleLength<br />**    desc:    计算含转义字符串长度<br />*/<br />int     calcEscapleLength(char * str){<br />    int len;<br />    char * pesc;<br />    len = 0;    <br />    while( *str ){<br />        pesc = escape_ch_table;<br />        while( *pesc ){<br />            if( *pesc==*str){<br />                len++;<br />                break;<br />            }<br />            pesc++;<br />        }        <br />        str++; <br />    }    <br />    return len;<br />}<br /><br /><br />char* escape_copy(char * dest,char * src){<br />    char * pesc;<br />    while( *src ){<br />        pesc = escape_ch_table;<br />        while( *pesc ){<br />            if( *pesc==*src){<br />                *dest++=ESCAPE_CHAR;<br />                break;<br />            }<br />            pesc++;<br />        }<br />        *dest++=*src++;                <br />    }    <br />    return dest;    <br />}<br /><br />void trim_escape_copy(char * dest,char * src,int size){<br />    int last_escape = btsc_FALSE;<br />    while( size--){<br />        if( *src == ESCAPE_CHAR &amp;&amp; last_escape != btsc_TRUE){        <br />            last_escape = btsc_TRUE    ;<br />            src++;<br />            continue;<br />        }<br />        last_escape = btsc_FALSE;<br />        *dest++=*src++;        <br />    }<br />}<br /><br />int       calcPacketLength(struct btsc_Packet* pkt){<br />    int len;<br />    int size;<br />    struct btsc_Property* ppt;    <br />    len = 0;<br />    size = pkt-&gt;size;<br />    while( size--){<br />        ppt = pkt-&gt;properties[size];    <br />        len+=strlen(ppt-&gt;name)+strlen(ppt-&gt;value);    <br /><br />        len+= calcEscapleLength(ppt-&gt;name);<br />        len+= calcEscapleLength(ppt-&gt;value);    <br />    }<br />    len+= pkt-&gt;size*2+1; <br />    return  len;<br />}<br /><br /><br />int        btsc_Pack(struct btsc_Context*  ctx,struct btsc_Packet* pkt,unsigned char * obuff,int* osize){<br />    struct btsc_Property* ppt;<br />    int size;<br />    int len;<br />    unsigned char * buff;<br />    char * pbuff;<br />    len = calcPacketLength( pkt);<br />    buff = malloc( len );<br />    size = pkt-&gt;size;<br />    pbuff = (char*)buff;<br />    *pbuff++=PACKET_HEAD;    <br />    while( size--){<br />        ppt = pkt-&gt;properties[size];    <br />        pbuff = escape_copy(pbuff,ppt-&gt;name);<br />        *pbuff++=PAIR_DELIMITER;<br />        pbuff = escape_copy(pbuff,ppt-&gt;value);<br />        if( size ){<br />            *pbuff++=PROPERTY_DELIMITER;            <br />        }<br />    }<br />    *pbuff = PACKET_TAIL;<br />    if( ctx-&gt;tx ){<br />        ctx-&gt;tx(ctx,buff,len);<br />    } <br />    if( obuff &amp;&amp; *osize &gt;=len){<br />        memcpy( obuff, buff ,len);<br />        *osize = len;<br />    }<br /><br />    free(buff);<br />    return btsc_TRUE;    <br />}<br /><br />/* e not in range*/<br />char*     __memchr(char * s,char* e,char c){<br />    while( s!=e){<br />        if( *s == c){<br />            return s;<br />        }        <br />        s++;<br />    }<br />    return btsc_NULL;<br />}<br /><br />int        is_escape_char(char c){<br />    return btsc_FALSE;    <br />}<br /><br />/*<br />    name: parseProperty<br />    desc: 指定内存范围中提取属性  key=&gt;value<br />        搜索包含e<br />    params:    <br />        pkt    --    消息数据包<br />        s    --    起始内存地址 <br />        e    --    结束地址 ,<br />*/<br />void parseProperty(struct btsc_Packet * pkt,char * s,char * e){<br />    char * p1,*p2;<br />    int n;<br />    struct btsc_Property*    ppt;<br />    p1 = s ;<br />    p2 = e;<br />__REPEAT:    <br />    p1 = __memchr(p1,e+1,PAIR_DELIMITER);<br />    if( p1 ){<br />        if( *(p1-1) == ESCAPE_CHAR ){<br />            p1++;<br />            goto __REPEAT;<br />        }<br />        ppt = malloc( sizeof( struct btsc_Property ));<br />        n = p1-s;         <br />        ppt-&gt;name = malloc( n+1 );<br />        memset(ppt-&gt;name,0,n+1);        <br />        trim_escape_copy(ppt-&gt;name,s,n);<br />        <br />        n =e-p1;<br />        ppt-&gt;value = malloc( n+1);<br />        memset(ppt-&gt;value,0,n+1);<br />        trim_escape_copy(ppt-&gt;value,p1+1,n);<br />        <br />        btsc_Property_Append(pkt,ppt);<br />    }<br />}<br /><br />/*<br />    name: parsePacket<br />    desc:    分解指定内存到包结构<br />            成功分解出包立刻回送到应用接收者 ( btsc_Context::notifier)<br />    param:<br />        s,e     内存地址 (处e)<br /><br />** 缓冲区还需进一步测试,包括缓冲区大小调节, 不完整协议包格式的容错<br />*/<br />void     parsePacket(struct btsc_Context* ctx,char * s,char* e){<br />    char *p,*p1,*p2;<br />    struct btsc_Packet * pkt;<br />    if( e-s &lt;=1 ){<br />        return ;<br />    }<br />    pkt = btsc_Packet_Alloc(ctx);<br />    <br />    p1 = s+1;<br />    p2 = e-1;<br />    p = p1;<br />__REPEAT:    <br />    p = __memchr(p,e,PROPERTY_DELIMITER);<br />    if( p ){<br />        if( *(p-1)==ESCAPE_CHAR){<br />            p = p+1;<br />            goto __REPEAT;<br />        }<br />        parseProperty(pkt,p1,p-1);<br />        p1 = ++p;<br />        goto __REPEAT;<br />    }<br />    /*allow one property reside in*/<br />    parseProperty(pkt,p1,e-1);<br />    if( ctx-&gt;notifier ){<br />        if(ctx-&gt;notifier(pkt)){ /* nonzero value， delete internal*/<br />            btsc_Packet_Free(pkt);            <br />        }<br />    }else{<br />       btsc_Packet_Free(pkt);    <br />    }<br />}<br /><br />void    btsc_Parse(struct btsc_Context* ctx, char * data,int size){<br />    int len ;<br />_RESTART:<br />    while( size ){<br />        len = ctx-&gt;recv_cached_capacity - ctx-&gt;recv_size;<br />        if( len &gt;0){ <br />            if( size &lt;= len){<br />                len = size;<br />                size = 0;<br />            }else{<br />                size-=len;<br />            }<br />            memcpy( ctx-&gt;recv_buff+ctx-&gt;recv_size,data,len);<br />            ctx-&gt;recv_size+=len;<br />            data+=len;<br />        }    <br />        <br />        {<br />            char * p1,*p2;            <br />_RESCAN:            <br />            p1 = ctx-&gt;recv_buff;<br />_RESCAN_HEAD:             <br />            p1 = __memchr(p1,ctx-&gt;recv_buff+ctx-&gt;recv_size,PACKET_HEAD);            <br />            if( !p1 ){ <br />                ctx-&gt;recv_size =0;<br />                if( size ){<br />                    goto _RESTART;<br />                }<br />            }<br />            if( p1&gt;ctx-&gt;recv_buff &amp;&amp; *(p1-1)==ESCAPE_CHAR){ /* "\&lt;" */<br />                p1++;<br />                goto _RESCAN_HEAD;    <br />            }<br />            <br />            /*move backward*/<br />            ctx-&gt;recv_size -=(p1-ctx-&gt;recv_buff);<br />            memmove(ctx-&gt;recv_buff,p1, ctx-&gt;recv_size);<br />            p1=ctx-&gt;recv_buff;<br />            p2 = p1+1;<br />_RESCAN_TAIL:            <br />            p2 = __memchr(p2,ctx-&gt;recv_buff+ctx-&gt;recv_size,PACKET_TAIL);<br />            if( !p2 ){<br />                if( ctx-&gt;recv_size == ctx-&gt;recv_cached_capacity ){<br />                    ctx-&gt;recv_size  = 0; <br />                }<br />                goto _RESTART;<br />            }<br />            if( *(p2-1) == ESCAPE_CHAR ){<br />                p2++;<br />                goto _RESCAN_TAIL;    <br />            }<br />            <br />            parsePacket(ctx,p1,p2);<br />            ctx-&gt;recv_size -=p2-p1+1;<br />            if( ctx-&gt;recv_size ){<br />                memmove(ctx-&gt;recv_buff,p2+1,ctx-&gt;recv_size);<br />                goto _RESCAN; <br />            }             <br />        }        <br />    }<br />}<br /><br />/*   debug */<br />#ifdef _DEBUGX<br />void tx(unsigned char * data,int len);<br />void notifier(struct btsc_Packet* packet);<br />/*初始化上下文， tx=发送处理函数,notifier=接收函数*/<br />struct btsc_Context c={tx:tx,notifier:notifier};<br /><br />/*测试数据接收并解析*/<br />void rx(){    <br />     char * msg="&lt;MSG=HELLO,NAME=SCOTT&gt;"<br />                 "&lt;MSG2=HELLO2,NAME2=SCOTT2&gt;"<br />                 "&lt;MSG3=HELLO3,NAME3=SCOTT3&gt;"; /*simulating data*/<br />    int len = strlen(msg);<br />    btsc_Parse(&amp;c,msg,len);<br />}<br />/*发送处理过程*/<br />void tx(unsigned char * buff,int len){    <br />    char *outmsg = malloc(1024*10);<br />    memset(outmsg,0,1024*10);<br />    memcpy(outmsg,buff,len);<br />    printf("encode str: %s\n",outmsg);<br />    free(outmsg);<br />    btsc_Parse(&amp;c,buff,len);<br />}<br /><br />void notifier(struct btsc_Packet* packet){<br />    struct btsc_Property * ppt;<br />    ppt = btsc_Property_Get(packet,"MSG");<br />    if(ppt)<br />        printf("property get: MSG=&gt;%s\n",ppt-&gt;value);<br />    /*遍历包内属性参数*/<br />    BTSC_FOREACH(packet,ppt);<br />    printf("packet: %s=&gt;%s\n",ppt-&gt;name,ppt-&gt;value);<br />    BTSC_END_FOREACH();<br />}<br /><br />int main(){<br />    int r;<br />    /*optional*/<br />    c.recv_cached_capacity = 1024; /*初始化接收缓冲区大小 byte*/<br />    c.packet_cached_size = 5;    /*消息包缓冲属性个数*/<br />    btsc_init(&amp;c);            /*上下文初始化*/<br />    puts("test rx()...");<br />    rx();    /*接*/<br />    puts("escape testing...");    <br />    do{<br />        /*构造消息包,并完成发送*/<br />        BTSC_PACKET_BEGIN(&amp;c);<br />        BTSC_NEW_PROPERTY("MSG","calling");<br /><br />        BTSC_PACKET_END();    <br />        usleep(1000*50);<br />        printf("&gt;&gt;seq:%d\n",r);<br />    }while(0);<br />        <br />    btsc_cleanup(&amp;c);    <br />    <br />    return 0;<br />}<br /><br /><br />#endif<br /><br /><img src ="http://www.cppblog.com/socketref/aggbug/18931.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁啊狗</a> 2007-02-23 22:54 <a href="http://www.cppblog.com/socketref/archive/2007/02/23/18931.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>随便写个 线程类 玩玩</title><link>http://www.cppblog.com/socketref/archive/2007/02/23/18930.html</link><dc:creator>放屁啊狗</dc:creator><author>放屁啊狗</author><pubDate>Fri, 23 Feb 2007 14:47:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2007/02/23/18930.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/18930.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2007/02/23/18930.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/18930.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/18930.html</trackback:ping><description><![CDATA[#ifndef _BT_THREAD_H<br />#define _BT_THREAD_H<br /><br />#include &lt;windows.h&gt;<br /><br />class btworkThread{<br />public:<br />    btworkThread( void(*entry)(btworkThread* ,void*),void* user){        <br />        _entry = entry;        <br />        _param = user;<br />        _thandle = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)btworkThread::run,user,NULL,&amp;_tid);<br />    }<br />    void    stop(){<br />        _loop = false;<br />    }<br />    void    wait(){<br />        while(!_end){<br />            Sleep(20);<br />        }<br />        Sleep(20);  // ensure that thread has terminated<br />    }<br />    void    stopAndWait(){<br />        stop();wait();<br />    }<br />    bool    loop(){<br />        return _loop;<br />    }<br />    void    code_begin(){<br />        _loop = true; _begin = true;_end=false;<br />    }<br />    void    code_end(){<br />        _loop = false; _begin = false;_end=true;<br />        CloseHandle(_thandle);<br />    }<br />protected:<br />    static void    run(btworkThread* thread){<br />        thread-&gt;_entry(thread,thread-&gt;_param);<br />    }<br />private:<br />    volatile bool    _loop,_begin,_end;<br />    void (*_entry)(btworkThread* ,void*);<br />    void*    _param;<br />    DWORD    _tid;<br />    HANDLE    _thandle;<br />};<img src ="http://www.cppblog.com/socketref/aggbug/18930.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁啊狗</a> 2007-02-23 22:47 <a href="http://www.cppblog.com/socketref/archive/2007/02/23/18930.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>闲来无事，写个智能指针类 玩玩</title><link>http://www.cppblog.com/socketref/archive/2007/02/23/18929.html</link><dc:creator>放屁啊狗</dc:creator><author>放屁啊狗</author><pubDate>Fri, 23 Feb 2007 14:39:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2007/02/23/18929.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/18929.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2007/02/23/18929.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/18929.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/18929.html</trackback:ping><description><![CDATA[    #include "btMutex.h"<br /><br />template &lt;typename T&gt;<br />class SmartHandlePtr{<br />    struct Handle{<br />        Handle(){<br />            ptr = NULL;<br />            cnt = 0;<br />        }<br />        void*    ptr;<br />        int        cnt;<br />        btLock    lock;<br />        void    inc(){<br />            btScopeLock sl(lock);<br />            cnt++;<br />        }<br />        void    dec(){<br />            btScopeLock sl(lock);<br />            cnt--;<br />        }<br />    };<br />public:<br />    SmartHandlePtr(const T* p){<br />        _ph = new Handle;<br />        _ph-&gt;ptr =(void*) p;<br />        _ph-&gt;inc();<br />    }<br /><br />    ~SmartHandlePtr(){<br />        if( _ph ){<br />            _ph-&gt;dec();<br />            if( _ph-&gt;cnt==0){<br />                T* p;<br />                p = (T*)_ph-&gt;ptr;<br />                if( p ){<br />                    delete p;<br />                }<br />                delete _ph;<br />            }            <br />        }<br />    }<br /><br />    SmartHandlePtr(const SmartHandlePtr&amp; shp){<br />        if( _ph ){<br />            _ph-&gt;dec();<br />            if( _ph-&gt;cnt==0){<br />                T* p;<br />                p = (T*)_ph-&gt;ptr;<br />                if( p){<br />                    delete p;<br />                }<br />                delete _ph;<br />            }            <br />        }<br />        _ph = _ph;<br />        _ph-&gt;inc();<br />    }<br />    bool operator==(const T* p) {<br />        return _ph-&gt;ptr == p;<br />    }<br />    bool operator==(const SmartHandlePtr&amp; shp){<br />        return _ph == shp._ph;<br />    }<br /><br />    T* operator-&gt;(){<br />        return (T*)_ph-&gt;ptr;<br />    }<br /><br />    T* get(){<br />        if( _ph &amp;&amp; _ph-&gt;ptr){<br />            return (T*)_ph-&gt;ptr;<br />        }<br />        return NULL;<br />    }<br /><br />private:<br />    Handle*    _ph;<br />};<br /><img src ="http://www.cppblog.com/socketref/aggbug/18929.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁啊狗</a> 2007-02-23 22:39 <a href="http://www.cppblog.com/socketref/archive/2007/02/23/18929.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>