1*45d8a16aSMatthias Ringwald#!/usr/bin/env python3 2*45d8a16aSMatthias Ringwald 3*45d8a16aSMatthias Ringwaldimport glob 4*45d8a16aSMatthias Ringwaldimport re 5*45d8a16aSMatthias Ringwaldimport sys 6*45d8a16aSMatthias Ringwaldimport os 7*45d8a16aSMatthias Ringwaldimport datetime 8*45d8a16aSMatthias Ringwaldfrom pathlib import Path 9*45d8a16aSMatthias Ringwald 10*45d8a16aSMatthias Ringwaldprogram_info = ''' 11*45d8a16aSMatthias RingwaldGenerate .h and .c with BTstack copyright header in BTstack tree 12*45d8a16aSMatthias Ringwald 13*45d8a16aSMatthias RingwaldUsage: tool/btstack_code_template.py path/filename (without extension) 14*45d8a16aSMatthias Ringwald''' 15*45d8a16aSMatthias Ringwald 16*45d8a16aSMatthias Ringwaldcopyright = """/* 17*45d8a16aSMatthias Ringwald * Copyright (C) {copyright_year} BlueKitchen GmbH 18*45d8a16aSMatthias Ringwald * 19*45d8a16aSMatthias Ringwald * Redistribution and use in source and binary forms, with or without 20*45d8a16aSMatthias Ringwald * modification, are permitted provided that the following conditions 21*45d8a16aSMatthias Ringwald * are met: 22*45d8a16aSMatthias Ringwald * 23*45d8a16aSMatthias Ringwald * 1. Redistributions of source code must retain the above copyright 24*45d8a16aSMatthias Ringwald * notice, this list of conditions and the following disclaimer. 25*45d8a16aSMatthias Ringwald * 2. Redistributions in binary form must reproduce the above copyright 26*45d8a16aSMatthias Ringwald * notice, this list of conditions and the following disclaimer in the 27*45d8a16aSMatthias Ringwald * documentation and/or other materials provided with the distribution. 28*45d8a16aSMatthias Ringwald * 3. Neither the name of the copyright holders nor the names of 29*45d8a16aSMatthias Ringwald * contributors may be used to endorse or promote products derived 30*45d8a16aSMatthias Ringwald * from this software without specific prior written permission. 31*45d8a16aSMatthias Ringwald * 4. Any redistribution, use, or modification is done solely for 32*45d8a16aSMatthias Ringwald * personal benefit and not for any commercial purpose or for 33*45d8a16aSMatthias Ringwald * monetary gain. 34*45d8a16aSMatthias Ringwald * 35*45d8a16aSMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS 36*45d8a16aSMatthias Ringwald * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 37*45d8a16aSMatthias Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 38*45d8a16aSMatthias Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN 39*45d8a16aSMatthias Ringwald * GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 40*45d8a16aSMatthias Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 41*45d8a16aSMatthias Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 42*45d8a16aSMatthias Ringwald * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 43*45d8a16aSMatthias Ringwald * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 44*45d8a16aSMatthias Ringwald * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 45*45d8a16aSMatthias Ringwald * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 46*45d8a16aSMatthias Ringwald * SUCH DAMAGE. 47*45d8a16aSMatthias Ringwald * 48*45d8a16aSMatthias Ringwald * Please inquire about commercial licensing options at 49*45d8a16aSMatthias Ringwald * [email protected] 50*45d8a16aSMatthias Ringwald * 51*45d8a16aSMatthias Ringwald */ 52*45d8a16aSMatthias Ringwald""" 53*45d8a16aSMatthias Ringwald 54*45d8a16aSMatthias Ringwaldinclude_template = ''' 55*45d8a16aSMatthias Ringwald/** 56*45d8a16aSMatthias Ringwald * @brief TODO 57*45d8a16aSMatthias Ringwald */ 58*45d8a16aSMatthias Ringwald 59*45d8a16aSMatthias Ringwald#ifndef {include_guard} 60*45d8a16aSMatthias Ringwald#define {include_guard} 61*45d8a16aSMatthias Ringwald 62*45d8a16aSMatthias Ringwald#if defined __cplusplus 63*45d8a16aSMatthias Ringwaldextern "C" {{ 64*45d8a16aSMatthias Ringwald#endif 65*45d8a16aSMatthias Ringwald 66*45d8a16aSMatthias Ringwald#if defined __cplusplus 67*45d8a16aSMatthias Ringwald}} 68*45d8a16aSMatthias Ringwald#endif 69*45d8a16aSMatthias Ringwald#endif // {include_guard} 70*45d8a16aSMatthias Ringwald''' 71*45d8a16aSMatthias Ringwald 72*45d8a16aSMatthias Ringwaldsource_template = ''' 73*45d8a16aSMatthias Ringwald#define BTSTACK_FILE__ "{btstack_file}" 74*45d8a16aSMatthias Ringwald 75*45d8a16aSMatthias Ringwald#include "{header_file}" 76*45d8a16aSMatthias Ringwald 77*45d8a16aSMatthias Ringwald#include "btstack_bool.h" 78*45d8a16aSMatthias Ringwald#include "btstack_config.h" 79*45d8a16aSMatthias Ringwald#include "btstack_debug.h" 80*45d8a16aSMatthias Ringwald 81*45d8a16aSMatthias Ringwald#include <stdint.h> 82*45d8a16aSMatthias Ringwald''' 83*45d8a16aSMatthias Ringwald 84*45d8a16aSMatthias Ringwaldbtstack_root = os.path.abspath(os.path.dirname(sys.argv[0]) + '/..') 85*45d8a16aSMatthias Ringwald 86*45d8a16aSMatthias Ringwaldif len(sys.argv) == 1: 87*45d8a16aSMatthias Ringwald print(program_info) 88*45d8a16aSMatthias Ringwald sys.exit(0) 89*45d8a16aSMatthias Ringwald 90*45d8a16aSMatthias Ringwaldpath = sys.argv[1] 91*45d8a16aSMatthias Ringwaldpath_object = Path(path) 92*45d8a16aSMatthias Ringwald 93*45d8a16aSMatthias Ringwald# include file 94*45d8a16aSMatthias Ringwaldpath_include = path + '.h' 95*45d8a16aSMatthias Ringwaldcopyright_year = datetime.datetime.now().year 96*45d8a16aSMatthias Ringwaldinclude_guard = path_object.name.replace('/','_').upper()+'_H' 97*45d8a16aSMatthias Ringwaldwith open(btstack_root + '/' + path_include, 'wt') as fout: 98*45d8a16aSMatthias Ringwald fout.write(copyright.format(copyright_year=copyright_year)) 99*45d8a16aSMatthias Ringwald fout.write(include_template.format(include_guard=include_guard)) 100*45d8a16aSMatthias Ringwald 101*45d8a16aSMatthias Ringwald# source file 102*45d8a16aSMatthias Ringwaldpath_source = path + ".c" 103*45d8a16aSMatthias Ringwaldbtstack_file = path_object.name + '.c' 104*45d8a16aSMatthias Ringwaldif path_include.startswith('src/'): 105*45d8a16aSMatthias Ringwald # keep path for src/ folder 106*45d8a16aSMatthias Ringwald header_file = path_include.replace('src/','') 107*45d8a16aSMatthias Ringwaldelse: 108*45d8a16aSMatthias Ringwald # only use filename for everything else 109*45d8a16aSMatthias Ringwald header_file = Path(path).name + '.h' 110*45d8a16aSMatthias Ringwaldwith open(btstack_root + '/' + path_source, 'wt') as fout: 111*45d8a16aSMatthias Ringwald fout.write(copyright.format(copyright_year=copyright_year)) 112*45d8a16aSMatthias Ringwald fout.write(source_template.format(btstack_file=btstack_file,header_file=header_file)) 113*45d8a16aSMatthias Ringwald 114*45d8a16aSMatthias Ringwaldprint("Generated {file}.h and {file}.c in {path}".format(file=path_object.name,path=str(path_object.parent))) 115