X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/misc/blobdiff_plain/8d769cc9146d71188f2ffe9cd5a9160706614f1d..71d8432e96caa48f761666b6c07f5519d98d04a4:/cdb-assign diff --git a/cdb-assign b/cdb-assign index 5f2f44e..686d0f7 100755 --- a/cdb-assign +++ b/cdb-assign @@ -1,15 +1,40 @@ -#! /usr/bin/perl - -use CDB_File; - -@ARGV >= 1 or die "usage: $0 CDB [INPUT ...]\n"; -$f = shift; -$c = CDB_File->new($f, "$f.new") or die "CDB_File->new: $!\n"; -while (<>) { - chomp; - next if m'^\s*(\#|$)'; - m'^\s*([-\w]+)\s*=\s*(.*\S|)\s*$' or die "bad assignment `$_'\n"; - $c->insert($1, $2); -} -$c->finish(); -exit 0; +#! /usr/bin/python + +from cdb import cdbmake +from sre import compile as r_compile, sub as r_sub +from sys import argv, stdin, stderr, exit + +ego = r_sub(r'^.*[/\\]', '', argv[0]) +def die(msg, prefix = True): + if prefix: msg ='%s: %s' % (ego, msg) + print >>stderr, msg + exit(1) + +def files(args): + if len(args) == 0: + yield stdin + else: + for a in args: + if a == '-': + yield stdin + else: + yield open(a, 'r') + +if len(argv) < 2: + die('usage: %s CDB [INPUT ...]' % ego, False) + +rx_comment = r_compile(r'^\s*(\#|$)') +rx_split = r_compile(r'^\s*([-\w]+)\s*=\s*(.*\S|)\s*$') + +cdb = cdbmake(argv[1], argv[1] + '.new') +for f in files(argv[2:]): + for line in f: + if len(line) and line[-1] == '\n': line = line[:-1] + if rx_comment.match(line): + continue + m = rx_split.match(line) + if not m: + die("bad assignment: `%s'" % line) + k, v = m.groups([1, 2]) + cdb.add(k, v) +cdb.finish()