| 
								
							 | 
							
								# Copyright (c) 2018 Sebastian Gniazdowski
							 | 
						
						
						
							| 
								
							 | 
							
								#
							 | 
						
						
						
							| 
								
							 | 
							
								# $1 - path to the ini file to parse
							 | 
						
						
						
							| 
								
							 | 
							
								# $2 - name of output hash (INI by default)
							 | 
						
						
						
							| 
								
							 | 
							
								# $3 - prefix for keys in the hash (can be empty)
							 | 
						
						
						
							| 
								
							 | 
							
								#
							 | 
						
						
						
							| 
								
							 | 
							
								# Writes to given hash under keys built in following way: ${3}<section>_field.
							 | 
						
						
						
							| 
								
							 | 
							
								# Values are values from ini file.
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								local __ini_file="$1" __out_hash="${2:-INI}" __key_prefix="$3"
							 | 
						
						
						
							| 
								
							 | 
							
								local IFS='' __line __cur_section="void" __access_string
							 | 
						
						
						
							| 
								
							 | 
							
								local -a match mbegin mend
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								[[ ! -r "$__ini_file" ]] && { builtin print -r "fast-syntax-highlighting: an ini file is unreadable ($__ini_file)"; return 1; }
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								while read -r -t 1 __line; do
							 | 
						
						
						
							| 
								
							 | 
							
								    if [[ "$__line" = [[:blank:]]#\;* ]]; then
							 | 
						
						
						
							| 
								
							 | 
							
								        continue
							 | 
						
						
						
							| 
								
							 | 
							
								    elif [[ "$__line" = (#b)[[:blank:]]#\[([^\]]##)\][[:blank:]]# ]]; then
							 | 
						
						
						
							| 
								
							 | 
							
								        __cur_section="${match[1]}"
							 | 
						
						
						
							| 
								
							 | 
							
								    elif [[ "$__line" = (#b)[[:blank:]]#([^[:blank:]=]##)[[:blank:]]#[=][[:blank:]]#(*) ]]; then
							 | 
						
						
						
							| 
								
							 | 
							
								        match[2]="${match[2]%"${match[2]##*[! $'\t']}"}" # remove trailing whitespace
							 | 
						
						
						
							| 
								
							 | 
							
								        __access_string="${__out_hash}[${__key_prefix}<$__cur_section>_${match[1]}]"
							 | 
						
						
						
							| 
								
							 | 
							
								        : "${(P)__access_string::=${match[2]}}"
							 | 
						
						
						
							| 
								
							 | 
							
								    fi
							 | 
						
						
						
							| 
								
							 | 
							
								done < "$__ini_file"
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								return 0
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								# vim:ft=zsh:sw=4:sts=4:et
							 |