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

socketref,再見!高德

https://github.com/adoggie

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  246 Posts :: 4 Stories :: 312 Comments :: 0 Trackbacks

常用鏈接

留言簿(54)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

#

在移植glib到wince環境時,發現wince的c runtime library不包含很多庫函數,諸如 bsearch() 半則搜索法,其用法有點像 std::bind2nd(),
費了點時間將其刨了出來,相信對有些人有用

 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 放屁阿狗 閱讀(754) | 評論 (1)編輯 收藏

代碼很容易閱讀,以前做藍牙項目時用戶電話本搜索只用


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 放屁阿狗 閱讀(2086) | 評論 (4)編輯 收藏

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

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

3.改錯并解釋:
  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.編寫函數:
    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. 實現以下類成員函數并解釋
        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;
        }  
       返回列表頭節點
        listNode * reverse(listNode * head){
       }
      
這些題基本上是能考核一個c/cpp開發人員的基本技術能力的

posted @ 2008-05-06 20:16 放屁阿狗 閱讀(5988) | 評論 (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 放屁阿狗 閱讀(4066) | 評論 (15)編輯 收藏

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

目前已經完成移植的開源項目列表:
    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

未完成的移植內容:
    librsvg
    wxLua

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

Fontconfig 2.5.0

 

 

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

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

 

Fontconfig要移植到wince,必須處理內部諸多的單字節與寬字符轉換問題

 

 

Fontconfig將字體文件cached的過程就是將字體文件映射到內存地址空間

 

 

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

Cache-dir目錄存放字體緩沖文件 ?????-x86- cache2,緩沖文件被mmap進內存

每個font目錄都將創建一個cache文件,存放于cache-dir

 

Cache文件內存放一個字體目錄下(font-dir)所有字體的pattern信息集合和基本的FcCache對象的控制信息,系統掃描完字體之后的信息存于FcSerialize對象,之后綁定到FcCache對象,之后將FcCache對象及其關聯的數據全部寫入本地文件cache-file

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

 

系統初始化時FcInit()檢測cache文件是否存在(文件鎖控制),不存在則掃描字體目錄創建緩沖文件(一個字體目錄對應一個緩沖文件);否則打開緩沖文件并映射進入本地進程的地址空間(mmap),其起始地址被轉換為FcCache*對象返回

 

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

 

FcSerialize過程

將不同類型的Fcxxxx對象序列化轉儲時,先將對象結構信息專儲,對象內的指針指向的對象也進行轉儲到對象頭信息之后,其位置由對象頭結構內的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對象結構信息先被serialize, intptr_t變量指向的附屬數據所在位置(本對象的當前偏移量)

struct _FcPattern {

    int               num;

    int               size;

    intptr_t        elts_offset;

    int               ref;

};

typedef struct _FcPatternElt {

    FcObject        object;

    FcValueList            *values;

} FcPatternElt;

每個FcPattern由若干個FcPatternElt組成FcPatternElt的數組的首地址與FcPattern對象地址的差值作為偏移量存儲在FcPattern::elts_offset

 

 

Fonts.conf

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

{ "acceptfont",       FcElementAcceptfont },

{ "rejectfont", FcElementRejectfont },

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

 

每個字體文件通過freetype進行訪問,當在font目錄下掃描字體文件是,將讀取若干個patterns

 

FcSerialize FcSerializeBucket存儲

 

SystemFont or ApplicationFont

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

 

 

FcSerializebucket不能超過 8k個,字體文件也不能過8k,每個字體文件名置入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時產生,比如fc-lang.h,fc-case.h,將其在linux下編譯fontconfig.tgz,產生這幾個頭文件再拷貝出來

 

 

 

 

FONTCONFIG WINCE/WIN32移植

 

WinX版本去除了以下內容:

     FcCache

     FcSerialize  不支持對象的序列化存儲

     不支持多字體目錄

     不支持多cache目錄

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

     因為在嵌入式環境配置的字體可能只有12種,這種內存的消耗應該不會是很大

 

WINCE:

     字體存儲和配置信息儲存在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目前作為靜態庫生成并被使用,因為dll生成必須定義fontconfig.def(此操作費時)

 

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

cairo
agg
wxArt2D
geos


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


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

cairo 依賴項目:  FreeType,FontConfig,libPng,libExpat,libZ

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

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

libPng:
libpng的  png_convert_from_struct_tm ,png_convert_from_time_t  在wince得不到實現,因為部分的c runtime functions在wince沒有實現,所以不得已自己實現這些功能函數

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











posted @ 2008-04-04 02:39 放屁阿狗 閱讀(2762) | 評論 (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;?? ?// 外部數據傳遞?? ??? ??? ??? ??? ??? ??? ?
};


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:??? 計算含轉義字符串長度
*/
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: 指定內存范圍中提取屬性? key=>value
??? ??? 搜索包含e
??? params:???
??? ??? pkt??? --??? 消息數據包
??? ??? s??? --??? 起始內存地址
??? ??? e??? --??? 結束地址 ,
*/
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:??? 分解指定內存到包結構
??? ??? ??? 成功分解出包立刻回送到應用接收者 ( btsc_Context::notifier)
??? param:
??? ??? s,e ??? 內存地址 (處e)

** 緩沖區還需進一步測試,包括緩沖區大小調節, 不完整協議包格式的容錯
*/
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=發送處理函數,notifier=接收函數*/
struct btsc_Context c={tx:tx,notifier:notifier};

/*測試數據接收并解析*/
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);
}
/*發送處理過程*/
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);
??? /*遍歷包內屬性參數*/
??? 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; /*初始化接收緩沖區大小 byte*/
??? c.packet_cached_size = 5;??? /*消息包緩沖屬性個數*/
??? btsc_init(&c);??? ??? ??? /*上下文初始化*/
??? puts("test rx()...");
??? rx();??? /*接*/
??? puts("escape testing...");???
??? do{
??? ??? /*構造消息包,并完成發送*/
??? ??? 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 放屁阿狗 閱讀(1099) | 評論 (0)編輯 收藏

僅列出標題
共25頁: 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网站| 欧美在线视屏| 99精品久久| 日韩视频在线观看国产| 亚洲国产精品第一区二区三区| 欧美一级免费视频| 一道本一区二区| 在线综合欧美| 欧美伊人久久久久久午夜久久久久| 亚洲一区二区在线视频| 亚洲一本视频| 久久久久久伊人| 亚洲欧洲视频在线| 亚洲综合色婷婷| 亚洲素人一区二区| 午夜久久美女| 欧美激情中文字幕乱码免费| 日韩视频一区二区三区| 中国亚洲黄色| 欧美亚洲日本一区| 亚洲国产第一页| 国产美女精品视频| 亚洲丶国产丶欧美一区二区三区| 亚洲日本久久| 久久视频国产精品免费视频在线 | 亚洲在线成人| 欧美二区在线观看| 国产午夜亚洲精品羞羞网站| 亚洲激情一区| 久久一区二区三区超碰国产精品| 亚洲日本中文字幕| 欧美成人免费一级人片100| 国产日本欧美一区二区| 91久久久国产精品| 麻豆久久久9性大片| 欧美一区二区免费| 国产乱码精品1区2区3区| 日韩一级免费观看| 欧美 日韩 国产一区二区在线视频| 亚洲天堂第二页| 国产精品福利在线观看| 一本久久青青| 亚洲网站在线观看| 国产精品永久免费观看| 午夜精品久久久久久久| 亚洲欧美国产高清| 国内视频一区| 亚洲黄页一区| 狠狠色伊人亚洲综合网站色| 久久一区二区三区av| 美女视频黄a大片欧美| 91久久久久久| 亚洲一区日韩在线| 亚洲主播在线播放| 欧美在线日韩| 欧美福利电影在线观看| 亚洲欧美成人| 欧美大片一区| 久久久国产精品一区二区中文| 久久色在线播放| 亚洲影院在线| 欧美成人午夜激情视频| 午夜久久久久| 欧美伦理影院| 欧美成人午夜视频| 国产精品性做久久久久久| 亚洲电影中文字幕| 国产欧美精品一区| 日韩写真视频在线观看| 在线观看欧美| 久久岛国电影| 久久综合色婷婷| 国产亚洲欧洲| 欧美在线视频网站| 欧美中文字幕在线| 国产精品综合av一区二区国产馆| 国内精品视频一区| aa级大片欧美三级| 亚洲色诱最新| 国产精品成人久久久久| 一二三区精品| 欧美一级播放| 精品99视频| 亚洲国产精品www| 欧美午夜不卡在线观看免费| 欧美激情久久久久久| 亚洲狼人综合| 欧美日韩精品一区二区在线播放| 亚洲国产欧美一区二区三区丁香婷| 亚洲国产一区二区精品专区| 欧美gay视频| 亚洲免费视频在线观看| 久久免费视频在线| 最新精品在线| 国产欧美在线| 欧美三级电影大全| 久久久99爱| 国产精品99久久久久久久vr| 欧美亚洲在线观看| 亚洲激情第一页| 国产精品一二三四| 欧美久色视频| 久久人人爽人人爽| 亚洲欧美日韩人成在线播放| 欧美国产日韩一区二区三区| 亚洲午夜未删减在线观看| 在线国产欧美| 黄色av一区| 黄色欧美成人| 韩国精品在线观看| 国产日产亚洲精品| 欧美成人激情在线| 欧美自拍偷拍午夜视频| 99伊人成综合| 亚洲一级免费视频| 亚洲另类春色国产| 亚洲毛片在线观看| 一区二区三区精品视频在线观看| 亚洲日本电影| 亚洲最新在线视频| 亚洲自拍三区| 久久精品亚洲精品国产欧美kt∨| 亚洲午夜精品网| 欧美日韩高清在线播放| 欧美高清视频一区二区三区在线观看| 午夜精品一区二区在线观看 | 国内一区二区三区在线视频| 国产一区亚洲一区| 亚洲黄色影片| 欧美一二三区在线观看| 美女日韩欧美| 在线亚洲欧美视频| 久久成人国产精品| 欧美激情一二三区| 国产精品最新自拍| 亚洲精品久久久久久久久久久久| 妖精视频成人观看www| 翔田千里一区二区| 最新精品在线| 久久久精品视频成人| 国产精品v欧美精品v日韩 | 美女诱惑黄网站一区| 一区二区三区福利| 篠田优中文在线播放第一区| 欧美国产精品专区| 欧美尤物一区| 国产欧美va欧美va香蕉在| 一区二区毛片| 欧美三日本三级少妇三99| 亚洲精品护士| 亚洲精品乱码久久久久| 另类图片国产| 尤物99国产成人精品视频| 久久精品人人爽| 午夜精品视频在线观看| 国产日韩欧美在线播放| 欧美亚洲综合久久| 久久精品国亚洲| 亚洲高清久久久| 亚洲区免费影片| 国产精品久久午夜夜伦鲁鲁| 欧美区一区二区三区| 一区二区国产在线观看| 亚洲理伦在线| 国产亚洲欧美aaaa| 欧美高潮视频| 国产精品国产三级国产aⅴ无密码| 亚洲一区二区三区四区中文 | 亚洲另类自拍| 国产精品theporn| 久久精品国产96久久久香蕉| 欧美在线精品免播放器视频| 在线看片一区| 亚洲淫性视频| 日韩视频不卡| 久久久久九九视频| 亚洲综合日韩| 欧美精品麻豆| 免费视频久久| 国产精品一二一区| 亚洲图片在线| 夜夜嗨av一区二区三区免费区| 亚洲在线视频| 一区二区三区免费在线观看| 久久久精品一区二区三区| 亚洲在线中文字幕| 欧美高清视频免费观看| 免费观看在线综合| 国产亚洲午夜| 亚洲综合色自拍一区| 亚洲尤物视频网| 欧美四级剧情无删版影片| 亚洲精品乱码久久久久久黑人| 伊人狠狠色丁香综合尤物| 亚洲欧美日韩在线| 欧美专区在线观看| 国外视频精品毛片| 欧美精品国产| av72成人在线|