青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

socketref,再見!高德

https://github.com/adoggie

  C++博客 :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
  246 Posts :: 4 Stories :: 312 Comments :: 0 Trackbacks

常用鏈接

留言簿(54)

我參與的團(tuán)隊(duì)

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

#

在移植glib到wince環(huán)境時(shí),發(fā)現(xiàn)wince的c runtime library不包含很多庫(kù)函數(shù),諸如 bsearch() 半則搜索法,其用法有點(diǎn)像 std::bind2nd(),
費(fèi)了點(diǎn)時(shí)間將其刨了出來(lái),相信對(duì)有些人有用

 1 void * bsearch(
 2          const void *key,
 3         const void *base0,
 4         size_t nmemb,
 5          size_t size,
 6          int (*compar)(const void *const void *)) {
 7 
 8          const char *base = base0;
 9          size_t lim;
10          int cmp;
11          const void *p;
12 
13         for (lim = nmemb; lim != 0; lim >>= 1) {
14                 p = base + (lim >> 1* size;
15                 cmp = (*compar)(key, p);
16                 if (cmp == 0)
17                         return ((void *)p);
18                 if (cmp > 0) {  /* key > p: move right */
19                         base = (char *)p + size;
20                         lim--;
21                 }               /* else move left */
22         }
23         return (NULL);
24 }


posted @ 2008-05-07 01:33 放屁阿狗 閱讀(760) | 評(píng)論 (1)編輯 收藏

代碼很容易閱讀,以前做藍(lán)牙項(xiàng)目時(shí)用戶電話本搜索只用


static public string GetChineseSpell(string strText)
{
int len = strText.Length;
string myStr 
= "";
for(int i=0;i<len;i++)
{
myStr 
+= getSpell(strText.Substring(i,1));
}
return myStr;
}

static public string getSpell(string myChar)
{
byte[] arrCN = System.Text.Encoding.Default.GetBytes(myChar);
if(arrCN.Length > 1)
{
int area = (short)arrCN[0];
int pos = (short)arrCN[1];
int code = (area<<8+ pos;
int[] areacode = {45217,45253,45761,46318,46826,47010,47297,47614,48119,48119,49062,49324,49896,50371,50614,50622,50906,51387,51446,52218,52698,52698,52698,52980,53689,54481};
for(int i=0;i<26;i++)
{
int max = 55290;
if(i != 25) max = areacode[i+1];
if(areacode[i]<=code && code<max)
{
return System.Text.Encoding.Default.GetString(new byte[]{(byte)(65+i)});
}
}
return "*";
}
else return myChar;
}


posted @ 2008-05-07 01:28 放屁阿狗 閱讀(2087) | 評(píng)論 (4)編輯 收藏

    昨天接到the9的人事mm的電話通知今天去公司面試,職位大概是開發(fā)崗位
這些年來(lái)也一直沒有面試的經(jīng)歷,閑在家里沒事所以今天就去看看。
the9.com =>張江高科技園區(qū)碧波路690號(hào)3號(hào)樓,google了一下具體位置,帶了個(gè)導(dǎo)航儀開著桑哥走了。
外環(huán)比較擁擠,25公里開了45分鐘便到了碧波路,一個(gè)大拐就進(jìn)了690號(hào),接著一個(gè)小拐又一個(gè)大拐,直接將車停就進(jìn)了車位,"技術(shù)不錯(cuò),可以打9.9分"。
    the9也算是有點(diǎn)財(cái)力和規(guī)模,整個(gè)一片都是the9公司。
剛想推門下車,一個(gè)保安馬上上來(lái),我想這個(gè)服務(wù)到是周到。"先生,這里不能停車,這是我們老板的車位". 奶奶的,確實(shí)邊上不是BMW就是A6之類的車子,仔細(xì)一看,確實(shí)車位上都有具體的車牌。一不小心把車停到the9老板 家了。接著就倒車,7拐八拐 找了個(gè)日光浴的位置。
來(lái)到the9的前臺(tái),說(shuō)是要做題,領(lǐng)了份考卷就去2號(hào)會(huì)議室。
    里面有2人,各一男女,沒多時(shí)便走了,過(guò)了半小時(shí)又進(jìn)來(lái)一位做題,看上去比我是年輕多了。
開始做題,好久沒被面試了,有點(diǎn)興奮。某些題目回答的太細(xì)且考慮過(guò)多,磨磨蹭蹭也搞了一個(gè)小時(shí),看了下鐘點(diǎn)15:30了。
接著等人來(lái)?yè)莆胰フ?,等?0分鐘也沒人來(lái),所以就踱到前臺(tái)交予前臺(tái)mm(長(zhǎng)得不錯(cuò)哦)。然后我繼續(xù)等,約莫20來(lái)分鐘mm叫我,我便跟一個(gè)叫陳國(guó)*的Man去面試,陳**帶我繞了幾條走廊,那個(gè)走路的速度真是超級(jí)的慢,居然是我走在他前面,有點(diǎn)受不了。
    進(jìn)了一會(huì)議室,陳**不知為何一下子沒開口,瞬即拿出筆在白板上寫了起來(lái)。
    "你現(xiàn)在做個(gè)題目哦,題目是這樣的:1000~10000里面的4位平方數(shù)你給我找出來(lái),數(shù)字的規(guī)則是 abcd, a=b c=d,我現(xiàn)在有個(gè)其他面試,過(guò)5分鐘我再來(lái)",奶奶的,居然還讓我做題,而且是這種小學(xué)生做的題目。說(shuō)完陳Man就走了,真是來(lái)氣,起來(lái)我也轉(zhuǎn)身離開了the.com。
做了這么些年的開發(fā),本來(lái)以為面試會(huì)跟我聊一下系統(tǒng)的架構(gòu),opensource,通信技巧,看了我的簡(jiǎn)歷也不應(yīng)該當(dāng)成應(yīng)屆畢業(yè)生來(lái)對(duì)待啊,一些考官就是喜歡在面試過(guò)程中夾雜一些自己的小聰明搞一些旁門做到的東西,想想過(guò)去我做考官也不是這個(gè)樣子的,還是比較對(duì)人尊重的,這么大的一個(gè)公司讓面試的人左等右等,感覺這是不這么的好。
    記得一個(gè)mm說(shuō)的好,說(shuō)是老板與員工不存在地位的差別,雇傭和被雇工是建立在平等的基礎(chǔ)上的合作關(guān)系。
    想到了 蓋茨關(guān)于他的車位總是被員工占用,及員工總是跟蓋茨借錢的故事;想到了以前一位博士領(lǐng)導(dǎo)整天給老總安裝office的事情
    中國(guó)人骨子里還是比較官僚的,階級(jí)感比較強(qiáng)烈,老板永遠(yuǎn)是老板,是上帝,打工的就是一條狗。
    不過(guò)我對(duì)狗這個(gè)字眼不感冒,我就是一條狗,但是是條有尊嚴(yán)的狗。
    the9對(duì)其現(xiàn)在不這么感興趣了,林子大了啥鳥都有,還是老實(shí)在家呆著。
    the9的考題對(duì)于開發(fā)者的還是有點(diǎn)用的,憑著有點(diǎn)記憶的腦子回想一下考題,大致如下:

1.是非題: 10題  具體記不清楚了
2.解釋:
    const 的作用(2種以上)
    數(shù)據(jù)與鏈表的差異和作用
    純虛函數(shù),重載的區(qū)別和作用

3.改錯(cuò)并解釋:
  1. void getmemory( char * p){
          p = new char[20];
     }
     main(){
       char *str;
        getmemory(str);
       strcpy(str,"hello");
    }
  2. char * getmemory(){
       char buf[]="ssssssssssssssss";
       return buf;
    }
    main(){
       sprintf(buf,"%d",100);
       printf( buf);
    }

4.編寫函數(shù):
    1. strcmp
    int strcmp( char * s1,char * s2 ){
    }

    2. strstr
    // return pointer if s2 found in s1,else return NULL
    char * strstr(char* s1,char* s2){
    }

    3. void compress(char * in,char * out)
    要求:    
            in          out
            abc         abc
          aaabbbccc     a2b2c2

    5. 實(shí)現(xiàn)以下類成員函數(shù)并解釋
        class String(){
          String(char* s=NULL);
          String( const String & other);
          String & operator+=(const String &other);
          bool operator==(const String & other );
          operator double();
        };
    6. 鏈表倒置
       struct listNode{
          struct listNode * next;
          int data;
        }  
       返回列表頭節(jié)點(diǎn)
        listNode * reverse(listNode * head){
       }
      
這些題基本上是能考核一個(gè)c/cpp開發(fā)人員的基本技術(shù)能力的

posted @ 2008-05-06 20:16 放屁阿狗 閱讀(6002) | 評(píng)論 (68)編輯 收藏


return true if equal

 1 bool strcmp( char* d,char * s){
 2     if( d==s) return true;
 3     while*d==*&& *&& *s){
 4         d++;s++;
 5     }
 6     if*d==*&& *d==0){
 7         return true;
 8     }
 9     return false;
10 }


posted @ 2008-05-05 02:57 放屁阿狗 閱讀(4072) | 評(píng)論 (15)編輯 收藏

     摘要: 經(jīng)常會(huì)在編寫流驅(qū)動(dòng)接口的時(shí)候必須實(shí)現(xiàn)一系列的接口,諸如 xxx_init,xxx_open,xxx_write等等,某些接口函數(shù)雖然無(wú)需功能的實(shí)現(xiàn)但也必須定義一個(gè)空的函數(shù)接口。由于多年的c++思路,利用虛函數(shù)(virtual)和重載(override)把這些驅(qū)動(dòng)的實(shí)現(xiàn)封裝起來(lái),來(lái)簡(jiǎn)化代碼量。程序的實(shí)現(xiàn),采用了兩種方式: 宏定義和類繼承希望對(duì)編寫wince 流驅(qū)動(dòng)的開發(fā)人員有所幫助 Code hi...  閱讀全文
posted @ 2008-05-05 02:15 放屁阿狗 閱讀(2124) | 評(píng)論 (0)編輯 收藏

目前已經(jīng)完成移植的開源項(xiàng)目列表:
    cairo.dll        
    zlib1_2_3.lib
   cairomm.lib
   expat_wince.dll
   expat_wince.lib
   fontconfig-lib.lib
   freetype235.lib
   gdkpixbuf.dll
   glib-lite.lib
   gmodule.lib
   gobject.lib
   gthread.lib
   iconv.dll
   iconv.lib
   jpeg.lib
   libsigc++.lib
   libtinyxpath.lib
   libxml_ce.dll
   libxml_ce.lib
   mini-fribidi.lib
   opentype.lib
   pango1.18.dll
   pango1.18.lib
   pangocairo.lib
   pangoft2.lib
   papyrus0.7.1.lib
   png1.2.8.dll
   png1.2.8.lib
   zlib1_2_3.dll
   wxWidgets

未完成的移植內(nèi)容:
    librsvg
    wxLua

posted @ 2008-05-05 01:55 放屁阿狗 閱讀(2608) | 評(píng)論 (5)編輯 收藏

Fontconfig 2.5.0

 

 

Cairo依賴Fontconfig部分,但未見其起初的時(shí)候調(diào)用fontconfig的初始化函數(shù),諸如FcInit().

Fontconfig代碼有WIN32條件編譯的宏,且預(yù)定義了DllMain()入口,但也未調(diào)用FcInit()

 

Fontconfig要移植到wince,必須處理內(nèi)部諸多的單字節(jié)與寬字符轉(zhuǎn)換問(wèn)題

 

 

Fontconfig將字體文件cached的過(guò)程就是將字體文件映射到內(nèi)存地址空間

 

 

FontConfig 設(shè)有字體目錄(font-dir),緩沖目錄(cache-dir),配置目錄(font-dir)

Cache-dir目錄存放字體緩沖文件 ?????-x86- cache2,緩沖文件被mmap進(jìn)內(nèi)存

每個(gè)font目錄都將創(chuàng)建一個(gè)cache文件,存放于cache-dir

 

Cache文件內(nèi)存放一個(gè)字體目錄下(font-dir)所有字體的pattern信息集合和基本的FcCache對(duì)象的控制信息,系統(tǒng)掃描完字體之后的信息存于FcSerialize對(duì)象,之后綁定到FcCache對(duì)象,之后將FcCache對(duì)象及其關(guān)聯(lián)的數(shù)據(jù)全部寫入本地文件cache-file

之后在加載cache-file時(shí)通過(guò)FcDirCacheMapHelper()->FcDirCacheMapFd()cache-file進(jìn)行mmap映射到虛擬地址空間,采用mmap方式可以允許多個(gè)進(jìn)程同時(shí)訪問(wèn)這些字體信息。

 

系統(tǒng)初始化時(shí)FcInit()檢測(cè)cache文件是否存在(文件鎖控制),不存在則掃描字體目錄創(chuàng)建緩沖文件(一個(gè)字體目錄對(duì)應(yīng)一個(gè)緩沖文件);否則打開緩沖文件并映射進(jìn)入本地進(jìn)程的地址空間(mmap),其起始地址被轉(zhuǎn)換為FcCache*對(duì)象返回

 

如果字體目錄下存在子目錄,在生成的信息存放在FcCache::dirs

 

FcSerialize過(guò)程

將不同類型的Fcxxxx對(duì)象序列化轉(zhuǎn)儲(chǔ)時(shí),先將對(duì)象結(jié)構(gòu)信息專儲(chǔ),對(duì)象內(nèi)的指針指向的對(duì)象也進(jìn)行轉(zhuǎn)儲(chǔ)到對(duì)象頭信息之后,其位置由對(duì)象頭結(jié)構(gòu)內(nèi)的intptr_t變量指定。

例如:

struct _FcCache {

    int           magic;            /* FC_CACHE_MAGIC_MMAP or FC_CACHE_ALLOC */

    int           version;       /* FC_CACHE_CONTENT_VERSION */

    intptr_t    size;            /* size of file */

    intptr_t    dir;             /* offset to dir name */

    intptr_t    dirs;            /* offset to subdirs */

    int           dirs_count;         /* number of subdir strings */

    intptr_t    set;             /* offset to font set */

    int           mtime;               /* low bits of directory mtime */

};

FcCache對(duì)象結(jié)構(gòu)信息先被serialize, intptr_t變量指向的附屬數(shù)據(jù)所在位置(本對(duì)象的當(dāng)前偏移量)

struct _FcPattern {

    int               num;

    int               size;

    intptr_t        elts_offset;

    int               ref;

};

typedef struct _FcPatternElt {

    FcObject        object;

    FcValueList            *values;

} FcPatternElt;

每個(gè)FcPattern由若干個(gè)FcPatternElt組成FcPatternElt的數(shù)組的首地址與FcPattern對(duì)象地址的差值作為偏移量存儲(chǔ)在FcPattern::elts_offset

 

 

Fonts.conf

可以禁用部分字體或者啟用字體(字體目錄)

{ "acceptfont",       FcElementAcceptfont },

{ "rejectfont", FcElementRejectfont },

如果沒有定義acceptfontrejectfont,則默認(rèn)都是acceptfont的,所以<dir>font-dir</dir>默認(rèn)是允許的

 

每個(gè)字體文件通過(guò)freetype進(jìn)行訪問(wèn),當(dāng)在font目錄下掃描字體文件是,將讀取若干個(gè)patterns

 

FcSerialize FcSerializeBucket存儲(chǔ)

 

SystemFont or ApplicationFont

不同字體被登記在不同類別的字體集合中管理

 

 

FcSerializebucket不能超過(guò) 8k個(gè),字體文件也不能過(guò)8k個(gè),每個(gè)字體文件名置入bucket

 

 

/**

 * container_of - cast a member of a structure out to the containing structure

 *

 * @ptr:  the pointer to the member.

 * @type:       the type of the container struct this is embedded in.

 * @member: the name of the member within the struct.

 *

 */

#define container_of(ptr, type, member) ({                \

        const typeof( ((type *)0)->member ) *__mptr = (ptr);       \

        (type *)( (char *)__mptr - offsetof(type,member) );})

#define list_entry(ptr, type, member) \

       container_of(ptr, type, member)

 

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

 

Example:

struct user_struct *user;

user = list_entry(up, struct user_struct, uidhash_list);

 

取成員變量偏移量:

struct testcls{

     int a;

     int b;

};

testcls *cls= new testcls;

UINT offset = (UINT)&((testcls*)0)->b;

 

 

 

 

編譯

Fontconfig部分頭文件需要在makefile時(shí)產(chǎn)生,比如fc-lang.h,fc-case.h,將其在linux下編譯fontconfig.tgz,產(chǎn)生這幾個(gè)頭文件再拷貝出來(lái)

 

 

 

 

FONTCONFIG WINCE/WIN32移植

 

WinX版本去除了以下內(nèi)容:

     FcCache

     FcSerialize  不支持對(duì)象的序列化存儲(chǔ)

     不支持多字體目錄

     不支持多cache目錄

     所以不支持多進(jìn)程共用fontconfig cache內(nèi)容,也就是不能用mmap進(jìn)行map到自己的空間。這樣每個(gè)進(jìn)程必須消耗一系列的Pattern及其相關(guān)對(duì)象所占據(jù)的內(nèi)存空間。

     因?yàn)樵谇度胧江h(huán)境配置的字體可能只有1,2種,這種內(nèi)存的消耗應(yīng)該不會(huì)是很大

 

WINCE:

     字體存儲(chǔ)和配置信息儲(chǔ)存在wince.h文件

#define FONTS_DIR      "/nandflashpartition/fonts"

#define FONTS_CACHE_DIR "/nandflashpartition/fonts-cache"

#define FONTCONFIG_FILE FONTS_DIR##"/fonts.conf"

 

Fonts.conf

<fontconfig>

<dir>/nandflashpartition/fonts</dir>

<cachedir>/nandflashpartition</cachedir>

<font-file>simhei.ttf</font-file>

</fontconfig>

CMakefile的配置

#去除_WIN32 _WINDOWS定義

ADD_DEFINITIONS(-D_WINCE -D_WIN32_WCE=0x500 -DUNDER_CE -DWINCE -DARM -D_ARM_ -D_UNICODE -DUNICODE)

 

INCLUDE_DIRECTORIES("../" "C:/temp9/papyrus_dependencies/include" )

 

add_library (fontconfig

#    fcatomic.c

     fcblanks.c

#    fccache.c

     fccfg.c

     fccharset.c

     fcdbg.c

     fcdefault.c

     fcdir.c

     fcfreetype.c

     fcfs.c

     fcinit.c

     fclang.c

     fclist.c

     fcmatch.c

     fcmatrix.c

     fcname.c

     fcpat.c

#    fcserialize.c

     fcstr.c

     fcxml.c

     ftglue.h

     ftglue.c

     wince.h

     wince_imp.c                

     )

 

Fontconfig目前作為靜態(tài)庫(kù)生成并被使用,因?yàn)?span lang="EN-US">dll生成必須定義fontconfig.def(此操作費(fèi)時(shí))

 

posted @ 2008-04-04 02:50 放屁阿狗 閱讀(2207) | 評(píng)論 (2)編輯 收藏

cairo
agg
wxArt2D
geos


posted @ 2008-04-04 02:40 放屁阿狗 閱讀(965) | 評(píng)論 (0)編輯 收藏


cairo是opensource的項(xiàng)目,其在*nix上利用makefile,gcc便能很方便進(jìn)行編譯,客戶程序也能很方便pkg-config進(jìn)行鏈接.

cairo 依賴項(xiàng)目:  FreeType,FontConfig,libPng,libExpat,libZ

Win32平臺(tái)的編譯也是非常簡(jiǎn)單,只要將makefile.in里面的東東搬到CMakefiles.txt中,然后用CMake(2.4)產(chǎn)生vs2005的工程即可

WINCE的編譯可謂是異常的麻煩
FreeType倒是不錯(cuò),自帶了wince的工程檔,F(xiàn)ontConfig卻是沒有,且Fontconfig為了實(shí)現(xiàn)多進(jìn)程共享字體資源而采用了cache機(jī)制,應(yīng)用程序通過(guò)mmap()將字體信息映射到自己的地址空間來(lái)訪問(wèn)。這種模式在wince里可謂沒有必要,所以對(duì)Fontconfig進(jìn)行了比較大的手術(shù),去除了FcSerialize,FcCache,FcPattern的內(nèi)存映射機(jī)制,同時(shí)限定fonts.conf的存儲(chǔ)位置,字體目錄位置等等。

libPng:
libpng的  png_convert_from_struct_tm ,png_convert_from_time_t  在wince得不到實(shí)現(xiàn),因?yàn)椴糠值腸 runtime functions在wince沒有實(shí)現(xiàn),所以不得已自己實(shí)現(xiàn)這些功能函數(shù)

我編譯的cairo特性:
    支持win32_surface,freetype,fontconfig,image_surface,png_surface











posted @ 2008-04-04 02:39 放屁阿狗 閱讀(2763) | 評(píng)論 (9)編輯 收藏

#define OUT
#define INOUT
#define IN

#define INIT_LIST_HEAD(x)?? ?

#define btsc_TRUE ?? ?0
#define btsc_FALSE?? ?1
#define btsc_NULL ?? ?0

struct list_head{
?? ?struct list_head* prev,*next;
};


struct btsc_Property{
?? ?char * ?? ??? ?name;
?? ?char * ?? ??? ?value;?? ??? ?
};


struct btsc_Packet{
?? ?/*struct list_head?? ?list;*/
?? ?struct btsc_Property** ?? ?properties;
?? ?int?? ??? ??? ??? ?size;
?? ?int?? ??? ??? ??? ?capacity;
?? ?struct btsc_Context?? ?*?? ?ctx;
};

struct btsc_Packet* ?? ?btsc_Packet_Alloc(struct btsc_Context* );
void?? ??? ??? ??? ??? ?btsc_Packet_Free(struct btsc_Packet*);

struct btsc_Property*?? ?btsc_Property_Alloc(struct btsc_Context* ,char * name,char * value);
void?? ??? ??? ??? ??? ?btsc_Property_Free(struct btsc_Property*);


struct btsc_Property* ?? ?btsc_Property_Get(struct btsc_Packet* packet,char * name); ?? ?
void?? ??? ??? ??? ??? ?btsc_Property_Append(struct btsc_Packet* packet,struct btsc_Property * );


struct btsc_Context{
?? ?void (*tx)(struct btsc_Context*,unsigned char * data,int len);?? ??? ?
?? ?int (*notifier)(struct btsc_Packet* packet);/*外部釋放packet,返回NULL*/?? ??? ?
?? ?int?? ??? ?packet_cached_size;
?? ?int?? ??? ?recv_cached_capacity;?? ??? ??? ??? ??? ??? ?
?? ?char*?? ?recv_buff;?? ??? ??? ??? ??? ??? ??? ??? ??? ?
?? ?int?? ??? ?recv_size;?? ??? ?
?? ?void*?? ?user;?? ?// 外部數(shù)據(jù)傳遞?? ??? ??? ??? ??? ??? ??? ?
};


int ?? ?btsc_init(struct btsc_Context* IN ctx);?? ?
void ?? ?btsc_cleanup(struct btsc_Context* IN ctx);
int?? ??? ?btsc_Pack(struct btsc_Context* IN ctx,struct btsc_Packet* packet,unsigned char * INOUT buff,int* INOUT size);?? ?
void?? ?btsc_Parse(struct btsc_Context* , char * data,int len);


#define BTSC_PACKET_BEGIN(ctx) {\
?? ??? ??? ??? ??? ??? ??? ??? ?struct btsc_Context* _ctx_internel;\
?? ??? ??? ??? ??? ??? ??? ??? ?struct btsc_Packet * _pkt ;\
?? ??? ??? ??? ??? ??? ??? ??? ?_ctx_internel= (ctx);\
?? ??? ??? ??? ??? ??? ??? ??? ?_pkt = btsc_Packet_Alloc(_ctx_internel);
?? ??? ??? ??? ??? ??? ??? ??? ?
/* key is not suitable for vairable*/?? ??? ??? ??? ??? ??? ??? ??? ?
#define BTSC_NEW_PROPERTY(key,value)?? ?{\
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?struct btsc_Property * _ppt =btsc_Property_Alloc(_ctx_internel,key,value);\
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?btsc_Property_Append(_pkt,_ppt);\
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?}
#define BTSC_PACKET_END()?? ??? ?btsc_Pack(_ctx_internel,_pkt,btsc_NULL,0);\
?? ??? ??? ??? ??? ??? ??? ??? ?btsc_Packet_Free(_pkt);\
?? ??? ??? ??? ??? ??? ??? ??? ?}

#define BTSC_FOREACH(packet,ppt)?? ?{\
?? ??? ??? ??? ??? ??? ??? ??? ??? ?int n;\
?? ??? ??? ??? ??? ??? ??? ??? ??? ?for(n=0;n<packet->size;n++){\
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?ppt = packet->properties[n];
#define BTSC_END_FOREACH()?? ??? ??? ?}\
?? ??? ??? ??? ??? ??? ??? ??? ?}








/*
??? name:??? ??? ??? btsc
??? ??? ??? ??? ??? serial communicating? with bluetooth and app-user
??? desc:??? ??? ??? pair parameter codec
???
??? ??? packet=[ key:name,...]
??? ???
??? implemented: ??? zhangbin ,? 3 hours occupied
??? date:??? ??? ??? 2007-01-26
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef _UNIX
#include <unistd.h>
#endif
#include "btsc.h"

#define PACKET_HEAD??? ??? '<'
#define PACKET_TAIL??? ??? '>'
#define PROPERTY_DELIMITER??? ','
#define PAIR_DELIMITER??? ??? '='
#define ESCAPE_CHAR??? ??? ??? '\\'


int calcEscapleLength(char * str);
char* escape_copy(char * dest,char * src);
void trim_escape_copy(char * dest,char * src,int size);
int? calcPacketLength(struct btsc_Packet* pkt);
int??? is_escape_char(char c);
void parseProperty(struct btsc_Packet * pkt,char * s,char * e);
void parsePacket(struct btsc_Context* ctx,char * s,char* e);
char* ??? __memchr(char * s,char* e,char c);

char escape_ch_table[]={PACKET_HEAD,PACKET_TAIL,PROPERTY_DELIMITER,PAIR_DELIMITER,ESCAPE_CHAR,'\0'};

struct btsc_Packet* ??? btsc_Packet_Alloc(struct btsc_Context* ctx){???
??? struct btsc_Packet * pt = malloc(sizeof(struct btsc_Packet));??? ???
??? pt->size = 0;
??? pt->capacity = ctx->packet_cached_size;
??? pt->properties=malloc(pt->capacity*sizeof(struct btsc_Property*));???
??? pt->ctx = ctx;
??? return pt;???
}

void??? btsc_Packet_Free(struct btsc_Packet* pt){???
??? struct btsc_Property** tmp;
??? if( !pt ) ??? return ;
??? tmp = pt->properties;
??? while(pt->size--){
??? ??? btsc_Property_Free(*tmp++);??? ??? ??? ???
??? }??? ???
??? if( pt->properties){
??? ??? free(pt->properties);?
??? }
??? free(pt);
}


struct btsc_Property*??? btsc_Property_Alloc(struct btsc_Context* ctx,char * name,char * value){
??? struct btsc_Property * ppt;
??? printf("enter btsc_Property_Alloc()\n");
??? ppt = malloc( sizeof( struct btsc_Property) );
??? if(!ppt)??? printf("error: malloc failed (s1)\n");
??? ppt->name = malloc( strlen(name)+1);
??? if( !ppt->name ) printf("error: malloc failed (s2)\n");
??? strcpy(ppt->name,name);???
??? ppt->value = malloc( strlen(value)+1);
??? if( !ppt->value) printf("error: malloc failed (s3),str:%s, len: %d\n",value,strlen(value)+1);
??? strcpy( ppt->value,value);
??? return ppt;
}

void??? ??? btsc_Property_Free(struct btsc_Property* ppt){
??? if( !ppt )??? return;
??? free( ppt->name);
??? free( ppt->value);
??? free( ppt);
}

/* scan pointer array */
struct btsc_Property* ??? btsc_Property_Get(struct btsc_Packet* pkt,char * name){
??? int size;
??? struct btsc_Property* ppt;
??? size = pkt->size;
??? while(size--){
??? ??? ppt = pkt->properties[size];
??? ??? if( !strcmp( name, ppt->name ) ){
??? ??? ??? return ppt;/*that's ok */
??? ??? }
??? }
??? return btsc_NULL;
}

/* low effeciency, memory allocation,more costs*/
void??? btsc_Property_Append(struct btsc_Packet* pt,struct btsc_Property * ppt){
??? struct btsc_Property** tmpppt;
??? if( pt->size==pt->capacity){ ??? ???
??? ??? pt->capacity += pt->ctx->packet_cached_size;???
??? ??? tmpppt = pt->properties;??? ???
??? ??? pt->properties = malloc( pt->capacity * sizeof( struct btsc_Property**) );
??? ??? memcpy( pt->properties, tmpppt, pt->size * sizeof( struct btsc_Property**));
??? ??? free( tmpppt);
??? }
??? pt->properties[pt->size++]=ppt;???
}

int ??? btsc_init(struct btsc_Context* ctx){???
??? ctx->packet_cached_size = 10;???
??? if( ctx->recv_cached_capacity==0){
??? ??? ctx->recv_cached_capacity = 1024*2;???
??? }
??? ctx->recv_buff = malloc( ctx->recv_cached_capacity );
??? ctx->recv_size = 0;
??? return btsc_TRUE;
}

void ??? btsc_cleanup(struct btsc_Context* ctx){
??? free(ctx->recv_buff);???
}

/*
**??? name:??? calcEscapleLength
**??? desc:??? 計(jì)算含轉(zhuǎn)義字符串長(zhǎng)度
*/
int ??? calcEscapleLength(char * str){
??? int len;
??? char * pesc;
??? len = 0;???
??? while( *str ){
??? ??? pesc = escape_ch_table;
??? ??? while( *pesc ){
??? ??? ??? if( *pesc==*str){
??? ??? ??? ??? len++;
??? ??? ??? ??? break;
??? ??? ??? }
??? ??? ??? pesc++;
??? ??? }??? ???
??? ??? str++;
??? }???
??? return len;
}


char* escape_copy(char * dest,char * src){
??? char * pesc;
??? while( *src ){
??? ??? pesc = escape_ch_table;
??? ??? while( *pesc ){
??? ??? ??? if( *pesc==*src){
??? ??? ??? ??? *dest++=ESCAPE_CHAR;
??? ??? ??? ??? break;
??? ??? ??? }
??? ??? ??? pesc++;
??? ??? }
??? ??? *dest++=*src++;??? ??? ??? ???
??? }???
??? return dest;???
}

void trim_escape_copy(char * dest,char * src,int size){
??? int last_escape = btsc_FALSE;
??? while( size--){
??? ??? if( *src == ESCAPE_CHAR && last_escape != btsc_TRUE){??? ???
??? ??? ??? last_escape = btsc_TRUE??? ;
??? ??? ??? src++;
??? ??? ??? continue;
??? ??? }
??? ??? last_escape = btsc_FALSE;
??? ??? *dest++=*src++;??? ???
??? }
}

int?? ??? calcPacketLength(struct btsc_Packet* pkt){
??? int len;
??? int size;
??? struct btsc_Property* ppt;???
??? len = 0;
??? size = pkt->size;
??? while( size--){
??? ??? ppt = pkt->properties[size];???
??? ??? len+=strlen(ppt->name)+strlen(ppt->value);???

??? ??? len+= calcEscapleLength(ppt->name);
??? ??? len+= calcEscapleLength(ppt->value);???
??? }
??? len+= pkt->size*2+1;
??? return? len;
}


int??? ??? btsc_Pack(struct btsc_Context*? ctx,struct btsc_Packet* pkt,unsigned char * obuff,int* osize){
??? struct btsc_Property* ppt;
??? int size;
??? int len;
??? unsigned char * buff;
??? char * pbuff;
??? len = calcPacketLength( pkt);
??? buff = malloc( len );
??? size = pkt->size;
??? pbuff = (char*)buff;
??? *pbuff++=PACKET_HEAD;???
??? while( size--){
??? ??? ppt = pkt->properties[size];???
??? ??? pbuff = escape_copy(pbuff,ppt->name);
??? ??? *pbuff++=PAIR_DELIMITER;
??? ??? pbuff = escape_copy(pbuff,ppt->value);
??? ??? if( size ){
??? ??? ??? *pbuff++=PROPERTY_DELIMITER;??? ??? ???
??? ??? }
??? }
??? *pbuff = PACKET_TAIL;
??? if( ctx->tx ){
??? ??? ctx->tx(ctx,buff,len);
??? }
??? if( obuff && *osize >=len){
??? ??? memcpy( obuff, buff ,len);
??? ??? *osize = len;
??? }

??? free(buff);
??? return btsc_TRUE;???
}

/* e not in range*/
char* ??? __memchr(char * s,char* e,char c){
??? while( s!=e){
??? ??? if( *s == c){
??? ??? ??? return s;
??? ??? }??? ???
??? ??? s++;
??? }
??? return btsc_NULL;
}

int??? ??? is_escape_char(char c){
??? return btsc_FALSE;???
}

/*
??? name: parseProperty
??? desc: 指定內(nèi)存范圍中提取屬性? key=>value
??? ??? 搜索包含e
??? params:???
??? ??? pkt??? --??? 消息數(shù)據(jù)包
??? ??? s??? --??? 起始內(nèi)存地址
??? ??? e??? --??? 結(jié)束地址 ,
*/
void parseProperty(struct btsc_Packet * pkt,char * s,char * e){
??? char * p1,*p2;
??? int n;
??? struct btsc_Property*??? ppt;
??? p1 = s ;
??? p2 = e;
__REPEAT:???
??? p1 = __memchr(p1,e+1,PAIR_DELIMITER);
??? if( p1 ){
??? ??? if( *(p1-1) == ESCAPE_CHAR ){
??? ??? ??? p1++;
??? ??? ??? goto __REPEAT;
??? ??? }
??? ??? ppt = malloc( sizeof( struct btsc_Property ));
??? ??? n = p1-s; ??? ???
??? ??? ppt->name = malloc( n+1 );
??? ??? memset(ppt->name,0,n+1);??? ???
??? ??? trim_escape_copy(ppt->name,s,n);
??? ???
??? ??? n =e-p1;
??? ??? ppt->value = malloc( n+1);
??? ??? memset(ppt->value,0,n+1);
??? ??? trim_escape_copy(ppt->value,p1+1,n);
??? ???
??? ??? btsc_Property_Append(pkt,ppt);
??? }
}

/*
??? name: parsePacket
??? desc:??? 分解指定內(nèi)存到包結(jié)構(gòu)
??? ??? ??? 成功分解出包立刻回送到應(yīng)用接收者 ( btsc_Context::notifier)
??? param:
??? ??? s,e ??? 內(nèi)存地址 (處e)

** 緩沖區(qū)還需進(jìn)一步測(cè)試,包括緩沖區(qū)大小調(diào)節(jié), 不完整協(xié)議包格式的容錯(cuò)
*/
void ??? parsePacket(struct btsc_Context* ctx,char * s,char* e){
??? char *p,*p1,*p2;
??? struct btsc_Packet * pkt;
??? if( e-s <=1 ){
??? ??? return ;
??? }
??? pkt = btsc_Packet_Alloc(ctx);
???
??? p1 = s+1;
??? p2 = e-1;
??? p = p1;
__REPEAT:???
??? p = __memchr(p,e,PROPERTY_DELIMITER);
??? if( p ){
??? ??? if( *(p-1)==ESCAPE_CHAR){
??? ??? ??? p = p+1;
??? ??? ??? goto __REPEAT;
??? ??? }
??? ??? parseProperty(pkt,p1,p-1);
??? ??? p1 = ++p;
??? ??? goto __REPEAT;
??? }
??? /*allow one property reside in*/
??? parseProperty(pkt,p1,e-1);
??? if( ctx->notifier ){
??????? if(ctx->notifier(pkt)){ /* nonzero value, delete internal*/
??????????? btsc_Packet_Free(pkt);??? ???????
??????? }
??? }else{
??? ?? btsc_Packet_Free(pkt);???
??? }
}

void??? btsc_Parse(struct btsc_Context* ctx, char * data,int size){
??? int len ;
_RESTART:
??? while( size ){
??? ??? len = ctx->recv_cached_capacity - ctx->recv_size;
??? ??? if( len >0){
??? ??? ??? if( size <= len){
??? ??? ??? ??? len = size;
??? ??? ??? ??? size = 0;
??? ??? ??? }else{
??? ??? ??? ??? size-=len;
??? ??? ??? }
??? ??? ??? memcpy( ctx->recv_buff+ctx->recv_size,data,len);
??? ??? ??? ctx->recv_size+=len;
??? ??? ??? data+=len;
??? ??? }???
??? ???
??? ??? {
??? ??? ??? char * p1,*p2;??? ??? ???
_RESCAN:??? ??? ???
??? ??? ??? p1 = ctx->recv_buff;
_RESCAN_HEAD:??? ??? ??? ?
??? ??? ??? p1 = __memchr(p1,ctx->recv_buff+ctx->recv_size,PACKET_HEAD);??? ??? ???
??? ??? ??? if( !p1 ){
??? ??? ??? ??? ctx->recv_size =0;
??? ??? ??? ??? if( size ){
??? ??? ??? ??? ??? goto _RESTART;
??? ??? ??? ??? }
??? ??? ??? }
??? ??? ??? if( p1>ctx->recv_buff && *(p1-1)==ESCAPE_CHAR){ /* "\<" */
??? ??? ??? ??? p1++;
??? ??? ??? ??? goto _RESCAN_HEAD;???
??? ??? ??? }
??? ??? ???
??? ??? ??? /*move backward*/
??? ??? ??? ctx->recv_size -=(p1-ctx->recv_buff);
??? ??? ??? memmove(ctx->recv_buff,p1, ctx->recv_size);
??? ??? ??? p1=ctx->recv_buff;
??? ??? ??? p2 = p1+1;
_RESCAN_TAIL:??? ??? ???
??? ??? ??? p2 = __memchr(p2,ctx->recv_buff+ctx->recv_size,PACKET_TAIL);
??? ??? ??? if( !p2 ){
??? ??? ??? ??? if( ctx->recv_size == ctx->recv_cached_capacity ){
??? ??? ??? ??? ??? ctx->recv_size? = 0;
??? ??? ??? ??? }
??? ??? ??? ??? goto _RESTART;
??? ??? ??? }
??? ??? ??? if( *(p2-1) == ESCAPE_CHAR ){
??? ??? ??? ??? p2++;
??? ??? ??? ??? goto _RESCAN_TAIL;???
??? ??? ??? }
??? ??? ???
??? ??? ??? parsePacket(ctx,p1,p2);
??? ??? ??? ctx->recv_size -=p2-p1+1;
??? ??? ??? if( ctx->recv_size ){
??? ??? ??? ??? memmove(ctx->recv_buff,p2+1,ctx->recv_size);
??? ??? ??? ??? goto _RESCAN;
??? ??? ??? }??? ??? ??? ?
??? ??? }??? ???
??? }
}

/*?? debug */
#ifdef _DEBUGX
void tx(unsigned char * data,int len);
void notifier(struct btsc_Packet* packet);
/*初始化上下文, tx=發(fā)送處理函數(shù),notifier=接收函數(shù)*/
struct btsc_Context c={tx:tx,notifier:notifier};

/*測(cè)試數(shù)據(jù)接收并解析*/
void rx(){???
??? ?char * msg="<MSG=HELLO,NAME=SCOTT>"
??? ???? ??? ??? "<MSG2=HELLO2,NAME2=SCOTT2>"
??? ???? ??? ??? "<MSG3=HELLO3,NAME3=SCOTT3>"; /*simulating data*/
??? int len = strlen(msg);
??? btsc_Parse(&c,msg,len);
}
/*發(fā)送處理過(guò)程*/
void tx(unsigned char * buff,int len){???
??? char *outmsg = malloc(1024*10);
??? memset(outmsg,0,1024*10);
??? memcpy(outmsg,buff,len);
??? printf("encode str: %s\n",outmsg);
??? free(outmsg);
??? btsc_Parse(&c,buff,len);
}

void notifier(struct btsc_Packet* packet){
??? struct btsc_Property * ppt;
??? ppt = btsc_Property_Get(packet,"MSG");
??? if(ppt)
??? ??? printf("property get: MSG=>%s\n",ppt->value);
??? /*遍歷包內(nèi)屬性參數(shù)*/
??? BTSC_FOREACH(packet,ppt);
??? printf("packet: %s=>%s\n",ppt->name,ppt->value);
??? BTSC_END_FOREACH();
}

int main(){
??? int r;
??? /*optional*/
??? c.recv_cached_capacity = 1024; /*初始化接收緩沖區(qū)大小 byte*/
??? c.packet_cached_size = 5;??? /*消息包緩沖屬性個(gè)數(shù)*/
??? btsc_init(&c);??? ??? ??? /*上下文初始化*/
??? puts("test rx()...");
??? rx();??? /*接*/
??? puts("escape testing...");???
??? do{
??? ??? /*構(gòu)造消息包,并完成發(fā)送*/
??? ??? BTSC_PACKET_BEGIN(&c);
??? ??? BTSC_NEW_PROPERTY("MSG","calling");

??? ??? BTSC_PACKET_END();???
??? ??? usleep(1000*50);
??? ??? printf(">>seq:%d\n",r);
??? }while(0);
??? ???
??? btsc_cleanup(&c);???
???
??? return 0;
}


#endif

posted @ 2007-02-23 22:54 放屁阿狗 閱讀(1101) | 評(píng)論 (0)編輯 收藏

僅列出標(biāo)題
共25頁(yè): First 17 18 19 20 21 22 23 24 25 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美一站二站| 免费亚洲电影| 国产欧美日韩三区| 欧美在线观看网站| 午夜欧美视频| 亚洲成人在线| 亚洲另类自拍| 国产精品视屏| 你懂的成人av| 欧美视频国产精品| 久久久999| 欧美 日韩 国产 一区| 宅男噜噜噜66一区二区66| 亚洲手机成人高清视频| 国产一区二区三区在线观看网站| 久久综合五月| 欧美日韩一区二区免费在线观看| 午夜国产精品视频| 六月婷婷久久| 亚洲欧美国产三级| 久久躁狠狠躁夜夜爽| 一本久久精品一区二区| 欧美亚洲一区| 一区二区三区日韩精品| 欧美一区二区三区免费大片| 亚洲国产精品尤物yw在线观看| 日韩午夜在线电影| 韩日在线一区| 99综合在线| 亚洲高清视频在线| 亚洲专区免费| 日韩一区二区精品葵司在线| 亚洲一区二区三区免费观看 | 亚洲一区二区三区乱码aⅴ| 国产真实久久| 中文一区在线| 亚洲精品国产欧美| 欧美一区91| 亚洲图片欧美一区| 免费亚洲婷婷| 老**午夜毛片一区二区三区| 欧美日韩亚洲一区二区三区| 免费亚洲婷婷| 狠狠色2019综合网| 亚洲欧美国产毛片在线| 99精品久久久| 免费观看一区| 免费观看亚洲视频大全| 国产午夜精品久久久久久久| 99精品久久久| 在线一区二区视频| 女主播福利一区| 欧美成人性网| 在线视频国内自拍亚洲视频| 亚洲女性裸体视频| 亚洲欧美日韩精品久久久| 欧美日韩精品| 日韩一本二本av| 亚洲视频1区2区| 欧美日韩精品高清| 亚洲乱码国产乱码精品精天堂| 激情综合网址| 久久中文在线| 亚洲大片一区二区三区| 国产尤物精品| 久久精选视频| 免费人成精品欧美精品| 在线观看中文字幕亚洲| 久久综合久久综合久久| 欧美激情a∨在线视频播放| 怡红院精品视频在线观看极品| 久久国产免费| 欧美黄色精品| 亚洲毛片av在线| 欧美女同在线视频| 99精品热视频只有精品10| 亚洲丝袜av一区| 国产精品主播| 久久精品国产77777蜜臀| 模特精品在线| 99精品国产福利在线观看免费| 欧美精品福利视频| 中文在线一区| 老色批av在线精品| 亚洲精品三级| 国产精品日韩久久久| 久久福利毛片| 亚洲欧洲一区二区在线观看| 亚洲图片欧美午夜| 国产一区二区三区在线观看网站| 久久亚洲二区| 中文亚洲欧美| 毛片基地黄久久久久久天堂| 99国产精品视频免费观看| 国产精品久久久久久影视| 欧美亚洲网站| 亚洲免费观看高清完整版在线观看熊| 亚洲一区二区三区在线播放| 国产一区二区三区的电影 | 欧美一区二区观看视频| 麻豆成人在线| 亚洲一区二区三区精品在线| 国产一区二区毛片| 欧美日本韩国| 久久av二区| 日韩手机在线导航| 久久综合中文| 亚洲欧美日韩国产综合在线 | 在线观看成人一级片| 欧美日韩国产成人在线观看| 亚洲一区在线播放| 亚洲国产综合在线| 久久―日本道色综合久久| 亚洲精品在线三区| 一区二区视频在线观看| 欧美三区在线视频| 欧美大片一区二区| 久久精品主播| 亚洲欧美在线免费观看| 日韩视频一区| 亚洲国产岛国毛片在线| 久久一二三区| 久久国产一区| 午夜精品久久久久久久久久久久久| 亚洲福利av| 精品成人国产| 国产主播一区二区三区| 国产精品热久久久久夜色精品三区| 欧美www在线| 久久综合导航| 久久久久久黄| 久久精品30| 久久成人精品视频| 欧美中日韩免费视频| 亚洲男女自偷自拍| 亚洲影音先锋| 亚洲曰本av电影| 亚洲欧美电影在线观看| 亚洲一区二区三区精品动漫| 99国产精品国产精品久久| 亚洲乱码国产乱码精品精| 亚洲激情在线观看视频免费| 欧美激情在线观看| 亚洲丰满在线| 亚洲区国产区| 亚洲乱码国产乱码精品精可以看| 91久久精品一区二区别| 最新亚洲电影| 一本色道久久综合亚洲精品高清 | 妖精视频成人观看www| 亚洲风情在线资源站| 亚洲黄色三级| 亚洲美女区一区| 宅男在线国产精品| 午夜精品久久久| 久久精品国产免费| 久久久一区二区三区| 蜜臀99久久精品久久久久久软件| 欧美成人精品高清在线播放| 欧美另类一区| 国产精品一区2区| 韩国成人福利片在线播放| 亚洲成人在线| 在线一区亚洲| 久久久777| 亚洲激情视频在线观看| 一区二区三区日韩在线观看| 香蕉免费一区二区三区在线观看 | 亚洲无人区一区| 午夜影院日韩| 美女精品在线观看| 欧美午夜视频一区二区| 国产综合精品一区| 99视频日韩| 久久精品国产综合| 亚洲欧洲精品成人久久奇米网| 在线亚洲精品福利网址导航| 欧美在线91| 欧美日韩视频在线观看一区二区三区 | 久久久久久久久久久成人| 欧美高清在线视频| 国产日韩av一区二区| 亚洲欧洲在线免费| 久久本道综合色狠狠五月| 欧美黄污视频| 小黄鸭精品密入口导航| 欧美黄色一级视频| 国产一区二区三区四区五区美女 | 亚洲一区在线直播| 欧美1级日本1级| 亚洲欧美日韩精品久久亚洲区| 久久亚洲综合色一区二区三区| 欧美日韩中文| 亚洲人成网站777色婷婷| 午夜一区二区三视频在线观看| 亚洲成人在线视频播放| 欧美一区二区黄| 国产精品国产三级国产aⅴ9色| 亚洲国产日韩欧美| 久久精品综合网|