Buy Reviews
Powered by MaxBlogPress  

Archive for the ‘C_and_CPP’ Category

GNU C Library – bindtextdomain

星期四, 三月 11th, 2010

函式: char * bindtextdomain (const char *domainname, const char *dirname)

bindtextdomain函式用於指定包含不同語言域名的訊息目錄,要正確的使用,就要有層次結構目錄中的目錄,下面會解釋這細節。

對程式設計師來說注意程式所要的翻譯被放在那個目錄結構開始是很重要的,像我們說/foo/bar,然後這個程式應該使用bindtextdomain呼叫來繫結目前程式對這個目錄的域名,所以要確認這個目錄可以找到,一支正確執行的程式不會依賴使用者設定一個環境變數。

bindtextdomain函式可以重複使用假如這個跟之前繫結的域名不同的domainname 參數沒有被覆寫時。

假如該程式想要在某個時間使用bindtextdomain,它就可以使用chdir函式來改變目前的工作目錄,dirname字串應該是絕對路徑名稱是很重要的,否則處理的目錄就會隨時間改變。

假如dirname參數是null指標,bindtextdomain會傳回目前domainname 域名所選擇的目錄。

bindtextdomain函式傳回一個含有所選擇目錄名稱的字串指標,這個字串會在函式內被配置耳且不能被使用者改變,假如系統在bindtextdomain執行時開始不用核心,傳回值會是NULL而且全域變數errno 會跟著被設定。

stardict set gStarDictDataDir

星期一, 三月 8th, 2010

static void set_data_dir()
{
    //set gStarDictDataDir;
#ifdef _WIN32
    HMODULE hmod;

    if ((hmod = GetModuleHandle(NULL))==0) //取得目前 process的載入位址
        exit(EXIT_FAILURE);
    char tmp_buf[256];
    if (GetModuleFileName(hmod, tmp_buf, sizeof(tmp_buf))==0)
        exit(EXIT_FAILURE);

    gchar* buf = g_path_get_dirname(tmp_buf);
    gStarDictDataDir=buf;   
    g_free(buf);
#else
    gStarDictDataDir = STARDICT_DATA_DIR;
#endif
}

GetModuleHandle是Windows API的函式,函式庫是kernel32.dll,用來由模組名稱得到該模組的頭銜
GetModuleFileName也是Windows API的函式,函式庫是kernel32.dll,用來從已載入的模組得知該可執行檔的檔名及完整路徑

g_path_get_dirname是Glib函式庫裡雜項的實用函式,功能是取得取得檔案名稱的目錄部份。

g_free是釋放指向buf的記憶體。

這個函式的功能就是設定gStarDictDataDir的目錄,在Windows下我測到是指向C:\Program Files\StarDict,因為StarDict就是安裝在這裡!

__argc, __argv的功用

星期四, 二月 25th, 2010

在startdic的原始碼中,有這樣一段return stardict_main (__argc, __argv);

這也會讓人有點疑惑,查詢一下__argv的功用,你可以看到如何取得程式名稱在 Windows 架構應用程式和 Win32 架構的應用程式中這一篇,以C撰寫的MS-DOS應用程式,命令列可以取得從 argv 參數的 main ()。在特別程式名稱由 argv [0] 被指到]。

Windows 為基礎和以 Win32 基礎的應用程式使用 WinMain() 做為進入點。

在 32 位元應用程式中您就可以直接參考 __argv。在 stdlib.h 中有這樣的宣告:

extern int    _argc;
extern char**    _argv;

在 16 位元應用程式中 __argv 未宣告,而且您將需要宣告它。在您的來源或標頭檔中加入下列宣告。

   #ifdef __cplusplus
   extern "C"
   #endif
   extern char ** __argv;

這個__argc, __argv,主要是在接下來的gtk_init(&argc, &argv); 會用到,一般來說,我們不太會在命令列中執行這個,所以常會忽略到gtk-init的命令列參數有一些功用 ,可以參考GTK+ 2.0 教學-從這裡開始這篇的說明。

gtk+ vs WinMain

星期四, 二月 25th, 2010

在startdict的原始碼中,你會看到這樣的程式碼:

#ifdef _WIN32

#ifdef __GNUC__
#  ifndef _stdcall
#    define _stdcall  __attribute__((stdcall))
#  endif
#endif

int _stdcall
WinMain (struct HINSTANCE__ *hInstance,
struct HINSTANCE__ *hPrevInstance,
char               *lpszCmdLine,
int                 nCmdShow)
{
stardictexe_hInstance = hInstance;
return stardict_main (__argc, __argv);
}
#endif

跟一般我們用int main開始寫程式,有一點差異,據說這是為了在跑的時候不要有命令視窗出現的關係,但是我測試好像沒這個問題,不過也沒關係,顯而易見的是這些原始碼,有很多可研究的!

StarDict 邁向更新路

星期一, 二月 22nd, 2010

[Linker error] undefined reference to `__cpu_features_init’

第一個碰到的問題就是這個,可以參考http://www.wretch.cc/blog/claytors/18277063,獲得解決,但是後來我有一個靈感,應該是Dev-C++的一個問題,所以嘗試用工具->檢查更新版本來安裝另外程式:

2010-02-22_144522

這個是MinGW runtime version 3.14

2010-02-22_144557

另一個是Mingw-utils。

確實是可以解決這個連結錯誤!

xml parsing – Libxml2

星期三, 二月 3rd, 2010

『用libxml2來寫程式就像是異國的陌生人給你的一個扣人心弦的擁抱那樣。』 Mark Pilgrim

Libxml2 是Gnome專案開發的XML C 剖析器跟工具包(但是Gnome平台外也可以使用),它是根據MIT License的免費軟體,XML本身是一種元語言(metalanguage)用來設計標記語言,例如, to design markup languages, i.e. 具語意和結構的文字語言會加到兩個角括號內使用額外的”標記”訊息內容內,HTML是最有名的標記語言,雖然這個函式庫是用C寫的,現在有很多的語言繫結 使得它在其它的環境下也可以使用。

據了解Libxml2很容易移植,函式庫可以在很多的系統(Linux, Unix, Windows, CygWin, MacOS, MacOS X, RISC Os, OS/2, VMS, QNX, MVS, VxWorks, …)下建構跟工作都不會有嚴重的問題。

Libxml2 實作了很多跟標記語言相關的標準:

在大多數的情況下libxml2嘗試用相對一致嚴格地方式來實作規格,截至2.4.16版的釋出,libxml2通過了OASIS XML Tests Suite所有的1800以上的測試。

在一些程度上libxml2提供了下列額外規格的支援但是沒有完整實作的宣佈:

  • 文件物件模型(Document Object Model,DOM) http://www.w3.org/TR/DOM-Level-2-Core/ 文件模型,但是它沒有實作自己的API,gdome2在libxml2之上做了這個模型
  • RFC 959 :libxml2 實作一個基本的FTP 客戶端程式碼
  • RFC 1945 : HTTP/1.0, 這也是一個基本的 HTTP 客戶端程式碼
  • SAX:SAX2很像是跟早期expat版本相容的介面跟最小的SAX1實作

XML Schemas Part 1: Structure 的部份實作正在努力但是當時過早做出一致性聲明。

單獨文件:

讀Windows Mobile手機應用開發

星期三, 十一月 11th, 2009

前一陣子我妹朋友託售台灣手機,見託售HTC Touch Diamond 3.5G完美鑽石機(取消),久久乏人問津,所以他就又拿回去不賣了,上週六回高雄後,他又說給我用沒關係,就每個月付個一兩千就可以,哇裡列,怎麼這麼三心二意啊!好吧!就給它拿回來了,稍微開箱一下,哇賽,連光碟片都沒開過,看來他還真不懂得用!

我稍微開機來看,裡面的office支援,我想要打敗其他的手機真的有很大優勢,連pdf的adobe支援也方便,不像我用nokia 5800,adodb要收費,真是!@#$%^!

但是說實在的,我不喜歡Windows Mobile的平台,因為軟體使用方便,但是軟體開發不便,有點封閉不開放,這對想以手機開發程式的我來說,是我不想用Windows Mobile的主要原因,而且現在還有更開放的android可以用,要在Windows Mobile開發程式可以用eMbedded Visual C++來做,好像沒聽說有Java的,另外是否有軟體 免費的情形,聽說的也不多,好像就是死要錢吧!所以這樣子的手機軟體我就不喜歡去開發!

另外我不喜歡它的手機價格,剛出來好像要兩萬多吧,跟nokia 5800真的相比就遜了!

不過既然拿回家了,就希望好好地利用它,所以趕快借了本Windows Mobile手機應用開發來看看!

image

希望能儘快上手!

讀世紀末軟體革命復刻版:C++、GUI與物件導向理論

星期一, 十一月 9th, 2009

自從讀了樂讀│世紀末軟體革命復刻版:C++、GUI與物件導向理論後,就開始注意到要去圖書館借這本書來看看,一直到上週五才真的去借到!

聽說很不錯,一定要好好看看,到今天已經看到了p.5,哈哈!

iPhone 山寨開發

星期四, 十月 8th, 2009

iPhone創意程式設計家,今天我在看的一本書,赫然發現開發軟體上傳到App Store要花錢!
但是作者也題到了可以用山寨開發的方式來節費,他的必要環境為

  • iPhone必須是越獄過的,才剛看過越獄風雲,真的很流行喔
  • MobileInstallation必須是破解的
  • 一部Mac電腦,或可以安裝Leopard的Intel X86電腦
  • 開發端環境設定

還好看到台灣的中華電信是可以越獄的,但是為什麼只有中華電信可以辦,我現在是用台哥大的根本不可能換門號啊,看來還有段時間要等,看倌們如果很想ㄚ琪幫忙開發iPhone的程式的話,很歡迎可以送機或借機給我試試!

Leopard這個字也很好奇,查到了wiki這樣寫:『Mac OS X 10.5“Leopard”是蘋果為 Mac 產品所製作的作業系統Mac OS X的第六個版本,也是前代作業系統Tiger的繼承者。Leopard最早於2007年10月26日發行,以兩種版本:以個人電腦為訴求的桌上型電腦版本,以及伺服器版本——Mac OS X Server。』並且可以在PC上用,『必須是任何的 Intel 處理器,PowerPC G5 或 G4(867 MHz 以上)。』
這下可好了,ㄚ琪好像不用藉口說沒有Mac就不能用Mac OS了,不過ㄚ琪還是想買一台PowerPC,哈哈!
好吧!ㄚ琪現在沒手機也沒Leopard,看來得先把這本書拿去還了,待ㄚ琪將這些配備弄齊了再說!
對iPhone開發計畫有興趣贊助的好朋友,可以直接點


這個paypal按鈕來贊助一下,ㄚ琪先在這感恩了!

[轉貼]CHM格式解析

星期四, 八月 6th, 2009

這一篇CHM格式解析,應該是譯自Microsoft’s HTML Help (.chm) format,我把它轉貼在此供紀錄:

HM格式有一个初始化头,占38H字节,后面是header section和到正文 段的偏移量。加在一起,这些被称为文件头。
header section一共有两个section,一个是文件目录,另一个包含着文件长度和一些未知信息。
初始化头:
前 四个字节为ITSF,第二个双字为版本信息,第三双字是文件头的总长度,第四双字值为1,第五双字是一个时间记录,(第一个字节是MSB,第二个字节是 fractional seconds(second byte),第三个字节可并不确定,第四个字节仅能知道其符号位是确定的。)第六双字是windows语言ID标识,后面16个字节是两个连续的组ID, 分别为{7C01FD10-7BAA-11D0-9E0C-00A0-C922-E6EC}
和{7C01FD11-7BAA-11D0-9E0C-00A0-C922-E6EC}
后面是header section的表,其中有两项,每项占16个字节,记录着从文件头开始的偏移量和section的长度,各占8个字节。
后面还有8个字节的信息,这些在版本2里是没有的。
header section 0:
第一双字:0×01fe
第三双字为文件大小
共占5个双字,其余双字均为0
header section 1(directory header)
开始的四个字节为ITSP,
后面的双字为版本号,
第三双字为本section长度,
第四双字信息未知,
第五双字值为0×1000,是目录块的大小,
第六双字是quickref section的“密度”,一般是2
第七双字是索引树的深度,1表示没有索引,2表示有一层的PMGI数据块。
第八双字表示根索引的块号,如果没有索引为-1
第九双字是第一个PMGL(listing)的块号
第十双字是最后一个PMGL的块号
第十一双字是-1
第十二双字是目录块的块数
第十三双字是windows语言ID标识
从这里开始有16个字节的GUID{5D02926A-212E-11D0-9DF9-00A0C922E6EC}
然后四个双字不知道是什么东西
本段共84个字节
从这里开始往后都是数据块,分为两种,一种是列表块(listing chunks),一种是索引块(index chunks)其中列表块的格式如下:
开始是四个字节PMGL
然后的四个字节是目录块尾部的空白区的长度或是quickref区域的长度
第三双字恒为0
第四双字是前一个列表块的块号,如果这是第一个块,该值为-1
第五双字是后一个列表块的块号,如果这是最后一块,该值为-1
从这里开始是目录列表项,按文件名排序,并且大小写不分
quickref区是从数据块的后面向前写,每隔n个项出现一个quickref,且n的值为1+(1<<“密度”),其格式从后至前为
第一个字:整个数据块中的项数
第二个字:从第0项到第n项之间的偏移量
第三个字:从第0项到第2n项之间的偏移量
以此类推
目录列表的每一项的格式如下:
encint型名字长度,后面是UTF-8编码的名称,encint型正文段,encint型偏移量,encint型长度,其中偏移量是从解压缩之后的正文段的开始来计算的,同样长度也是表示解压缩之后的长度。
在目录中存在两种文件,用户数据文件和格式信息文件,格式信息文件以两个连续的冒号“::”开头,用户数据文件以“/”开头。
索引块:
前四个字节为PMGI
后面四个字节是块尾部的quickref或是空白区的长度。
从这里开始是目录索引项的开始,每一个目录索引项的结构如下:
encint型的名称长度,UFT-8编码的名称,以此名称开始的列表块的块号。
quickref的格式和排列与列表块中相同
当有索引块的层次较多时,将不再存储数据块号而是存储下一层的索引号。
解释一下encint型变量的编码规则:
一种可变长度的整型变量,第一个字节只使用低7位,最高位为1表示该字节之后的下一字节的低7位要接在这7位的尾部组成一个数,这样通过移位相加的运算,直到遇到最高位为0的字节,可以组和成一个长度可调节的整数。
正文:在版本3中,正文一般紧跟着文件头,而且在文件头表之后有一个双字用来指定其位置。在版本2中,正文部分紧跟着文件头,而且所有此文件夹中的正文部分的第0段放在都放在这个益上,其它的正文段都within content section 0
名称列表文件:
放在content section 0中,文件名为』::DataSpace/NameList』,其中包含着所有正文段的名称,其格式如下:
第一个字:以字计数的文件长度
第二个字:文件中的entry数
对于每一个entry格式为:
第一个字:以字计数的名字长度,不包括最后的NULL结尾符
以word 0表示所有entry的结束。
名称的编码类似于UFT-16。
段的名称目前为止只有两种,Uncompressed和MSCompressed,分别表示自解释文件和Microsoft LZX压缩算法压缩的文件。
section data:
对 于段号不为0的段,还有一个文件为::DataSpace/Storage/<Section Name>/Content,里面存放着该段的压缩信息,所以,当解析非0段时,需要两步工作,第一步,取得第0段并将其解圧,取得段名,第二步才 能利用段名找到相应的段
其余与格式相关的文件:
::DataSpace/Storage/<SectionName>/ControlData
共0×20个字节,存储关于压缩的信息
第一个双字为在“LZXC”串后的双字个数,在版本2中,此值必为6
第二个双字为“LZXC”
第三个双字为版本信息,必须大于2
第四个双字为LZX reset interval
第五个双字为窗口大小
第六个双字为缓存大小
第七个双字为0,未知信息。
::DataSpace/Storage/<SectionName>/SpanInfo
存放着未解压的段的长度信息。
::DataSpace/Storage/<SectionName>/Transform/List
存放GUID列表用于解压缩
压缩段:
这 一段用LZX压缩,要进行解压缩,先要读取::DataSpace/Storage/<SectionName>/Transform /{7FC28940-9D31-11D0-9B27-00A0C91E9C7C}/InstanceData/ResetTable,其格式如下:
第一个双字为2,估计是版本信息
第二个双字是reset table中的entry数
第三个双字是8,每一个entry的大小
第四个双字是表头长度
16个字节的压缩前长度
16个字节的压缩后长度
16个字节的0×8000 block size for locations below
16个字节的0
16个字节的第一个非压缩数据块的边界在压缩数据块中的位置信息
注意:
There is one change from LZX as defined by Microsoft: After each LZX reset interval (defined in the ControlData file, but in practice equal to the window size) of compressed data is processed, the LZX state is fully reset, as if an entirely new file was being encoded. This allows semi-random access to the compressed data; you can start reading on any reset interval boundary using the reset interval size and the reset table.