CLIte/clite/libclite.js
2023-12-14 17:46:08 +10:00

119 lines
2.1 KiB
JavaScript

clite.libs.data = function() {
clite.libs.load('libclite','clite',function(io,env) {
return Object.create({
// returns an absolute path: ('foo','/etc') -> '/etc/foo': ('foo','bar') -> $PWD/bar/foo
resolvePath:function(txt,base) {
if (txt == '/')
return txt;
if (txt[0] == '~')
txt = env.HOME+txt.substring(1);
if (txt[0] == '.')
txt = env.PWD+'/'+txt;
var path = txt;
if (txt[0] != '/') {
if (typeof base != 'string')
base = env.PWD;
if (base[0] != '/')
base = env.PWD+'/'+base;
path = base+'/'+txt;
}
var parts = path.split('/');
path = '';
var i;
while ((i = parts.indexOf('.')) != -1) {
parts.splice(i,1);
}
while ((i = parts.indexOf('')) != -1) {
parts.splice(i,1);
}
while ((i = parts.indexOf('..')) != -1) {
parts.splice(i-1,2);
}
path = '/'+parts.join('/');
return path;
},
// convert a string into an argument array: 'ls /etc' -> ['ls','/etc'], supports "quoted arguments" and `command substitutions`
strToArgs:function(txt) {
var parts = [];
var sp = '';
var s = '';
var e = false;
var q = false;
var c = false;
for (var i=0; i<txt.length; i++) {
switch (txt[i]) {
case '//':
if (e) {
s+='//';
}else{
e = true;
}
break;
case '`':
if (!e) {
if (!c) {
c = true;
s += '`';
}else{
s += '`';
c = false;
}
}else{
s += txt[i];
e = false;
}
break;
case '"':
case "'":
if (!e) {
if (!q) {
sp = txt[i];
q = true;
}else if (txt[i] == sp) {
sp = '';
q = false;
}
}else{
s += txt[i];
e = false;
}
break;
case ' ':
if (!q && !c) {
parts.push(s);
s = '';
e = false;
q = false;
break;
}
default:
s+=txt[i];
e = false;
}
}
if (s.length > 0)
parts.push(s);
// TODO: resolve all paths passed as arguments? - catches ~ and * etc
return parts;
},
ptrnew:function() {
return Object.create({value:null});
},
ptrset:function(ptr,val) {
ptr.value = val;
},
ptrget:function(ptr) {
if (typeof ptr.value === 'undefined')
return null;
return ptr.value;
}
});
});
}