17db96d56Sopenharmony_ciimport contextlib
27db96d56Sopenharmony_ciimport os.path
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci
57db96d56Sopenharmony_cidef resolve(source, filename):
67db96d56Sopenharmony_ci    if _looks_like_filename(source):
77db96d56Sopenharmony_ci        return _resolve_filename(source, filename)
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_ci    if isinstance(source, str):
107db96d56Sopenharmony_ci        source = source.splitlines()
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ci    # At this point "source" is not a str.
137db96d56Sopenharmony_ci    if not filename:
147db96d56Sopenharmony_ci        filename = None
157db96d56Sopenharmony_ci    elif not isinstance(filename, str):
167db96d56Sopenharmony_ci        raise TypeError(f'filename should be str (or None), got {filename!r}')
177db96d56Sopenharmony_ci    else:
187db96d56Sopenharmony_ci        filename, _ = _resolve_filename(filename)
197db96d56Sopenharmony_ci    return source, filename
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ci
227db96d56Sopenharmony_ci@contextlib.contextmanager
237db96d56Sopenharmony_cidef good_file(filename, alt=None):
247db96d56Sopenharmony_ci    if not _looks_like_filename(filename):
257db96d56Sopenharmony_ci        raise ValueError(f'expected a filename, got {filename}')
267db96d56Sopenharmony_ci    filename, _ = _resolve_filename(filename, alt)
277db96d56Sopenharmony_ci    try:
287db96d56Sopenharmony_ci        yield filename
297db96d56Sopenharmony_ci    except Exception:
307db96d56Sopenharmony_ci        if not os.path.exists(filename):
317db96d56Sopenharmony_ci            raise FileNotFoundError(f'file not found: {filename}')
327db96d56Sopenharmony_ci        raise  # re-raise
337db96d56Sopenharmony_ci
347db96d56Sopenharmony_ci
357db96d56Sopenharmony_cidef _looks_like_filename(value):
367db96d56Sopenharmony_ci    if not isinstance(value, str):
377db96d56Sopenharmony_ci        return False
387db96d56Sopenharmony_ci    return value.endswith(('.c', '.h'))
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ci
417db96d56Sopenharmony_cidef _resolve_filename(filename, alt=None):
427db96d56Sopenharmony_ci    if os.path.isabs(filename):
437db96d56Sopenharmony_ci        ...
447db96d56Sopenharmony_ci#        raise NotImplementedError
457db96d56Sopenharmony_ci    else:
467db96d56Sopenharmony_ci        filename = os.path.join('.', filename)
477db96d56Sopenharmony_ci
487db96d56Sopenharmony_ci    if not alt:
497db96d56Sopenharmony_ci        alt = filename
507db96d56Sopenharmony_ci    elif os.path.abspath(filename) == os.path.abspath(alt):
517db96d56Sopenharmony_ci        alt = filename
527db96d56Sopenharmony_ci    else:
537db96d56Sopenharmony_ci        raise ValueError(f'mismatch: {filename} != {alt}')
547db96d56Sopenharmony_ci    return filename, alt
557db96d56Sopenharmony_ci
567db96d56Sopenharmony_ci
577db96d56Sopenharmony_ci@contextlib.contextmanager
587db96d56Sopenharmony_cidef opened(source, filename=None):
597db96d56Sopenharmony_ci    source, filename = resolve(source, filename)
607db96d56Sopenharmony_ci    if isinstance(source, str):
617db96d56Sopenharmony_ci        with open(source) as srcfile:
627db96d56Sopenharmony_ci            yield srcfile, filename
637db96d56Sopenharmony_ci    else:
647db96d56Sopenharmony_ci        yield source, filename
65