diff --git a/api/inp_in_new.py b/api/inp_in_new.py index e1b0b4a..328a67e 100644 --- a/api/inp_in_new.py +++ b/api/inp_in_new.py @@ -14,8 +14,39 @@ from .s22_report import inp_in_report_new from .s23_options import inp_in_option_new from .s27_backdrop import inp_in_backdrop_new +_S = 'S' +_L = 'L' -_UNKNOWN = 'UNKNOWN' +_handler = { + TITLE : (_S, inp_in_title_new), + JUNCTIONS : (_L, inp_in_junction_new), + RESERVOIRS : (_L, inp_in_reservoir_new), + TANKS : (_L, inp_in_tank_new), + PIPES : (_L, None), + PUMPS : (_L, None), + VALVES : (_L, None), + TAGS : (_L, None), + DEMANDS : (_L, None), + STATUS : (_L, None), + PATTERNS : (_L, inp_in_pattern_new), + CURVES : (_L, inp_in_curve_new), + CONTROLS : (_L, inp_in_control_new), + RULES : (_L, inp_in_rule_new), + ENERGY : (_L, None), + EMITTERS : (_L, None), + QUALITY : (_L, None), + SOURCES : (_L, None), + REACTIONS : (_L, None), + MIXING : (_L, None), + TIMES : (_S, inp_in_time_new), + REPORT : (_S, inp_in_report_new), + OPTIONS : (_S, inp_in_option_new), + COORDINATES : (_L, None), + VERTICES : (_L, None), + LABELS : (_L, None), + BACKDROP : (_S, inp_in_backdrop_new), + #END : 'END', +} _level_1 = { TITLE, @@ -56,174 +87,75 @@ _level_4 = { VERTICES, } -def scan1(project: str, inp: str) -> list[str]: - handlers = { - TITLE: inp_in_title_new, #1 - PATTERNS: inp_in_pattern_new, #11 - CURVES: inp_in_curve_new, #12 - CONTROLS: inp_in_control_new, #13 - RULES: inp_in_rule_new, #14 - TIMES: inp_in_time_new, #21 - REPORT: inp_in_report_new, #22 - OPTIONS: inp_in_option_new, #23 - BACKDROP: inp_in_backdrop_new,#27 - } - curr_section = _UNKNOWN - prev_section = _UNKNOWN +_UNKNOWN = 'UNKNOWN' - inp_sections: list[str] = [] +class SectionRange: + def __init__(self) -> None: + start = 0 + end = 0 + + +class SectionOffset: + def __init__(self, s: str) -> None: + name = s + ranges: list[SectionRange] = [] + + +def parse_file(project: str, inp: str) -> None: + # find section position + offset_list = [] + + offset: dict[str, list[tuple[int, int]]] = {} + for s in section_name: + offset[s] = [] + + with open(inp) as f: + while True: + line = f.readline() + if not line: + break + + line = line.strip() + if line.startswith('['): + for s in section_name: + if line.startswith(f'[{s}'): + offset[s].append(f.tell()) + break + + # parse the whole section rather than line sections : dict[str, list[str]]= {} - for c in handlers.keys(): - sections[c] = [] + for [s, t] in _handler.items(): + if t[0] == _S: + sections[s] = [] - for line in open(inp): - line = line.strip() + levels = _level_1 | _level_2 | _level_3 | _level_4 - if line.startswith('['): - the_section = _UNKNOWN + with open(inp) as f: + for s in levels: + is_s = _handler[s][0] == _S - for s in section_name: - if line.startswith(f'[{s}'): - the_section = s - inp_sections.append(s) - break + for o in offset[s]: + f.seek(o) - prev_section = curr_section - if prev_section in handlers.keys(): - handlers[prev_section](project, sections[prev_section]) - sections[prev_section].clear() + while True: + line = f.readline() + if not line: + break - curr_section = the_section + line = line.strip() - continue - - elif line == '': - continue - - if curr_section in handlers.keys(): - sections[curr_section].append(line) - - return inp_sections - - -def scan2(project: str, inp: str) -> None: - handlers = { - JUNCTIONS: inp_in_junction_new, #2 - RESERVOIRS: inp_in_reservoir_new, #3 - TANKS: inp_in_tank_new, #4 - } - - curr_section = _UNKNOWN - - sections : dict[str, list[str]]= {} - for c in handlers.keys(): - sections[c] = [] - - for line in open(inp): - line = line.strip() - - if line.startswith('['): - is_candidate = False - - for s in handlers.keys(): - if line.startswith(f'[{s}'): - curr_section = s - is_candidate = True - break - - if is_candidate: - continue - else: - curr_section = _UNKNOWN - continue - - elif line == '': - continue - - if curr_section in handlers.keys(): - handlers[curr_section](project, line) - - -def scan3(project: str, inp: str) -> None: - handlers = { - - } - - curr_section = _UNKNOWN - - sections : dict[str, list[str]]= {} - for c in handlers.keys(): - sections[c] = [] - - for line in open(inp): - line = line.strip() - - if line.startswith('['): - is_candidate = False - - for s in handlers.keys(): - if line.startswith(f'[{s}'): - curr_section = s - is_candidate = True - break - - if is_candidate: - continue - else: - curr_section = _UNKNOWN - continue - - elif line == '': - continue - - if curr_section in handlers.keys(): - handlers[curr_section](project, line) - - -def scan4(project: str, inp: str) -> None: - handlers = { - - } - - curr_section = _UNKNOWN - - sections : dict[str, list[str]]= {} - for c in handlers.keys(): - sections[c] = [] - - for line in open(inp): - line = line.strip() - - if line.startswith('['): - is_candidate = False - - for s in handlers.keys(): - if line.startswith(f'[{s}'): - curr_section = s - is_candidate = True - break - - if is_candidate: - continue - else: - curr_section = _UNKNOWN - continue - - elif line == '': - continue - - if curr_section in handlers.keys(): - handlers[curr_section](project, line) + if is_s: + sections[s].append(line) + else: + pass + f.seek(0) def parse_inp(project: str, inp: str) -> None: - scan1(project, inp) - scan2(project, inp) - scan3(project, inp) - scan4(project, inp) + pass def read_inp_new(project: str, inp: str) -> bool: @@ -236,10 +168,14 @@ def read_inp_new(project: str, inp: str) -> bool: create_project(project) open_project(project) - parse_inp(project, inp) + try: + parse_inp(project, inp) + except: + close_project(project) + delete_project(project) + return False close_project(project) - return True