user@elli:~/Downloads/Remote/LPC/GEM$ node harness.js tests/string.c
[1] Loading tests/string.c...
[2] Executing reference binary (tests/string)...
[3] Compiling LPC to JS via port...
[4] Executing generated JS...
[FAIL] Execution outputs do not match.
--- JS EXECUTION OUTPUT ---
(No Output)
--- EXPECTED LPC OUTPUT ---
Str: abcd123<XYZ>
Str[-2..-1]: Z>
Lower case: abcd123<xyz>
Upper case: ABCD123<XYZ>
Capitalize: Abcd123<XYZ>
Str [1 .. 2] = .b.c.
Str: a.b.c.d123<XYZ>
HTML: a.b.c.d123<XYZ>
Str[3..4]: .c
Crop(str,3,4): .c
Str: a.b.c.d123<XYZ>
Strpos(str,'c'): 4
Strpos(str,"d1"): 6
Strpos(str,'.'): 1 (.)
Strrpos(str,'.'): 5 (.)
Str + str [0]: a.b.c.d123<XYZ>97
Str + str [0 .. 0]: a.b.c.d123<XYZ>97a
substr_count(str,a): 2
dirname(str): .
str: a.b.c.d123<XYZ>97a/xyz
dirname(str): a.b.c.d123<XYZ>97a
str_truncate(str,50): 50 bytes: a.b.c.d123<XYZ>97a/xyz
str_truncate(str,5): 5 bytes: a.b.c
str_write (str,1,***): a***c.d123<XYZ>97a/xyz
str_write (str,20,***): a***c.d123<XYZ>97a/x***
--- GENERATED JAVASCRIPT EMISSION ---
const rt = {
printf: (fmt, ...args) => {
let i = 0;
let res = fmt.replace(/%([sdc])/g, (match, type) => {
let val = args[i++];
if (type === 'c') return String.fromCharCode(val); // LPC %c
integer to char
return val;
});
process_stdout.write(res);
},
lower_case: (s) => s.toLowerCase(),
upper_case: (s) => s.toUpperCase(),
capitalize: (s) => s.charAt(0).toUpperCase() + s.slice(1),
htmlspecialchars: (s) => s.replace(/</g, "<").replace(/>/g, ">"),
crop_string: function(s, start, end) { return this.range(s, start, end);
},
strpos: (s, c) => typeof c === 'number' ? s.indexOf(String.fromCharCode(c))
: s.indexOf(c),
strrpos: (s, c) => typeof c === 'number' ? s.lastIndexOf(String.fromCharCod
e(c)) : s.lastIndexOf(c),
substr_count: (s, c) => s.split(c).length - 1,
dirname: (s) => {
let idx = s.lastIndexOf('/');
return idx === -1 ? "." : s.substring(0, idx);
},
str_truncate: (s, len) => s.length > len ? s.slice(0, len) : s,
strlen: (s) => s.length,
str_write: (s, pos, val) => s.substring(0, pos) + val + s.substring(pos +
val.length),
// Core Array/String access mappings
index: (s, idx) => {
if (idx < 0) idx = s.length + idx;
return typeof s === 'string' ? s.charCodeAt(idx) : s[idx]; // LPC
strings return int codes
},
range: (s, start, end) => {
if (start < 0) start = s.length + start;
if (end < 0) end = s.length + end;
return s.slice(start, end + 1); // LPC slicing is inclusive
},
range_set: (s, start, end, val) => {
if (start < 0) start = s.length + start;
if (end < 0) end = s.length + end;
return s.substring(0, start) + val + s.substring(end + 1);
}
};
function lpc_main() {
let str;
let x;
(str = _tmp_string0);
rt.printf(_tmp_string1, str);
rt.printf(_tmp_string2, rt.range(str, -2, (-1)));
rt.printf(_tmp_string3);
rt.printf(_tmp_string4, rt.lower_case(str));
rt.printf(_tmp_string5, rt.upper_case(str));
rt.printf(_tmp_string6, rt.capitalize(str));
rt.printf(_tmp_string3);
rt.printf(_tmp_string7);
rt.printf(_tmp_string1, (rt.range(str, 1, 2) = _tmp_string8));
rt.printf(_tmp_string9, rt.htmlspecialchars(str));
rt.printf(_tmp_string3);
rt.printf(_tmp_string10, rt.range(str, 3, 4));
rt.printf(_tmp_string11, rt.crop_string(str, 3, 4));
rt.printf(_tmp_string3);
rt.printf(_tmp_string1, str);
rt.printf(_tmp_string12, rt.strpos(str, _tmp_char13));
rt.printf(_tmp_string14, rt.strpos(str, _tmp_string15));
rt.printf(_tmp_string16, rt.strpos(str, _tmp_char17), rt.index(str,
rt.strpos(str, _tmp_char17)));
rt.printf(_tmp_string18, rt.strrpos(str, _tmp_char17), rt.index(str,
rt.strrpos(str, _tmp_char17)));
rt.printf(_tmp_string3);
(str += rt.index(str, 0));
rt.printf(_tmp_string19, str);
(str += rt.range(str, 0, 0));
rt.printf(_tmp_string20, str);
rt.printf(_tmp_string3);
rt.printf(_tmp_string21, rt.substr_count(str, _tmp_string22));
rt.printf(_tmp_string23, rt.dirname(str));
(str += _tmp_string24);
rt.printf(_tmp_string25, str);
rt.printf(_tmp_string26, rt.dirname(str));
rt.printf(_tmp_string27, rt.strlen((x = rt.str_truncate(str, 50))), x);
rt.printf(_tmp_string28, rt.strlen((x = rt.str_truncate(str, 5))), x);
rt.printf(_tmp_string29, rt.str_write(str, 1, _tmp_string30));
rt.printf(_tmp_string31, rt.str_write(str, 20, _tmp_string30));
(str === str);
}
lpc_main();
user@elli:~/Downloads/Remote/LPC/GEM$