def read(self, filename=None, preprocess=True, **defines): """Preprocess, read and parse itp file *filename*. Any keywords in *defines* are use to modify the default preprocessor variables (see :meth:`gromacs.fileformats.preprocessor.Preprocessor.parse` for details). Setting *preprocess* = ``False`` skips the preprocessing step. """ self._init_filename(filename) if preprocess: kwargs = self.defines.copy() kwargs['commentchar'] = self.commentchar kwargs['clean'] = True ppitp = Preprocessor(self.real_filename, **kwargs) ppitp.parse(**defines) itp = ppitp.StringIO() else: itp = open(self.real_filename) try: stream = OneLineBuffer(itp.next) self.parse(stream) finally: itp.close()
def contains_preprocessor_constructs(self): """Check if file makes use of any preprocessor constructs. The test is done by running the file through the :class:`~gromacs.fileformats.preprocessor.Preprocessor` (while stripping all empty and lines starting with a comment character. This is compared to the original file, stripped in the same manner. If the two stripped files differ from each other then the preprocessor altered the file and preprocessor directives must have been involved and this function returns ``True``. .. versionadded: 0.3.1 """ from itertools import izip kwargs = self.defines.copy() kwargs['commentchar'] = self.commentchar kwargs['clean'] = True kwargs['strip'] = True ppitp = Preprocessor(self.real_filename, **kwargs) ppitp.parse() pp_lines = ppitp.StringIO().readlines() def strip_line(line): s = line.strip() return len(s) == 0 or s.startswith(self.commentchar) raw_lines = [line for line in open(self.real_filename) if not strip_line(line)] if len(pp_lines) != len(raw_lines): self.logger.debug("File %r is preprocessed (pp: %d vs raw %d lines (stripped))", self.real_filename, len(pp_lines), len(raw_lines)) return True for linenum, (raw, pp) in enumerate(izip(raw_lines, pp_lines)): if raw != pp: self.logger.debug("File %r is preprocessed. Difference at (stripped) line %d", self.real_filename, linenum) self.logger.debug("preprocessed: %s", pp) self.logger.debug("original: %s", raw) return True self.logger.debug("File %r does not appear to contain recognized preprocessing directives", self.real_filename) return False