rof.bash
#!/usr/bin/env bash
str="$(cat test.rof)"
declare -A ROF_CONF
state=""
stOpen="0"
stKey=1
curKey=""
curValue=""
function conf_load(){
while read -r line; do
key=$(echo "$line" | sed -E 's/^([a-zA-Z._-]+):.*/\1/')
if [[ "$key" != "$line" ]];then
if [[ -n "$curKey" ]];then
# remove trailing whitespace from curValue
# echo "#####${curValue:(-1)}"
while [[ "${curValue:(-1)}" == " " || "${curValue:(-2)}" == "\n" ]];do
# echo "TRIM END"
if [[ "${curValue:(-1)}" == " " ]];then
curValue="${curValue:0:-1}"
else
curValue="${curValue:0:-2}"
fi
done
# echo "#####${curValue:(-1)}"
if [[ "${curValue:(-1)}" == "\\" ]];then
# echo "backslash!!!!!!"
curValue="${curValue:0:-1}"
fi
ROF_CONF["$curKey"]="$curValue"
# echo "KEY:${curKey}"
fi
len="${#key}"
len=$(( len + 1 ))
value="${line:${len}}"
while [[ "${value:0:1}" == " " ]];do
value="${value:1}"
done
if [[ "${value:0:1}" == "\\" ]];then
value=${value:1}
fi
# echo "##$key"
# echo "--$value"
curKey="$key"
curValue="$value"
else
# echo "--$line--"
if [[ "${line:0:1}" == "\\" ]];then
line=${line:1}
fi
# echo "--$line--"
# continue;
if [[ "${line:-1}" == "\\" ]];then
echo '################trim end'
line="${line:0:-1}"
fi
curValue+="\n"
curValue+=$line
fi
done <<< "$str"
while [[ "${curValue:(-1)}" == " " || "${curValue:(-2)}" == "\n" ]];do
# echo "TRIM END"
if [[ "${curValue:(-1)}" == " " ]];then
curValue="${curValue:0:-1}"
else
curValue="${curValue:0:-2}"
fi
done
# echo "#####${curValue:(-1)}"
if [[ "${curValue:(-1)}" == "\\" ]];then
# echo "backslash!!!!!!"
curValue="${curValue:0:-1}"
fi
ROF_CONF["$curKey"]="$curValue"
}
function conf_get(){
key="$1"
# local -n OUT $2
# echo "--------$key"
OUT="${ROF_CONF["$key"]}"
echo -e "$OUT"
}
function conf_set(){
key="$1"
val="$2"
ROF_CONF["$key"]="$val"
}
## THIS IS THE ONLY PART THAT DOESNT WORK!!!!
function conf_save(){
file="test-out.rof"
: > $file
out=""
for key in "${!ROF_CONF[@]}"; do
# echo "$key:::::"
out="${key}: "
# echo -e "$out" >> "$file"
value="${ROF_CONF["$key"]}";
if [[ "${value:0:1}" == " " ]];then
value="\\${value}"
fi
if [[ "${value:(-1)}" == " " ]];then
value="${value}\\"
fi
c=0
value=$(echo -e "$value")
while read -r line; do
storeValue=""
# echo "---$line---"
# continue;
if [[ $c -eq 0 ]];then
c=1
storeValue+="$line"
echo -e "${key}: $line" >> $file
continue;
fi
# if [[ "${line:0:3}" == "not" ]];then
# line="\\$line"
# fi
if [[ "$line" =~ ^([a-zA-Z._-]+):.* ]];then
line="\\$line"
elif [[ "${line:0:1}" == "\\" ]];then
line="\\$line"
fi
# key=$(echo "$line" | sed -E 's/^([a-zA-Z._-]+):.*/\1/')
storeValue+="$line"
storeValue+=$(echo -e "\n")
echo "$storeValue" >> $file
done <<< "$value"
echo "" >> $file
# out+="$storeValue"
# echo "$out" >> $file
# echo -e "\n" > $file
done
# echo -e "$out" > $file
}
conf_load
conf_set a.one "I am a new value for a.one"
conf_save
echo "######################### CAT FILE ####################################"
cat test-out.rof
# echo "######################### ORIG FILE ####################################"
# cat test.rof
# echo "--a.one:$(conf_get a.one)"
# echo "--two-whoo:$(conf_get Another_two-whoo)"
# echo "--last.four:$(conf_get last.fourkey)"
# echo "--three:$(conf_get A.Key.three)"