- no pollution of the Array prototype - alignment with js-xls CFB code - removed main code in CFB (use cfb bin instead) - more tests - added dist - correect for incorrect tree level pointers
43 lines
1.4 KiB
JavaScript
43 lines
1.4 KiB
JavaScript
/* [MS-CFB] 2.6.4 Red-Black Tree */
|
|
function build_full_paths(Dir, pathobj, paths, patharr) {
|
|
var i;
|
|
var dad = new Array(patharr.length);
|
|
|
|
var q = new Array(patharr.length);
|
|
|
|
for(i=0; i != dad.length; ++i) { dad[i]=q[i]=i; paths[i]=patharr[i]; }
|
|
|
|
while(q.length > 0) {
|
|
for(i = q[0]; typeof i !== "undefined"; i = q.shift()) {
|
|
if(dad[i] === i) {
|
|
if(Dir[i].left && dad[Dir[i].left] != Dir[i].left) dad[i] = dad[Dir[i].left];
|
|
if(Dir[i].right && dad[Dir[i].right] != Dir[i].right) dad[i] = dad[Dir[i].right];
|
|
}
|
|
if(Dir[i].child) dad[Dir[i].child] = i;
|
|
if(Dir[i].left) { dad[Dir[i].left] = dad[i]; q.push(Dir[i].left); }
|
|
if(Dir[i].right) { dad[Dir[i].right] = dad[i]; q.push(Dir[i].right); }
|
|
}
|
|
for(i=1; i != dad.length; ++i) if(dad[i] === i) {
|
|
if(Dir[i].right && dad[Dir[i].right] != Dir[i].right) dad[i] = dad[Dir[i].right];
|
|
else if(Dir[i].left && dad[Dir[i].left] != Dir[i].left) dad[i] = dad[Dir[i].left];
|
|
}
|
|
}
|
|
|
|
for(i=1; i !== paths.length; ++i) {
|
|
if(Dir[i].type === "unknown") continue;
|
|
var j = dad[i];
|
|
if(j === 0) paths[i] = paths[0] + "/" + paths[i];
|
|
else while(j !== 0) {
|
|
paths[i] = paths[j] + "/" + paths[i];
|
|
j = dad[j];
|
|
}
|
|
dad[i] = 0;
|
|
}
|
|
|
|
paths[0] += "/";
|
|
for(i=1; i !== paths.length; ++i) if(Dir[i].type !== 'stream') paths[i] += "/";
|
|
for(i=0; i !== paths.length; ++i) pathobj[paths[i]] = FileIndex[i];
|
|
}
|
|
build_full_paths(FileIndex, FullPathDir, FullPaths, Paths);
|
|
|