mirror of
https://codeberg.org/TicklishHoneyBee/CLIte.git
synced 2026-03-11 09:04:37 +00:00
119 lines
2.1 KiB
JavaScript
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;
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|