#!/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 " >&2 echo " Name of C variable in output file. Must be provided." >&2 echo " -m " >&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 " # 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