395
edits
m (→Wrapping dependencies: testing sanitize()) |
Philosopher (talk | contribs) m (Fix up our coding :)) |
||
Line 89: | Line 89: | ||
Wrapping APIs is simple to do in Nasal, too - without even requiring C/C++ changes, a standalone testbed could be scripted in Nasal like this: | Wrapping APIs is simple to do in Nasal, too - without even requiring C/C++ changes, a standalone testbed could be scripted in Nasal like this: | ||
<syntaxhighlight lang="php"> | <syntaxhighlight lang="php"> | ||
var tree = {}; | var tree = {}; | ||
var isalpha = func(n) n >= `a` and n <= `z` or n >= `A` and n <= `Z`; | |||
var isdigit = func(n) n >= `0` and n <= `9`; | |||
var sanitize = func(p) { | var sanitize = func(p) { | ||
if (!p) die(); | if (!p) die(); | ||
parts = split( | if (p[0] == `/`) p = substr(p, 1, nil); | ||
parts = split("/", p); | |||
for (var i=0; i<size(parts); i+=1) { | for (var i=0; i<size(parts); i+=1) { | ||
if (parts[i] == "") { | if (parts[i] == "") { | ||
parts = parts[:i-1] ~ parts[i+1:]; | if (i == size(parts)-1) | ||
parts = parts[:i-1]; | |||
else parts = parts[:i-1] ~ parts[i+1:]; | |||
i-=1; | i-=1; | ||
} else { | |||
for (var j=0; j<size(parts[i]); j+=1) { | |||
if (parts[i][j] == `[`) break; | |||
if (parts[i][j] != `-` and !isalpha(parts[i][j]) and | |||
parts[i][j] != `_` and !isdigit(parts[i][j]) and | |||
parts[i][j] != `.`) die("bad character in name "~parts[i]~" at index "~j~"."); | |||
} | |||
if (j == size(parts[i])) | |||
parts[i] ~= "[0]"; | |||
elsif (parts[i][-1] != `]`) die("bad index specifier in string "~parts[i]~".") | |||
} | } | ||
} | } | ||
var p = "/"; | var p = "/"; | ||
Line 113: | Line 122: | ||
return p; | return p; | ||
} | } | ||
# wrappers for the FG setprop/getprop APIs: | # wrappers for the FG setprop/getprop APIs: | ||
var setprop = func(p, value) tree[ sanitize(p) ] = value; | var setprop = func(p, value) tree[ sanitize(p) ] = value; | ||
var getprop = func(p) return tree[ sanitize(p) ]; | var getprop = func(p) return tree[ sanitize(p) ]; | ||
# some tests: | # some tests: | ||
var path = ["/foo/bar", "/foo[0]/bar[0]","/foo[0]/bar[0]/", "/foo/bar[0]","/foo[0]/bar/","/foo[0]/bar/"] | var path = ["/foo/bar", "/foo[0]/bar[0]","/foo[0]/bar[0]/", "/foo/bar[0]","/foo[0]/bar/","/foo[0]/bar/"]; | ||
var value = "MyUniqueValue"; | var value = "MyUniqueValue"; | ||
setprop(path, value); | setprop(path[0], value); | ||
foreach(var p; path) | foreach(var p; path) | ||
if (p != value) die("sanitize() implementation is broken"); | if (getprop(p) != value) die("sanitize() implementation is broken"); | ||
print("sanitize() looks good!\n"); | print("sanitize() looks good!\n"); | ||
edits