| #!/usr/bin/env bash |
| # tools/process_config.sh |
| # |
| # Licensed to the Apache Software Foundation (ASF) under one or more |
| # contributor license agreements. See the NOTICE file distributed with |
| # this work for additional information regarding copyright ownership. The |
| # ASF licenses this file to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance with the |
| # License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| # License for the specific language governing permissions and limitations |
| # under the License. |
| # |
| |
| process_file() { |
| local output_file="$1" |
| local input_file="$2" |
| local include_paths=("${!3}") |
| |
| while IFS= read -r line || [ -n "$line" ] |
| do |
| if [[ $line == \#include* ]]; then |
| local include_file=$(echo $line | sed -E 's/#include [<"](.+)[">]/\1/') |
| local found=false |
| |
| # Check current directory first |
| |
| if [ -f $include_file ]; then |
| process_file $output_file $include_file include_paths[@] |
| found=true |
| else |
| # Then check in the include paths |
| |
| for path in "${include_paths[@]}"; do |
| local full_path="$path/$include_file" |
| if [ -f $full_path ]; then |
| process_file $output_file $full_path include_paths[@] |
| found=true |
| break |
| fi |
| done |
| fi |
| |
| # Configuration file not found |
| |
| if [ "$found" = false ]; then |
| echo "ERROR: Can't find \"$include_file\" in current directory or search paths." |
| rm $output_file |
| exit 1 |
| fi |
| else |
| echo "$line" >> $output_file |
| fi |
| done < "$input_file" |
| } |
| |
| usage() { |
| echo "Usage: $0 [OPTIONS] [INPUT_FILE]" |
| echo " -h display this help" |
| echo " -I include path, can be specified multiple times" |
| echo " -o output file" |
| echo " [INPUT_FILE] the file to be processed" |
| } |
| |
| while [[ $# -gt 0 ]] |
| do |
| key="$1" |
| |
| case $key in |
| -I) |
| INCLUDE_PATHS+=("$2") |
| shift |
| shift |
| ;; |
| -o) |
| OUTPUT_FILE="$2" |
| shift |
| shift |
| ;; |
| *) |
| if [ -z "$INPUT_FILE" ]; then |
| INPUT_FILE="$1" |
| shift |
| else |
| echo "Error: Multiple input files specified" |
| usage |
| exit 1 |
| fi |
| ;; |
| esac |
| done |
| |
| if [ -z "$INPUT_FILE" ]; then |
| echo "Error: Input file not specified" |
| usage |
| exit 1 |
| fi |
| |
| if [ -z "$OUTPUT_FILE" ]; then |
| echo "Error: Output file not specified" |
| usage |
| exit 1 |
| fi |
| |
| echo "" > $OUTPUT_FILE |
| process_file "$OUTPUT_FILE" "$INPUT_FILE" INCLUDE_PATHS[@] |