js-cfb/bits/45_rbtree.js

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);