使用開原始碼寫linux程式(轉)

post0發表於2007-08-11
使用開原始碼寫linux程式(轉)[@more@]

linux下程式設計沒有現成的東西都要自己寫,但網上有不少開源作品可以複用,僅以此篇拋轉引玉,也想讓大家互相交流如何有效的使用這些資源,千萬別吝嗇你的經驗。

由來

小時候很喜歡看卡通漫畫,最近偶然從網上看見許多以前看過的漫畫,donwloading...,但這些漫畫都是放在zip包內,看起來需要解壓縮很不方便,win下有一些直接在zip包內看圖的軟體而且使用方便,可linux下卻很少而且即使有也需要x,一般對像我這樣都直接在控制檯下工作不用 x的人很不方便,為此想寫一個小工具用以解決這個問題。

問題

這個工具初步階段需要解決的是zip解壓縮和圖片解碼及圖形顯示的問題和程式碼級的平臺無關性。

關於zip解壓縮有2個方案:

1、使用unzip工具(zipinfo、unzip)現有工具完成

2、使用zlib和其包裝庫zziplib

圖形相關的則選用SDL和其相關圖片解碼庫SDL_image

相關連線:

unzip工具

zlib

zziplib

SDL

SDL_image /projects/SDL_image

unzip的使用

#define UNZIP "unzip -p -qq -P"

#define UNZIP_TEST "unzip -q -t -P"

#define ZIPINFO "zipinfo -1"

#define SORT "sort -gin"

透過以上這些宏對zip檔案進行處理

這段程式碼假定當前目錄有一個密碼檔案,而UNZIP_TEST是用於測試密碼檔案內的這些密碼是不是適合當前需要解壓縮的zip

UNZIP則是用來解壓縮

ZIPINFO是取得zip包內的檔名列表

SORT則是把ZIPINFO取得的檔名列表按數字順序排序(如果不能按數字排序就以字母排序)

解壓縮程式碼實現了3個供圖片顯示程式碼呼叫的介面:

zip_init(zip) 初始化zip

zip_getfile(i) 取得zip內第i個檔案

zip_free() 釋放zip

之所以這麼安排完全是為了解壓縮和顯示分離。

tatic ZZIP_DIR *zip_dir;

static ZZIP_DIRENT *zip_dirent;

static ZZIP_FILE *zip_file;

以上3個顧名思意,和平時的程式設計不同的是有了ZZIP字首。

和un_zip一樣,這個例程也實現了同樣的3個介面(當然實現是不同的),不過zziplib不支援加密檔案:(,所以這段程式碼不能用於加密的zip。

首先用zzip_opendir開啟zip,然後逐個zzip_readdir,由於無法用sort,所以只好用標準c提供的qsort的函式,但要自己寫一個compare函式,這個compare和前面un_zip裡的sort完成同樣功能(忽略路徑,對檔名先按數字比較,再按字母比較)

SDL顯示圖片

函式showzipimg先初試化sdl環境,然後呼叫zip_init初始化zip檔案並獲得zip內的檔案數量(zip_init的返回值),接著用zip_getfile(i)取得圖片檔案的FILE*,

接下來透過IMG_Load_RW(SDL_RWFromFP(tmpimg, 1), 1)呼叫獲得圖片的sdl_surface,接下去就是用SDL_BlitSurface和SDL_UpdateRect畫圖和更新螢幕了

跟著的while和switch就是響應事件了

空格和左鍵雙擊是顯示下一張圖片,

右鍵雙擊是顯示上一張圖片,

上,下,左,右及滑鼠拖放是移動圖片

Q鍵或關閉視窗(x?)是退出程式

(sdl裡沒雙擊事件,用個時間差模擬了一下)

mycomicviewer

這個是整套的程式,在控制檯下執行需要fb的支援(x下應該可以直接執行),win下也可用,comicsviewer.pwd就是密碼檔案,現在裡面為空,:)

main函式很簡單,以後可以為其加如命令列選項(考慮用libpopt)和配置檔案載入(考慮用win的ini或linux的conf,反正這2種檔案都有開源包的支援).

雖然用autoconf配過了,但是短時間做的很粗糙,如果不能configure和make,就直接gcc吧(應該自己寫個makefile,懶~,用慣gnu的工具了)

對了,這個工具叫mycomicviewer

宣告

寫此文並不是想在這裡釋出軟體,而是想透過此文和大家交流一下使用開源包的經驗和技巧,還有就是讓大家少走彎路,讓大家知道有那些方便的庫可以使用,不必再重複開發

ps,個人還是很喜歡親自寫一些別人寫過的的程式碼以達到鍛鍊的目的,不過如果是寫應用的話就不必這麼費力氣了,找點有用的包就解決問題


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-944633/,如需轉載,請註明出處,否則將追究法律責任。

相關文章