xypsri (cpp, doesn't expire)
#include <bits/stdc++.h>
using namespace std;
struct Sector {
	int16_t floor, ceil;
	char floortex[8], ceiltex[8];
	int16_t light, special, tag;
	void print(int idx, int diff)
	{
		string ftex(floortex, find(floortex, floortex+8, '\0'));
		string ctex(ceiltex, find(ceiltex, ceiltex+8, '\0'));
		int w = 8;

		cout << left << setfill(' ');

		cout << " idx " << setw(w) << idx;
		if (!diff || (diff & 0b10))       cout << " flr " << setw(w) <<  floor;
		else                              cout << "     " << setw(w) << " ";
		if (!diff || (diff & 0b100))      cout << " cei " << setw(w) << ceil;
		else                              cout << "     " << setw(w) << " ";
		if (!diff || (diff & 0b1000))     cout << " ftx " << setw(w) <<  ftex;
		else                              cout << "     " << setw(w) << " ";
		if (!diff || (diff & 0b10000))    cout << " ctx " << setw(w) << ctex;
		else                              cout << "     " << setw(w) << " ";
		if (!diff || (diff & 0b100000))   cout << " lig " << setw(w) << light;
		else                              cout << "     " << setw(w) << " ";
		if (!diff || (diff & 0b1000000))  cout << " spc " << setw(w) << special;
		else                              cout << "     " << setw(w) << " ";
		if (!diff || (diff & 0b10000000)) cout << " tag " << setw(w) << tag;
		else                              cout << "     " << setw(w) << " ";

		cout << "\n";
	}
	int compare(Sector &other)
	{
		int diff = 0;
		if (floor != other.floor)             diff |= 0b10;
		if (ceil != other.ceil)               diff |= 0b100;
		if (strncmp(floortex, other.floortex, 8)) diff |= 0b1000;
		if (strncmp(ceiltex, other.ceiltex, 8))   diff |= 0b10000;
		if (light != other.light)             diff |= 0b100000;
		if (special != other.special)         diff |= 0b1000000;
		if (tag != other.tag)                 diff |= 0b10000000;
		return diff;
	}
} sectorA, sectorB;
int main(int argc, char** argv)
{
	if (argc < 3) { std::cout << "usage: " << argv[0] << " SECTORS1.lmp SECTORS2.lmp\n"; return 1; }
	ifstream fileA(argv[1]), fileB(argv[2]);
	bool endA = false, endB = false;
	for (int i = 0; !(endA && endB); ++i)
	{
		if (fileA.peek() == EOF) endA = true;
		else fileA.read((char*)&sectorA, sizeof(Sector));
		if (fileB.peek() == EOF) endB = true;
		else fileB.read((char*)&sectorB, sizeof(Sector));
		if (endB && !endA) { cout << "--- "; sectorA.print(i, 0); }
		else if (endA && !endB) { cout << "+++ "; sectorB.print(i, 0); }
		else {
			int diff = sectorA.compare(sectorB);
			if (diff) {
				cout << "\n";
				cout << "<<< "; sectorA.print(i, diff);
				cout << ">>> "; sectorB.print(i, diff);
				cout << "\n";
			}
		}
	}
	return 0;
}