about summary refs log tree commit diff stats
path: root/cpp/tangle/makefile
blob: 2448565265e27b7f913d05e24a7e19d05ae5ee34 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
tangle: makefile type_list function_list file_list test_file_list test_list
	g++ -g -O3 -Wall -Wextra -fno-strict-aliasing boot.cc -o tangle

type_list: boot.cc [0-9]*.cc
	@# assumes struct decl has space before '{'
	@grep -h "^struct .* {" [0-9]*.cc |perl -pwe 's/(struct *[^ ]*).*/$$1;/' > type_list
	@grep -h typedef [0-9]*.cc >> type_list

function_list: boot.cc [0-9]*.cc
	@# assumes function decl has space before '{'
	@grep -h "^[^ #].*) {" [0-9]*.cc |perl -pwe 's/ {.*/;/' > function_list

file_list: boot.cc [0-9]*.cc
	@ls [0-9]*.cc |grep -v "\.test\.cc$$" |perl -pwe 's/.*/#include "$$&"/' > file_list

test_file_list: [0-9]*.test.cc
	@ls [0-9]*.test.cc |perl -pwe 's/.*/#include "$$&"/' > test_file_list

test_list: [0-9]*.cc
	@grep -h "^[[:space:]]*void test_" [0-9]*.cc |perl -pwe 's/^\s*void (.*)\(\) {$$/$$1,/' > test_list

clean:
	rm -rf tangle *_list
c License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. from ranger.ext.utfwidth import uwid class Bar(object): left = None right = None gap = None def __init__(self, base_color_tag): self.left = BarSide(base_color_tag) self.right = BarSide(base_color_tag) self.gap = BarSide(base_color_tag) def add(self, *a, **kw): self.left.add(*a, **kw) def addright(self, *a, **kw): self.right.add(*a, **kw) def sumsize(self): return self.left.sumsize() + self.right.sumsize() def fixedsize(self): return self.left.fixedsize() + self.right.fixedsize() def shrink_by_removing(self, wid): leftsize = self.left.sumsize() rightsize = self.right.sumsize() sumsize = leftsize + rightsize # remove elemets from the left until it fits if sumsize > wid: while len(self.left) > 0: leftsize -= len(self.left.pop(-1).string) if leftsize + rightsize <= wid: break sumsize = leftsize + rightsize # remove elemets from the right until it fits if sumsize > wid: while len(self.right) > 0: rightsize -= len(self.right.pop(0).string) if leftsize + rightsize <= wid: break sumsize = leftsize + rightsize if sumsize < wid: self.fill_gap(' ', (wid - sumsize), gapwidth=True) def shrink_from_the_left(self, wid): fixedsize = self.fixedsize() if wid < fixedsize: raise ValueError("Cannot shrink down to that size by cutting") leftsize = self.left.sumsize() rightsize = self.right.sumsize() oversize = leftsize + rightsize - wid - 1 if oversize <= 0: return self.fill_gap(' ', wid, gapwidth=False) nonfixed_items = self.left.nonfixed_items() # Shrink items to a minimum size of 1 until there is enough room. for item in self.left: if not item.fixed: itemlen = len(item) if oversize > itemlen - 1: item.cut_off_to(1) oversize -= (itemlen - 1) else: item.cut_off(oversize) break def fill_gap(self, char, wid, gapwidth=False): del self.gap[:] if not gapwidth: wid = wid - self.sumsize() if wid > 0: self.gap.add(char * wid, 'space') def combine(self): return self.left + self.gap + self.right class BarSide(list): def __init__(self, base_color_tag): self.base_color_tag = base_color_tag def add(self, string, *lst, **kw): cs = ColoredString(string, self.base_color_tag, *lst) cs.__dict__.update(kw) self.append(cs) def add_space(self, n=1): self.add(' ' * n, 'space') def sumsize(self): return sum(len(item) for item in self) def fixedsize(self): n = 0 for item in self: if item.fixed: n += len(item) else: n += 1 return n def nonfixed_items(self): return sum(1 for item in self if not item.fixed) class ColoredString(object): def __init__(self, string, *lst): self.string = string self.lst = lst self.fixed = False def cut_off(self, n): if n >= 1: self.string = self.string[:-n] def cut_off_to(self, n): self.string = self.string[:n] def __len__(self): return uwid(self.string) def __str__(self): return self.string