(root)/
glibc-2.38/
stdio-common/
tst-errno-manual.py
       1  #!/usr/bin/python3
       2  # Check is all errno definitions at errlist.h documented in the manual.
       3  # Copyright (C) 2020-2023 Free Software Foundation, Inc.
       4  # This file is part of the GNU C Library.
       5  #
       6  # The GNU C Library is free software; you can redistribute it and/or
       7  # modify it under the terms of the GNU Lesser General Public
       8  # License as published by the Free Software Foundation; either
       9  # version 2.1 of the License, or (at your option) any later version.
      10  #
      11  # The GNU C Library is distributed in the hope that it will be useful,
      12  # but WITHOUT ANY WARRANTY; without even the implied warranty of
      13  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      14  # Lesser General Public License for more details.
      15  #
      16  # You should have received a copy of the GNU Lesser General Public
      17  # License along with the GNU C Library; if not, see
      18  # <https://www.gnu.org/licenses/>.
      19  
      20  import argparse
      21  import sys
      22  import re
      23  
      24  RE_MANUAL = re.compile(
      25      r'(?:^@errno){(\w+)')
      26  
      27  RE_ERRLIST = re.compile(
      28      r'\(E[a-zA-Z0-9]+\)')
      29  
      30  PASS=0
      31  FAIL=1
      32  
      33  # Each manual entry is in the form:
      34  #
      35  #  errno{EAGAIN, 35, Resource temporarily unavailable}
      36  def parse_manual(f):
      37      errlist = [RE_MANUAL.findall(s) for s in f]
      38      return map(lambda x : x[0], filter(None, errlist))
      39  
      40  # Each errlist entry is in the form:
      41  #
      42  #  _S(ERR_MAP(EAGAIN), N_("Resource temporarily unavailable"))
      43  def parse_errlist(f):
      44      errlist = [RE_ERRLIST.findall(s) for s in f]
      45      # Each element is '[]' or '['(EAGAIN)']'
      46      return map(lambda s : s[0][s[0].find('(')+1:s[0].find(')')],
      47                 filter(None, errlist))
      48  
      49  def check_errno_definitions(manual_fname, errlist_fname):
      50      with open(manual_fname, 'r') as mfile, open(errlist_fname, 'r') as efile:
      51          merr = parse_manual(mfile)
      52          eerr = parse_errlist(efile)
      53          diff = set(eerr).difference(merr)
      54          if not diff:
      55              sys.exit(PASS)
      56          else:
      57              print("Failure: the following value(s) are not in manual:",
      58                    ", ".join(str(e) for e in diff))
      59              sys.exit(FAIL)
      60  
      61  def main():
      62      parser = argparse.ArgumentParser(description='Generate errlist.h')
      63      parser.add_argument('-m', dest='manual', metavar='FILE',
      64                          help='manual errno texi file')
      65      parser.add_argument('-e', dest='errlist', metavar='FILE',
      66                          help='errlist with errno definitions')
      67      args = parser.parse_args()
      68  
      69      check_errno_definitions(args.manual, args.errlist)
      70  
      71  
      72  if __name__ == '__main__':
      73      main()