| #!/bin/bash |
| |
| # Copyright 2015 Cloudera Inc. |
| # Copyright 2013 University of Chicago and Argonne National Laboratory |
| # |
| # Licensed 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 |
| |
| # Convert file to a C array with provided name. |
| # |
| # Also produce length variable of type size_t with _len suffix. |
| # |
| # We add an extra null byte on the end of the array, which is not |
| # included in the length, to allow it to be used as a string if needed. |
| # |
| set -e |
| |
| arrname="" |
| modifiers="" |
| null_terminate=0 |
| |
| usage () { |
| echo "Usage: $0 [options] [input file] " >&2 |
| echo "Options:" >&2 |
| echo " -v <c array variable name>" >&2 |
| echo " Name of C variable in output file. Must be provided." >&2 |
| echo " -m <array variable modifiers>" >&2 |
| echo " Modifiers for C variable in output file. Default is const." >&2 |
| echo " -n" >&2 |
| echo " Add a trailing null byte, not included in length." >&2 |
| exit 1 |
| } |
| |
| while getopts "m:nv:" opt; do |
| case $opt in |
| m) |
| if [[ $modifiers != "" ]]; then |
| echo "-m specified twice" >&2 |
| usage |
| fi |
| modifiers=$OPTARG |
| ;; |
| n) |
| null_terminate=1 |
| ;; |
| v) |
| if [[ $arrname != "" ]]; then |
| echo "-v specified twice" >&2 |
| usage |
| fi |
| arrname=$OPTARG |
| ;; |
| \?) |
| echo "Invalid option: -$OPTARG" >&2 |
| usage |
| esac |
| done |
| shift $((OPTIND - 1)) |
| |
| infile=$1 |
| if [[ $# > 1 ]]; then |
| echo "Too many remaining arguments: $@" >&2 |
| usage |
| fi |
| |
| if [ -z "$arrname" ]; then |
| echo "-v not provided or empty." >&2 |
| usage |
| fi |
| |
| if [ -z "$modifiers" ]; then |
| # Default is const with global linking visibility |
| modifiers="const" |
| fi |
| |
| echo "#include <stddef.h>" # For size_t |
| echo |
| # Preceding extern declaration guarantees external linkage in C++ |
| echo "extern $modifiers unsigned char $arrname[];"; |
| echo "extern $modifiers size_t ${arrname}_len;" |
| echo |
| echo "$modifiers unsigned char $arrname[] = {" |
| xxd -i < $infile |
| if [ ${null_terminate} = 1 ]; then |
| echo ", 0x0" |
| fi |
| echo "};" |
| |
| echo -n "$modifiers size_t ${arrname}_len = " |
| if [ ${null_terminate} = 1 ]; then |
| echo "sizeof(${arrname}) - 1;" |
| else |
| echo "sizeof(${arrname});" |
| fi |