REBOL [ Title: "Parse ini file" Date: 15-Apr-2009 Author: "Sunanda" File: %parse-ini.r Purpose: "Parses a Window's ini file. Also a function to find entries in a parsed ini file" library: [ level: 'beginner platform: 'windows type: 'Tool domain: [file-handling parse win-api] tested-under: 'windows support: none license: 'bsd see-also: none ] Version: 1.0.2 History: [ [1.0.0 2-oct-2004 "First release"] [1.0.1 4-feb-2007 "Fix bug that drops the last section -- thanks, robiandi!"] [1.0.2 15-apr-2009 "Fix bug that failed to parse comments -- thanks, sqlab!"] ] ] ;; ===================== ;; Comments on script: ;; Altme: http://www.rebol.org/aga-display-posts.r?post=r3wp162x826 ;; REBOL.org: http://www.rebol.org/discussion.r?script=parse-ini.r ;; ;; ============== ;; parse ini file ;; ============== parse-ini-file: func [ file-name [file!] /local ini-block current-section parsed-line section-name ][ ini-block: copy [] current-section: copy [] foreach ini-line read/lines file-name [ if #";" <> first ini-line [ ; do not process comment lines section-name: ini-line error? try [section-name: first load/all ini-line] either any [ error? try [block? section-name] not block? section-name ][ parsed-line: parse/all ini-line "=" append last current-section parsed-line/1 append last current-section parsed-line/2 ][ append ini-block current-section current-section: copy [] append current-section form section-name append/only current-section copy [] ] ;; either ] ] ;; for append ini-block current-section return to-hash ini-block ] ;; =========== ;; Find in ini ;; =========== Find-in-ini: func [ ini [hash!] section [string!] item [string!] ][ error? try [return select/skip select ini section item 2] return false ] ;; ========= ;; test data ;; ========= ini: parse-ini-file %/c/windows/win.ini print find-in-ini ini "ports" "com1:" print find-in-ini ini "intl" "iCountry" print find-in-ini ini "truetype" "FontSmoothing" print find-in-ini ini "xxx" "xxxx"