glean/tools/byte-offsets-to-lines/byte_offsets_to_lines.py (30 lines of code) (raw):
#!/usr/bin/env python3
# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.
#
# This source code is licensed under the BSD-style license found in the
# LICENSE file in the root directory of this source tree.
# pyre-strict
import argparse
from typing import List, Tuple
def read_file(path: str, offsets: List[int]) -> None:
offsets.sort()
relative_offsets = [offsets[n] - offsets[n - 1] for n in range(1, len(offsets))]
relative_offsets.insert(0, offsets[0])
offsets: Tuple[int, int] = zip(offsets, relative_offsets)
with open(path, "r") as infile:
current_line = 1
current_column = 1
for offset in offsets:
absolute_offset, relative_offset = offset
chunk = infile.read(relative_offset).split("\n")
last_line = chunk[-1]
num_new_lines = len(chunk) - 1
if num_new_lines != 0:
current_line += num_new_lines
current_column = 1
current_column += len(last_line)
print(f"{absolute_offset} -> {current_line}:{current_column}")
def main() -> None:
parser = argparse.ArgumentParser(fromfile_prefix_chars="@")
parser.add_argument("file", help="File path to read")
parser.add_argument(
"offsets", nargs="+", type=int, help="Byte offsets to convert to line numbers"
)
parsed_args = parser.parse_args()
read_file(parsed_args.file, parsed_args.offsets)
if __name__ == "__main__":
main()