TCL programmer since 2000
Just giving back to the TCL community
package provide Equals 0.1
# After doing some work trying converting a C library example into TCL it dawned on me, we don't have +=, -= ...
proc plusEq {var val {float ""}} {
upvar $var lVar
if {![info exists lVar]} {set lVar 0}
if {[regexp -nocase -- {^f(|l|lt|loat)$} $float]} {
if {[regexp -nocase -- {\.} $val]} {
set lVar [expr $lVar + ${val}]
} else {
set lVar [expr $lVar + ${val}.0]
}
} else {
set lVar [expr $lVar + int($val)]
}
}
proc minusEq {var val {float ""}} {
upvar $var lVar
if {![info exists lVar]} {set lVar 0}
if {[regexp -nocase -- {^f(l|lt|loat)$} $float]} {
if {[regexp -nocase -- {\.} $val]} {
set lVar [expr $lVar - ${val}]
} else {
set lVar [expr $lVar - ${val}.0]
}
} else {
set lVar [expr $lVar - int($val)]
}
}
proc timesEq {var val {float ""}} {
upvar $var lVar
if {![info exists lVar]} {set lVar 1}
if {[regexp -nocase -- {^f(l|lt|loat)$} $float]} {
if {[regexp -nocase -- {\.} $val]} {
set lVar [expr $lVar * ${val}]
} else {
set lVar [expr $lVar * ${val}.0]
}
} else {
set lVar [expr $lVar * int($val)]
}
}
proc divEq {var val {float ""}} {
upvar $var lVar
if {![info exists lVar]} {set lVar 1}
if {[regexp -nocase -- {^f(l|lt|loat)$} $float]} {
if {[regexp -nocase -- {\.} $val]} {
set lVar [expr $lVar / ${val}]
} else {
set lVar [expr $lVar / ${val}.0]
}
} else {
set lVar [expr $lVar / int($val)]
}
}
Here's another of my creations that i'm currently using in a project. I have this built to be incorporated into a namespace, I currently use it my own tclUtil package. But you can modify it, to use globals as you see fit.
and as always,
proc makeToglVar {var args} {
# As per its name, this creates a procedure and stores the value in its own
# dictionary of variables.
# I originally wrote it to just toggle between 0 and 1, but then thought about it
# for a bit and it can toggle between probably any 2 values
# and that's all it does, by calling the variable name
# it will simply toggle between the 2 values on succesive calls
# The latest change in the variable procedure,
# is to call it with a 1 and it will just return the current value, without toggling.
# if you're debugging and need to know what it is at that time, lol
if {$args == ""} {
lassign {0 1} val0 val1
} elseif {[llength [eval concat $args]] != 2} {
error "invalid number of args:$args"
} else {
# this might get a little tricky if you use values with spaces.
lassign [eval concat $args] val0 val1
}
pvar val0 val1
variable $var
variable mtv
dict set mtv $var [dict create val1 [list $val1] val0 [list $val0]]
set $var $val0
set cmd {proc ::nsTclUtil::$var {{val 0}} {
variable mtv
if {\$val} {
return [set ::nsTclUtil::$var]
}
if {[set ::nsTclUtil::$var] == [dict get \$mtv $var val0]} {
set ::nsTclUtil::$var [dict get \$mtv $var val1]
} else {
set ::nsTclUtil::$var [dict get \$mtv $var val0]
}
}}
set cmd [subst -nocommands $cmd]
# pvar cmd
uplevel #0 $cmd
namespace export $var
uplevel #0 "namespace import ::nsTclUtil::$var"
eval $var
}Anybody care to join in on creating a Network discovery utility, without using SNMP.
I'm thinking of spoofing a routing protocol and capturing the updates or data, and deciphering.
Especially since we have network / port access to be a server or client of sorts, and transmit packets.
I was initally thinking OSPF, because i thought there might be some nice psuedo code, but i don't seem to find any, just C* livbrarys, even in some of the open source packages.
This is intended to perform local disovery only, on your own network
--- Ok, well nevermind, i found a round about solution, that appears to be robust enough --- I created a vm on my network and am running FRRouting, on it, with 2 interfaces, 1 on the main common network that extends into the VM network, and the other interface on the VM network that is attached to the routers running, And since FRRouting runs on a Linux distro, i also installed NMAP, and can now use just a shell script to capture all the ip addresses on every subnet that the routers are advertising. Pretty slick. And being a shell script can pretty much configure the output any way anybody might desire.