# # # patch "fdo/sharedmimeinfo.py" # from [6db1bfd2628f4ecd84b7c64ab79d6843d2dc910c] # to [d177ae1d1b6cd3626696b870fc3973ce0f2535c7] # ============================================================ --- fdo/sharedmimeinfo.py 6db1bfd2628f4ecd84b7c64ab79d6843d2dc910c +++ fdo/sharedmimeinfo.py d177ae1d1b6cd3626696b870fc3973ce0f2535c7 @@ -84,7 +84,7 @@ class MagicLookup(object): for dir in mime_dirs: magic_file = os.path.join(dir, 'magic') if os.access(magic_file, os.R_OK): - self.update(magic_file) + self.update(magic_file) def update(self, fname): fd = open(fname, 'rb') @@ -93,53 +93,60 @@ class MagicLookup(object): header_re = re.compile(r'^\[([0-9]+):([^\]]+)\]$') value_re = re.compile(r'^([0-9]*)>([0-9]+)=') options_re = re.compile(r'^(\~[0-9]+)?(\+[0-9]+)?$') - while True: - # read the first line (priority and mimetype) - header = fd.readline() - if not header: - break - m = header_re.match(header) + # read a header, followed by a number of lines + self.__buf = '' + def skip_line(): + nl = self.__buf.find('\n') + if nl == -1: + self.__buf = '' + else: + self.__buf = self.__buf[nl+1:] + def read_header(): + m = header_re.match(self.__buf) if not m: print "no match:", repr(header) - continue - priority, mime_type = m.groups() + skip_line() + else: + self.__buf = self.__buf[m.end()+1:] + return m.groups() + def read_line(): # the next line will have indent, start_offset and the # start of the value - buf = fd.readline() - m = value_re.match(buf) + m = value_re.match(self.__buf) if not m: - continue + skip_line() + return indent, start_offset = m.groups() try: indent = int(indent) except: indent = 0 - buf = buf[m.end():] + self.__buf = self.__buf[m.end():] # the next two bytes are the length, in big-endian format - length = (ord(buf[0]) << 8) + ord(buf[1]) - buf = buf[2:] + length = (ord(self.__buf[0]) << 8) + ord(self.__buf[1]) + self.__buf = self.__buf[2:] # read the remainder of the value - to_read = length - len(buf) + to_read = length - len(self.__buf) if to_read > 0: - buf += fd.read(to_read) - value, buf = buf[:length], buf[length:] + self.__buf += fd.read(to_read) + value, self.__buf = self.__buf[:length], self.__buf[length:] # is the next thing a mask? - if len(buf) == 0: - buf += fd.read(1) - if buf[0] == '&': - buf = buf[1:] - to_read = length - len(buf) + if len(self.__buf) == 0: + self.__buf += fd.read(1) + if self.__buf[0] == '&': + self.__buf = self.__buf[1:] + to_read = length - len(self.__buf) if to_read > 0: - buf += fd.read(to_read) - mask, buf = buf[:length], buf[length:] + self.__buf += fd.read(to_read) + mask, self.__buf = self.__buf[:length], self.__buf[length:] else: mask = '\xff' * length # anything remaining will end in a newline; so readline() # does what we want. see whether or not we need to call it.. - if len(buf) == 0 or buf[-1] != '\n': - buf += fd.readline() + if len(self.__buf) == 0 or self.__buf[-1] != '\n': + self.__buf += fd.readline() word_size, range_length = 1, 0 - m = options_re.match(buf) + m = options_re.match(self.__buf) if m: for group in m.groups(): if not group: @@ -148,7 +155,22 @@ class MagicLookup(object): word_size = int(group[1:]) elif group[0] == '+': range_length = int(group[1:]) - print indent, start_offset, repr(value), repr(mask), word_size, range_length + self.__buf = self.__buf[m.end()+1:] + return indent, start_offset, repr(value), repr(mask), word_size, range_length + while True: + if self.__buf == '': + nd = fd.readline() + if not nd: + break + self.__buf += nd + print "loop:", repr(self.__buf) + if self.__buf[0] == '[': + header = read_header() + print "header:", header + else: + line = read_line() + print "line:", line +# print indent, start_offset, repr(value), repr(mask), word_size, range_length def lookup(self, data): return None