xref: /freebsd/contrib/bc/gen/strgen.sh (revision a970610a3af63b3f4df5b69d91c6b4093a00ed8f)
1252884aeSStefan Eßer#! /bin/sh
2252884aeSStefan Eßer#
33aa99676SStefan Eßer# SPDX-License-Identifier: BSD-2-Clause
4252884aeSStefan Eßer#
5*a970610aSStefan Eßer# Copyright (c) 2018-2024 Gavin D. Howard and contributors.
6252884aeSStefan Eßer#
7252884aeSStefan Eßer# Redistribution and use in source and binary forms, with or without
8252884aeSStefan Eßer# modification, are permitted provided that the following conditions are met:
9252884aeSStefan Eßer#
10252884aeSStefan Eßer# * Redistributions of source code must retain the above copyright notice, this
11252884aeSStefan Eßer#   list of conditions and the following disclaimer.
12252884aeSStefan Eßer#
13252884aeSStefan Eßer# * Redistributions in binary form must reproduce the above copyright notice,
14252884aeSStefan Eßer#   this list of conditions and the following disclaimer in the documentation
15252884aeSStefan Eßer#   and/or other materials provided with the distribution.
16252884aeSStefan Eßer#
17252884aeSStefan Eßer# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18252884aeSStefan Eßer# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19252884aeSStefan Eßer# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20252884aeSStefan Eßer# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
21252884aeSStefan Eßer# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22252884aeSStefan Eßer# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23252884aeSStefan Eßer# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24252884aeSStefan Eßer# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25252884aeSStefan Eßer# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26252884aeSStefan Eßer# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27252884aeSStefan Eßer# POSSIBILITY OF SUCH DAMAGE.
28252884aeSStefan Eßer#
29252884aeSStefan Eßer
30252884aeSStefan Eßerexport LANG=C
31252884aeSStefan Eßerexport LC_CTYPE=C
32252884aeSStefan Eßer
33252884aeSStefan Eßerprogname=${0##*/}
34252884aeSStefan Eßer
3578bc019dSStefan Eßerscript="$0"
3678bc019dSStefan Eßerscriptdir=$(dirname "$script")
3778bc019dSStefan Eßer. "$scriptdir/../scripts/functions.sh"
3878bc019dSStefan Eßer
394fca8e0fSStefan Eßer# Just print the usage and exit with an error. This can receive a message to
404fca8e0fSStefan Eßer# print.
414fca8e0fSStefan Eßer# @param 1  A message to print.
424fca8e0fSStefan Eßerusage() {
434fca8e0fSStefan Eßer	if [ $# -eq 1 ]; then
444fca8e0fSStefan Eßer		printf '%s\n\n' "$1"
454fca8e0fSStefan Eßer	fi
464fca8e0fSStefan Eßer	printf 'usage: %s input output exclude name [label [define [remove_tabs]]]\n' "$progname"
474fca8e0fSStefan Eßer	exit 1
484fca8e0fSStefan Eßer}
494fca8e0fSStefan Eßer
5044d4804dSStefan Eßer# See strgen.c comment on main() for what these mean. Note, however, that this
5144d4804dSStefan Eßer# script generates a string literal, not a char array. To understand the
5244d4804dSStefan Eßer# consequences of that, see manuals/development.md#strgenc.
5350696a6eSStefan Eßerif [ $# -lt 3 ]; then
544fca8e0fSStefan Eßer	usage "Not enough arguments"
55252884aeSStefan Eßerfi
56252884aeSStefan Eßer
57252884aeSStefan Eßerinput="$1"
584fca8e0fSStefan Eßercheck_file_arg "$input"
59252884aeSStefan Eßeroutput="$2"
6078bc019dSStefan Eßerexclude="$3"
6178bc019dSStefan Eßername="$4"
6278bc019dSStefan Eßerlabel="$5"
6378bc019dSStefan Eßerdefine="$6"
6478bc019dSStefan Eßerremove_tabs="$7"
65103d7cdfSStefan Eßerif [ "$remove_tabs" != "" ]; then
664fca8e0fSStefan Eßer	check_bool_arg "$remove_tabs"
67103d7cdfSStefan Eßerfi
68252884aeSStefan Eßer
69d101cdd6SStefan Eßertmpinput=$(mktemp -t "${input##*/}_XXXXXX")
7078bc019dSStefan Eßer
7178bc019dSStefan Eßerif [ "$exclude" -ne 0 ]; then
7278bc019dSStefan Eßer	filter_text "$input" "$tmpinput" "E"
7378bc019dSStefan Eßerelse
7478bc019dSStefan Eßer	filter_text "$input" "$tmpinput" "A"
7578bc019dSStefan Eßerfi
7678bc019dSStefan Eßer
7778bc019dSStefan Eßerexec < "$tmpinput"
78252884aeSStefan Eßerexec > "$output"
79252884aeSStefan Eßer
8078bc019dSStefan Eßerrm -f "$tmpinput"
8178bc019dSStefan Eßer
82252884aeSStefan Eßerif [ -n "$label" ]; then
83252884aeSStefan Eßer	nameline="const char *${label} = \"${input}\";"
8450696a6eSStefan Eßer	labelexternline="extern const char *${label};"
85252884aeSStefan Eßerfi
86252884aeSStefan Eßer
87252884aeSStefan Eßerif [ -n "$define" ]; then
88252884aeSStefan Eßer	condstart="#if ${define}"
89252884aeSStefan Eßer	condend="#endif"
90252884aeSStefan Eßerfi
91252884aeSStefan Eßer
92252884aeSStefan Eßerif [ -n "$remove_tabs" ]; then
93252884aeSStefan Eßer	if [ "$remove_tabs" -ne 0 ]; then
94252884aeSStefan Eßer		remtabsexpr='s:	::g;'
95252884aeSStefan Eßer	fi
96252884aeSStefan Eßerfi
97252884aeSStefan Eßer
98252884aeSStefan Eßercat<<EOF
99*a970610aSStefan Eßer// Copyright (c) 2018-2024 Gavin D. Howard and contributors.
100252884aeSStefan Eßer// Licensed under the 2-clause BSD license.
101252884aeSStefan Eßer// *** AUTOMATICALLY GENERATED FROM ${input}. DO NOT MODIFY. ***
102252884aeSStefan Eßer
103252884aeSStefan Eßer${condstart}
10450696a6eSStefan Eßer$labelexternline
10550696a6eSStefan Eßer
10650696a6eSStefan Eßerextern const char $name[];
107252884aeSStefan Eßer
108252884aeSStefan Eßer$nameline
109252884aeSStefan Eßer
110252884aeSStefan Eßerconst char ${name}[] =
111252884aeSStefan Eßer$(sed -e "$remtabsexpr " -e '1,/^$/d; s:\\n:\\\\n:g; s:":\\":g; s:^:":; s:$:\\n":')
112252884aeSStefan Eßer;
113252884aeSStefan Eßer${condend}
114252884aeSStefan EßerEOF
11578bc019dSStefan Eßer
11678bc019dSStefan Eßer#if [ "$exclude" -ne 0 ]; then
11778bc019dSStefan Eßer	#rm -rf "$input"
11878bc019dSStefan Eßer#fi
119