diff --git a/bits/56_dirtree.js b/bits/56_dirtree.js index 4a1a093..d23d961 100644 --- a/bits/56_dirtree.js +++ b/bits/56_dirtree.js @@ -1,19 +1,25 @@ var now = new Date(1987, 1, 19), j = 0; + // Track which names exist + var fullPaths = Object.create ? Object.create(null) : {}; var data/*:Array<[string, CFBEntry]>*/ = []; for(i = 0; i < cfb.FullPaths.length; ++i) { + fullPaths[cfb.FullPaths[i]] = true; if(cfb.FileIndex[i].type === 0) continue; data.push([cfb.FullPaths[i], cfb.FileIndex[i]]); } for(i = 0; i < data.length; ++i) { var dad = dirname(data[i][0]); - s = false; - for(j = 0; j < data.length; ++j) if(data[j][0] === dad) s = true; - if(!s) data.push([dad, ({ - name: filename(dad).replace("/",""), - type: 1, - clsid: HEADER_CLSID, - ct: now, mt: now, - content: null - }/*:any*/)]); + s = fullPaths[dad]; + if(!s) { + data.push([dad, ({ + name: filename(dad).replace("/",""), + type: 1, + clsid: HEADER_CLSID, + ct: now, mt: now, + content: null + }/*:any*/)]); + // Add name to set + fullPaths[dad] = true; + } } diff --git a/cfb.flow.js b/cfb.flow.js index b755124..d884851 100644 --- a/cfb.flow.js +++ b/cfb.flow.js @@ -756,22 +756,28 @@ function rebuild_cfb(cfb/*:CFBContainer*/, f/*:?boolean*/)/*:void*/ { if(!gc && !f) return; var now = new Date(1987, 1, 19), j = 0; + // Track which names exist + var fullPaths = Object.create ? Object.create(null) : {}; var data/*:Array<[string, CFBEntry]>*/ = []; for(i = 0; i < cfb.FullPaths.length; ++i) { + fullPaths[cfb.FullPaths[i]] = true; if(cfb.FileIndex[i].type === 0) continue; data.push([cfb.FullPaths[i], cfb.FileIndex[i]]); } for(i = 0; i < data.length; ++i) { var dad = dirname(data[i][0]); - s = false; - for(j = 0; j < data.length; ++j) if(data[j][0] === dad) s = true; - if(!s) data.push([dad, ({ - name: filename(dad).replace("/",""), - type: 1, - clsid: HEADER_CLSID, - ct: now, mt: now, - content: null - }/*:any*/)]); + s = fullPaths[dad]; + if(!s) { + data.push([dad, ({ + name: filename(dad).replace("/",""), + type: 1, + clsid: HEADER_CLSID, + ct: now, mt: now, + content: null + }/*:any*/)]); + // Add name to set + fullPaths[dad] = true; + } } data.sort(function(x,y) { return namecmp(x[0], y[0]); }); diff --git a/cfb.js b/cfb.js index 7882e20..a3b5550 100644 --- a/cfb.js +++ b/cfb.js @@ -738,22 +738,28 @@ function rebuild_cfb(cfb, f) { if(!gc && !f) return; var now = new Date(1987, 1, 19), j = 0; + // Track which names exist + var fullPaths = Object.create ? Object.create(null) : {}; var data = []; for(i = 0; i < cfb.FullPaths.length; ++i) { + fullPaths[cfb.FullPaths[i]] = true; if(cfb.FileIndex[i].type === 0) continue; data.push([cfb.FullPaths[i], cfb.FileIndex[i]]); } for(i = 0; i < data.length; ++i) { var dad = dirname(data[i][0]); - s = false; - for(j = 0; j < data.length; ++j) if(data[j][0] === dad) s = true; - if(!s) data.push([dad, ({ - name: filename(dad).replace("/",""), - type: 1, - clsid: HEADER_CLSID, - ct: now, mt: now, - content: null - })]); + s = fullPaths[dad]; + if(!s) { + data.push([dad, ({ + name: filename(dad).replace("/",""), + type: 1, + clsid: HEADER_CLSID, + ct: now, mt: now, + content: null + })]); + // Add name to set + fullPaths[dad] = true; + } } data.sort(function(x,y) { return namecmp(x[0], y[0]); }); diff --git a/xlscfb.flow.js b/xlscfb.flow.js index fefebdf..9991d94 100644 --- a/xlscfb.flow.js +++ b/xlscfb.flow.js @@ -604,22 +604,28 @@ function rebuild_cfb(cfb/*:CFBContainer*/, f/*:?boolean*/)/*:void*/ { if(!gc && !f) return; var now = new Date(1987, 1, 19), j = 0; + // Track which names exist + var fullPaths = Object.create ? Object.create(null) : {}; var data/*:Array<[string, CFBEntry]>*/ = []; for(i = 0; i < cfb.FullPaths.length; ++i) { + fullPaths[cfb.FullPaths[i]] = true; if(cfb.FileIndex[i].type === 0) continue; data.push([cfb.FullPaths[i], cfb.FileIndex[i]]); } for(i = 0; i < data.length; ++i) { var dad = dirname(data[i][0]); - s = false; - for(j = 0; j < data.length; ++j) if(data[j][0] === dad) s = true; - if(!s) data.push([dad, ({ - name: filename(dad).replace("/",""), - type: 1, - clsid: HEADER_CLSID, - ct: now, mt: now, - content: null - }/*:any*/)]); + s = fullPaths[dad]; + if(!s) { + data.push([dad, ({ + name: filename(dad).replace("/",""), + type: 1, + clsid: HEADER_CLSID, + ct: now, mt: now, + content: null + }/*:any*/)]); + // Add name to set + fullPaths[dad] = true; + } } data.sort(function(x,y) { return namecmp(x[0], y[0]); }); diff --git a/xlscfb.js b/xlscfb.js index ef2fa71..ba81cd4 100644 --- a/xlscfb.js +++ b/xlscfb.js @@ -570,22 +570,28 @@ function rebuild_cfb(cfb, f) { if(!gc && !f) return; var now = new Date(1987, 1, 19), j = 0; + // Track which names exist + var fullPaths = Object.create ? Object.create(null) : {}; var data = []; for(i = 0; i < cfb.FullPaths.length; ++i) { + fullPaths[cfb.FullPaths[i]] = true; if(cfb.FileIndex[i].type === 0) continue; data.push([cfb.FullPaths[i], cfb.FileIndex[i]]); } for(i = 0; i < data.length; ++i) { var dad = dirname(data[i][0]); - s = false; - for(j = 0; j < data.length; ++j) if(data[j][0] === dad) s = true; - if(!s) data.push([dad, ({ - name: filename(dad).replace("/",""), - type: 1, - clsid: HEADER_CLSID, - ct: now, mt: now, - content: null - })]); + s = fullPaths[dad]; + if(!s) { + data.push([dad, ({ + name: filename(dad).replace("/",""), + type: 1, + clsid: HEADER_CLSID, + ct: now, mt: now, + content: null + })]); + // Add name to set + fullPaths[dad] = true; + } } data.sort(function(x,y) { return namecmp(x[0], y[0]); });