#!/bin/sh
#The script inserts or replaces an ini field where $1 is the path of the target file and $2 is the value to add or replace. $2 has the form section:property=value. It only cares about the first instance of $2

file=$2
change=$3
section=$(printf $change | cut -d ':' -f 1)
property=$(printf $change | cut -d ':' -f 2)
property_type=$(printf $property | cut -d '=' -f 1)
ex_blank='^\s*$'
ex_any_sec='^\[.*\]$'
#ex_sec='/^\[$section\]/,/^\[.*\]$\|^\s*$/'

check_args() {
	if [ $1 -ne $2 ]; then
		printf "Invalid number of arguments. Expected $2\n$@\n"
		exit;
	fi
	return 0;
}

replace() {
	sed -i "/^\[$section\]/,/$ex_any_sec\|$ex_blank/ {s/^$property_type=.*$/$property/ }" $1
}

add() {
	#Check if the section exists. If not, abort.
	if [ -z "$(sed "/^\[$section\]$/p" $1)" ]; then printf "section $section does not exist. Aborting.\n" exit; fi
	sed -i "/^\[$section\]/a $property" $1
}

insert() {
	#Check if the field is already there
	field=$(sed -n "/^\[$section\]/,/$ex_any_sec\|$ex_blank/ {/^$property_type=.*$/p}" $1)

	if [ -z $field ]; then add $1; else replace $1; fi
}

get() {
	#Prints a section of the ini file
	sed -n "/^\[$section\]/,/$ex_any_sec\|$ex_blank/ p" $1
}

make() {
	sed -i "$ G; $ a [$section]" $1
}

sdelete() {
	sed -i "/^\[$section\]/,/$ex_any_sec\|$ex_blank/ {/$ex_any_sec/! d; /\[$section\]/d}" $1

}

check_args $# 3
case $1 in
	insert) insert $2 $3;;
	get) get $2 $3;;
	make) make $2 $3;;
	sdelete) sdelete $2 $3;;
	*) printf "invalid command $1";;
esac