#!/bin/bash #set -x OPENSCAD=${OPENSCAD:-"openscad"} RUN=y INTERACTIVE= PRINT_VARS= USER_OUTPUT_FILENAME= SCAD_FILE= SHELL_SKEL= help() { cat <&2; exit 1; } warn() { printf 'Warning: %s\n' "$*" >&2; } strip_multiline_comments () { # https://stackoverflow.com/questions/13061785/remove-multi-line-comments # https://stackoverflow.com/users/751863/steve sed -r ':a; s%(.*)/\*.*\*/%\1%; ta; /\/\*/ !b; N; ba' } strip_trailing_semicolon () { sed -r 's/;$//' } strip_leading_spaces () { sed -r 's/^ +//' } strip_trailing_spaces () { sed -r 's/ +$//' } strip_nonassignments () { grep -e '^[A-Za-z0-9_]\+\s*=' } chomp () { strip_leading_spaces |strip_trailing_spaces } parse_variable () { #sed -r 's/^([a-zA-Z0-9_]+).*/\1/' sed -r 's/^([^=]+)=.*/\1/' } parse_value () { #sed -r 's/^.*?=\s*([^;]+);.*$/\1/' #sed -r 's/^[^=]+\s*=\s*([^;]+);.*$/\1/' sed -r 's/.*=\s*([^;]+?).*/\1/' } val_to_filename () { echo "$1" |sed -r 's/"//g' |sed -r 's/ /_/g' } strip_after_hidden () { sed -n '/\/\* \[Hidden\] \*\//q;p' "$1" } strip_trailing () { trailing="$1" input="$2" echo ${input%${trailing}} } main() { parse_options "$@" output_params="" default_output_filename="" ALL="" VALUES="" val_sep="-" var_sep="," declare -A SCAD declare -a scad_var_order while IFS= read -r line; do [ "$line" ] || continue; clean="$(echo -n "$line" |chomp)" var=$(echo -n "$clean" |parse_variable |chomp) # use value provided on command line preferentially to any values in the .scad file val="" if [[ -n "${!var}" ]]; then val=${!var} else val=$(echo -n "$clean" |parse_value |chomp) fi if [ "$var" ] && [ "$val" ]; then scad_var_order+=($var); SCAD[$var]="$val" output_params+="-D '$var=$val' " VALUES+="$(val_to_filename "$val")${val_sep}" ALL+="${var}=$(val_to_filename "$val")${var_sep}" fi; done < <(strip_after_hidden $SCAD_FILE | \ strip_multiline_comments |strip_nonassignments |strip_trailing_semicolon) if [ "$PRINT_VARS" ]; then for k in "${scad_var_order[@]}"; do # Make sure quotes surround openscad strings case "${SCAD[$k]:0:1}" in \" ) line="${k}='${SCAD[$k]}'";; \' ) line=${k}="\"${SCAD[$k]}\"";; * ) line="${k}=${SCAD[$k]}";; esac echo $line done exit fi if [ "$SHELL_SKEL" ]; then all_vars=$($0 $SCAD_FILE -p |sed -e 's/^/# /') cat <