r3wp [groups: 83 posts: 189283]
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search
 

World: r3wp

[Core] Discuss core issues

Ladislav
13-Apr-2010
[16302]
Certainly, that is another possibility, and if you state it that 
way, then, of course, there is a possibility to use that form, it 
is just not the one chosen in the MOLD implementation in this case.
Geomol
13-Apr-2010
[16303]
oki, I just wanted to know, if there was some problem in here, I 
didn't see.
BrianH
13-Apr-2010
[16304]
The creating the strings two different ways isn't the problem in 
this case, it's double escaping.
Ladislav
13-Apr-2010
[16305]
..., and, as far as I know, the escaping of #"{" and #"}" has quirks 
in R2 (does not work well in the console)
BrianH
13-Apr-2010
[16306x3]
When you
>> load {"^^-"}

you are loading the string twice, the first time when you are loading 
{"^^-"} and the second time when you are loading "^-". Each round 
of loading resolves another set of escaping.
When you enter something at the command line it is also loaded.
So when you mold "^/", the resulting string has a round of escaping 
added, and then *that* string is molded again for the console, with 
another round of escaping added for display. This means two ^ characters 
are apparently added, though one is taken away earlier when the initial 
command is loaded:
>> mold "^/"
== {"^^/"}
Geomol
13-Apr-2010
[16309]
So maybe I should ask, why do LOAD double-load?
BrianH
13-Apr-2010
[16310]
It doesn't. It loads once (at the command line), then *you* load 
a second time explicitly.
Geomol
13-Apr-2010
[16311]
And if this is in a script, and not at the prompt?
BrianH
13-Apr-2010
[16312x3]
Then when the script is loaded it will be loaded. And there is no 
difference in R3: Every command entered into the prompt is a separate 
script.
Keep in mind that you are already loading a script: {load {"^^-"}}. 
And then executing that script, which loads another script: "^-".
Sorry, "^-" -> {"^-"}.
Geomol
13-Apr-2010
[16315]
I think, it can be done more efficient, but I may be wrong.
BrianH
13-Apr-2010
[16316]
It was the same in R2, though LOAD was native (and incredibly buggy) 
instead of mezzanine (and more capable).
Ladislav
13-Apr-2010
[16317]
the specific case yes (3 vs. 4 chars), but the escaping of curly 
braces is broken in R2 console:

in R3:
>> {^{}
== "{"

in R2 it does not work
BrianH
13-Apr-2010
[16318x2]
All you have to remember is that every round of loading does another 
round of resolving escapes, and every round of molding does another 
round of adding escapes. And that there is one round of loading when 
you DO a script or do a command line, and one round of molding when 
the command line prints its results.
Hopefully your memory of that is less awkwardly phrased than that 
:(
Pekr
14-Apr-2010
[16320]
Can I somehow get volume name?
Oldes
14-Apr-2010
[16321]
Probably by using GetVolumeInformation from kernel32.dll

http://social.msdn.microsoft.com/Forums/en-US/Vsexpressvb/thread/51a0c190-05d0-4d36-b679-b2ae470e622f
Pekr
14-Apr-2010
[16322]
ok, thanks ... I thought that maybe there is some get-modes trick, 
but there is probably not :-)
Gregg
14-Apr-2010
[16323]
FSUTIL is your friend. I have a REBOL wrapper if you want.

fsutil fsinfo volumeinfo c:\
Pekr
14-Apr-2010
[16324]
thanx!
Pekr
16-Apr-2010
[16325x3]
Did anyone do IP arithmetics? I need to check, if some ip is in correct 
range  :-)


I have e.g. IP 10.10.10.10, and I need to check, if it belongs to 
10.10.0.0/16. I have very primitive (but probably complicated function, 
which can't however count with cases where mask is different from 
8. 16, 24, or 32:

in-ip-range?: func [ip-fw ip-sq /local is? ip-sq-tmp ip-fw-tmp][


  ;--- turn ip-string into block of separated values- removes dots 
  and slash ["10" "10" "10" "10" "24"]
  ip-sq-tmp: parse ip-sq "./"
  ip-fw-tmp: parse ip-fw "."

  mask:  last ip-sq-tmp
  ip-sq: copy/part ip-sq-tmp 4
  ip-fw: copy/part ip-fw-tmp 4
   
  switch/default mask [

    "8"  [either (copy/part ip-fw 1) = (copy/part ip-sq 1) [is?: true][is?: 
    false]]

    "16" [either (copy/part ip-fw 2) = (copy/part ip-sq 2) [is?: true][is?: 
    false]]

    "24" [either (copy/part ip-fw 3) = (copy/part ip-sq 3) [is?: true][is?: 
    false]]

    "32" [either (copy/part ip-fw 4) = (copy/part ip-sq 4) [is?: true][is?: 
    false]]
  ][
     is?: false

     print ["Mas not found: " mask ", the result will most probably contain 
     false positives ..."]
  ]

 return is?

]
calling convetions: is-in-range? "10.10.10.10" "10.10.10.0/24"
ah, should be in-ip-range? in line above ...
BrianH
16-Apr-2010
[16328x5]
Convert to integers (through tuple then binary) and do bitwise operations.
>> ip: to-tuple "10.10.10.10"
== 10.10.10.10
>> ip-as-integer: to-integer to-binary to-tuple "10.10.10.10"
== 168430090
>> set [mask-ip mask-range] parse "10.10.10.0/24" "/"
== ["10.10.10.0" "24"]
>> mask-ip: to-tuple mask-ip
== 10.10.10.0
>> mask-range: to-integer mask-range
== 24

>> mask-integer: (to-integer to-binary mask-ip) and (-1 xor (to-integer 
2 ** (32 - mask-range)) - 1)
== 168430080
>> mask-integer = (ip-as-integer and mask-integer)
== true
That process can be converted to the algorithm for your function:

in-ip-range?: funct [ip-fw ip-sq] [
    ; Convert ip to integer
    ip-as-integer: to-integer to-binary to-tuple ip-fw
    ; Convert mask to tuple and range integer
    set [mask-ip mask-range] parse ip-sq "/"
    mask-ip: to-tuple mask-ip
    mask-range: to-integer mask-range
    ; Calculate mask as integer

    mask-integer: (to-integer to-binary mask-ip) and (-1 xor (to-integer 
    2 ** (32 - mask-range)) - 1)
    ; Is ip within mask?
    mask-integer = (ip-as-integer and mask-integer)
]
Passes testing here, R2 and R3.
Of course FUNCT was added in 2.7.7, so if you use earlier versions 
use FUNC and collect your own locals.
And this version can handle all mask ranges, not just 8, 16, 24 and 
32.
Steeve
16-Apr-2010
[16333x3]
>> (-1 xor (to-integer 2 ** (32 - mask-range)) - 1)
same thing than:
>>shift  -1 mask-range
sorry, I mean
shift  -1 32 - mask-range
not tested though...
Andreas
16-Apr-2010
[16336]
Only in R3, though, where, per default, shift == lshift, in R2 shift 
== rshift.
Steeve
16-Apr-2010
[16337]
ah yes, I forgot
Andreas
16-Apr-2010
[16338x4]
R2 needs shift/left to lshift, R3 rshifts with negative offsets.
And Brian, I fear your function is flawed.
>> in-ip-range? "10.10.10.10" "10.10.0.0/24" ; == true
Which is wrong.
From a quick glance your masking logic is wrong. You need to mask 
both the address and the network and then compare if the results 
match.
Steeve
16-Apr-2010
[16342]
I guess it's in the last line::::
ip-as-integer = (ip-as-integer and mask-integer)
Andreas
16-Apr-2010
[16343x3]
I have a correct function for R3 lying around somewhere ... if only 
I could find it :)
Ah, got it.
cidr-match?: funct [address [tuple!] network [tuple!] bits [integer!]] 
[
    mask: skip to-binary (shift -1 32 - bits) 4
    (mask and to-binary address) = (mask and to-binary network)
]
Steeve
16-Apr-2010
[16346]
not R2 though ;-)
Andreas
16-Apr-2010
[16347]
For R3
, as I mentioned.
Steeve
16-Apr-2010
[16348]
I on
Andreas
16-Apr-2010
[16349x3]
Usage:
>> cidr-match? 10.10.10.10 10.10.0.0 16 ; == true
>> cidr-match? 10.10.10.10 10.10.0.0 24 ; == false
It's much nicer in R3, as to-binary on numbers works properly :)
In any case, here's an R2 version (assuming 2.7.7+ for funct):


cidr-match?: funct [address [tuple!] network [tuple!] bits [integer!]] 
[
    mask: shift/left -1 32 - bits

    (mask and to-integer to-binary address) = (mask and to-integer to-binary 
    network)
]