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