| 1 |
root |
1.1 |
# assert.pl |
| 2 |
|
|
# tchrist@convex.com (Tom Christiansen) |
| 3 |
|
|
# |
| 4 |
|
|
# Usage: |
| 5 |
|
|
# |
| 6 |
|
|
# &assert('@x > @y'); |
| 7 |
|
|
# &assert('$var > 10', $var, $othervar, @various_info); |
| 8 |
|
|
# |
| 9 |
|
|
# That is, if the first expression evals false, we blow up. The |
| 10 |
|
|
# rest of the args, if any, are nice to know because they will |
| 11 |
|
|
# be printed out by &panic, which is just the stack-backtrace |
| 12 |
|
|
# routine shamelessly borrowed from the perl debugger. |
| 13 |
|
|
|
| 14 |
|
|
sub assert { |
| 15 |
|
|
&panic("ASSERTION BOTCHED: $_[$[]",$@) unless eval $_[$[]; |
| 16 |
|
|
} |
| 17 |
|
|
|
| 18 |
|
|
sub panic { |
| 19 |
|
|
package DB; |
| 20 |
|
|
|
| 21 |
|
|
select(STDERR); |
| 22 |
|
|
|
| 23 |
|
|
print "\npanic: @_\n"; |
| 24 |
|
|
|
| 25 |
|
|
exit 1 if $] <= 4.003; # caller broken |
| 26 |
|
|
|
| 27 |
|
|
# stack traceback gratefully borrowed from perl debugger |
| 28 |
|
|
|
| 29 |
|
|
local $_; |
| 30 |
|
|
my $i; |
| 31 |
|
|
my ($p,$f,$l,$s,$h,$a,@a,@frames); |
| 32 |
|
|
for ($i = 0; ($p,$f,$l,$s,$h,$w) = caller($i); $i++) { |
| 33 |
|
|
@a = @args; |
| 34 |
|
|
for (@a) { |
| 35 |
|
|
if (/^StB\000/ && length($_) == length($_main{'_main'})) { |
| 36 |
|
|
$_ = sprintf("%s",$_); |
| 37 |
|
|
} |
| 38 |
|
|
else { |
| 39 |
|
|
s/'/\\'/g; |
| 40 |
|
|
s/([^\0]*)/'$1'/ unless /^-?[\d.]+$/; |
| 41 |
|
|
s/([\200-\377])/sprintf("M-%c",ord($1)&0177)/eg; |
| 42 |
|
|
s/([\0-\37\177])/sprintf("^%c",ord($1)^64)/eg; |
| 43 |
|
|
} |
| 44 |
|
|
} |
| 45 |
|
|
$w = $w ? '@ = ' : '$ = '; |
| 46 |
|
|
$a = $h ? '(' . join(', ', @a) . ')' : ''; |
| 47 |
|
|
push(@frames, "$w&$s$a from file $f line $l\n"); |
| 48 |
|
|
} |
| 49 |
|
|
for ($i=0; $i <= $#frames; $i++) { |
| 50 |
|
|
print $frames[$i]; |
| 51 |
|
|
} |
| 52 |
|
|
exit 1; |
| 53 |
|
|
} |
| 54 |
|
|
|
| 55 |
|
|
1; |