Issue #25523: Correct "a" article to "an" article

This changes the main documentation, doc strings, source code comments, and a
couple error messages in the test suite. In some cases the word was removed
to fix the grammar.
diff --git a/Modules/_ctypes/libffi/src/x86/darwin64.S b/Modules/_ctypes/libffi/src/x86/darwin64.S
index 2f7394e..0c72ed2 100644
--- a/Modules/_ctypes/libffi/src/x86/darwin64.S
+++ b/Modules/_ctypes/libffi/src/x86/darwin64.S
@@ -350,7 +350,7 @@
 	.set	L$set$3,LUW1-LUW0
 	.long	L$set$3
 
-	/* New stack frame based off rbp.  This is a itty bit of unwind
+	/* New stack frame based off rbp.  This is an itty bit of unwind
 	   trickery in that the CFA *has* changed.  There is no easy way
 	   to describe it correctly on entry to the function.  Fortunately,
 	   it doesn't matter too much since at all points we can correctly
diff --git a/Modules/_ctypes/libffi/src/x86/unix64.S b/Modules/_ctypes/libffi/src/x86/unix64.S
index dcd6bc7..45a0ed7 100644
--- a/Modules/_ctypes/libffi/src/x86/unix64.S
+++ b/Modules/_ctypes/libffi/src/x86/unix64.S
@@ -366,7 +366,7 @@
 	.byte	0x4			/* DW_CFA_advance_loc4 */
 	.long	.LUW1-.LUW0
 
-	/* New stack frame based off rbp.  This is a itty bit of unwind
+	/* New stack frame based off rbp.  This is an itty bit of unwind
 	   trickery in that the CFA *has* changed.  There is no easy way
 	   to describe it correctly on entry to the function.  Fortunately,
 	   it doesn't matter too much since at all points we can correctly
diff --git a/Modules/_ctypes/libffi_osx/x86/darwin64.S b/Modules/_ctypes/libffi_osx/x86/darwin64.S
index 165d469..1286d33 100644
--- a/Modules/_ctypes/libffi_osx/x86/darwin64.S
+++ b/Modules/_ctypes/libffi_osx/x86/darwin64.S
@@ -351,7 +351,7 @@
  .set  L$set$3,LUW1-LUW0
  .long L$set$3
 
- /* New stack frame based off rbp.  This is a itty bit of unwind
+ /* New stack frame based off rbp.  This is an itty bit of unwind
     trickery in that the CFA *has* changed.  There is no easy way
     to describe it correctly on entry to the function.  Fortunately,
     it doesn't matter too much since at all points we can correctly
diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c
index 01f4577..ad336c7 100644
--- a/Modules/_hashopenssl.c
+++ b/Modules/_hashopenssl.c
@@ -730,7 +730,7 @@
     if (openssl_obj_name == NULL)
         return;
     /* Ignore aliased names, they pollute the list and OpenSSL appears to
-     * have a its own definition of alias as the resulting list still
+     * have its own definition of alias as the resulting list still
      * contains duplicate and alternate names for several algorithms.     */
     if (openssl_obj_name->alias)
         return;
diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c
index 04c4445..bbfea71 100644
--- a/Modules/_io/_iomodule.c
+++ b/Modules/_io/_iomodule.c
@@ -74,7 +74,7 @@
 "Another IOBase subclass, TextIOBase, deals with the encoding and decoding\n"
 "of streams into text. TextIOWrapper, which extends it, is a buffered text\n"
 "interface to a buffered raw stream (`BufferedIOBase`). Finally, StringIO\n"
-"is a in-memory stream for text.\n"
+"is an in-memory stream for text.\n"
 "\n"
 "Argument names are not part of the specification, and only the arguments\n"
 "of open() are intended to be used as keyword arguments.\n"
diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c
index 710ada4..5f7b345 100644
--- a/Modules/_io/iobase.c
+++ b/Modules/_io/iobase.c
@@ -35,7 +35,7 @@
     "Even though IOBase does not declare read, readinto, or write because\n"
     "their signatures will vary, implementations and clients should\n"
     "consider those methods part of the interface. Also, implementations\n"
-    "may raise a IOError when operations they do not support are called.\n"
+    "may raise an IOError when operations they do not support are called.\n"
     "\n"
     "The basic type used for binary data read from or written to a file is\n"
     "the bytes type. Method arguments may also be bytearray or memoryview\n"
diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c
index 38bb0d8..a95edce 100644
--- a/Modules/_io/textio.c
+++ b/Modules/_io/textio.c
@@ -881,8 +881,8 @@
             if (self->encoding == NULL) {
               catch_ImportError:
                 /*
-                 Importing locale can raise a ImportError because of
-                 _functools, and locale.getpreferredencoding can raise a
+                 Importing locale can raise an ImportError because of
+                 _functools, and locale.getpreferredencoding can raise an
                  ImportError if _locale is not available.  These will happen
                  during module building.
                 */
diff --git a/Modules/audioop.c b/Modules/audioop.c
index e829e4d..a4d1375 100644
--- a/Modules/audioop.c
+++ b/Modules/audioop.c
@@ -121,7 +121,7 @@
 
 /*
  * linear2ulaw() accepts a 14-bit signed integer and encodes it as u-law data
- * stored in a unsigned char.  This function should only be called with
+ * stored in an unsigned char.  This function should only be called with
  * the data shifted such that it only contains information in the lower
  * 14-bits.
  *
diff --git a/Modules/expat/pyexpatns.h b/Modules/expat/pyexpatns.h
index 2f2f4f9..999c5c7 100644
--- a/Modules/expat/pyexpatns.h
+++ b/Modules/expat/pyexpatns.h
@@ -21,7 +21,7 @@
  *
  *
  * The Solution:
- * Prefix all a exported symbols with "PyExpat_". This is similar to
+ * Prefix all exported symbols with "PyExpat_". This is similar to
  * what Mozilla does for some common libs:
  * http://lxr.mozilla.org/seamonkey/source/modules/libimg/png/mozpngconf.h#115
  *
diff --git a/Modules/readline.c b/Modules/readline.c
index 3bb0ac8..6091a68 100644
--- a/Modules/readline.c
+++ b/Modules/readline.c
@@ -1144,7 +1144,7 @@
         return NULL;
     }
 
-    /* We got an EOF, return a empty string. */
+    /* We got an EOF, return an empty string. */
     if (p == NULL) {
         p = PyMem_Malloc(1);
         if (p != NULL)