function lcs(a,b){ var l = new Array(); for(var i = -1; i < a.length; i++) l[i] = new Array(); for(var i = -1; i < a.length; i++) l[i][-1] = 0; for(var j = -1; j < b.length; j++) l[-1][j] = 0; for(var i = 0; i < a.length; i++) for(var j = 0; j < b.length; j++) if (a[i] == b[j]) l[i][j] = l[i-1][j-1] + 1; else l[i][j] = Math.max(l[i-1][j], l[i][j-1]); var r = []; var i = a.length, j = b.length; while (i > 0 && j > 0) { i--; j--; if (a[i] == b[j]) r.unshift(a[i]); else if (l[i][j-1] > l[i-1][j]) i++; else j++; } return r; } function parseFile(fileName, parser) { var req = new XMLHttpRequest(); req.onreadystatechange = function() { if(req.readyState == 4) parser(req.responseText); } req.open("GET", fileName); req.send(null); } function getFile(fileName) { var req = new XMLHttpRequest(); req.open("GET", fileName, false); req.send(null); return req.responseText; } function parsePublic(target) { var mainLines = getFile(target).split('/* DIFFTABLE */')[1].split('\n'); var fileNames = new Array(); var privateFilesRE = new RegExp('#include "simpleops/(.*\.h)"'); for(var i = 0; i < mainLines.length; i++) if(privateFilesRE.test(mainLines[i])) fileNames.push(privateFilesRE.exec(mainLines[i])[1]); return fileNames; } function addRow(table, row) { var tr = table.insertRow(-1); for(var j = 0; j < row.length; j++) { var cell = tr.insertCell(-1); cell.setAttribute("class", row[j].getAttribute("class")); cell.appendChild(row[j]); } } function createPre(x, cls) { var node = document.createElement('pre'); node.setAttribute("class", cls); node.appendChild(document.createTextNode(x)); return node; } function diffNode(x) { return createPre(x, "diff"); } function emptyNode() { return createPre("", "empty"); } function equalNode(x) { return createPre(x, "equal"); } function multidiff(diffTable, target) { var sourceNames = parsePublic(target); var sourceLines = new Array(); var idx = new Array(); var ref; for(var i = 0; i < sourceNames.length; i++) { var data = getFile(sourceNames[i]); var lines = data.split('\n'); sourceLines.push(lines); idx.push(0); if(i == 0) ref = lines; else ref = lcs(ref, lines); } for(var refidx = 0; refidx < ref.length; refidx++) { while (true) { var matching = true; var line = new Array(); for(var j = 0; j < sourceLines.length; j++) if (ref[refidx] != sourceLines[j][idx[j]]) { matching = false; line.push(diffNode(sourceLines[j][idx[j]++])); } else { line.push(emptyNode()); } if (matching) break; else addRow(diffTable, line); } var line = new Array(); for(var j = 0; j < sourceLines.length; j++) line.push(equalNode(sourceLines[j][idx[j]++])); addRow(diffTable, line); } while (true) { var complete = true; var line = new Array(); for(var j = 0; j < sourceLines.length; j++) if (idx[j] < sourceLines[j].length) { complete = false; line.push(diffNode(sourceLines[j][idx[j]++])); } else { line.push(emptyNode()); } if (complete) break; else addRow(diffTable, line); } var tr = diffTable.createTHead().insertRow(0); for(var j = 0; j < sourceNames.length; j++) { var td = tr.insertCell(j); var text = document.createTextNode(sourceNames[j]); td.appendChild(text); } }