#! /usr/bin/env python # # # GNAT COMPILER COMPONENTS # # # # X S P A C K # # # # Copyright (C) 2001-2024, Free Software Foundation, Inc. # # # # GNAT is free software; you can redistribute it and/or modify it under # # terms of the GNU General Public License as published by the Free Soft- # # ware Foundation; either version 3, or (at your option) any later ver- # # sion. GNAT is distributed in the hope that it will be useful, but WITH- # # OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY # # or FITNESS FOR A PARTICULAR PURPOSE. # # # # As a special exception under Section 7 of GPL version 3, you are granted # # additional permissions described in the GCC Runtime Library Exception, # # version 3.1, as published by the Free Software Foundation. # # # # You should have received a copy of the GNU General Public License and # # a copy of the GCC Runtime Library Exception along with this program; # # see the files COPYING3 and COPYING.RUNTIME respectively. If not, see # # <http://www.gnu.org/licenses/>. # # # # GNAT was originally developed by the GNAT team at New York University. # # Extensive contributions were provided by Ada Core Technologies Inc. # # xspack # Generate s-pack*.{ads,adb} from templates s-pack.ads.tmpl and s-pack.adb.tmpl tmpl_base = "s-pack.ad%c.tmpl" def read_template(part): return open(tmpl_base % part).readlines() def output(pkg, bits, part): global tmpl bits_str_pad = "%02d" % bits if bits > 99: bits_str_dbl = "1 %d %d" % ((bits / 10) % 10, bits % 10) else: bits_str_dbl = "%d %d " % (bits / 10, bits % 10) bits_str = "%d" % bits out = open(pkg % (bits, part), 'w') skip = False for line in tmpl[part]: if line.find('@even') == 0 and bits % 2 == 1: skip = True if line.find('@/even') == 0: skip = False if line[0] != '@' and not skip: line = line.replace('@@', bits_str_pad) line = line.replace('@ @ ', bits_str_dbl) line = line.replace('@', bits_str) out.write(line) parts = ['s', 'b'] tmpl = {} for part in parts: tmpl[part] = read_template(part) for bits in range(1, 128): if bits & (bits - 1) == 0: # Power of two: no package generated continue if bits > 99: pkg_base = "s-pack%3d.ad%c" else: pkg_base = "s-pack%02d.ad%c" for part in parts: output(pkg_base, bits, part)