code: def process_msg18(fname):
      
      with open(fname, 'r') as infile:
          info = []
          for lineno, line in enumerate(infile):
              parts = line.split('  ')
              try:
                  if len(parts) == 8:
                      parts = parts[:6] + [parts[6] + parts[7]]
  
                  var_name, desc, typ, units, rng, prec, byte_range = parts
                  start, end = map(int, byte_range.split('-'))
                  size = end - start + 1
                  assert size >= 4
                  fmt = fix_type(typ, size,
                                 additional=[('See Note (5)', ('{size}s', 1172))])
  
                  if ' ' in var_name:
                      warnings.warn('Space in {}'.format(var_name))
                  if not desc:
                      warnings.warn('null description for {}'.format(var_name))
  
                  var_name = fix_var_name(var_name)
                  full_desc = fix_desc(desc, units)
  
                  info.append({'name': var_name, 'desc': full_desc, 'fmt': fmt})
  
                  if (ignored_item(info[-1]) and var_name != 'SPARE'
                          and 'SPARE' not in full_desc):
                      warnings.warn('{} has type {}. Setting as SPARE'.format(var_name, typ))
  
              except (ValueError, AssertionError):
                  warnings.warn('{} > {}'.format(lineno + 1, ':'.join(parts)))
                  raise
          return info
docs: Handle information for message type 18.