AI
Animation
CGI
Compression
Console
Database
Debug
Dialects
Dialogs
Editor
Email
Encryption
Extension
External Library
File
File Handling
Files
Financial
FTP
Game
Games
Graphics
GUI
HTML
HTTP
Internet
LDC
Markup
Math
Module
Network
Networking
None
Other - Net
Parse
Patch
Printing
Protocol
Rebol
Scheme
Scientific
SDK
Security
Shell
Sound
SQL
TCP
Testing
Text
Text Processing
UI
User Interface
Util
Utility
VID
Visualization
Web
Win API
X-File
XML
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"

            
            
        
Copyright © 2018 Rebol Software Foundation