summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorMarkus Mohrhard <markus.mohrhard@googlemail.com>2017-08-16 04:49:59 +0200
committerMarkus Mohrhard <markus.mohrhard@googlemail.com>2017-08-16 11:16:25 +0200
commite5d9b5ffc423cbb314cde1f66f7bebf4db30b1e6 (patch)
treeb4c7bfbc175e5d179c9c86822797d78a3f5e7817 /sc
parent4ad52186048e023234039f8344612b5123bb5700 (diff)
add python script to interpret the calc cache format
Change-Id: I5d66024024b8150fad67397a0debc40aab1ae5fc Reviewed-on: https://gerrit.libreoffice.org/41200 Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com> Tested-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
Diffstat (limited to 'sc')
-rw-r--r--sc/workben/cache.py76
1 files changed, 76 insertions, 0 deletions
diff --git a/sc/workben/cache.py b/sc/workben/cache.py
new file mode 100644
index 000000000000..da2fe2e82290
--- /dev/null
+++ b/sc/workben/cache.py
@@ -0,0 +1,76 @@
+# -*- Mode: python; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+import sys
+import struct
+
+column_block_type = {
+ 0 : "empty block",
+ 1 : "numeric block",
+ 2 : "string block"
+ }
+
+
+def parse_block(data, index):
+ start_row = struct.unpack('Q', data[index:index+8])[0]
+ index += 8
+ data_size = struct.unpack('Q', data[index:index+8])[0]
+ index += 8
+ block_type = struct.unpack('B', data[index:index+1])[0]
+ index += 1
+ vals = {}
+ if block_type == 1:
+ # numeric block
+ for i in range(data_size):
+ vals[start_row + i] = struct.unpack('d', data[index:index+8])[0]
+ index += 8
+ elif block_type == 2:
+ # string block
+ for i in range(data_size):
+ str_length = struct.unpack('i', data[index:index+4])[0]
+ index += 4
+ vals[start_row + i] = data[index:index+str_length].decode("utf-8")
+ index += str_length
+
+ return index, data_size, vals
+
+
+def parse_column(data, index):
+ column_index = struct.unpack('Q', data[index:index+8])[0]
+ index += 8
+ column_entries = struct.unpack('Q', data[index:index+8])[0]
+ index += 8
+ imported_columns = 0
+ column_values = {}
+ while imported_columns < column_entries:
+ index, block_size, vals = parse_block(data, index)
+ imported_columns += block_size
+ column_values.update(vals)
+ return index, column_values
+
+def parse_columns(data, index):
+ column_count = struct.unpack('Q', data[index:index+8])[0]
+ index += 8
+ columns = {}
+ for i in range(column_count):
+ index, column_values = parse_column(data, index)
+ columns[i] = column_values
+
+ return columns
+
+def main():
+ filename = sys.argv[1]
+ with open(filename, "rb") as f:
+ content = f.read()
+ index = 0
+ columns = parse_columns(content, index)
+ print(columns)
+
+if __name__ == "__main__":
+ main()
+
+# vim:set shiftwidth=4 softtabstop=4 expandtab: */