Patch #568124: Add doc string macros.
diff --git a/Modules/_hotshot.c b/Modules/_hotshot.c
index 4399525..06a6824 100644
--- a/Modules/_hotshot.c
+++ b/Modules/_hotshot.c
@@ -101,9 +101,9 @@
 
 /* The log reader... */
 
-static char logreader_close__doc__[] =
+PyDoc_STRVAR(logreader_close__doc__,
 "close()\n"
-"Close the log file, preventing additional records from being read.";
+"Close the log file, preventing additional records from being read.");
 
 static PyObject *
 logreader_close(LogReaderObject *self, PyObject *args)
@@ -522,9 +522,9 @@
     return result;
 }
 
-static char next__doc__[] =
+PyDoc_STRVAR(next__doc__,
 "next() -> event-info\n"
-"Return the next event record from the log file.";
+"Return the next event record from the log file.");
 
 static PyObject *
 logreader_next(LogReaderObject *self, PyObject *args)
@@ -1021,9 +1021,9 @@
 
 /* Profiler object interface methods. */
 
-static char addinfo__doc__[] =
+PyDoc_STRVAR(addinfo__doc__,
 "addinfo(key, value)\n"
-"Insert an ADD_INFO record into the log.";
+"Insert an ADD_INFO record into the log.");
 
 static PyObject *
 profiler_addinfo(ProfilerObject *self, PyObject *args)
@@ -1044,9 +1044,9 @@
     return result;
 }
 
-static char close__doc__[] =
+PyDoc_STRVAR(close__doc__,
 "close()\n"
-"Shut down this profiler and close the log files, even if its active.";
+"Shut down this profiler and close the log files, even if its active.");
 
 static PyObject *
 profiler_close(ProfilerObject *self, PyObject *args)
@@ -1065,9 +1065,9 @@
     return result;
 }
 
-static char runcall__doc__[] =
+PyDoc_STRVAR(runcall__doc__,
 "runcall(callable[, args[, kw]]) -> callable()\n"
-"Profile a specific function call, returning the result of that call.";
+"Profile a specific function call, returning the result of that call.");
 
 static PyObject *
 profiler_runcall(ProfilerObject *self, PyObject *args)
@@ -1088,10 +1088,10 @@
     return result;
 }
 
-static char runcode__doc__[] =
+PyDoc_STRVAR(runcode__doc__,
 "runcode(code, globals[, locals])\n"
 "Execute a code object while collecting profile data.  If locals is\n"
-"omitted, globals is used for the locals as well.";
+"omitted, globals is used for the locals as well.");
 
 static PyObject *
 profiler_runcode(ProfilerObject *self, PyObject *args)
@@ -1127,9 +1127,9 @@
     return result;
 }
 
-static char start__doc__[] =
+PyDoc_STRVAR(start__doc__,
 "start()\n"
-"Install this profiler for the current thread.";
+"Install this profiler for the current thread.");
 
 static PyObject *
 profiler_start(ProfilerObject *self, PyObject *args)
@@ -1146,9 +1146,9 @@
     return result;
 }
 
-static char stop__doc__[] =
+PyDoc_STRVAR(stop__doc__,
 "stop()\n"
-"Remove this profiler from the current thread.";
+"Remove this profiler from the current thread.");
 
 static PyObject *
 profiler_stop(ProfilerObject *self, PyObject *args)
@@ -1225,7 +1225,7 @@
 }
 
 
-static char profiler_object__doc__[] =
+PyDoc_STRVAR(profiler_object__doc__,
 "High-performance profiler object.\n"
 "\n"
 "Methods:\n"
@@ -1241,7 +1241,7 @@
 "closed:       True if the profiler has already been closed.\n"
 "frametimings: True if ENTER/EXIT events collect timing information.\n"
 "lineevents:   True if SET_LINENO events are reported to the profiler.\n"
-"linetimings:  True if SET_LINENO events collect timing information.";
+"linetimings:  True if SET_LINENO events collect timing information.");
 
 static PyTypeObject ProfilerType = {
     PyObject_HEAD_INIT(NULL)
@@ -1288,9 +1288,9 @@
 }
 
 
-static char logreader__doc__[] = "\
-logreader(filename) --> log-iterator\n\
-Create a log-reader for the timing information file.";
+PyDoc_STRVAR(logreader__doc__,
+"logreader(filename) --> log-iterator\n\
+Create a log-reader for the timing information file.");
 
 static PySequenceMethods logreader_as_sequence = {
     0,					/* sq_length */
@@ -1476,9 +1476,9 @@
     return 0;
 }
 
-static char profiler__doc__[] = "\
-profiler(logfilename[, lineevents[, linetimes]]) -> profiler\n\
-Create a new profiler object.";
+PyDoc_STRVAR(profiler__doc__,
+"profiler(logfilename[, lineevents[, linetimes]]) -> profiler\n\
+Create a new profiler object.");
 
 static PyObject *
 hotshot_profiler(PyObject *unused, PyObject *args)
@@ -1529,10 +1529,10 @@
     return (PyObject *) self;
 }
 
-static char coverage__doc__[] = "\
-coverage(logfilename) -> profiler\n\
+PyDoc_STRVAR(coverage__doc__,
+"coverage(logfilename) -> profiler\n\
 Returns a profiler that doesn't collect any timing information, which is\n\
-useful in building a coverage analysis tool.";
+useful in building a coverage analysis tool.");
 
 static PyObject *
 hotshot_coverage(PyObject *unused, PyObject *args)
@@ -1552,17 +1552,22 @@
     return result;
 }
 
-static char resolution__doc__[] =
+PyDoc_VAR(resolution__doc__) = 
 #ifdef MS_WIN32
+PyDoc_STR(
 "resolution() -> (performance-counter-ticks, update-frequency)\n"
 "Return the resolution of the timer provided by the QueryPerformanceCounter()\n"
 "function.  The first value is the smallest observed change, and the second\n"
-"is the result of QueryPerformanceFrequency().";
+"is the result of QueryPerformanceFrequency()."
+)
 #else
+PyDoc_STR(
 "resolution() -> (gettimeofday-usecs, getrusage-usecs)\n"
 "Return the resolution of the timers provided by the gettimeofday() and\n"
-"getrusage() system calls, or -1 if the call is not supported.";
+"getrusage() system calls, or -1 if the call is not supported."
+)
 #endif
+;
 
 static PyObject *
 hotshot_resolution(PyObject *unused, PyObject *args)
diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c
index 06f5346..e6bacb4 100644
--- a/Modules/_localemodule.c
+++ b/Modules/_localemodule.c
@@ -38,15 +38,14 @@
 char *strdup(const char *);
 #endif
 
-static char locale__doc__[] = "Support for POSIX locales.";
+PyDoc_STRVAR(locale__doc__, "Support for POSIX locales.");
 
 static PyObject *Error;
 
 /* support functions for formatting floating point numbers */
 
-static char setlocale__doc__[] =
-"(integer,string=None) -> string. Activates/queries locale processing."
-;
+PyDoc_STRVAR(setlocale__doc__,
+"(integer,string=None) -> string. Activates/queries locale processing.");
 
 /* to record the LC_NUMERIC settings */
 static PyObject* grouping = NULL;
@@ -244,9 +243,8 @@
     return result_object;
 }
 
-static char localeconv__doc__[] =
-"() -> dict. Returns numeric and monetary locale-specific parameters."
-;
+PyDoc_STRVAR(localeconv__doc__,
+"() -> dict. Returns numeric and monetary locale-specific parameters.");
 
 static PyObject*
 PyLocale_localeconv(PyObject* self)
@@ -321,9 +319,8 @@
     return NULL;
 }
 
-static char strcoll__doc__[] =
-"string,string -> int. Compares two strings according to the locale."
-;
+PyDoc_STRVAR(strcoll__doc__,
+"string,string -> int. Compares two strings according to the locale.");
 
 static PyObject*
 PyLocale_strcoll(PyObject* self, PyObject* args)
@@ -335,9 +332,8 @@
   return PyInt_FromLong(strcoll(s1, s2));
 }
 
-static char strxfrm__doc__[] =
-"string -> string. Returns a string that behaves for cmp locale-aware."
-;
+PyDoc_STRVAR(strxfrm__doc__,
+"string -> string. Returns a string that behaves for cmp locale-aware.");
 
 static PyObject*
 PyLocale_strxfrm(PyObject* self, PyObject* args)
@@ -521,10 +517,9 @@
     {0, 0}
 };
 
-static char nl_langinfo__doc__[] =
+PyDoc_STRVAR(nl_langinfo__doc__,
 "nl_langinfo(key) -> string\n"
-"Return the value for the locale information associated with key."
-;
+"Return the value for the locale information associated with key.");
 
 static PyObject*
 PyLocale_nl_langinfo(PyObject* self, PyObject* args)
@@ -545,9 +540,9 @@
 
 #ifdef HAVE_LIBINTL_H
 
-static char gettext__doc__[]=
+PyDoc_STRVAR(gettext__doc__,
 "gettext(msg) -> string\n"
-"Return translation of msg.";
+"Return translation of msg.");
 
 static PyObject*
 PyIntl_gettext(PyObject* self, PyObject *args)
@@ -558,9 +553,9 @@
 	return PyString_FromString(gettext(in));
 }
 
-static char dgettext__doc__[]=
+PyDoc_STRVAR(dgettext__doc__,
 "dgettext(domain, msg) -> string\n"
-"Return translation of msg in domain.";
+"Return translation of msg in domain.");
 
 static PyObject*
 PyIntl_dgettext(PyObject* self, PyObject *args)
@@ -571,9 +566,9 @@
 	return PyString_FromString(dgettext(domain, in));
 }
 
-static char dcgettext__doc__[]=
+PyDoc_STRVAR(dcgettext__doc__,
 "dcgettext(domain, msg, category) -> string\n"
-"Return translation of msg in domain and category.";
+"Return translation of msg in domain and category.");
 
 static PyObject*
 PyIntl_dcgettext(PyObject *self, PyObject *args)
@@ -585,9 +580,9 @@
 	return PyString_FromString(dcgettext(domain,msgid,category));
 }
 
-static char textdomain__doc__[]=
+PyDoc_STRVAR(textdomain__doc__,
 "textdomain(domain) -> string\n"
-"Set the C library's textdmain to domain, returning the new domain.";
+"Set the C library's textdmain to domain, returning the new domain.");
 
 static PyObject*
 PyIntl_textdomain(PyObject* self, PyObject* args)
@@ -603,9 +598,9 @@
 	return PyString_FromString(domain);
 }
 
-static char bindtextdomain__doc__[]=
+PyDoc_STRVAR(bindtextdomain__doc__,
 "bindtextdomain(domain, dir) -> string\n"
-"Bind the C library's domain to dir.";
+"Bind the C library's domain to dir.");
 
 static PyObject*
 PyIntl_bindtextdomain(PyObject* self,PyObject*args)
diff --git a/Modules/_ssl.c b/Modules/_ssl.c
index 1b05e40..d8353e4 100644
--- a/Modules/_ssl.c
+++ b/Modules/_ssl.c
@@ -259,8 +259,8 @@
 	return (PyObject *)rv;
 }
 
-static char ssl_doc[] =
-"ssl(socket, [keyfile, certfile]) -> sslobject";
+PyDoc_STRVAR(ssl_doc,
+"ssl(socket, [keyfile, certfile]) -> sslobject");
 
 /* SSL object methods */
 
@@ -306,11 +306,11 @@
 		return PySSL_SetError(self, len);
 }
 
-static char PySSL_SSLwrite_doc[] =
+PyDoc_STRVAR(PySSL_SSLwrite_doc,
 "write(s) -> len\n\
 \n\
 Writes the string s into the SSL object.  Returns the number\n\
-of bytes written.";
+of bytes written.");
 
 static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
 {
@@ -336,10 +336,10 @@
 	return buf;
 }
 
-static char PySSL_SSLread_doc[] =
+PyDoc_STRVAR(PySSL_SSLread_doc,
 "read([len]) -> string\n\
 \n\
-Read up to len bytes from the SSL socket.";
+Read up to len bytes from the SSL socket.");
 
 static PyMethodDef PySSLMethods[] = {
 	{"write", (PyCFunction)PySSL_SSLwrite, METH_VARARGS,
@@ -392,11 +392,11 @@
     return Py_None;
 }
 
-static char PySSL_RAND_add_doc[] =
+PyDoc_STRVAR(PySSL_RAND_add_doc,
 "RAND_add(string, entropy)\n\
 \n\
 Mix string into the OpenSSL PRNG state.  entropy (a float) is a lower\n\
-bound on the entropy contained in string.";
+bound on the entropy contained in string.");
 
 static PyObject *
 PySSL_RAND_status(PyObject *self)
@@ -404,12 +404,12 @@
     return PyInt_FromLong(RAND_status());
 }
 
-static char PySSL_RAND_status_doc[] = 
+PyDoc_STRVAR(PySSL_RAND_status_doc,
 "RAND_status() -> 0 or 1\n\
 \n\
 Returns 1 if the OpenSSL PRNG has been seeded with enough data and 0 if not.\n\
 It is necessary to seed the PRNG with RAND_add() on some platforms before\n\
-using the ssl() function.";
+using the ssl() function.");
 
 static PyObject *
 PySSL_RAND_egd(PyObject *self, PyObject *arg)
@@ -430,12 +430,12 @@
     return PyInt_FromLong(bytes);
 }
 
-static char PySSL_RAND_egd_doc[] = 
+PyDoc_STRVAR(PySSL_RAND_egd_doc,
 "RAND_egd(path) -> bytes\n\
 \n\
 Queries the entropy gather daemon (EGD) on socket path.  Returns number\n\
 of bytes read.  Raises socket.sslerror if connection to EGD fails or\n\
-if it does provide enough data to seed PRNG.";
+if it does provide enough data to seed PRNG.");
 
 #endif
 
@@ -456,9 +456,9 @@
 };
 
 
-static char module_doc[] =
+PyDoc_STRVAR(module_doc,
 "Implementation module for SSL socket operations.  See the socket module\n\
-for documentation.";
+for documentation.");
 
 DL_EXPORT(void)
 init_ssl(void)
diff --git a/Modules/_weakref.c b/Modules/_weakref.c
index f797fbf..31e63d1 100644
--- a/Modules/_weakref.c
+++ b/Modules/_weakref.c
@@ -5,9 +5,9 @@
         ((PyWeakReference **) PyObject_GET_WEAKREFS_LISTPTR(o))
 
 
-static char weakref_getweakrefcount__doc__[] =
+PyDoc_STRVAR(weakref_getweakrefcount__doc__,
 "getweakrefcount(object) -- return the number of weak references\n"
-"to 'object'.";
+"to 'object'.");
 
 static PyObject *
 weakref_getweakrefcount(PyObject *self, PyObject *object)
@@ -26,9 +26,9 @@
 }
 
 
-static char weakref_getweakrefs__doc__[] =
+PyDoc_STRVAR(weakref_getweakrefs__doc__,
 "getweakrefs(object) -- return a list of all weak reference objects\n"
-"that point to 'object'.";
+"that point to 'object'.");
 
 static PyObject *
 weakref_getweakrefs(PyObject *self, PyObject *object)
@@ -57,10 +57,10 @@
 }
 
 
-static char weakref_ref__doc__[] =
+PyDoc_STRVAR(weakref_ref__doc__,
 "new(object[, callback]) -- create a weak reference to 'object';\n"
 "when 'object' is finalized, 'callback' will be called and passed\n"
-"a reference to 'object'.";
+"a reference to 'object'.");
 
 static PyObject *
 weakref_ref(PyObject *self, PyObject *args)
@@ -76,10 +76,10 @@
 }
 
 
-static char weakref_proxy__doc__[] =
+PyDoc_STRVAR(weakref_proxy__doc__,
 "proxy(object[, callback]) -- create a proxy object that weakly\n"
 "references 'object'.  'callback', if given, is called with a\n"
-"reference to the proxy when it is about to be finalized.";
+"reference to the proxy when it is about to be finalized.");
 
 static PyObject *
 weakref_proxy(PyObject *self, PyObject *args)
diff --git a/Modules/almodule.c b/Modules/almodule.c
index 31af258..05c4bef 100644
--- a/Modules/almodule.c
+++ b/Modules/almodule.c
@@ -272,9 +272,8 @@
 	return PyInt_FromLong((long) par);
 }
 
-static char alc_SetWidth__doc__[] = 
-"alSetWidth: set the wordsize for integer audio data."
-;
+PyDoc_STRVAR(alc_SetWidth__doc__,
+"alSetWidth: set the wordsize for integer audio data.");
 
 static PyObject *
 alc_SetWidth(alcobject *self, PyObject *args)
@@ -283,9 +282,8 @@
 }
 
 
-static char alc_GetWidth__doc__[] = 
-"alGetWidth: get the wordsize for integer audio data."
-;
+PyDoc_STRVAR(alc_GetWidth__doc__,
+"alGetWidth: get the wordsize for integer audio data.");
 
 static PyObject *
 alc_GetWidth(alcobject *self, PyObject *args)
@@ -294,9 +292,9 @@
 }
 
 
-static char alc_SetSampFmt__doc__[] = 
-"alSetSampFmt: set the sample format setting in an audio ALconfig structure."
-;
+PyDoc_STRVAR(alc_SetSampFmt__doc__,
+"alSetSampFmt: set the sample format setting in an audio ALconfig "
+"structure.");
 
 static PyObject *
 alc_SetSampFmt(alcobject *self, PyObject *args)
@@ -305,9 +303,9 @@
 }
 
 
-static char alc_GetSampFmt__doc__[] = 
-"alGetSampFmt: get the sample format setting in an audio ALconfig structure."
-;
+PyDoc_STRVAR(alc_GetSampFmt__doc__,
+"alGetSampFmt: get the sample format setting in an audio ALconfig "
+"structure.");
 
 static PyObject *
 alc_GetSampFmt(alcobject *self, PyObject *args)
@@ -316,9 +314,8 @@
 }
 
 
-static char alc_SetChannels__doc__[] = 
-"alSetChannels: set the channel settings in an audio ALconfig."
-;
+PyDoc_STRVAR(alc_SetChannels__doc__,
+"alSetChannels: set the channel settings in an audio ALconfig.");
 
 static PyObject *
 alc_SetChannels(alcobject *self, PyObject *args)
@@ -327,9 +324,8 @@
 }
 
 
-static char alc_GetChannels__doc__[] = 
-"alGetChannels: get the channel settings in an audio ALconfig."
-;
+PyDoc_STRVAR(alc_GetChannels__doc__,
+"alGetChannels: get the channel settings in an audio ALconfig.");
 
 static PyObject *
 alc_GetChannels(alcobject *self, PyObject *args)
@@ -338,9 +334,8 @@
 }
 
 
-static char alc_SetFloatMax__doc__[] = 
-"alSetFloatMax: set the maximum value of floating point sample data."
-;
+PyDoc_STRVAR(alc_SetFloatMax__doc__,
+"alSetFloatMax: set the maximum value of floating point sample data.");
 
 static PyObject *
 alc_SetFloatMax(alcobject *self, PyObject *args)
@@ -356,9 +351,8 @@
 }
 
 
-static char alc_GetFloatMax__doc__[] = 
-"alGetFloatMax: get the maximum value of floating point sample data."
-;
+PyDoc_STRVAR(alc_GetFloatMax__doc__,
+"alGetFloatMax: get the maximum value of floating point sample data.");
 
 static PyObject *
 alc_GetFloatMax(alcobject *self, PyObject *args)
@@ -373,9 +367,8 @@
 }
 
 
-static char alc_SetDevice__doc__[] = 
-"alSetDevice: set the device setting in an audio ALconfig structure."
-;
+PyDoc_STRVAR(alc_SetDevice__doc__,
+"alSetDevice: set the device setting in an audio ALconfig structure.");
 
 static PyObject *
 alc_SetDevice(alcobject *self, PyObject *args)
@@ -384,9 +377,8 @@
 }
 
 
-static char alc_GetDevice__doc__[] = 
-"alGetDevice: get the device setting in an audio ALconfig structure."
-;
+PyDoc_STRVAR(alc_GetDevice__doc__,
+"alGetDevice: get the device setting in an audio ALconfig structure.");
 
 static PyObject *
 alc_GetDevice(alcobject *self, PyObject *args)
@@ -395,9 +387,8 @@
 }
 
 
-static char alc_SetQueueSize__doc__[] = 
-"alSetQueueSize: set audio port buffer size."
-;
+PyDoc_STRVAR(alc_SetQueueSize__doc__,
+"alSetQueueSize: set audio port buffer size.");
 
 static PyObject *
 alc_SetQueueSize(alcobject *self, PyObject *args)
@@ -406,9 +397,8 @@
 }
 
 
-static char alc_GetQueueSize__doc__[] = 
-"alGetQueueSize: get audio port buffer size."
-;
+PyDoc_STRVAR(alc_GetQueueSize__doc__,
+"alGetQueueSize: get audio port buffer size.");
 
 static PyObject *
 alc_GetQueueSize(alcobject *self, PyObject *args)
@@ -590,9 +580,7 @@
 	return Py_FindMethod(alc_methods, (PyObject *)self, name);
 }
 
-static char Alctype__doc__[] = 
-""
-;
+PyDoc_STRVAR(Alctype__doc__, "");
 
 static PyTypeObject Alctype = {
 	PyObject_HEAD_INIT(&PyType_Type)
@@ -624,9 +612,8 @@
 
 #ifdef AL_NO_ELEM		/* IRIX 6 */
 
-static char alp_SetConfig__doc__[] = 
-"alSetConfig: set the ALconfig of an audio ALport."
-;
+PyDoc_STRVAR(alp_SetConfig__doc__,
+"alSetConfig: set the ALconfig of an audio ALport.");
 
 static PyObject *
 alp_SetConfig(alpobject *self, PyObject *args)
@@ -641,9 +628,8 @@
 }
 
 
-static char alp_GetConfig__doc__[] = 
-"alGetConfig: get the ALconfig of an audio ALport."
-;
+PyDoc_STRVAR(alp_GetConfig__doc__,
+"alGetConfig: get the ALconfig of an audio ALport.");
 
 static PyObject *
 alp_GetConfig(alpobject *self, PyObject *args)
@@ -657,9 +643,8 @@
 }
 
 
-static char alp_GetResource__doc__[] = 
-"alGetResource: get the resource associated with an audio port."
-;
+PyDoc_STRVAR(alp_GetResource__doc__,
+"alGetResource: get the resource associated with an audio port.");
 
 static PyObject *
 alp_GetResource(alpobject *self, PyObject *args)
@@ -674,9 +659,8 @@
 }
 
 
-static char alp_GetFD__doc__[] = 
-"alGetFD: get the file descriptor for an audio port."
-;
+PyDoc_STRVAR(alp_GetFD__doc__,
+"alGetFD: get the file descriptor for an audio port.");
 
 static PyObject *
 alp_GetFD(alpobject *self, PyObject *args)
@@ -693,9 +677,9 @@
 }
 
 
-static char alp_GetFilled__doc__[] = 
-"alGetFilled: return the number of filled sample frames in an audio port."
-;
+PyDoc_STRVAR(alp_GetFilled__doc__,
+"alGetFilled: return the number of filled sample frames in "
+"an audio port.");
 
 static PyObject *
 alp_GetFilled(alpobject *self, PyObject *args)
@@ -710,9 +694,9 @@
 }
 
 
-static char alp_GetFillable__doc__[] = 
-"alGetFillable: report the number of unfilled sample frames in an audio port."
-;
+PyDoc_STRVAR(alp_GetFillable__doc__,
+"alGetFillable: report the number of unfilled sample frames "
+"in an audio port.");
 
 static PyObject *
 alp_GetFillable(alpobject *self, PyObject *args)
@@ -727,9 +711,8 @@
 }
 
 
-static char alp_ReadFrames__doc__[] = 
-"alReadFrames: read sample frames from an audio port."
-;
+PyDoc_STRVAR(alp_ReadFrames__doc__,
+"alReadFrames: read sample frames from an audio port.");
 
 static PyObject *
 alp_ReadFrames(alpobject *self, PyObject *args)
@@ -796,9 +779,8 @@
 }
 
 
-static char alp_DiscardFrames__doc__[] = 
-"alDiscardFrames: discard audio from an audio port."
-;
+PyDoc_STRVAR(alp_DiscardFrames__doc__,
+"alDiscardFrames: discard audio from an audio port.");
 
 static PyObject *
 alp_DiscardFrames(alpobject *self, PyObject *args)
@@ -819,9 +801,8 @@
 }
 
 
-static char alp_ZeroFrames__doc__[] = 
-"alZeroFrames: write zero-valued sample frames to an audio port."
-;
+PyDoc_STRVAR(alp_ZeroFrames__doc__,
+"alZeroFrames: write zero-valued sample frames to an audio port.");
 
 static PyObject *
 alp_ZeroFrames(alpobject *self, PyObject *args)
@@ -845,9 +826,8 @@
 }
 
 
-static char alp_SetFillPoint__doc__[] = 
-"alSetFillPoint: set low- or high-water mark for an audio port."
-;
+PyDoc_STRVAR(alp_SetFillPoint__doc__,
+"alSetFillPoint: set low- or high-water mark for an audio port.");
 
 static PyObject *
 alp_SetFillPoint(alpobject *self, PyObject *args)
@@ -865,9 +845,8 @@
 }
 
 
-static char alp_GetFillPoint__doc__[] = 
-"alGetFillPoint: get low- or high-water mark for an audio port."
-;
+PyDoc_STRVAR(alp_GetFillPoint__doc__,
+"alGetFillPoint: get low- or high-water mark for an audio port.");
 
 static PyObject *
 alp_GetFillPoint(alpobject *self, PyObject *args)
@@ -884,9 +863,9 @@
 }
 
 
-static char alp_GetFrameNumber__doc__[] = 
-"alGetFrameNumber: get the absolute sample frame number associated with a port."
-;
+PyDoc_STRVAR(alp_GetFrameNumber__doc__,
+"alGetFrameNumber: get the absolute sample frame number "
+"associated with a port.");
 
 static PyObject *
 alp_GetFrameNumber(alpobject *self, PyObject *args)
@@ -903,9 +882,9 @@
 }
 
 
-static char alp_GetFrameTime__doc__[] = 
-"alGetFrameTime: get the time at which a sample frame came in or will go out."
-;
+PyDoc_STRVAR(alp_GetFrameTime__doc__,
+"alGetFrameTime: get the time at which a sample frame came "
+"in or will go out.");
 
 static PyObject *
 alp_GetFrameTime(alpobject *self, PyObject *args)
@@ -931,9 +910,8 @@
 }
 
 
-static char alp_WriteFrames__doc__[] = 
-"alWriteFrames: write sample frames to an audio port."
-;
+PyDoc_STRVAR(alp_WriteFrames__doc__,
+"alWriteFrames: write sample frames to an audio port.");
 
 static PyObject *
 alp_WriteFrames(alpobject *self, PyObject *args)
@@ -997,9 +975,7 @@
 }
 
 
-static char alp_ClosePort__doc__[] = 
-"alClosePort: close an audio port."
-;
+PyDoc_STRVAR(alp_ClosePort__doc__, "alClosePort: close an audio port.");
 
 static PyObject *
 alp_ClosePort(alpobject *self, PyObject *args)
@@ -1314,9 +1290,7 @@
 	return Py_FindMethod(alp_methods, (PyObject *)self, name);
 }
 
-static char Alptype__doc__[] = 
-""
-;
+PyDoc_STRVAR(Alptype__doc__, "");
 
 static PyTypeObject Alptype = {
 	PyObject_HEAD_INIT(&PyType_Type)
@@ -1349,9 +1323,8 @@
 
 #ifdef AL_NO_ELEM		/* IRIX 6 */
 
-static char al_NewConfig__doc__[] =
-"alNewConfig: create and initialize an audio ALconfig structure."
-;
+PyDoc_STRVAR(al_NewConfig__doc__,
+"alNewConfig: create and initialize an audio ALconfig structure.");
 
 static PyObject *
 al_NewConfig(PyObject *self, PyObject *args)
@@ -1365,9 +1338,8 @@
 	return newalcobject(config);
 }
 
-static char al_OpenPort__doc__[] =
-"alOpenPort: open an audio port."
-;
+PyDoc_STRVAR(al_OpenPort__doc__,
+"alOpenPort: open an audio port.");
 
 static PyObject *
 al_OpenPort(PyObject *self, PyObject *args)
@@ -1383,9 +1355,8 @@
 	return newalpobject(port);
 }
 
-static char al_Connect__doc__[] =
-"alConnect: connect two audio I/O resources."
-;
+PyDoc_STRVAR(al_Connect__doc__,
+"alConnect: connect two audio I/O resources.");
 
 static PyObject *
 al_Connect(PyObject *self, PyObject *args)
@@ -1423,9 +1394,8 @@
 	return PyInt_FromLong((long) id);
 }
 
-static char al_Disconnect__doc__[] =
-"alDisconnect: delete a connection between two audio I/O resources."
-;
+PyDoc_STRVAR(al_Disconnect__doc__,
+"alDisconnect: delete a connection between two audio I/O resources.");
 
 static PyObject *
 al_Disconnect(PyObject *self, PyObject *args)
@@ -1440,9 +1410,8 @@
 	return Py_None;
 }
 
-static char al_GetParams__doc__[] =
-"alGetParams: get the values of audio resource parameters."
-;
+PyDoc_STRVAR(al_GetParams__doc__,
+"alGetParams: get the values of audio resource parameters.");
 
 static PyObject *
 al_GetParams(PyObject *self, PyObject *args)
@@ -1585,9 +1554,8 @@
 	return NULL;
 }
 
-static char al_SetParams__doc__[] =
-"alSetParams: set the values of audio resource parameters."
-;
+PyDoc_STRVAR(al_SetParams__doc__,
+"alSetParams: set the values of audio resource parameters.");
 
 static PyObject *
 al_SetParams(PyObject *self, PyObject *args)
@@ -1631,9 +1599,8 @@
 	return NULL;
 }
 
-static char al_QueryValues__doc__[] =
-"alQueryValues: get the set of possible values for a parameter."
-;
+PyDoc_STRVAR(al_QueryValues__doc__,
+"alQueryValues: get the set of possible values for a parameter.");
 
 static PyObject *
 al_QueryValues(PyObject *self, PyObject *args)
@@ -1711,9 +1678,9 @@
 	return res;
 }
 
-static char al_GetParamInfo__doc__[] =
-"alGetParamInfo: get information about a parameter on a particular audio resource."
-;
+PyDoc_STRVAR(al_GetParamInfo__doc__,
+"alGetParamInfo: get information about a parameter on "
+"a particular audio resource.");
 
 static PyObject *
 al_GetParamInfo(PyObject *self, PyObject *args)
@@ -1794,9 +1761,8 @@
 	return v;
 }
 
-static char al_GetResourceByName__doc__[] =
-"alGetResourceByName: find an audio resource by name."
-;
+PyDoc_STRVAR(al_GetResourceByName__doc__,
+"alGetResourceByName: find an audio resource by name.");
 
 static PyObject *
 al_GetResourceByName(PyObject *self, PyObject *args)
@@ -1811,9 +1777,8 @@
 	return PyInt_FromLong((long) res);
 }
 
-static char al_IsSubtype__doc__[] =
-"alIsSubtype: indicate if one resource type is a subtype of another."
-;
+PyDoc_STRVAR(al_IsSubtype__doc__,
+"alIsSubtype: indicate if one resource type is a subtype of another.");
 
 static PyObject *
 al_IsSubtype(PyObject *self, PyObject *args)
@@ -1825,9 +1790,7 @@
 	return PyInt_FromLong((long) alIsSubtype(type, subtype));
 }
 
-static char al_SetErrorHandler__doc__[] =
-""
-;
+PyDoc_STRVAR(al_SetErrorHandler__doc__, "");
 
 static PyObject *
 al_SetErrorHandler(PyObject *self, PyObject *args)
@@ -2024,9 +1987,7 @@
 
 /* Initialization function for the module (*must* be called inital) */
 
-static char al_module_documentation[] = 
-""
-;
+PyDoc_STRVAR(al_module_documentation, "");
 
 void
 inital(void)
diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c
index f10d442..dd93950 100644
--- a/Modules/arraymodule.c
+++ b/Modules/arraymodule.c
@@ -820,10 +820,10 @@
 	return PyInt_FromLong((long)count);
 }
 
-static char count_doc [] =
+PyDoc_STRVAR(count_doc,
 "count(x)\n\
 \n\
-Return number of occurences of x in the array.";
+Return number of occurences of x in the array.");
 
 static PyObject *
 array_index(arrayobject *self, PyObject *args)
@@ -847,10 +847,10 @@
 	return NULL;
 }
 
-static char index_doc [] =
+PyDoc_STRVAR(index_doc,
 "index(x)\n\
 \n\
-Return index of first occurence of x in the array.";
+Return index of first occurence of x in the array.");
 
 static PyObject *
 array_remove(arrayobject *self, PyObject *args)
@@ -878,10 +878,10 @@
 	return NULL;
 }
 
-static char remove_doc [] =
+PyDoc_STRVAR(remove_doc,
 "remove(x)\n\
 \n\
-Remove the first occurence of x in the array.";
+Remove the first occurence of x in the array.");
 
 static PyObject *
 array_pop(arrayobject *self, PyObject *args)
@@ -909,10 +909,10 @@
 	return v;
 }
 
-static char pop_doc [] =
+PyDoc_STRVAR(pop_doc,
 "pop([i])\n\
 \n\
-Return the i-th element and delete it from the array. i defaults to -1.";
+Return the i-th element and delete it from the array. i defaults to -1.");
 
 static PyObject *
 array_extend(arrayobject *self, PyObject *args)
@@ -927,10 +927,10 @@
 	return Py_None;
 }
 
-static char extend_doc [] =
+PyDoc_STRVAR(extend_doc,
 "extend(array)\n\
 \n\
- Append array items to the end of the array.";
+ Append array items to the end of the array.");
 
 static PyObject *
 array_insert(arrayobject *self, PyObject *args)
@@ -942,10 +942,10 @@
 	return ins(self, i, v);
 }
 
-static char insert_doc [] =
+PyDoc_STRVAR(insert_doc,
 "insert(i,x)\n\
 \n\
-Insert a new item x into the array before position i.";
+Insert a new item x into the array before position i.");
 
 
 static PyObject *
@@ -964,13 +964,13 @@
 	return retval;
 }
 
-static char buffer_info_doc [] =
+PyDoc_STRVAR(buffer_info_doc,
 "buffer_info() -> (address, length)\n\
 \n\
 Return a tuple (address, length) giving the current memory address and\n\
 the length in items of the buffer used to hold array's contents\n\
 The length should be multiplied by the itemsize attribute to calculate\n\
-the buffer length in bytes.";
+the buffer length in bytes.");
 
 
 static PyObject *
@@ -982,10 +982,10 @@
 	return ins(self, (int) self->ob_size, v);
 }
 
-static char append_doc [] =
+PyDoc_STRVAR(append_doc,
 "append(x)\n\
 \n\
-Append new value x to the end of the array.";
+Append new value x to the end of the array.");
 
 
 static PyObject *
@@ -1042,11 +1042,11 @@
 	return Py_None;
 }
 
-static char byteswap_doc [] =
+PyDoc_STRVAR(byteswap_doc,
 "byteswap()\n\
 \n\
 Byteswap all items of the array.  If the items in the array are not 1, 2,\n\
-4, or 8 bytes in size, RuntimeError is raised.";
+4, or 8 bytes in size, RuntimeError is raised.");
 
 static PyObject *
 array_reverse(arrayobject *self, PyObject *args)
@@ -1078,10 +1078,10 @@
 	return Py_None;
 }
 
-static char reverse_doc [] =
+PyDoc_STRVAR(reverse_doc,
 "reverse()\n\
 \n\
-Reverse the order of the items in the array.";
+Reverse the order of the items in the array.");
 
 static PyObject *
 array_fromfile(arrayobject *self, PyObject *args)
@@ -1130,11 +1130,11 @@
 	return Py_None;
 }
 
-static char fromfile_doc [] =
+PyDoc_STRVAR(fromfile_doc,
 "fromfile(f, n)\n\
 \n\
 Read n objects from the file object f and append them to the end of the\n\
-array.  Also called as read.";
+array.  Also called as read.");
 
 
 static PyObject *
@@ -1161,11 +1161,11 @@
 	return Py_None;
 }
 
-static char tofile_doc [] =
+PyDoc_STRVAR(tofile_doc,
 "tofile(f)\n\
 \n\
 Write all items (as machine values) to the file object f.  Also called as\n\
-write.";
+write.");
 
 
 static PyObject *
@@ -1207,10 +1207,10 @@
 	return Py_None;
 }
 
-static char fromlist_doc [] =
+PyDoc_STRVAR(fromlist_doc,
 "fromlist(list)\n\
 \n\
-Append items to array from list.";
+Append items to array from list.");
 
 
 static PyObject *
@@ -1233,10 +1233,10 @@
 	return list;
 }
 
-static char tolist_doc [] =
+PyDoc_STRVAR(tolist_doc,
 "tolist() -> list\n\
 \n\
-Convert array to an ordinary list with the same items.";
+Convert array to an ordinary list with the same items.");
 
 
 static PyObject *
@@ -1269,11 +1269,11 @@
 	return Py_None;
 }
 
-static char fromstring_doc [] =
+PyDoc_STRVAR(fromstring_doc,
 "fromstring(string)\n\
 \n\
 Appends items from the string, interpreting it as an array of machine\n\
-values,as if it had been read from a file using the fromfile() method).";
+values,as if it had been read from a file using the fromfile() method).");
 
 
 static PyObject *
@@ -1285,11 +1285,11 @@
 				    self->ob_size * self->ob_descr->itemsize);
 }
 
-static char tostring_doc [] =
+PyDoc_STRVAR(tostring_doc,
 "tostring() -> string\n\
 \n\
 Convert the array to an array of machine values and return the string\n\
-representation.";
+representation.");
 
 
 
@@ -1325,13 +1325,13 @@
 	return Py_None;
 }
 
-static char fromunicode_doc[] =
+PyDoc_STRVAR(fromunicode_doc,
 "fromunicode(ustr)\n\
 \n\
 Extends this array with data from the unicode string ustr.\n\
 The array must be a type 'u' array; otherwise a ValueError\n\
 is raised.  Use array.fromstring(ustr.decode(...)) to\n\
-append Unicode data to an array of some other type.";
+append Unicode data to an array of some other type.");
 
 
 static PyObject *
@@ -1347,13 +1347,13 @@
 	return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, self->ob_size);
 }
 
-static char tounicode_doc [] =
+PyDoc_STRVAR(tounicode_doc,
 "tounicode() -> unicode\n\
 \n\
 Convert the array to a unicode string.  The array must be\n\
 a type 'u' array; otherwise a ValueError is raised.  Use\n\
 array.tostring().decode() to obtain a unicode string from\n\
-an array of some other type.";
+an array of some other type.");
 
 #endif /* Py_USING_UNICODE */
 
@@ -1621,7 +1621,7 @@
 }
 
 
-static char module_doc [] =
+PyDoc_STRVAR(module_doc,
 "This module defines an object type which can efficiently represent\n\
 an array of basic values: characters, integers, floating point\n\
 numbers.  Arrays are sequence types and behave very much like lists,\n\
@@ -1646,9 +1646,9 @@
 The constructor is:\n\
 \n\
 array(typecode [, initializer]) -- create a new array\n\
-";
+");
 
-static char arraytype_doc [] =
+PyDoc_STRVAR(arraytype_doc,
 "array(typecode [, initializer]) -> array\n\
 \n\
 Return a new array whose items are restricted by typecode, and\n\
@@ -1683,7 +1683,7 @@
 \n\
 typecode -- the typecode character used to create the array\n\
 itemsize -- the length in bytes of one array item\n\
-";
+");
 
 statichere PyTypeObject Arraytype = {
 	PyObject_HEAD_INIT(NULL)
diff --git a/Modules/binascii.c b/Modules/binascii.c
index 9ef3054..6cba688 100644
--- a/Modules/binascii.c
+++ b/Modules/binascii.c
@@ -179,7 +179,7 @@
 	0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,
 };
 
-static char doc_a2b_uu[] = "(ascii) -> bin. Decode a line of uuencoded data";
+PyDoc_STRVAR(doc_a2b_uu, "(ascii) -> bin. Decode a line of uuencoded data");
 
 static PyObject *
 binascii_a2b_uu(PyObject *self, PyObject *args)
@@ -254,7 +254,7 @@
 	return rv;
 }
 
-static char doc_b2a_uu[] = "(bin) -> ascii. Uuencode line of data";
+PyDoc_STRVAR(doc_b2a_uu, "(bin) -> ascii. Uuencode line of data");
 	
 static PyObject *
 binascii_b2a_uu(PyObject *self, PyObject *args)
@@ -330,7 +330,7 @@
 	return ret;
 }
 
-static char doc_a2b_base64[] = "(ascii) -> bin. Decode a line of base64 data";
+PyDoc_STRVAR(doc_a2b_base64, "(ascii) -> bin. Decode a line of base64 data");
 
 static PyObject *
 binascii_a2b_base64(PyObject *self, PyObject *args)
@@ -417,7 +417,7 @@
 	return rv;
 }
 
-static char doc_b2a_base64[] = "(bin) -> ascii. Base64-code line of data";
+PyDoc_STRVAR(doc_b2a_base64, "(bin) -> ascii. Base64-code line of data");
 	
 static PyObject *
 binascii_b2a_base64(PyObject *self, PyObject *args)
@@ -470,7 +470,7 @@
 	return rv;
 }
 
-static char doc_a2b_hqx[] = "ascii -> bin, done. Decode .hqx coding";
+PyDoc_STRVAR(doc_a2b_hqx, "ascii -> bin, done. Decode .hqx coding");
 
 static PyObject *
 binascii_a2b_hqx(PyObject *self, PyObject *args)
@@ -534,7 +534,7 @@
 	return NULL;
 }
 
-static char doc_rlecode_hqx[] = "Binhex RLE-code binary data";
+PyDoc_STRVAR(doc_rlecode_hqx, "Binhex RLE-code binary data");
 
 static PyObject *
 binascii_rlecode_hqx(PyObject *self, PyObject *args)
@@ -581,7 +581,7 @@
 	return rv;
 }
 
-static char doc_b2a_hqx[] = "Encode .hqx data";
+PyDoc_STRVAR(doc_b2a_hqx, "Encode .hqx data");
 	
 static PyObject *
 binascii_b2a_hqx(PyObject *self, PyObject *args)
@@ -621,7 +621,7 @@
 	return rv;
 }
 
-static char doc_rledecode_hqx[] = "Decode hexbin RLE-coded string";
+PyDoc_STRVAR(doc_rledecode_hqx, "Decode hexbin RLE-coded string");
 	
 static PyObject *
 binascii_rledecode_hqx(PyObject *self, PyObject *args)
@@ -717,8 +717,8 @@
 	return rv;
 }
 
-static char doc_crc_hqx[] =
-"(data, oldcrc) -> newcrc. Compute hqx CRC incrementally";
+PyDoc_STRVAR(doc_crc_hqx,
+"(data, oldcrc) -> newcrc. Compute hqx CRC incrementally");
 
 static PyObject *
 binascii_crc_hqx(PyObject *self, PyObject *args)
@@ -737,8 +737,8 @@
 	return Py_BuildValue("i", crc);
 }
 
-static char doc_crc32[] =
-"(data, oldcrc = 0) -> newcrc. Compute CRC-32 incrementally";
+PyDoc_STRVAR(doc_crc32,
+"(data, oldcrc = 0) -> newcrc. Compute CRC-32 incrementally");
 
 /*  Crc - 32 BIT ANSI X3.66 CRC checksum files
     Also known as: ISO 3307
@@ -912,10 +912,10 @@
 	return NULL;
 }
 
-static char doc_hexlify[] =
+PyDoc_STRVAR(doc_hexlify,
 "b2a_hex(data) -> s; Hexadecimal representation of binary data.\n\
 \n\
-This function is also available as \"hexlify()\".";
+This function is also available as \"hexlify()\".");
 
 
 static int
@@ -978,11 +978,11 @@
 	return NULL;
 }
 
-static char doc_unhexlify[] =
+PyDoc_STRVAR(doc_unhexlify,
 "a2b_hex(hexstr) -> s; Binary data of hexadecimal representation.\n\
 \n\
 hexstr must contain an even number of hex digits (upper or lower case).\n\
-This function is also available as \"unhexlify()\"";
+This function is also available as \"unhexlify()\"");
 
 static int table_hex[128] = {
   -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
@@ -999,7 +999,7 @@
 
 #define MAXLINESIZE 76
 
-static char doc_a2b_qp[] = "Decode a string of qp-encoded data";
+PyDoc_STRVAR(doc_a2b_qp, "Decode a string of qp-encoded data");
 
 static PyObject* 
 binascii_a2b_qp(PyObject *self, PyObject *args, PyObject *kwargs)
@@ -1088,13 +1088,13 @@
 	return 0;
 }
 
-static char doc_b2a_qp[] = 
+PyDoc_STRVAR(doc_b2a_qp,
 "b2a_qp(data, quotetabs=0, istext=1, header=0) -> s; \n\
  Encode a string using quoted-printable encoding. \n\
 \n\
 On encoding, when istext is set, newlines are not encoded, and white \n\
 space at end of lines is.  When istext is not set, \\r and \\n (CR/LF) are \n\
-both encoded.  When quotetabs is set, space and tabs are encoded.";
+both encoded.  When quotetabs is set, space and tabs are encoded.");
 
 /* XXX: This is ridiculously complicated to be backward compatible
  * (mostly) with the quopri module.  It doesn't re-create the quopri
@@ -1295,7 +1295,7 @@
 
 
 /* Initialization function for the module (*must* be called initbinascii) */
-static char doc_binascii[] = "Conversion between binary data and ASCII";
+PyDoc_STRVAR(doc_binascii, "Conversion between binary data and ASCII");
 
 DL_EXPORT(void)
 initbinascii(void)
diff --git a/Modules/cPickle.c b/Modules/cPickle.c
index 8ba423e..70ead48 100644
--- a/Modules/cPickle.c
+++ b/Modules/cPickle.c
@@ -1,13 +1,12 @@
-static char cPickle_module_documentation[] =
-"C implementation and optimization of the Python pickle module\n"
-"\n"
-"cPickle.c,v 1.71 1999/07/11 13:30:34 jim Exp\n"
-;
-
 #include "Python.h"
 #include "cStringIO.h"
 #include "structmember.h"
 
+PyDoc_STRVAR(cPickle_module_documentation,
+"C implementation and optimization of the Python pickle module\n"
+"\n"
+"cPickle.c,v 1.71 1999/07/11 13:30:34 jim Exp\n");
+
 #ifndef Py_eval_input
 #include <graminit.h>
 #define Py_eval_input eval_input
@@ -2511,8 +2510,8 @@
     {NULL}
 };
 
-static char Picklertype__doc__[] =
-"Objects that know how to pickle objects\n";
+PyDoc_STRVAR(Picklertype__doc__,
+"Objects that know how to pickle objects\n");
 
 static PyTypeObject Picklertype = {
     PyObject_HEAD_INIT(NULL)
@@ -4609,8 +4608,8 @@
 }
 
 
-static char Unpicklertype__doc__[] =
-"Objects that know how to unpickle";
+PyDoc_STRVAR(Unpicklertype__doc__,
+"Objects that know how to unpickle");
 
 static PyTypeObject Unpicklertype = {
     PyObject_HEAD_INIT(NULL)
diff --git a/Modules/cStringIO.c b/Modules/cStringIO.c
index 1dbec84..2f85f41 100644
--- a/Modules/cStringIO.c
+++ b/Modules/cStringIO.c
@@ -1,4 +1,9 @@
-static char cStringIO_module_documentation[] = 
+
+#include "Python.h"
+#include "import.h"
+#include "cStringIO.h"
+
+PyDoc_STRVAR(cStringIO_module_documentation,
 "A simple fast partial StringIO replacement.\n"
 "\n"
 "This module provides a simple useful replacement for\n"
@@ -25,12 +30,7 @@
 "If someone else wants to provide a more complete implementation,\n"
 "go for it. :-)  \n"
 "\n"
-"cStringIO.c,v 1.29 1999/06/15 14:10:27 jim Exp\n"
-;
-
-#include "Python.h"
-#include "import.h"
-#include "cStringIO.h"
+"cStringIO.c,v 1.29 1999/06/15 14:10:27 jim Exp\n");
 
 #define UNLESS(E) if (!(E))
 
@@ -74,7 +74,7 @@
 
 /* IOobject (common) methods */
 
-static char IO_flush__doc__[] = "flush(): does nothing.";
+PyDoc_STRVAR(IO_flush__doc__, "flush(): does nothing.");
 
 static int
 IO__opencheck(IOobject *self) {
@@ -96,12 +96,11 @@
         return Py_None;
 }
 
-static char IO_getval__doc__[] = 
-   "getvalue([use_pos]) -- Get the string value."
-   "\n"
-   "If use_pos is specified and is a true value, then the string returned\n"
-   "will include only the text up to the current file position.\n"
-;
+PyDoc_STRVAR(IO_getval__doc__,
+"getvalue([use_pos]) -- Get the string value."
+"\n"
+"If use_pos is specified and is a true value, then the string returned\n"
+"will include only the text up to the current file position.\n");
 
 static PyObject *
 IO_cgetval(PyObject *self) {
@@ -127,7 +126,7 @@
         return PyString_FromStringAndSize(self->buf, s);
 }
 
-static char IO_isatty__doc__[] = "isatty(): always returns 0";
+PyDoc_STRVAR(IO_isatty__doc__, "isatty(): always returns 0");
 
 static PyObject *
 IO_isatty(IOobject *self, PyObject *args) {
@@ -137,9 +136,8 @@
         return PyInt_FromLong(0);
 }
 
-static char IO_read__doc__[] = 
-"read([s]) -- Read s characters, or the rest of the string"
-;
+PyDoc_STRVAR(IO_read__doc__,
+"read([s]) -- Read s characters, or the rest of the string");
 
 static int
 IO_cread(PyObject *self, char **output, int  n) {
@@ -169,9 +167,7 @@
         return PyString_FromStringAndSize(output, n);
 }
 
-static char IO_readline__doc__[] = 
-"readline() -- Read one line"
-;
+PyDoc_STRVAR(IO_readline__doc__, "readline() -- Read one line");
 
 static int
 IO_creadline(PyObject *self, char **output) {
@@ -207,9 +203,7 @@
         return PyString_FromStringAndSize(output, n);
 }
 
-static char IO_readlines__doc__[] = 
-"readlines() -- Read all lines"
-;
+PyDoc_STRVAR(IO_readlines__doc__, "readlines() -- Read all lines");
 
 static PyObject *
 IO_readlines(IOobject *self, PyObject *args) {
@@ -244,9 +238,8 @@
         return NULL;
 }
 
-static char IO_reset__doc__[] = 
-"reset() -- Reset the file position to the beginning"
-;
+PyDoc_STRVAR(IO_reset__doc__,
+"reset() -- Reset the file position to the beginning");
 
 static PyObject *
 IO_reset(IOobject *self, PyObject *args) {
@@ -260,8 +253,7 @@
         return Py_None;
 }
 
-static char IO_tell__doc__[] =
-"tell() -- get the current position.";
+PyDoc_STRVAR(IO_tell__doc__, "tell() -- get the current position.");
 
 static PyObject *
 IO_tell(IOobject *self, PyObject *args) {
@@ -272,8 +264,8 @@
         return PyInt_FromLong(self->pos);
 }
 
-static char IO_truncate__doc__[] = 
-"truncate(): truncate the file at the current position.";
+PyDoc_STRVAR(IO_truncate__doc__,
+"truncate(): truncate the file at the current position.");
 
 static PyObject *
 IO_truncate(IOobject *self, PyObject *args) {
@@ -294,9 +286,9 @@
 
 /* Read-write object methods */
 
-static char O_seek__doc__[] =
+PyDoc_STRVAR(O_seek__doc__,
 "seek(position)       -- set the current position\n"
-"seek(position, mode) -- mode 0: absolute; 1: relative; 2: relative to EOF";
+"seek(position, mode) -- mode 0: absolute; 1: relative; 2: relative to EOF");
 
 static PyObject *
 O_seek(Oobject *self, PyObject *args) {
@@ -332,10 +324,9 @@
         return Py_None;
 }
 
-static char O_write__doc__[] = 
+PyDoc_STRVAR(O_write__doc__,
 "write(s) -- Write a string to the file"
-"\n\nNote (hack:) writing None resets the buffer"
-;
+"\n\nNote (hack:) writing None resets the buffer");
 
 
 static int
@@ -384,7 +375,7 @@
         return Py_None;
 }
 
-static char O_close__doc__[] = "close(): explicitly release resources held.";
+PyDoc_STRVAR(O_close__doc__, "close(): explicitly release resources held.");
 
 static PyObject *
 O_close(Oobject *self, PyObject *args) {
@@ -401,8 +392,8 @@
 }
 
 
-static char O_writelines__doc__[] =
-"writelines(sequence_of_strings): write each string";
+PyDoc_STRVAR(O_writelines__doc__,
+"writelines(sequence_of_strings): write each string");
 static PyObject *
 O_writelines(Oobject *self, PyObject *args) {
         PyObject *tmp = 0;
@@ -483,9 +474,7 @@
 	return 0;
 }
 
-static char Otype__doc__[] = 
-"Simple type for output to strings."
-;
+PyDoc_STRVAR(Otype__doc__, "Simple type for output to strings.");
 
 static PyTypeObject Otype = {
   PyObject_HEAD_INIT(NULL)
@@ -617,9 +606,8 @@
 }
 
 
-static char Itype__doc__[] = 
-"Simple type for treating strings as input file streams"
-;
+PyDoc_STRVAR(Itype__doc__,
+"Simple type for treating strings as input file streams");
 
 static PyTypeObject Itype = {
   PyObject_HEAD_INIT(NULL)
@@ -678,9 +666,8 @@
 /* -------------------------------------------------------- */
 
 
-static char IO_StringIO__doc__[] =
-"StringIO([s]) -- Return a StringIO-like stream for reading or writing"
-;
+PyDoc_STRVAR(IO_StringIO__doc__,
+"StringIO([s]) -- Return a StringIO-like stream for reading or writing");
 
 static PyObject *
 IO_StringIO(PyObject *self, PyObject *args) {
diff --git a/Modules/cmathmodule.c b/Modules/cmathmodule.c
index 8e74e51..0437368 100644
--- a/Modules/cmathmodule.c
+++ b/Modules/cmathmodule.c
@@ -29,10 +29,10 @@
 		    c_sqrt(c_diff(c_one,c_prod(x,x))))))));
 }
 
-static char c_acos_doc[] =
+PyDoc_STRVAR(c_acos_doc,
 "acos(x)\n"
 "\n"
-"Return the arc cosine of x.";
+"Return the arc cosine of x.");
 
 
 static Py_complex
@@ -45,10 +45,10 @@
 	return c_sum(z, z);
 }
 
-static char c_acosh_doc[] =
+PyDoc_STRVAR(c_acosh_doc,
 "acosh(x)\n"
 "\n"
-"Return the hyperbolic arccosine of x.";
+"Return the hyperbolic arccosine of x.");
 
 
 static Py_complex
@@ -62,10 +62,10 @@
 		    )       )     );
 }
 
-static char c_asin_doc[] =
+PyDoc_STRVAR(c_asin_doc,
 "asin(x)\n"
 "\n"
-"Return the arc sine of x.";
+"Return the arc sine of x.");
 
 
 static Py_complex
@@ -78,10 +78,10 @@
 	return c_sum(z, z);
 }
 
-static char c_asinh_doc[] =
+PyDoc_STRVAR(c_asinh_doc,
 "asinh(x)\n"
 "\n"
-"Return the hyperbolic arc sine of x.";
+"Return the hyperbolic arc sine of x.");
 
 
 static Py_complex
@@ -90,10 +90,10 @@
 	return c_prod(c_halfi,c_log(c_quot(c_sum(c_i,x),c_diff(c_i,x))));
 }
 
-static char c_atan_doc[] =
+PyDoc_STRVAR(c_atan_doc,
 "atan(x)\n"
 "\n"
-"Return the arc tangent of x.";
+"Return the arc tangent of x.");
 
 
 static Py_complex
@@ -102,10 +102,10 @@
 	return c_prod(c_half,c_log(c_quot(c_sum(c_one,x),c_diff(c_one,x))));
 }
 
-static char c_atanh_doc[] =
+PyDoc_STRVAR(c_atanh_doc,
 "atanh(x)\n"
 "\n"
-"Return the hyperbolic arc tangent of x.";
+"Return the hyperbolic arc tangent of x.");
 
 
 static Py_complex
@@ -117,10 +117,10 @@
 	return r;
 }
 
-static char c_cos_doc[] =
+PyDoc_STRVAR(c_cos_doc,
 "cos(x)\n"
 "n"
-"Return the cosine of x.";
+"Return the cosine of x.");
 
 
 static Py_complex
@@ -132,10 +132,10 @@
 	return r;
 }
 
-static char c_cosh_doc[] =
+PyDoc_STRVAR(c_cosh_doc,
 "cosh(x)\n"
 "n"
-"Return the hyperbolic cosine of x.";
+"Return the hyperbolic cosine of x.");
 
 
 static Py_complex
@@ -148,10 +148,10 @@
 	return r;
 }
 
-static char c_exp_doc[] =
+PyDoc_STRVAR(c_exp_doc,
 "exp(x)\n"
 "\n"
-"Return the exponential value e**x.";
+"Return the exponential value e**x.");
 
 
 static Py_complex
@@ -164,10 +164,10 @@
 	return r;
 }
 
-static char c_log_doc[] =
+PyDoc_STRVAR(c_log_doc,
 "log(x)\n"
 "\n"
-"Return the natural logarithm of x.";
+"Return the natural logarithm of x.");
 
 
 static Py_complex
@@ -180,10 +180,10 @@
 	return r;
 }
 
-static char c_log10_doc[] =
+PyDoc_STRVAR(c_log10_doc,
 "log10(x)\n"
 "\n"
-"Return the base-10 logarithm of x.";
+"Return the base-10 logarithm of x.");
 
 
 /* internal function not available from Python */
@@ -206,10 +206,10 @@
 	return r;
 }
 
-static char c_sin_doc[] =
+PyDoc_STRVAR(c_sin_doc,
 "sin(x)\n"
 "\n"
-"Return the sine of x.";
+"Return the sine of x.");
 
 
 static Py_complex
@@ -221,10 +221,10 @@
 	return r;
 }
 
-static char c_sinh_doc[] =
+PyDoc_STRVAR(c_sinh_doc,
 "sinh(x)\n"
 "\n"
-"Return the hyperbolic sine of x.";
+"Return the hyperbolic sine of x.");
 
 
 static Py_complex
@@ -253,10 +253,10 @@
 	return r;
 }
 
-static char c_sqrt_doc[] =
+PyDoc_STRVAR(c_sqrt_doc,
 "sqrt(x)\n"
 "\n"
-"Return the square root of x.";
+"Return the square root of x.");
 
 
 static Py_complex
@@ -280,10 +280,10 @@
 	return r;
 }
 
-static char c_tan_doc[] =
+PyDoc_STRVAR(c_tan_doc,
 "tan(x)\n"
 "\n"
-"Return the tangent of x.";
+"Return the tangent of x.");
 
 
 static Py_complex
@@ -307,10 +307,10 @@
 	return r;
 }
 
-static char c_tanh_doc[] =
+PyDoc_STRVAR(c_tanh_doc,
 "tanh(x)\n"
 "\n"
-"Return the hyperbolic tangent of x.";
+"Return the hyperbolic tangent of x.");
 
 
 /* And now the glue to make them available from Python: */
@@ -367,9 +367,9 @@
 FUNC1(cmath_tanh, c_tanh)
 
 
-static char module_doc[] =
+PyDoc_STRVAR(module_doc,
 "This module is always available. It provides access to mathematical\n"
-"functions for complex numbers.";
+"functions for complex numbers.");
 
 static PyMethodDef cmath_methods[] = {
 	{"acos",   cmath_acos,  METH_VARARGS, c_acos_doc},
diff --git a/Modules/cryptmodule.c b/Modules/cryptmodule.c
index 5c4ee2f..a1eaced 100644
--- a/Modules/cryptmodule.c
+++ b/Modules/cryptmodule.c
@@ -23,13 +23,13 @@
 
 }
 
-static char crypt_crypt__doc__[] = "\
-crypt(word, salt) -> string\n\
+PyDoc_STRVAR(crypt_crypt__doc__,
+"crypt(word, salt) -> string\n\
 word will usually be a user's password. salt is a 2-character string\n\
 which will be used to select one of 4096 variations of DES. The characters\n\
 in salt must be either \".\", \"/\", or an alphanumeric character. Returns\n\
 the hashed password as a string, which will be composed of characters from\n\
-the same alphabet as the salt.";
+the same alphabet as the salt.");
 
 
 static PyMethodDef crypt_methods[] = {
diff --git a/Modules/errnomodule.c b/Modules/errnomodule.c
index 4b54dc5..74d4f0f 100644
--- a/Modules/errnomodule.c
+++ b/Modules/errnomodule.c
@@ -43,7 +43,7 @@
 	Py_XDECREF(v);
 }
 
-static char errno__doc__ [] =
+PyDoc_STRVAR(errno__doc__,
 "This module makes available standard errno system symbols.\n\
 \n\
 The value of each symbol is the corresponding integer value,\n\
@@ -55,7 +55,7 @@
 Symbols that are not relevant to the underlying system are not defined.\n\
 \n\
 To map error codes to error messages, use the function os.strerror(),\n\
-e.g. os.strerror(2) could return 'No such file or directory'.";
+e.g. os.strerror(2) could return 'No such file or directory'.");
 
 DL_EXPORT(void)
 initerrno(void)
diff --git a/Modules/fcntlmodule.c b/Modules/fcntlmodule.c
index 13cd0f7..f1d89cc 100644
--- a/Modules/fcntlmodule.c
+++ b/Modules/fcntlmodule.c
@@ -72,8 +72,7 @@
 	return PyInt_FromLong((long)ret);
 }
 
-static char fcntl_doc [] =
-
+PyDoc_STRVAR(fcntl_doc,
 "fcntl(fd, opt, [arg])\n\
 \n\
 Perform the requested operation on file descriptor fd.  The operation\n\
@@ -84,7 +83,7 @@
 resulting value put in the arg buffer by the operating system.The length\n\
 of the arg string is not allowed to exceed 1024 bytes. If the arg given\n\
 is an integer or if none is specified, the result value is an integer\n\
-corresponding to the return value of the fcntl call in the C code.";
+corresponding to the return value of the fcntl call in the C code.");
 
 
 /* ioctl(fd, opt, [arg]) */
@@ -136,7 +135,7 @@
 	return PyInt_FromLong((long)ret);
 }
 
-static char ioctl_doc [] =
+PyDoc_STRVAR(ioctl_doc,
 "ioctl(fd, opt, [arg])\n\
 \n\
 Perform the requested operation on file descriptor fd.  The operation\n\
@@ -147,7 +146,7 @@
 containing the resulting value put in the arg buffer by the operating system.\n\
 The length of the arg string is not allowed to exceed 1024 bytes. If the arg\n\
 given is an integer or if none is specified, the result value is an integer\n\
-corresponding to the return value of the ioctl call in the C code.";
+corresponding to the return value of the ioctl call in the C code.");
 
 
 /* flock(fd, operation) */
@@ -202,12 +201,12 @@
 	return Py_None;
 }
 
-static char flock_doc [] =
+PyDoc_STRVAR(flock_doc,
 "flock(fd, operation)\n\
 \n\
 Perform the lock operation op on file descriptor fd.  See the Unix \n\
 manual flock(3) for details.  (On some systems, this function is\n\
-emulated using fcntl().)";
+emulated using fcntl().)");
 
 
 /* lockf(fd, operation) */
@@ -283,7 +282,7 @@
 #endif  /* defined(PYOS_OS2) && defined(PYCC_GCC) */
 }
 
-static char lockf_doc [] =
+PyDoc_STRVAR(lockf_doc,
 "lockf (fd, operation, length=0, start=0, whence=0)\n\
 \n\
 This is essentially a wrapper around the fcntl() locking calls.  fd is the\n\
@@ -306,7 +305,7 @@
 \n\
     0 - relative to the start of the file (SEEK_SET)\n\
     1 - relative to the current buffer position (SEEK_CUR)\n\
-    2 - relative to the end of the file (SEEK_END)";
+    2 - relative to the end of the file (SEEK_END)");
 
 /* List of functions */
 
@@ -319,12 +318,11 @@
 };
 
 
-static char module_doc [] =
-
+PyDoc_STRVAR(module_doc,
 "This module performs file control and I/O control on file \n\
 descriptors.  It is an interface to the fcntl() and ioctl() Unix\n\
 routines.  File descriptors can be obtained with the fileno() method of\n\
-a file or socket object.";
+a file or socket object.");
 
 /* Module initialisation */
 
diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c
index fd8a076..e4417c2 100644
--- a/Modules/gcmodule.c
+++ b/Modules/gcmodule.c
@@ -508,11 +508,10 @@
 	return n;
 }
 
-static char gc_enable__doc__[] =
+PyDoc_STRVAR(gc_enable__doc__,
 "enable() -> None\n"
 "\n"
-"Enable automatic garbage collection.\n"
-;
+"Enable automatic garbage collection.\n");
 
 static PyObject *
 gc_enable(PyObject *self, PyObject *args)
@@ -527,11 +526,10 @@
 	return Py_None;
 }
 
-static char gc_disable__doc__[] =
+PyDoc_STRVAR(gc_disable__doc__,
 "disable() -> None\n"
 "\n"
-"Disable automatic garbage collection.\n"
-;
+"Disable automatic garbage collection.\n");
 
 static PyObject *
 gc_disable(PyObject *self, PyObject *args)
@@ -546,11 +544,10 @@
 	return Py_None;
 }
 
-static char gc_isenabled__doc__[] =
+PyDoc_STRVAR(gc_isenabled__doc__,
 "isenabled() -> status\n"
 "\n"
-"Returns true if automatic garbage collection is enabled.\n"
-;
+"Returns true if automatic garbage collection is enabled.\n");
 
 static PyObject *
 gc_isenabled(PyObject *self, PyObject *args)
@@ -562,11 +559,10 @@
 	return Py_BuildValue("i", enabled);
 }
 
-static char gc_collect__doc__[] =
+PyDoc_STRVAR(gc_collect__doc__,
 "collect() -> n\n"
 "\n"
-"Run a full collection.  The number of unreachable objects is returned.\n"
-;
+"Run a full collection.  The number of unreachable objects is returned.\n");
 
 static PyObject *
 gc_collect(PyObject *self, PyObject *args)
@@ -588,7 +584,7 @@
 	return Py_BuildValue("l", n);
 }
 
-static char gc_set_debug__doc__[] = 
+PyDoc_STRVAR(gc_set_debug__doc__,
 "set_debug(flags) -> None\n"
 "\n"
 "Set the garbage collection debugging flags. Debugging information is\n"
@@ -602,8 +598,7 @@
 "  DEBUG_INSTANCES - Print instance objects.\n"
 "  DEBUG_OBJECTS - Print objects other than instances.\n"
 "  DEBUG_SAVEALL - Save objects to gc.garbage rather than freeing them.\n"
-"  DEBUG_LEAK - Debug leaking programs (everything but STATS).\n"
-;
+"  DEBUG_LEAK - Debug leaking programs (everything but STATS).\n");
 
 static PyObject *
 gc_set_debug(PyObject *self, PyObject *args)
@@ -615,11 +610,10 @@
 	return Py_None;
 }
 
-static char gc_get_debug__doc__[] = 
+PyDoc_STRVAR(gc_get_debug__doc__,
 "get_debug() -> flags\n"
 "\n"
-"Get the garbage collection debugging flags.\n"
-;
+"Get the garbage collection debugging flags.\n");
 
 static PyObject *
 gc_get_debug(PyObject *self, PyObject *args)
@@ -630,12 +624,11 @@
 	return Py_BuildValue("i", debug);
 }
 
-static char gc_set_thresh__doc__[] =
+PyDoc_STRVAR(gc_set_thresh__doc__,
 "set_threshold(threshold0, [threshold1, threshold2]) -> None\n"
 "\n"
 "Sets the collection thresholds.  Setting threshold0 to zero disables\n"
-"collection.\n"
-;
+"collection.\n");
 
 static PyObject *
 gc_set_thresh(PyObject *self, PyObject *args)
@@ -655,11 +648,10 @@
 	return Py_None;
 }
 
-static char gc_get_thresh__doc__[] =
+PyDoc_STRVAR(gc_get_thresh__doc__,
 "get_threshold() -> (threshold0, threshold1, threshold2)\n"
 "\n"
-"Return the current collection thresholds\n"
-;
+"Return the current collection thresholds\n");
 
 static PyObject *
 gc_get_thresh(PyObject *self, PyObject *args)
@@ -702,9 +694,9 @@
 	return 1; /* no error */
 }
 
-static char gc_get_referrers__doc__[]=
+PyDoc_STRVAR(gc_get_referrers__doc__,
 "get_referrers(*objs) -> list\n\
-Return the list of objects that directly refer to any of objs.";
+Return the list of objects that directly refer to any of objs.");
 
 static PyObject *
 gc_get_referrers(PyObject *self, PyObject *args)
@@ -720,12 +712,11 @@
 	return result;
 }
 
-static char gc_get_objects__doc__[] =
+PyDoc_STRVAR(gc_get_objects__doc__,
 "get_objects() -> [...]\n"
 "\n"
 "Return a list of objects tracked by the collector (excluding the list\n"
-"returned).\n"
-;
+"returned).\n");
 
 /* appending objects in a GC list to a Python list */
 static int
@@ -765,7 +756,7 @@
 }
 
 
-static char gc__doc__ [] =
+PyDoc_STRVAR(gc__doc__,
 "This module provides access to the garbage collector for reference cycles.\n"
 "\n"
 "enable() -- Enable automatic garbage collection.\n"
@@ -777,8 +768,7 @@
 "set_threshold() -- Set the collection thresholds.\n"
 "get_threshold() -- Return the current the collection thresholds.\n"
 "get_objects() -- Return a list of all objects tracked by the collector.\n"
-"get_referrers() -- Return the list of objects that refer to an object.\n"
-;
+"get_referrers() -- Return the list of objects that refer to an object.\n");
 
 static PyMethodDef GcMethods[] = {
 	{"enable",	   gc_enable,	  METH_VARARGS, gc_enable__doc__},
diff --git a/Modules/gdbmmodule.c b/Modules/gdbmmodule.c
index 72d76ea..1da53ff 100644
--- a/Modules/gdbmmodule.c
+++ b/Modules/gdbmmodule.c
@@ -16,8 +16,8 @@
 extern const char * gdbm_strerror(gdbm_error);
 #endif
 
-static char gdbmmodule__doc__[] = "\
-This module provides an interface to the GNU DBM (GDBM) library.\n\
+PyDoc_STRVAR(gdbmmodule__doc__,
+"This module provides an interface to the GNU DBM (GDBM) library.\n\
 \n\
 This module is quite similar to the dbm module, but uses GDBM instead to\n\
 provide some additional functionality. Please note that the file formats\n\
@@ -26,7 +26,7 @@
 GDBM objects behave like mappings (dictionaries), except that keys and\n\
 values are always strings. Printing a GDBM object doesn't print the\n\
 keys and values, and the items() and values() methods are not\n\
-supported.";
+supported.");
 
 typedef struct {
     PyObject_HEAD
@@ -45,15 +45,15 @@
 
 static PyObject *DbmError;
 
-static char gdbm_object__doc__[] = "\
-This object represents a GDBM database.\n\
+PyDoc_STRVAR(gdbm_object__doc__,
+"This object represents a GDBM database.\n\
 GDBM objects behave like mappings (dictionaries), except that keys and\n\
 values are always strings. Printing a GDBM object doesn't print the\n\
 keys and values, and the items() and values() methods are not\n\
 supported.\n\
 \n\
 GDBM objects also support additional operations such as firstkey,\n\
-nextkey, reorganize, and sync.";
+nextkey, reorganize, and sync.");
 
 static PyObject *
 newdbmobject(char *file, int flags, int mode)
@@ -183,9 +183,9 @@
     (objobjargproc)dbm_ass_sub,         /*mp_ass_subscript*/
 };
 
-static char dbm_close__doc__[] = "\
-close() -> None\n\
-Closes the database.";
+PyDoc_STRVAR(dbm_close__doc__,
+"close() -> None\n\
+Closes the database.");
 
 static PyObject *
 dbm_close(register dbmobject *dp, PyObject *args)
@@ -199,9 +199,9 @@
     return Py_None;
 }
 
-static char dbm_keys__doc__[] = "\
-keys() -> list_of_keys\n\
-Get a list of all keys in the database.";
+PyDoc_STRVAR(dbm_keys__doc__,
+"keys() -> list_of_keys\n\
+Get a list of all keys in the database.");
 
 static PyObject *
 dbm_keys(register dbmobject *dp, PyObject *args)
@@ -245,9 +245,9 @@
     return v;
 }
 
-static char dbm_has_key__doc__[] = "\
-has_key(key) -> boolean\n\
-Find out whether or not the database contains a given key.";
+PyDoc_STRVAR(dbm_has_key__doc__,
+"has_key(key) -> boolean\n\
+Find out whether or not the database contains a given key.");
 
 static PyObject *
 dbm_has_key(register dbmobject *dp, PyObject *args)
@@ -260,12 +260,12 @@
     return PyInt_FromLong((long) gdbm_exists(dp->di_dbm, key));
 }
 
-static char dbm_firstkey__doc__[] = "\
-firstkey() -> key\n\
+PyDoc_STRVAR(dbm_firstkey__doc__,
+"firstkey() -> key\n\
 It's possible to loop over every key in the database using this method\n\
 and the nextkey() method. The traversal is ordered by GDBM's internal\n\
 hash values, and won't be sorted by the key values. This method\n\
-returns the starting key.";
+returns the starting key.");
 
 static PyObject *
 dbm_firstkey(register dbmobject *dp, PyObject *args)
@@ -288,8 +288,8 @@
     }
 }
 
-static char dbm_nextkey__doc__[] = "\
-nextkey(key) -> next_key\n\
+PyDoc_STRVAR(dbm_nextkey__doc__,
+"nextkey(key) -> next_key\n\
 Returns the key that follows key in the traversal.\n\
 The following code prints every key in the database db, without having\n\
 to create a list in memory that contains them all:\n\
@@ -297,7 +297,7 @@
       k = db.firstkey()\n\
       while k != None:\n\
           print k\n\
-          k = db.nextkey(k)";
+          k = db.nextkey(k)");
 
 static PyObject *
 dbm_nextkey(register dbmobject *dp, PyObject *args)
@@ -320,13 +320,13 @@
     }
 }
 
-static char dbm_reorganize__doc__[] = "\
-reorganize() -> None\n\
+PyDoc_STRVAR(dbm_reorganize__doc__,
+"reorganize() -> None\n\
 If you have carried out a lot of deletions and would like to shrink\n\
 the space used by the GDBM file, this routine will reorganize the\n\
 database. GDBM will not shorten the length of a database file except\n\
 by using this reorganization; otherwise, deleted file space will be\n\
-kept and reused as new (key,value) pairs are added.";
+kept and reused as new (key,value) pairs are added.");
 
 static PyObject *
 dbm_reorganize(register dbmobject *dp, PyObject *args)
@@ -346,10 +346,10 @@
     return Py_None;
 }
 
-static char dbm_sync__doc__[] = "\
-sync() -> None\n\
+PyDoc_STRVAR(dbm_sync__doc__,
+"sync() -> None\n\
 When the database has been opened in fast mode, this method forces\n\
-any unwritten data to be written to the disk.";
+any unwritten data to be written to the disk.");
 
 static PyObject *
 dbm_sync(register dbmobject *dp, PyObject *args)
@@ -406,8 +406,8 @@
 
 /* ----------------------------------------------------------------- */
 
-static char dbmopen__doc__[] = "\
-open(filename, [flags, [mode]])  -> dbm_object\n\
+PyDoc_STRVAR(dbmopen__doc__,
+"open(filename, [flags, [mode]])  -> dbm_object\n\
 Open a dbm database and return a dbm object. The filename argument is\n\
 the name of the database file.\n\
 \n\
@@ -428,7 +428,7 @@
 disk. The 'u' flag disables locking of the database file.\n\
 \n\
 The optional mode argument is the Unix mode of the file, used only\n\
-when the database has to be created. It defaults to octal 0666. ";
+when the database has to be created. It defaults to octal 0666. ");
 
 static PyObject *
 dbmopen(PyObject *self, PyObject *args)
diff --git a/Modules/grpmodule.c b/Modules/grpmodule.c
index daad574..c834009 100644
--- a/Modules/grpmodule.c
+++ b/Modules/grpmodule.c
@@ -15,11 +15,11 @@
    {0}
 };
 
-static char struct_group__doc__[] =
+PyDoc_STRVAR(struct_group__doc__,
 "grp.struct_group: Results from getgr*() routines.\n\n\
 This object may be accessed either as a tuple of\n\
   (gr_name,gr_passwd,gr_gid,gr_mem)\n\
-or via the object attributes as named in the above tuple.\n";
+or via the object attributes as named in the above tuple.\n");
 
 static PyStructSequence_Desc struct_group_type_desc = {
    "grp.struct_group",
@@ -139,7 +139,7 @@
     {NULL,		NULL}		/* sentinel */
 };
 
-static char grp__doc__[] =
+PyDoc_STRVAR(grp__doc__,
 "Access to the Unix group database.\n\
 \n\
 Group entries are reported as 4-tuples containing the following fields\n\
@@ -153,7 +153,7 @@
 The gid is an integer, name and password are strings.  (Note that most\n\
 users are not explicitly listed as members of the groups they are in\n\
 according to the password database.  Check both databases to get\n\
-complete membership information.)";
+complete membership information.)");
 
 
 DL_EXPORT(void)
diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c
index b6489fd..88b439f 100644
--- a/Modules/mathmodule.c
+++ b/Modules/mathmodule.c
@@ -85,13 +85,13 @@
 	static PyObject * math_##funcname(PyObject *self, PyObject *args) { \
 		return math_1(args, func, "d:" #funcname); \
 	}\
-        static char math_##funcname##_doc [] = docstring;
+        PyDoc_STRVAR(math_##funcname##_doc, docstring);
 
 #define FUNC2(funcname, func, docstring) \
 	static PyObject * math_##funcname(PyObject *self, PyObject *args) { \
 		return math_2(args, func, "dd:" #funcname); \
 	}\
-        static char math_##funcname##_doc [] = docstring;
+        PyDoc_STRVAR(math_##funcname##_doc, docstring);
 
 FUNC1(acos, acos,
       "acos(x)\n\nReturn the arc cosine (measured in radians) of x.")
@@ -155,12 +155,12 @@
 		return Py_BuildValue("(di)", x, i);
 }
 
-static char math_frexp_doc [] =
+PyDoc_STRVAR(math_frexp_doc,
 "frexp(x)\n"
 "\n"
 "Return the mantissa and exponent of x, as pair (m, e).\n"
 "m is a float and e is an int, such that x = m * 2.**e.\n"
-"If x is 0, m and e are both 0.  Else 0.5 <= abs(m) < 1.0.";
+"If x is 0, m and e are both 0.  Else 0.5 <= abs(m) < 1.0.");
 
 static PyObject *
 math_ldexp(PyObject *self, PyObject *args)
@@ -180,8 +180,8 @@
 		return PyFloat_FromDouble(x);
 }
 
-static char math_ldexp_doc [] =
-"ldexp(x, i) -> x * (2**i)";
+PyDoc_STRVAR(math_ldexp_doc,
+"ldexp(x, i) -> x * (2**i)");
 
 static PyObject *
 math_modf(PyObject *self, PyObject *args)
@@ -206,11 +206,11 @@
 		return Py_BuildValue("(dd)", x, y);
 }
 
-static char math_modf_doc [] =
+PyDoc_STRVAR(math_modf_doc,
 "modf(x)\n"
 "\n"
 "Return the fractional and integer parts of x.  Both results carry the sign\n"
-"of x.  The integer part is returned as a real.";
+"of x.  The integer part is returned as a real.");
 
 /* A decent logarithm is easy to compute even for huge longs, but libm can't
    do that by itself -- loghelper can.  func is log or log10, and name is
@@ -262,8 +262,8 @@
 	return loghelper(args, log, "log");
 }
 
-static char math_log_doc[] =
-"log(x) -> the natural logarithm (base e) of x.";
+PyDoc_STRVAR(math_log_doc,
+"log(x) -> the natural logarithm (base e) of x.");
 
 static PyObject *
 math_log10(PyObject *self, PyObject *args)
@@ -271,8 +271,8 @@
 	return loghelper(args, log10, "log10");
 }
 
-static char math_log10_doc[] =
-"log10(x) -> the base 10 logarithm of x.";
+PyDoc_STRVAR(math_log10_doc,
+"log10(x) -> the base 10 logarithm of x.");
 
 static const double degToRad = 3.141592653589793238462643383 / 180.0;
 
@@ -285,8 +285,8 @@
 	return PyFloat_FromDouble(x / degToRad);
 }
 
-static char math_degrees_doc[] =
-"degrees(x) -> converts angle x from radians to degrees";
+PyDoc_STRVAR(math_degrees_doc,
+"degrees(x) -> converts angle x from radians to degrees");
 
 static PyObject *
 math_radians(PyObject *self, PyObject *args)
@@ -297,8 +297,8 @@
 	return PyFloat_FromDouble(x * degToRad);
 }
 
-static char math_radians_doc[] =
-"radians(x) -> converts angle x from degrees to radians";
+PyDoc_STRVAR(math_radians_doc,
+"radians(x) -> converts angle x from degrees to radians");
 
 static PyMethodDef math_methods[] = {
 	{"acos",	math_acos,	METH_VARARGS,	math_acos_doc},
@@ -330,9 +330,9 @@
 };
 
 
-static char module_doc [] =
+PyDoc_STRVAR(module_doc,
 "This module is always available.  It provides access to the\n"
-"mathematical functions defined by the C standard.";
+"mathematical functions defined by the C standard.");
 
 DL_EXPORT(void)
 initmath(void)
diff --git a/Modules/md5module.c b/Modules/md5module.c
index a6068ff..045f27f 100644
--- a/Modules/md5module.c
+++ b/Modules/md5module.c
@@ -61,12 +61,12 @@
 	return Py_None;
 }
 
-static char update_doc [] =
+PyDoc_STRVAR(update_doc,
 "update (arg)\n\
 \n\
 Update the md5 object with the string arg. Repeated calls are\n\
 equivalent to a single call with the concatenation of all the\n\
-arguments.";
+arguments.");
 
 
 static PyObject *
@@ -82,12 +82,12 @@
 	return PyString_FromStringAndSize((char *)aDigest, 16);
 }
 
-static char digest_doc [] =
+PyDoc_STRVAR(digest_doc,
 "digest() -> string\n\
 \n\
 Return the digest of the strings passed to the update() method so\n\
 far. This is an 16-byte string which may contain non-ASCII characters,\n\
-including null bytes.";
+including null bytes.");
 
 
 static PyObject *
@@ -116,10 +116,10 @@
 }
 
 
-static char hexdigest_doc [] =
+PyDoc_STRVAR(hexdigest_doc,
 "hexdigest() -> string\n\
 \n\
-Like digest(), but returns the digest as a string of hexadecimal digits.";
+Like digest(), but returns the digest as a string of hexadecimal digits.");
 
 
 static PyObject *
@@ -135,10 +135,10 @@
 	return (PyObject *)md5p;
 }
 
-static char copy_doc [] =
+PyDoc_STRVAR(copy_doc,
 "copy() -> md5 object\n\
 \n\
-Return a copy (``clone'') of the md5 object.";
+Return a copy (``clone'') of the md5 object.");
 
 
 static PyMethodDef md5_methods[] = {
@@ -159,8 +159,7 @@
 	return Py_FindMethod(md5_methods, (PyObject *)self, name);
 }
 
-static char module_doc [] =
-
+PyDoc_STRVAR(module_doc,
 "This module implements the interface to RSA's MD5 message digest\n\
 algorithm (see also Internet RFC 1321). Its use is quite\n\
 straightforward: use the new() to create an md5 object. You can now\n\
@@ -176,10 +175,9 @@
 \n\
 Special Objects:\n\
 \n\
-MD5Type -- type object for md5 objects\n\
-";
+MD5Type -- type object for md5 objects");
 
-static char md5type_doc [] =
+PyDoc_STRVAR(md5type_doc,
 "An md5 represents the object used to calculate the MD5 checksum of a\n\
 string of information.\n\
 \n\
@@ -187,8 +185,7 @@
 \n\
 update() -- updates the current digest with an additional string\n\
 digest() -- return the current digest value\n\
-copy() -- return a copy of the current md5 object\n\
-";
+copy() -- return a copy of the current md5 object");
 
 statichere PyTypeObject MD5type = {
 	PyObject_HEAD_INIT(NULL)
@@ -238,11 +235,11 @@
 	return (PyObject *)md5p;
 }
 
-static char new_doc [] =
+PyDoc_STRVAR(new_doc,
 "new([arg]) -> md5 object\n\
 \n\
 Return a new md5 object. If arg is present, the method call update(arg)\n\
-is made.";
+is made.");
 
 
 /* List of functions exported by this module */
diff --git a/Modules/newmodule.c b/Modules/newmodule.c
index 0a48926..6897c86 100644
--- a/Modules/newmodule.c
+++ b/Modules/newmodule.c
@@ -4,9 +4,9 @@
 #include "Python.h"
 #include "compile.h"
 
-static char new_instance_doc[] =
+PyDoc_STRVAR(new_instance_doc,
 "Create an instance object from (CLASS [, DICT]) without calling its\n\
-__init__() method.  DICT must be a dictionary or None.";
+__init__() method.  DICT must be a dictionary or None.");
 
 static PyObject *
 new_instance(PyObject* unused, PyObject* args)
@@ -30,8 +30,8 @@
 	return PyInstance_NewRaw(klass, dict);
 }
 
-static char new_im_doc[] =
-"Create a instance method object from (FUNCTION, INSTANCE, CLASS).";
+PyDoc_STRVAR(new_im_doc,
+"Create a instance method object from (FUNCTION, INSTANCE, CLASS).");
 
 static PyObject *
 new_instancemethod(PyObject* unused, PyObject* args)
@@ -53,8 +53,8 @@
 	return PyMethod_New(func, self, classObj);
 }
 
-static char new_function_doc[] =
-"Create a function object from (CODE, GLOBALS, [NAME [, ARGDEFS]]).";
+PyDoc_STRVAR(new_function_doc,
+"Create a function object from (CODE, GLOBALS, [NAME [, ARGDEFS]]).");
 
 static PyObject *
 new_function(PyObject* unused, PyObject* args)
@@ -95,10 +95,10 @@
 	return (PyObject *)newfunc;
 }
 
-static char new_code_doc[] =
+PyDoc_STRVAR(new_code_doc,
 "Create a code object from (ARGCOUNT, NLOCALS, STACKSIZE, FLAGS, CODESTRING,\n"
 "CONSTANTS, NAMES, VARNAMES, FILENAME, NAME, FIRSTLINENO, LNOTAB, FREEVARS,\n"
-"CELLVARS).";
+"CELLVARS).");
 
 static PyObject *
 new_code(PyObject* unused, PyObject* args)
@@ -157,8 +157,8 @@
 				      firstlineno, lnotab); 
 }
 
-static char new_module_doc[] =
-"Create a module object from (NAME).";
+PyDoc_STRVAR(new_module_doc,
+"Create a module object from (NAME).");
 
 static PyObject *
 new_module(PyObject* unused, PyObject* args)
@@ -170,8 +170,8 @@
 	return PyModule_New(name);
 }
 
-static char new_class_doc[] =
-"Create a class object from (NAME, BASE_CLASSES, DICT).";
+PyDoc_STRVAR(new_class_doc,
+"Create a class object from (NAME, BASE_CLASSES, DICT).");
 
 static PyObject *
 new_class(PyObject* unused, PyObject* args)
@@ -202,10 +202,10 @@
 	{NULL,			NULL}		/* sentinel */
 };
 
-static char new_doc[] =
+PyDoc_STRVAR(new_doc,
 "Functions to create new objects used by the interpreter.\n\
 \n\
-You need to know a great deal about the interpreter to use this!";
+You need to know a great deal about the interpreter to use this!");
 
 DL_EXPORT(void)
 initnew(void)
diff --git a/Modules/operator.c b/Modules/operator.c
index d1ea181..fbe8c14 100644
--- a/Modules/operator.c
+++ b/Modules/operator.c
@@ -1,14 +1,14 @@
-static char operator_doc[] = "\
-Operator interface.\n\
+
+#include "Python.h"
+
+PyDoc_STRVAR(operator_doc,
+"Operator interface.\n\
 \n\
 This module exports a set of functions implemented in C corresponding\n\
 to the intrinsic operators of Python.  For example, operator.add(x, y)\n\
 is equivalent to the expression x+y.  The function names are those\n\
 used for special class methods; variants without leading and trailing\n\
-'__' are also provided for convenience.\n\
-";
-
-#include "Python.h"
+'__' are also provided for convenience.");
 
 #define spam1(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \
   PyObject *a1; \
diff --git a/Modules/parsermodule.c b/Modules/parsermodule.c
index 24dec1f..854d986 100644
--- a/Modules/parsermodule.c
+++ b/Modules/parsermodule.c
@@ -46,20 +46,17 @@
 /*  String constants used to initialize module attributes.
  *
  */
-static char*
-parser_copyright_string
-= "Copyright 1995-1996 by Virginia Polytechnic Institute & State\n\
+static char parser_copyright_string[] =
+"Copyright 1995-1996 by Virginia Polytechnic Institute & State\n\
 University, Blacksburg, Virginia, USA, and Fred L. Drake, Jr., Reston,\n\
 Virginia, USA.  Portions copyright 1991-1995 by Stichting Mathematisch\n\
 Centrum, Amsterdam, The Netherlands.";
 
 
-static char*
-parser_doc_string
-= "This is an interface to Python's internal parser.";
+PyDoc_STRVAR(parser_doc_string,
+"This is an interface to Python's internal parser.");
 
-static char*
-parser_version_string = "0.5";
+static char parser_version_string[] = "0.5";
 
 
 typedef PyObject* (*SeqMaker) (int length);
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 95f4613..7e90fbc 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -13,14 +13,14 @@
 
 /* See also ../Dos/dosmodule.c */
 
-static char posix__doc__ [] =
+#include "Python.h"
+#include "structseq.h"
+
+PyDoc_STRVAR(posix__doc__,
 "This module provides access to operating system functionality that is\n\
 standardized by the C Standard and the POSIX standard (a thinly\n\
 disguised Unix interface).  Refer to the library manual and\n\
-corresponding Unix manual entries for more information on calls.";
-
-#include "Python.h"
-#include "structseq.h"
+corresponding Unix manual entries for more information on calls.");
 
 #if defined(PYOS_OS2)
 #define  INCL_DOS
@@ -519,7 +519,7 @@
 	return Py_None;
 }
 
-static char stat_result__doc__[] =
+PyDoc_STRVAR(stat_result__doc__,
 "stat_result: Result from stat or lstat.\n\n\
 This object may be accessed either as a tuple of\n\
   (mode,ino,dev,nlink,uid,gid,size,atime,mtime,ctime)\n\
@@ -528,7 +528,7 @@
 Posix/windows: If your platform supports st_blksize, st_blocks, or st_rdev,\n\
 they are available as attributes only.\n\
 \n\
-See os.stat for more information.\n";
+See os.stat for more information.");
 
 static PyStructSequence_Field stat_result_fields[] = {
 	{"st_mode",    "protection bits"},
@@ -578,13 +578,13 @@
 	10
 };
 
-static char statvfs_result__doc__[] =
+PyDoc_STRVAR(statvfs_result__doc__,
 "statvfs_result: Result from statvfs or fstatvfs.\n\n\
 This object may be accessed either as a tuple of\n\
   (bsize,frsize,blocks,bfree,bavail,files,ffree,favail,flag,namemax),\n\
 or via the attributes f_bsize, f_frsize, f_blocks, f_bfree, and so on.\n\
 \n\
-See os.statvfs for more information.\n";
+See os.statvfs for more information.");
 
 static PyStructSequence_Field statvfs_result_fields[] = {
         {"f_bsize",  },
@@ -734,9 +734,9 @@
 
 /* POSIX methods */
 
-static char posix_access__doc__[] =
+PyDoc_STRVAR(posix_access__doc__,
 "access(path, mode) -> 1 if granted, 0 otherwise\n\
-Test for access to a file.";
+Test for access to a file.");
 
 static PyObject *
 posix_access(PyObject *self, PyObject *args)
@@ -767,9 +767,9 @@
 #endif
 
 #ifdef HAVE_TTYNAME
-static char posix_ttyname__doc__[] =
+PyDoc_STRVAR(posix_ttyname__doc__,
 "ttyname(fd) -> String\n\
-Return the name of the terminal device connected to 'fd'.";
+Return the name of the terminal device connected to 'fd'.");
 
 static PyObject *
 posix_ttyname(PyObject *self, PyObject *args)
@@ -788,9 +788,9 @@
 #endif
 
 #ifdef HAVE_CTERMID
-static char posix_ctermid__doc__[] =
+PyDoc_STRVAR(posix_ctermid__doc__,
 "ctermid() -> String\n\
-Return the name of the controlling terminal for this process.";
+Return the name of the controlling terminal for this process.");
 
 static PyObject *
 posix_ctermid(PyObject *self, PyObject *args)
@@ -812,9 +812,9 @@
 }
 #endif
 
-static char posix_chdir__doc__[] =
+PyDoc_STRVAR(posix_chdir__doc__,
 "chdir(path) -> None\n\
-Change the current working directory to the specified path.";
+Change the current working directory to the specified path.");
 
 static PyObject *
 posix_chdir(PyObject *self, PyObject *args)
@@ -827,10 +827,10 @@
 }
 
 #ifdef HAVE_FCHDIR
-static char posix_fchdir__doc__[] =
+PyDoc_STRVAR(posix_fchdir__doc__,
 "fchdir(fildes) -> None\n\
 Change to the directory of the given file descriptor.  fildes must be\n\
-opened on a directory, not a file.";
+opened on a directory, not a file.");
 
 static PyObject *
 posix_fchdir(PyObject *self, PyObject *fdobj)
@@ -840,9 +840,9 @@
 #endif /* HAVE_FCHDIR */
 
 
-static char posix_chmod__doc__[] =
+PyDoc_STRVAR(posix_chmod__doc__,
 "chmod(path, mode) -> None\n\
-Change the access permissions of a file.";
+Change the access permissions of a file.");
 
 static PyObject *
 posix_chmod(PyObject *self, PyObject *args)
@@ -865,9 +865,9 @@
 
 
 #ifdef HAVE_CHROOT
-static char posix_chroot__doc__[] =
+PyDoc_STRVAR(posix_chroot__doc__,
 "chroot(path) -> None\n\
-Change root directory to path.";
+Change root directory to path.");
 
 static PyObject *
 posix_chroot(PyObject *self, PyObject *args)
@@ -877,9 +877,9 @@
 #endif
 
 #ifdef HAVE_FSYNC
-static char posix_fsync__doc__[] =
+PyDoc_STRVAR(posix_fsync__doc__,
 "fsync(fildes) -> None\n\
-force write of file with filedescriptor to disk.";
+force write of file with filedescriptor to disk.");
 
 static PyObject *
 posix_fsync(PyObject *self, PyObject *fdobj)
@@ -894,10 +894,10 @@
 extern int fdatasync(int); /* On HP-UX, in libc but not in unistd.h */
 #endif
 
-static char posix_fdatasync__doc__[] =
+PyDoc_STRVAR(posix_fdatasync__doc__,
 "fdatasync(fildes) -> None\n\
 force write of file with filedescriptor to disk.\n\
- does not force update of metadata.";
+ does not force update of metadata.");
 
 static PyObject *
 posix_fdatasync(PyObject *self, PyObject *fdobj)
@@ -908,9 +908,9 @@
 
 
 #ifdef HAVE_CHOWN
-static char posix_chown__doc__[] =
+PyDoc_STRVAR(posix_chown__doc__,
 "chown(path, uid, gid) -> None\n\
-Change the owner and group id of path to the numeric uid and gid.";
+Change the owner and group id of path to the numeric uid and gid.");
 
 static PyObject *
 posix_chown(PyObject *self, PyObject *args)
@@ -935,9 +935,9 @@
 
 
 #ifdef HAVE_GETCWD
-static char posix_getcwd__doc__[] =
+PyDoc_STRVAR(posix_getcwd__doc__,
 "getcwd() -> path\n\
-Return a string representing the current working directory.";
+Return a string representing the current working directory.");
 
 static PyObject *
 posix_getcwd(PyObject *self, PyObject *args)
@@ -961,9 +961,9 @@
 
 
 #ifdef HAVE_LINK
-static char posix_link__doc__[] =
+PyDoc_STRVAR(posix_link__doc__,
 "link(src, dst) -> None\n\
-Create a hard link to a file.";
+Create a hard link to a file.");
 
 static PyObject *
 posix_link(PyObject *self, PyObject *args)
@@ -973,14 +973,14 @@
 #endif /* HAVE_LINK */
 
 
-static char posix_listdir__doc__[] =
+PyDoc_STRVAR(posix_listdir__doc__,
 "listdir(path) -> list_of_strings\n\
 Return a list containing the names of the entries in the directory.\n\
 \n\
 	path: path of directory to list\n\
 \n\
 The list is in arbitrary order.  It does not include the special\n\
-entries '.' and '..' even if they are present in the directory.";
+entries '.' and '..' even if they are present in the directory.");
 
 static PyObject *
 posix_listdir(PyObject *self, PyObject *args)
@@ -1238,9 +1238,9 @@
 } /* end of posix__getfullpathname */
 #endif /* MS_WIN32 */
 
-static char posix_mkdir__doc__[] =
+PyDoc_STRVAR(posix_mkdir__doc__,
 "mkdir(path [, mode=0777]) -> None\n\
-Create a directory.";
+Create a directory.");
 
 static PyObject *
 posix_mkdir(PyObject *self, PyObject *args)
@@ -1273,9 +1273,9 @@
 #endif
 #endif
 
-static char posix_nice__doc__[] =
+PyDoc_STRVAR(posix_nice__doc__,
 "nice(inc) -> new_priority\n\
-Decrease the priority of process and return new priority.";
+Decrease the priority of process and return new priority.");
 
 static PyObject *
 posix_nice(PyObject *self, PyObject *args)
@@ -1309,9 +1309,9 @@
 #endif /* HAVE_NICE */
 
 
-static char posix_rename__doc__[] =
+PyDoc_STRVAR(posix_rename__doc__,
 "rename(old, new) -> None\n\
-Rename a file or directory.";
+Rename a file or directory.");
 
 static PyObject *
 posix_rename(PyObject *self, PyObject *args)
@@ -1320,9 +1320,9 @@
 }
 
 
-static char posix_rmdir__doc__[] =
+PyDoc_STRVAR(posix_rmdir__doc__,
 "rmdir(path) -> None\n\
-Remove a directory.";
+Remove a directory.");
 
 static PyObject *
 posix_rmdir(PyObject *self, PyObject *args)
@@ -1331,10 +1331,10 @@
 }
 
 
-static char posix_stat__doc__[] =
+PyDoc_STRVAR(posix_stat__doc__,
 "stat(path) -> (st_mode, st_ino, st_dev, st_nlink, st_uid, st_gid,\n\
                 st_size, st_atime, st_mtime, st_ctime)\n\
-Perform a stat system call on the given path.";
+Perform a stat system call on the given path.");
 
 static PyObject *
 posix_stat(PyObject *self, PyObject *args)
@@ -1344,9 +1344,9 @@
 
 
 #ifdef HAVE_SYSTEM
-static char posix_system__doc__[] =
+PyDoc_STRVAR(posix_system__doc__,
 "system(command) -> exit_status\n\
-Execute the command (a string) in a subshell.";
+Execute the command (a string) in a subshell.");
 
 static PyObject *
 posix_system(PyObject *self, PyObject *args)
@@ -1363,9 +1363,9 @@
 #endif
 
 
-static char posix_umask__doc__[] =
+PyDoc_STRVAR(posix_umask__doc__,
 "umask(new_mask) -> old_mask\n\
-Set the current numeric umask and return the previous umask.";
+Set the current numeric umask and return the previous umask.");
 
 static PyObject *
 posix_umask(PyObject *self, PyObject *args)
@@ -1380,13 +1380,13 @@
 }
 
 
-static char posix_unlink__doc__[] =
+PyDoc_STRVAR(posix_unlink__doc__,
 "unlink(path) -> None\n\
-Remove a file (same as remove(path)).";
+Remove a file (same as remove(path)).");
 
-static char posix_remove__doc__[] =
+PyDoc_STRVAR(posix_remove__doc__,
 "remove(path) -> None\n\
-Remove a file (same as unlink(path)).";
+Remove a file (same as unlink(path)).");
 
 static PyObject *
 posix_unlink(PyObject *self, PyObject *args)
@@ -1396,9 +1396,9 @@
 
 
 #ifdef HAVE_UNAME
-static char posix_uname__doc__[] =
+PyDoc_STRVAR(posix_uname__doc__,
 "uname() -> (sysname, nodename, release, version, machine)\n\
-Return a tuple identifying the current operating system.";
+Return a tuple identifying the current operating system.");
 
 static PyObject *
 posix_uname(PyObject *self, PyObject *args)
@@ -1422,11 +1422,11 @@
 #endif /* HAVE_UNAME */
 
 
-static char posix_utime__doc__[] =
+PyDoc_STRVAR(posix_utime__doc__,
 "utime(path, (atime, utime)) -> None\n\
 utime(path, None) -> None\n\
 Set the access and modified time of the file to the given values.  If the\n\
-second form is used, set the access and modified times to the current time.";
+second form is used, set the access and modified times to the current time.");
 
 static PyObject *
 posix_utime(PyObject *self, PyObject *args)
@@ -1481,9 +1481,9 @@
 
 /* Process operations */
 
-static char posix__exit__doc__[] =
+PyDoc_STRVAR(posix__exit__doc__,
 "_exit(status)\n\
-Exit to the system with specified status, without normal exit processing.";
+Exit to the system with specified status, without normal exit processing.");
 
 static PyObject *
 posix__exit(PyObject *self, PyObject *args)
@@ -1497,12 +1497,12 @@
 
 
 #ifdef HAVE_EXECV
-static char posix_execv__doc__[] =
+PyDoc_STRVAR(posix_execv__doc__,
 "execv(path, args)\n\
 Execute an executable path with arguments, replacing current process.\n\
 \n\
 	path: path of executable file\n\
-	args: tuple or list of strings";
+	args: tuple or list of strings");
 
 static PyObject *
 posix_execv(PyObject *self, PyObject *args)
@@ -1563,13 +1563,13 @@
 }
 
 
-static char posix_execve__doc__[] =
+PyDoc_STRVAR(posix_execve__doc__,
 "execve(path, args, env)\n\
 Execute a path with arguments and environment, replacing current process.\n\
 \n\
 	path: path of executable file\n\
 	args: tuple or list of arguments\n\
-	env: dictionary of strings mapping to strings";
+	env: dictionary of strings mapping to strings");
 
 static PyObject *
 posix_execve(PyObject *self, PyObject *args)
@@ -1696,13 +1696,13 @@
 
 
 #ifdef HAVE_SPAWNV
-static char posix_spawnv__doc__[] =
+PyDoc_STRVAR(posix_spawnv__doc__,
 "spawnv(mode, path, args)\n\
 Execute the program 'path' in a new process.\n\
 \n\
 	mode: mode of process creation\n\
 	path: path of executable file\n\
-	args: tuple or list of strings";
+	args: tuple or list of strings");
 
 static PyObject *
 posix_spawnv(PyObject *self, PyObject *args)
@@ -1771,14 +1771,14 @@
 }
 
 
-static char posix_spawnve__doc__[] =
+PyDoc_STRVAR(posix_spawnve__doc__,
 "spawnve(mode, path, args, env)\n\
 Execute the program 'path' in a new process.\n\
 \n\
 	mode: mode of process creation\n\
 	path: path of executable file\n\
 	args: tuple or list of arguments\n\
-	env: dictionary of strings mapping to strings";
+	env: dictionary of strings mapping to strings");
 
 static PyObject *
 posix_spawnve(PyObject *self, PyObject *args)
@@ -1903,11 +1903,11 @@
 
 
 #ifdef HAVE_FORK1
-static char posix_fork1__doc__[] =
+PyDoc_STRVAR(posix_fork1__doc__,
 "fork1() -> pid\n\
 Fork a child process with a single multiplexed (i.e., not bound) thread.\n\
 \n\
-Return 0 to child process and PID of child to parent process.";
+Return 0 to child process and PID of child to parent process.");
 
 static PyObject *
 posix_fork1(self, args)
@@ -1927,11 +1927,11 @@
 
 
 #ifdef HAVE_FORK
-static char posix_fork__doc__[] =
+PyDoc_STRVAR(posix_fork__doc__,
 "fork() -> pid\n\
 Fork a child process.\n\
 \n\
-Return 0 to child process and PID of child to parent process.";
+Return 0 to child process and PID of child to parent process.");
 
 static PyObject *
 posix_fork(PyObject *self, PyObject *args)
@@ -1959,9 +1959,9 @@
 #endif /* defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) */
 
 #if defined(HAVE_OPENPTY) || defined(HAVE__GETPTY)
-static char posix_openpty__doc__[] =
+PyDoc_STRVAR(posix_openpty__doc__,
 "openpty() -> (master_fd, slave_fd)\n\
-Open a pseudo-terminal, returning open fd's for both master and slave end.\n";
+Open a pseudo-terminal, returning open fd's for both master and slave end.\n");
 
 static PyObject *
 posix_openpty(PyObject *self, PyObject *args)
@@ -1993,11 +1993,11 @@
 #endif /* defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) */
 
 #ifdef HAVE_FORKPTY
-static char posix_forkpty__doc__[] =
+PyDoc_STRVAR(posix_forkpty__doc__,
 "forkpty() -> (pid, master_fd)\n\
 Fork a new process with a new pseudo-terminal as controlling tty.\n\n\
 Like fork(), return 0 as pid to child process, and PID of child to parent.\n\
-To both, return fd of newly opened pseudo-terminal.\n";
+To both, return fd of newly opened pseudo-terminal.\n");
 
 static PyObject *
 posix_forkpty(PyObject *self, PyObject *args)
@@ -2016,9 +2016,9 @@
 #endif
 
 #ifdef HAVE_GETEGID
-static char posix_getegid__doc__[] =
+PyDoc_STRVAR(posix_getegid__doc__,
 "getegid() -> egid\n\
-Return the current process's effective group id.";
+Return the current process's effective group id.");
 
 static PyObject *
 posix_getegid(PyObject *self, PyObject *args)
@@ -2031,9 +2031,9 @@
 
 
 #ifdef HAVE_GETEUID
-static char posix_geteuid__doc__[] =
+PyDoc_STRVAR(posix_geteuid__doc__,
 "geteuid() -> euid\n\
-Return the current process's effective user id.";
+Return the current process's effective user id.");
 
 static PyObject *
 posix_geteuid(PyObject *self, PyObject *args)
@@ -2046,9 +2046,9 @@
 
 
 #ifdef HAVE_GETGID
-static char posix_getgid__doc__[] =
+PyDoc_STRVAR(posix_getgid__doc__,
 "getgid() -> gid\n\
-Return the current process's group id.";
+Return the current process's group id.");
 
 static PyObject *
 posix_getgid(PyObject *self, PyObject *args)
@@ -2060,9 +2060,9 @@
 #endif
 
 
-static char posix_getpid__doc__[] =
+PyDoc_STRVAR(posix_getpid__doc__,
 "getpid() -> pid\n\
-Return the current process id";
+Return the current process id");
 
 static PyObject *
 posix_getpid(PyObject *self, PyObject *args)
@@ -2074,9 +2074,9 @@
 
 
 #ifdef HAVE_GETGROUPS
-static char posix_getgroups__doc__[] = "\
-getgroups() -> list of group IDs\n\
-Return list of supplemental group IDs for the process.";
+PyDoc_STRVAR(posix_getgroups__doc__,
+"getgroups() -> list of group IDs\n\
+Return list of supplemental group IDs for the process.");
 
 static PyObject *
 posix_getgroups(PyObject *self, PyObject *args)
@@ -2118,9 +2118,9 @@
 #endif
 
 #ifdef HAVE_GETPGRP
-static char posix_getpgrp__doc__[] =
+PyDoc_STRVAR(posix_getpgrp__doc__,
 "getpgrp() -> pgrp\n\
-Return the current process group id.";
+Return the current process group id.");
 
 static PyObject *
 posix_getpgrp(PyObject *self, PyObject *args)
@@ -2137,9 +2137,9 @@
 
 
 #ifdef HAVE_SETPGRP
-static char posix_setpgrp__doc__[] =
+PyDoc_STRVAR(posix_setpgrp__doc__,
 "setpgrp() -> None\n\
-Make this process a session leader.";
+Make this process a session leader.");
 
 static PyObject *
 posix_setpgrp(PyObject *self, PyObject *args)
@@ -2159,9 +2159,9 @@
 #endif /* HAVE_SETPGRP */
 
 #ifdef HAVE_GETPPID
-static char posix_getppid__doc__[] =
+PyDoc_STRVAR(posix_getppid__doc__,
 "getppid() -> ppid\n\
-Return the parent's process id.";
+Return the parent's process id.");
 
 static PyObject *
 posix_getppid(PyObject *self, PyObject *args)
@@ -2174,9 +2174,9 @@
 
 
 #ifdef HAVE_GETLOGIN
-static char posix_getlogin__doc__[] = "\
-getlogin() -> string\n\
-Return the actual login name.";
+PyDoc_STRVAR(posix_getlogin__doc__,
+"getlogin() -> string\n\
+Return the actual login name.");
 
 static PyObject *
 posix_getlogin(PyObject *self, PyObject *args)
@@ -2205,9 +2205,9 @@
 #endif
 
 #ifdef HAVE_GETUID
-static char posix_getuid__doc__[] =
+PyDoc_STRVAR(posix_getuid__doc__,
 "getuid() -> uid\n\
-Return the current process's user id.";
+Return the current process's user id.");
 
 static PyObject *
 posix_getuid(PyObject *self, PyObject *args)
@@ -2220,9 +2220,9 @@
 
 
 #ifdef HAVE_KILL
-static char posix_kill__doc__[] =
+PyDoc_STRVAR(posix_kill__doc__,
 "kill(pid, sig) -> None\n\
-Kill a process with a signal.";
+Kill a process with a signal.");
 
 static PyObject *
 posix_kill(PyObject *self, PyObject *args)
@@ -2253,9 +2253,9 @@
 #endif
 
 #ifdef HAVE_KILLPG
-static char posix_killpg__doc__[] =
+PyDoc_STRVAR(posix_killpg__doc__,
 "killpg(pgid, sig) -> None\n\
-Kill a process group with a signal.";
+Kill a process group with a signal.");
 
 static PyObject *
 posix_killpg(PyObject *self, PyObject *args)
@@ -2276,9 +2276,9 @@
 #include <sys/lock.h>
 #endif
 
-static char posix_plock__doc__[] =
+PyDoc_STRVAR(posix_plock__doc__,
 "plock(op) -> None\n\
-Lock program segments into memory.";
+Lock program segments into memory.");
 
 static PyObject *
 posix_plock(PyObject *self, PyObject *args)
@@ -2295,9 +2295,9 @@
 
 
 #ifdef HAVE_POPEN
-static char posix_popen__doc__[] =
+PyDoc_STRVAR(posix_popen__doc__,
 "popen(command [, mode='r' [, bufsize]]) -> pipe\n\
-Open a pipe to/from a command returning a file object.";
+Open a pipe to/from a command returning a file object.");
 
 #if defined(PYOS_OS2)
 #if defined(PYCC_VACPP)
@@ -3835,9 +3835,10 @@
 
 
 #ifdef HAVE_SETUID
-static char posix_setuid__doc__[] =
+PyDoc_STRVAR(posix_setuid__doc__,
 "setuid(uid) -> None\n\
-Set the current process's user id.";
+Set the current process's user id.");
+
 static PyObject *
 posix_setuid(PyObject *self, PyObject *args)
 {
@@ -3853,9 +3854,10 @@
 
 
 #ifdef HAVE_SETEUID
-static char posix_seteuid__doc__[] =
+PyDoc_STRVAR(posix_seteuid__doc__,
 "seteuid(uid) -> None\n\
-Set the current process's effective user id.";
+Set the current process's effective user id.");
+
 static PyObject *
 posix_seteuid (PyObject *self, PyObject *args)
 {
@@ -3872,9 +3874,10 @@
 #endif /* HAVE_SETEUID */
 
 #ifdef HAVE_SETEGID
-static char posix_setegid__doc__[] =
+PyDoc_STRVAR(posix_setegid__doc__,
 "setegid(gid) -> None\n\
-Set the current process's effective group id.";
+Set the current process's effective group id.");
+
 static PyObject *
 posix_setegid (PyObject *self, PyObject *args)
 {
@@ -3891,9 +3894,10 @@
 #endif /* HAVE_SETEGID */
 
 #ifdef HAVE_SETREUID
-static char posix_setreuid__doc__[] =
+PyDoc_STRVAR(posix_setreuid__doc__,
 "seteuid(ruid, euid) -> None\n\
-Set the current process's real and effective user ids.";
+Set the current process's real and effective user ids.");
+
 static PyObject *
 posix_setreuid (PyObject *self, PyObject *args)
 {
@@ -3910,9 +3914,10 @@
 #endif /* HAVE_SETREUID */
 
 #ifdef HAVE_SETREGID
-static char posix_setregid__doc__[] =
+PyDoc_STRVAR(posix_setregid__doc__,
 "setegid(rgid, egid) -> None\n\
-Set the current process's real and effective group ids.";
+Set the current process's real and effective group ids.");
+
 static PyObject *
 posix_setregid (PyObject *self, PyObject *args)
 {
@@ -3929,9 +3934,9 @@
 #endif /* HAVE_SETREGID */
 
 #ifdef HAVE_SETGID
-static char posix_setgid__doc__[] =
+PyDoc_STRVAR(posix_setgid__doc__,
 "setgid(gid) -> None\n\
-Set the current process's group id.";
+Set the current process's group id.");
 
 static PyObject *
 posix_setgid(PyObject *self, PyObject *args)
@@ -3947,9 +3952,9 @@
 #endif /* HAVE_SETGID */
 
 #ifdef HAVE_SETGROUPS
-static char posix_setgroups__doc__[] =
+PyDoc_STRVAR(posix_setgroups__doc__,
 "setgroups(list) -> None\n\
-Set the groups of the current process to list.";
+Set the groups of the current process to list.");
 
 static PyObject *
 posix_setgroups(PyObject *self, PyObject *args)
@@ -3993,9 +3998,9 @@
 #endif /* HAVE_SETGROUPS */
 
 #ifdef HAVE_WAITPID
-static char posix_waitpid__doc__[] =
+PyDoc_STRVAR(posix_waitpid__doc__,
 "waitpid(pid, options) -> (pid, status)\n\
-Wait for completion of a given child process.";
+Wait for completion of a given child process.");
 
 static PyObject *
 posix_waitpid(PyObject *self, PyObject *args)
@@ -4024,9 +4029,9 @@
 #elif defined(HAVE_CWAIT)
 
 /* MS C has a variant of waitpid() that's usable for most purposes. */
-static char posix_waitpid__doc__[] =
+PyDoc_STRVAR(posix_waitpid__doc__,
 "waitpid(pid, options) -> (pid, status << 8)\n"
-"Wait for completion of a given process.  options is ignored on Windows.";
+"Wait for completion of a given process.  options is ignored on Windows.");
 
 static PyObject *
 posix_waitpid(PyObject *self, PyObject *args)
@@ -4049,9 +4054,9 @@
 #endif /* HAVE_WAITPID || HAVE_CWAIT */
 
 #ifdef HAVE_WAIT
-static char posix_wait__doc__[] =
+PyDoc_STRVAR(posix_wait__doc__,
 "wait() -> (pid, status)\n\
-Wait for completion of a child process.";
+Wait for completion of a child process.");
 
 static PyObject *
 posix_wait(PyObject *self, PyObject *args)
@@ -4079,10 +4084,10 @@
 #endif
 
 
-static char posix_lstat__doc__[] =
+PyDoc_STRVAR(posix_lstat__doc__,
 "lstat(path) -> (st_mode, st_ino, st_dev, st_nlink, st_uid, st_gid,\n\
                  st_size, st_atime, st_mtime, st_ctime)\n\
-Like stat(path), but do not follow symbolic links.";
+Like stat(path), but do not follow symbolic links.");
 
 static PyObject *
 posix_lstat(PyObject *self, PyObject *args)
@@ -4096,9 +4101,9 @@
 
 
 #ifdef HAVE_READLINK
-static char posix_readlink__doc__[] =
+PyDoc_STRVAR(posix_readlink__doc__,
 "readlink(path) -> path\n\
-Return a string representing the path to which the symbolic link points.";
+Return a string representing the path to which the symbolic link points.");
 
 static PyObject *
 posix_readlink(PyObject *self, PyObject *args)
@@ -4119,9 +4124,9 @@
 
 
 #ifdef HAVE_SYMLINK
-static char posix_symlink__doc__[] =
+PyDoc_STRVAR(posix_symlink__doc__,
 "symlink(src, dst) -> None\n\
-Create a symbolic link.";
+Create a symbolic link.");
 
 static PyObject *
 posix_symlink(PyObject *self, PyObject *args)
@@ -4215,16 +4220,16 @@
 #endif /* MS_WIN32 */
 
 #ifdef HAVE_TIMES
-static char posix_times__doc__[] =
+PyDoc_STRVAR(posix_times__doc__,
 "times() -> (utime, stime, cutime, cstime, elapsed_time)\n\
-Return a tuple of floating point numbers indicating process times.";
+Return a tuple of floating point numbers indicating process times.");
 #endif
 
 
 #ifdef HAVE_SETSID
-static char posix_setsid__doc__[] =
+PyDoc_STRVAR(posix_setsid__doc__,
 "setsid() -> None\n\
-Call the system call setsid().";
+Call the system call setsid().");
 
 static PyObject *
 posix_setsid(PyObject *self, PyObject *args)
@@ -4239,9 +4244,9 @@
 #endif /* HAVE_SETSID */
 
 #ifdef HAVE_SETPGID
-static char posix_setpgid__doc__[] =
+PyDoc_STRVAR(posix_setpgid__doc__,
 "setpgid(pid, pgrp) -> None\n\
-Call the system call setpgid().";
+Call the system call setpgid().");
 
 static PyObject *
 posix_setpgid(PyObject *self, PyObject *args)
@@ -4258,9 +4263,9 @@
 
 
 #ifdef HAVE_TCGETPGRP
-static char posix_tcgetpgrp__doc__[] =
+PyDoc_STRVAR(posix_tcgetpgrp__doc__,
 "tcgetpgrp(fd) -> pgid\n\
-Return the process group associated with the terminal given by a fd.";
+Return the process group associated with the terminal given by a fd.");
 
 static PyObject *
 posix_tcgetpgrp(PyObject *self, PyObject *args)
@@ -4277,9 +4282,9 @@
 
 
 #ifdef HAVE_TCSETPGRP
-static char posix_tcsetpgrp__doc__[] =
+PyDoc_STRVAR(posix_tcsetpgrp__doc__,
 "tcsetpgrp(fd, pgid) -> None\n\
-Set the process group associated with the terminal given by a fd.";
+Set the process group associated with the terminal given by a fd.");
 
 static PyObject *
 posix_tcsetpgrp(PyObject *self, PyObject *args)
@@ -4296,9 +4301,9 @@
 
 /* Functions acting on file descriptors */
 
-static char posix_open__doc__[] =
+PyDoc_STRVAR(posix_open__doc__,
 "open(filename, flag [, mode=0777]) -> fd\n\
-Open a file (for low level IO).";
+Open a file (for low level IO).");
 
 static PyObject *
 posix_open(PyObject *self, PyObject *args)
@@ -4322,9 +4327,9 @@
 }
 
 
-static char posix_close__doc__[] =
+PyDoc_STRVAR(posix_close__doc__,
 "close(fd) -> None\n\
-Close a file descriptor (for low level IO).";
+Close a file descriptor (for low level IO).");
 
 static PyObject *
 posix_close(PyObject *self, PyObject *args)
@@ -4342,9 +4347,9 @@
 }
 
 
-static char posix_dup__doc__[] =
+PyDoc_STRVAR(posix_dup__doc__,
 "dup(fd) -> fd2\n\
-Return a duplicate of a file descriptor.";
+Return a duplicate of a file descriptor.");
 
 static PyObject *
 posix_dup(PyObject *self, PyObject *args)
@@ -4361,9 +4366,9 @@
 }
 
 
-static char posix_dup2__doc__[] =
+PyDoc_STRVAR(posix_dup2__doc__,
 "dup2(fd, fd2) -> None\n\
-Duplicate file descriptor.";
+Duplicate file descriptor.");
 
 static PyObject *
 posix_dup2(PyObject *self, PyObject *args)
@@ -4381,9 +4386,9 @@
 }
 
 
-static char posix_lseek__doc__[] =
+PyDoc_STRVAR(posix_lseek__doc__,
 "lseek(fd, pos, how) -> newpos\n\
-Set the current position of a file descriptor.";
+Set the current position of a file descriptor.");
 
 static PyObject *
 posix_lseek(PyObject *self, PyObject *args)
@@ -4433,9 +4438,9 @@
 }
 
 
-static char posix_read__doc__[] =
+PyDoc_STRVAR(posix_read__doc__,
 "read(fd, buffersize) -> string\n\
-Read a file descriptor.";
+Read a file descriptor.");
 
 static PyObject *
 posix_read(PyObject *self, PyObject *args)
@@ -4460,9 +4465,9 @@
 }
 
 
-static char posix_write__doc__[] =
+PyDoc_STRVAR(posix_write__doc__,
 "write(fd, string) -> byteswritten\n\
-Write a string to a file descriptor.";
+Write a string to a file descriptor.");
 
 static PyObject *
 posix_write(PyObject *self, PyObject *args)
@@ -4480,9 +4485,9 @@
 }
 
 
-static char posix_fstat__doc__[]=
+PyDoc_STRVAR(posix_fstat__doc__,
 "fstat(fd) -> (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime)\n\
-Like stat(), but for an open file descriptor.";
+Like stat(), but for an open file descriptor.");
 
 static PyObject *
 posix_fstat(PyObject *self, PyObject *args)
@@ -4502,9 +4507,9 @@
 }
 
 
-static char posix_fdopen__doc__[] =
+PyDoc_STRVAR(posix_fdopen__doc__,
 "fdopen(fd, [, mode='r' [, bufsize]]) -> file_object\n\
-Return an open file object connected to a file descriptor.";
+Return an open file object connected to a file descriptor.");
 
 static PyObject *
 posix_fdopen(PyObject *self, PyObject *args)
@@ -4528,10 +4533,10 @@
 	return f;
 }
 
-static char posix_isatty__doc__[] =
+PyDoc_STRVAR(posix_isatty__doc__,
 "isatty(fd) -> bool\n\
 Return True if the file descriptor 'fd' is an open file descriptor\n\
-connected to the slave end of a terminal.";
+connected to the slave end of a terminal.");
 
 static PyObject *
 posix_isatty(PyObject *self, PyObject *args)
@@ -4543,9 +4548,9 @@
 }
 
 #ifdef HAVE_PIPE
-static char posix_pipe__doc__[] =
+PyDoc_STRVAR(posix_pipe__doc__,
 "pipe() -> (read_end, write_end)\n\
-Create a pipe.";
+Create a pipe.");
 
 static PyObject *
 posix_pipe(PyObject *self, PyObject *args)
@@ -4597,9 +4602,9 @@
 
 
 #ifdef HAVE_MKFIFO
-static char posix_mkfifo__doc__[] =
+PyDoc_STRVAR(posix_mkfifo__doc__,
 "mkfifo(filename, [, mode=0666]) -> None\n\
-Create a FIFO (a POSIX named pipe).";
+Create a FIFO (a POSIX named pipe).");
 
 static PyObject *
 posix_mkfifo(PyObject *self, PyObject *args)
@@ -4621,14 +4626,14 @@
 
 
 #ifdef HAVE_MKNOD
-static char posix_mknod__doc__[] =
+PyDoc_STRVAR(posix_mknod__doc__,
 "mknod(filename, [, mode=0600, major, minor]) -> None\n\
 Create a filesystem node (file, device special file or named pipe)\n\
 named filename. mode specifies both the permissions to use and the\n\
 type of node to be created, being combined (bitwise OR) with one of\n\
 S_IFREG, S_IFCHR, S_IFBLK, and S_IFIFO. For S_IFCHR and S_IFBLK,\n\
 major and minor define the newly created device special file, otherwise\n\
-they are ignored.";
+they are ignored.");
 
 
 static PyObject *
@@ -4654,9 +4659,9 @@
 
 
 #ifdef HAVE_FTRUNCATE
-static char posix_ftruncate__doc__[] =
+PyDoc_STRVAR(posix_ftruncate__doc__,
 "ftruncate(fd, length) -> None\n\
-Truncate a file to a specified length.";
+Truncate a file to a specified length.");
 
 static PyObject *
 posix_ftruncate(PyObject *self, PyObject *args)
@@ -4691,9 +4696,9 @@
 #endif
 
 #ifdef HAVE_PUTENV
-static char posix_putenv__doc__[] =
+PyDoc_STRVAR(posix_putenv__doc__,
 "putenv(key, value) -> None\n\
-Change or add an environment variable.";
+Change or add an environment variable.");
 
 /* Save putenv() parameters as values here, so we can collect them when they
  * get re-set with another call for the same key. */
@@ -4768,9 +4773,9 @@
 #endif /* putenv */
 
 #ifdef HAVE_UNSETENV
-static char posix_unsetenv__doc__[] =
+PyDoc_STRVAR(posix_unsetenv__doc__,
 "unsetenv(key) -> None\n\
-Delete an environment variable.";
+Delete an environment variable.");
 
 static PyObject *
 posix_unsetenv(PyObject *self, PyObject *args)
@@ -4799,9 +4804,9 @@
 #endif /* unsetenv */
 
 #ifdef HAVE_STRERROR
-static char posix_strerror__doc__[] =
+PyDoc_STRVAR(posix_strerror__doc__,
 "strerror(code) -> string\n\
-Translate an error code to a message string.";
+Translate an error code to a message string.");
 
 static PyObject *
 posix_strerror(PyObject *self, PyObject *args)
@@ -4824,9 +4829,9 @@
 #ifdef HAVE_SYS_WAIT_H
 
 #ifdef WCOREDUMP
-static char posix_WCOREDUMP__doc__[] =
+PyDoc_STRVAR(posix_WCOREDUMP__doc__,
 "WCOREDUMP(status) -> bool\n\
-Return True if the process returning 'status' was dumped to a core file.";
+Return True if the process returning 'status' was dumped to a core file.");
 
 static PyObject *
 posix_WCOREDUMP(PyObject *self, PyObject *args)
@@ -4851,10 +4856,10 @@
 #endif /* WCOREDUMP */
 
 #ifdef WIFCONTINUED
-static char posix_WIFCONTINUED__doc__[] =
+PyDoc_STRVAR(posix_WIFCONTINUED__doc__,
 "WIFCONTINUED(status) -> bool\n\
 Return True if the process returning 'status' was continued from a\n\
-job control stop.";
+job control stop.");
 
 static PyObject *
 posix_WIFCONTINUED(PyObject *self, PyObject *args)
@@ -4879,9 +4884,9 @@
 #endif /* WIFCONTINUED */
 
 #ifdef WIFSTOPPED
-static char posix_WIFSTOPPED__doc__[] =
+PyDoc_STRVAR(posix_WIFSTOPPED__doc__,
 "WIFSTOPPED(status) -> bool\n\
-Return True if the process returning 'status' was stopped.";
+Return True if the process returning 'status' was stopped.");
 
 static PyObject *
 posix_WIFSTOPPED(PyObject *self, PyObject *args)
@@ -4906,9 +4911,9 @@
 #endif /* WIFSTOPPED */
 
 #ifdef WIFSIGNALED
-static char posix_WIFSIGNALED__doc__[] =
+PyDoc_STRVAR(posix_WIFSIGNALED__doc__,
 "WIFSIGNALED(status) -> bool\n\
-Return True if the process returning 'status' was terminated by a signal.";
+Return True if the process returning 'status' was terminated by a signal.");
 
 static PyObject *
 posix_WIFSIGNALED(PyObject *self, PyObject *args)
@@ -4933,10 +4938,10 @@
 #endif /* WIFSIGNALED */
 
 #ifdef WIFEXITED
-static char posix_WIFEXITED__doc__[] =
+PyDoc_STRVAR(posix_WIFEXITED__doc__,
 "WIFEXITED(status) -> bool\n\
 Return true if the process returning 'status' exited using the exit()\n\
-system call.";
+system call.");
 
 static PyObject *
 posix_WIFEXITED(PyObject *self, PyObject *args)
@@ -4961,9 +4966,9 @@
 #endif /* WIFEXITED */
 
 #ifdef WEXITSTATUS
-static char posix_WEXITSTATUS__doc__[] =
+PyDoc_STRVAR(posix_WEXITSTATUS__doc__,
 "WEXITSTATUS(status) -> integer\n\
-Return the process return code from 'status'.";
+Return the process return code from 'status'.");
 
 static PyObject *
 posix_WEXITSTATUS(PyObject *self, PyObject *args)
@@ -4988,10 +4993,10 @@
 #endif /* WEXITSTATUS */
 
 #ifdef WTERMSIG
-static char posix_WTERMSIG__doc__[] =
+PyDoc_STRVAR(posix_WTERMSIG__doc__,
 "WTERMSIG(status) -> integer\n\
 Return the signal that terminated the process that provided the 'status'\n\
-value.";
+value.");
 
 static PyObject *
 posix_WTERMSIG(PyObject *self, PyObject *args)
@@ -5016,9 +5021,10 @@
 #endif /* WTERMSIG */
 
 #ifdef WSTOPSIG
-static char posix_WSTOPSIG__doc__[] =
+PyDoc_STRVAR(posix_WSTOPSIG__doc__,
 "WSTOPSIG(status) -> integer\n\
-Return the signal that stopped the process that provided the 'status' value.";
+Return the signal that stopped the process that provided\n\
+the 'status' value.");
 
 static PyObject *
 posix_WSTOPSIG(PyObject *self, PyObject *args)
@@ -5092,10 +5098,10 @@
         return v;
 }
 
-static char posix_fstatvfs__doc__[] =
+PyDoc_STRVAR(posix_fstatvfs__doc__,
 "fstatvfs(fd) -> \n\
  (bsize, frsize, blocks, bfree, bavail, files, ffree, favail, flag, namemax)\n\
-Perform an fstatvfs system call on the given fd.";
+Perform an fstatvfs system call on the given fd.");
 
 static PyObject *
 posix_fstatvfs(PyObject *self, PyObject *args)
@@ -5119,10 +5125,10 @@
 #if defined(HAVE_STATVFS)
 #include <sys/statvfs.h>
 
-static char posix_statvfs__doc__[] =
+PyDoc_STRVAR(posix_statvfs__doc__,
 "statvfs(path) -> \n\
  (bsize, frsize, blocks, bfree, bavail, files, ffree, favail, flag, namemax)\n\
-Perform a statvfs system call on the given path.";
+Perform a statvfs system call on the given path.");
 
 static PyObject *
 posix_statvfs(PyObject *self, PyObject *args)
@@ -5144,11 +5150,11 @@
 
 
 #ifdef HAVE_TEMPNAM
-static char posix_tempnam__doc__[] = "\
-tempnam([dir[, prefix]]) -> string\n\
+PyDoc_STRVAR(posix_tempnam__doc__,
+"tempnam([dir[, prefix]]) -> string\n\
 Return a unique name for a temporary file.\n\
 The directory and a short may be specified as strings; they may be omitted\n\
-or None if not needed.";
+or None if not needed.");
 
 static PyObject *
 posix_tempnam(PyObject *self, PyObject *args)
@@ -5180,9 +5186,9 @@
 
 
 #ifdef HAVE_TMPFILE
-static char posix_tmpfile__doc__[] = "\
-tmpfile() -> file object\n\
-Create a temporary file with no directory entries.";
+PyDoc_STRVAR(posix_tmpfile__doc__,
+"tmpfile() -> file object\n\
+Create a temporary file with no directory entries.");
 
 static PyObject *
 posix_tmpfile(PyObject *self, PyObject *args)
@@ -5200,9 +5206,9 @@
 
 
 #ifdef HAVE_TMPNAM
-static char posix_tmpnam__doc__[] = "\
-tmpnam() -> string\n\
-Return a unique name for a temporary file.";
+PyDoc_STRVAR(posix_tmpnam__doc__,
+"tmpnam() -> string\n\
+Return a unique name for a temporary file.");
 
 static PyObject *
 posix_tmpnam(PyObject *self, PyObject *args)
@@ -5355,10 +5361,10 @@
 #endif
 
 #ifdef HAVE_FPATHCONF
-static char posix_fpathconf__doc__[] = "\
-fpathconf(fd, name) -> integer\n\
+PyDoc_STRVAR(posix_fpathconf__doc__,
+"fpathconf(fd, name) -> integer\n\
 Return the configuration limit name for the file descriptor fd.\n\
-If there is no limit, return -1.";
+If there is no limit, return -1.");
 
 static PyObject *
 posix_fpathconf(PyObject *self, PyObject *args)
@@ -5383,10 +5389,10 @@
 
 
 #ifdef HAVE_PATHCONF
-static char posix_pathconf__doc__[] = "\
-pathconf(path, name) -> integer\n\
+PyDoc_STRVAR(posix_pathconf__doc__,
+"pathconf(path, name) -> integer\n\
 Return the configuration limit name for the file or directory path.\n\
-If there is no limit, return -1.";
+If there is no limit, return -1.");
 
 static PyObject *
 posix_pathconf(PyObject *self, PyObject *args)
@@ -5571,9 +5577,9 @@
                            / sizeof(struct constdef));
 }
 
-static char posix_confstr__doc__[] = "\
-confstr(name) -> string\n\
-Return a string-valued system configuration variable.";
+PyDoc_STRVAR(posix_confstr__doc__,
+"confstr(name) -> string\n\
+Return a string-valued system configuration variable.");
 
 static PyObject *
 posix_confstr(PyObject *self, PyObject *args)
@@ -6111,9 +6117,9 @@
                            / sizeof(struct constdef));
 }
 
-static char posix_sysconf__doc__[] = "\
-sysconf(name) -> integer\n\
-Return an integer-valued system configuration variable.";
+PyDoc_STRVAR(posix_sysconf__doc__,
+"sysconf(name) -> integer\n\
+Return an integer-valued system configuration variable.");
 
 static PyObject *
 posix_sysconf(PyObject *self, PyObject *args)
@@ -6210,10 +6216,10 @@
 }
 
 
-static char posix_abort__doc__[] = "\
-abort() -> does not return!\n\
+PyDoc_STRVAR(posix_abort__doc__,
+"abort() -> does not return!\n\
 Abort the interpreter immediately.  This 'dumps core' or otherwise fails\n\
-in the hardest way possible on the hosting operating system.";
+in the hardest way possible on the hosting operating system.");
 
 static PyObject *
 posix_abort(PyObject *self, PyObject *args)
@@ -6227,8 +6233,8 @@
 }
 
 #ifdef MS_WIN32
-static char win32_startfile__doc__[] = "\
-startfile(filepath) - Start a file with its associated application.\n\
+PyDoc_STRVAR(win32_startfile__doc__,
+"startfile(filepath) - Start a file with its associated application.\n\
 \n\
 This acts like double-clicking the file in Explorer, or giving the file\n\
 name as an argument to the DOS \"start\" command:  the file is opened\n\
@@ -6240,7 +6246,7 @@
 \n\
 The filepath is relative to the current directory.  If you want to use\n\
 an absolute path, make sure the first character is not a slash (\"/\");\n\
-the underlying Win32 ShellExecute function doesn't work if it is.";
+the underlying Win32 ShellExecute function doesn't work if it is.");
 
 static PyObject *
 win32_startfile(PyObject *self, PyObject *args)
diff --git a/Modules/pwdmodule.c b/Modules/pwdmodule.c
index 701ae03..b51b7f9 100644
--- a/Modules/pwdmodule.c
+++ b/Modules/pwdmodule.c
@@ -18,11 +18,11 @@
 	{0}
 };
 
-static char struct_passwd__doc__[] =
+PyDoc_STRVAR(struct_passwd__doc__,
 "pwd.struct_passwd: Results from getpw*() routines.\n\n\
 This object may be accessed either as a tuple of\n\
   (pw_name,pw_passwd,pw_uid,pw_gid,pw_gecos,pw_dir,pw_shell)\n\
-or via the object attributes as named in the above tuple.\n";
+or via the object attributes as named in the above tuple.");
 
 static PyStructSequence_Desc struct_pwd_type_desc = {
 	"pwd.struct_passwd",
@@ -31,15 +31,15 @@
 	7,
 };
 
-static char pwd__doc__ [] = "\
-This module provides access to the Unix password database.\n\
+PyDoc_STRVAR(pwd__doc__,
+"This module provides access to the Unix password database.\n\
 It is available on all Unix versions.\n\
 \n\
 Password database entries are reported as 7-tuples containing the following\n\
 items from the password database (see `<pwd.h>'), in order:\n\
 pw_name, pw_passwd, pw_uid, pw_gid, pw_gecos, pw_dir, pw_shell.\n\
 The uid and gid items are integers, all others are strings. An\n\
-exception is raised if the entry asked for cannot be found.";
+exception is raised if the entry asked for cannot be found.");
 
       
 static PyTypeObject StructPwdType;
@@ -74,10 +74,11 @@
 	return v;
 }
 
-static char pwd_getpwuid__doc__[] = "\
-getpwuid(uid) -> (pw_name,pw_passwd,pw_uid,pw_gid,pw_gecos,pw_dir,pw_shell)\n\
+PyDoc_STRVAR(pwd_getpwuid__doc__,
+"getpwuid(uid) -> (pw_name,pw_passwd,pw_uid,\n\
+                  pw_gid,pw_gecos,pw_dir,pw_shell)\n\
 Return the password database entry for the given numeric user ID.\n\
-See pwd.__doc__ for more on password database entries.";
+See pwd.__doc__ for more on password database entries.");
 
 static PyObject *
 pwd_getpwuid(PyObject *self, PyObject *args)
@@ -93,10 +94,11 @@
 	return mkpwent(p);
 }
 
-static char pwd_getpwnam__doc__[] = "\
-getpwnam(name) -> (pw_name,pw_passwd,pw_uid,pw_gid,pw_gecos,pw_dir,pw_shell)\n\
+PyDoc_STRVAR(pwd_getpwnam__doc__,
+"getpwnam(name) -> (pw_name,pw_passwd,pw_uid,\n\
+                    pw_gid,pw_gecos,pw_dir,pw_shell)\n\
 Return the password database entry for the given user name.\n\
-See pwd.__doc__ for more on password database entries.";
+See pwd.__doc__ for more on password database entries.");
 
 static PyObject *
 pwd_getpwnam(PyObject *self, PyObject *args)
@@ -113,11 +115,11 @@
 }
 
 #ifdef HAVE_GETPWENT
-static char pwd_getpwall__doc__[] = "\
-getpwall() -> list_of_entries\n\
+PyDoc_STRVAR(pwd_getpwall__doc__,
+"getpwall() -> list_of_entries\n\
 Return a list of all available password database entries, \
 in arbitrary order.\n\
-See pwd.__doc__ for more on password database entries.";
+See pwd.__doc__ for more on password database entries.");
 
 static PyObject *
 pwd_getpwall(PyObject *self)
diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c
index 3153693..ae8bf1b 100644
--- a/Modules/pyexpat.c
+++ b/Modules/pyexpat.c
@@ -625,9 +625,9 @@
 
 /* ---------------------------------------------------------------- */
 
-static char xmlparse_Parse__doc__[] = 
+PyDoc_STRVAR(xmlparse_Parse__doc__,
 "Parse(data[, isfinal])\n\
-Parse XML data.  `isfinal' should be true at end of input.";
+Parse XML data.  `isfinal' should be true at end of input.");
 
 static PyObject *
 xmlparse_Parse(xmlparseobject *self, PyObject *args)
@@ -695,9 +695,9 @@
     return len;
 }
 
-static char xmlparse_ParseFile__doc__[] = 
+PyDoc_STRVAR(xmlparse_ParseFile__doc__,
 "ParseFile(file)\n\
-Parse XML data from file-like object.";
+Parse XML data from file-like object.");
 
 static PyObject *
 xmlparse_ParseFile(xmlparseobject *self, PyObject *args)
@@ -754,9 +754,9 @@
     return Py_BuildValue("i", rv);
 }
 
-static char xmlparse_SetBase__doc__[] = 
+PyDoc_STRVAR(xmlparse_SetBase__doc__,
 "SetBase(base_url)\n\
-Set the base URL for the parser.";
+Set the base URL for the parser.");
 
 static PyObject *
 xmlparse_SetBase(xmlparseobject *self, PyObject *args)
@@ -772,9 +772,9 @@
     return Py_None;
 }
 
-static char xmlparse_GetBase__doc__[] = 
+PyDoc_STRVAR(xmlparse_GetBase__doc__,
 "GetBase() -> url\n\
-Return base URL string for the parser.";
+Return base URL string for the parser.");
 
 static PyObject *
 xmlparse_GetBase(xmlparseobject *self, PyObject *args)
@@ -785,11 +785,11 @@
     return Py_BuildValue("z", XML_GetBase(self->itself));
 }
 
-static char xmlparse_GetInputContext__doc__[] =
+PyDoc_STRVAR(xmlparse_GetInputContext__doc__,
 "GetInputContext() -> string\n\
 Return the untranslated text of the input that caused the current event.\n\
 If the event was generated by a large amount of text (such as a start tag\n\
-for an element with many attributes), not all of the text may be available.";
+for an element with many attributes), not all of the text may be available.");
 
 static PyObject *
 xmlparse_GetInputContext(xmlparseobject *self, PyObject *args)
@@ -817,10 +817,10 @@
     return result;
 }
 
-static char xmlparse_ExternalEntityParserCreate__doc__[] = 
+PyDoc_STRVAR(xmlparse_ExternalEntityParserCreate__doc__,
 "ExternalEntityParserCreate(context[, encoding])\n\
 Create a parser for parsing an external entity based on the\n\
-information passed to the ExternalEntityRefHandler.";
+information passed to the ExternalEntityRefHandler.");
 
 static PyObject *
 xmlparse_ExternalEntityParserCreate(xmlparseobject *self, PyObject *args)
@@ -892,13 +892,13 @@
     return (PyObject *)new_parser;    
 }
 
-static char xmlparse_SetParamEntityParsing__doc__[] =
+PyDoc_STRVAR(xmlparse_SetParamEntityParsing__doc__,
 "SetParamEntityParsing(flag) -> success\n\
 Controls parsing of parameter entities (including the external DTD\n\
 subset). Possible flag values are XML_PARAM_ENTITY_PARSING_NEVER,\n\
 XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE and\n\
 XML_PARAM_ENTITY_PARSING_ALWAYS. Returns true if setting the flag\n\
-was successful.";
+was successful.");
 
 static PyObject*
 xmlparse_SetParamEntityParsing(xmlparseobject *p, PyObject* args)
@@ -1225,8 +1225,7 @@
 }
 #endif
 
-static char Xmlparsetype__doc__[] = 
-"XML parser";
+PyDoc_STRVAR(Xmlparsetype__doc__, "XML parser");
 
 static PyTypeObject Xmlparsetype = {
 	PyObject_HEAD_INIT(NULL)
@@ -1267,9 +1266,9 @@
 /* End of code for xmlparser objects */
 /* -------------------------------------------------------- */
 
-static char pyexpat_ParserCreate__doc__[] =
+PyDoc_STRVAR(pyexpat_ParserCreate__doc__,
 "ParserCreate([encoding[, namespace_separator]]) -> parser\n\
-Return a new XML parser object.";
+Return a new XML parser object.");
 
 static PyObject *
 pyexpat_ParserCreate(PyObject *notused, PyObject *args, PyObject *kw)
@@ -1291,9 +1290,9 @@
     return newxmlparseobject(encoding, namespace_separator);
 }
 
-static char pyexpat_ErrorString__doc__[] =
+PyDoc_STRVAR(pyexpat_ErrorString__doc__,
 "ErrorString(errno) -> string\n\
-Returns string error for given number.";
+Returns string error for given number.");
 
 static PyObject *
 pyexpat_ErrorString(PyObject *self, PyObject *args)
@@ -1318,8 +1317,8 @@
 
 /* Module docstring */
 
-static char pyexpat_module_documentation[] = 
-"Python wrapper for Expat parser.";
+PyDoc_STRVAR(pyexpat_module_documentation,
+"Python wrapper for Expat parser.");
 
 #if PY_VERSION_HEX < 0x20000F0
 
diff --git a/Modules/readline.c b/Modules/readline.c
index 1ca8ec3..afd80db 100644
--- a/Modules/readline.c
+++ b/Modules/readline.c
@@ -46,10 +46,9 @@
 	return Py_None;
 }
 
-static char doc_parse_and_bind[] = "\
-parse_and_bind(string) -> None\n\
-Parse and execute single line of a readline init file.\
-";
+PyDoc_STRVAR(doc_parse_and_bind,
+"parse_and_bind(string) -> None\n\
+Parse and execute single line of a readline init file.");
 
 
 /* Exported function to parse a readline init file */
@@ -67,11 +66,10 @@
 	return Py_None;
 }
 
-static char doc_read_init_file[] = "\
-read_init_file([filename]) -> None\n\
+PyDoc_STRVAR(doc_read_init_file,
+"read_init_file([filename]) -> None\n\
 Parse a readline initialization file.\n\
-The default filename is the last filename used.\
-";
+The default filename is the last filename used.");
 
 
 /* Exported function to load a readline history file */
@@ -90,11 +88,10 @@
 }
 
 static int history_length = -1; /* do not truncate history by default */
-static char doc_read_history_file[] = "\
-read_history_file([filename]) -> None\n\
+PyDoc_STRVAR(doc_read_history_file,
+"read_history_file([filename]) -> None\n\
 Load a readline history file.\n\
-The default filename is ~/.history.\
-";
+The default filename is ~/.history.");
 
 
 /* Exported function to save a readline history file */
@@ -114,19 +111,17 @@
 	return Py_None;
 }
 
-static char doc_write_history_file[] = "\
-write_history_file([filename]) -> None\n\
+PyDoc_STRVAR(doc_write_history_file,
+"write_history_file([filename]) -> None\n\
 Save a readline history file.\n\
-The default filename is ~/.history.\
-";
+The default filename is ~/.history.");
 
 
-static char set_history_length_doc[] = "\
-set_history_length(length) -> None\n\
+PyDoc_STRVAR(set_history_length_doc,
+"set_history_length(length) -> None\n\
 set the maximal number of items which will be written to\n\
 the history file. A negative length is used to inhibit\n\
-history truncation.\n\
-";
+history truncation.");
 
 static PyObject*
 set_history_length(PyObject *self, PyObject *args)
@@ -141,11 +136,10 @@
 
 
 
-static char get_history_length_doc[] = "\
-get_history_length() -> int\n\
+PyDoc_STRVAR(get_history_length_doc,
+"get_history_length() -> int\n\
 return the maximum number of items that will be written to\n\
-the history file.\n\
-";
+the history file.");
 
 static PyObject*
 get_history_length(PyObject *self, PyObject *args)
@@ -204,12 +198,11 @@
 	return set_hook("startup_hook", &startup_hook, &startup_hook_tstate, args);
 }
 
-static char doc_set_startup_hook[] = "\
-set_startup_hook([function]) -> None\n\
+PyDoc_STRVAR(doc_set_startup_hook,
+"set_startup_hook([function]) -> None\n\
 Set or remove the startup_hook function.\n\
 The function is called with no arguments just\n\
-before readline prints the first prompt.\n\
-";
+before readline prints the first prompt.");
 
 #ifdef HAVE_RL_PRE_INPUT_HOOK
 static PyObject *
@@ -218,13 +211,12 @@
 	return set_hook("pre_input_hook", &pre_input_hook,  &pre_input_hook_tstate, args);
 }
 
-static char doc_set_pre_input_hook[] = "\
-set_pre_input_hook([function]) -> None\n\
+PyDoc_STRVAR(doc_set_pre_input_hook,
+"set_pre_input_hook([function]) -> None\n\
 Set or remove the pre_input_hook function.\n\
 The function is called with no arguments after the first prompt\n\
 has been printed and just before readline starts reading input\n\
-characters.\n\
-";
+characters.");
 #endif
 
 /* Exported function to specify a word completer in Python */
@@ -243,9 +235,9 @@
 	return begidx;
 }
 
-static char doc_get_begidx[] = "\
-get_begidx() -> int\n\
-get the beginning index of the readline tab-completion scope";
+PyDoc_STRVAR(doc_get_begidx,
+"get_begidx() -> int\n\
+get the beginning index of the readline tab-completion scope");
 
 /* get the ending index for the scope of the tab-completion */
 static PyObject *
@@ -255,9 +247,9 @@
 	return endidx;
 }
 
-static char doc_get_endidx[] = "\
-get_endidx() -> int\n\
-get the ending index of the readline tab-completion scope";
+PyDoc_STRVAR(doc_get_endidx,
+"get_endidx() -> int\n\
+get the ending index of the readline tab-completion scope");
 
 
 /* set the tab-completion word-delimiters that readline uses */
@@ -276,9 +268,9 @@
 	return Py_None;
 }
 
-static char doc_set_completer_delims[] = "\
-set_completer_delims(string) -> None\n\
-set the readline word delimiters for tab-completion";
+PyDoc_STRVAR(doc_set_completer_delims,
+"set_completer_delims(string) -> None\n\
+set the readline word delimiters for tab-completion");
 
 static PyObject *
 py_add_history(PyObject *self, PyObject *args)
@@ -293,9 +285,9 @@
 	return Py_None;
 }
 
-static char doc_add_history[] = "\
-add_history(string) -> None\n\
-add a line to the history buffer";
+PyDoc_STRVAR(doc_add_history,
+"add_history(string) -> None\n\
+add a line to the history buffer");
 
 
 /* get the tab-completion word-delimiters that readline uses */
@@ -306,9 +298,9 @@
 	return PyString_FromString(rl_completer_word_break_characters);
 }
 	
-static char doc_get_completer_delims[] = "\
-get_completer_delims() -> string\n\
-get the readline word delimiters for tab-completion";
+PyDoc_STRVAR(doc_get_completer_delims,
+"get_completer_delims() -> string\n\
+get the readline word delimiters for tab-completion");
 
 static PyObject *
 set_completer(PyObject *self, PyObject *args)
@@ -316,13 +308,12 @@
 	return set_hook("completer", &completer, &completer_tstate, args);
 }
 
-static char doc_set_completer[] = "\
-set_completer([function]) -> None\n\
+PyDoc_STRVAR(doc_set_completer,
+"set_completer([function]) -> None\n\
 Set or remove the completer function.\n\
 The function is called as function(text, state),\n\
 for state in 0, 1, 2, ..., until it returns a non-string.\n\
-It should return the next possible completion starting with 'text'.\
-";
+It should return the next possible completion starting with 'text'.");
 
 /* Exported function to get any element of history */
 
@@ -342,10 +333,9 @@
 	}
 }
 
-static char doc_get_history_item[] = "\
-get_history_item() -> string\n\
-return the current contents of history item at index.\
-";
+PyDoc_STRVAR(doc_get_history_item,
+"get_history_item() -> string\n\
+return the current contents of history item at index.");
 
 /* Exported function to get current length of history */
 
@@ -358,10 +348,9 @@
 	return PyInt_FromLong(hist_st ? (long) hist_st->length : (long) 0);
 }
 
-static char doc_get_current_history_length[] = "\
-get_current_history_length() -> integer\n\
-return the current (not the maximum) length of history.\
-";
+PyDoc_STRVAR(doc_get_current_history_length,
+"get_current_history_length() -> integer\n\
+return the current (not the maximum) length of history.");
 
 /* Exported function to read the current line buffer */
 
@@ -371,10 +360,9 @@
 	return PyString_FromString(rl_line_buffer);
 }
 
-static char doc_get_line_buffer[] = "\
-get_line_buffer() -> string\n\
-return the current contents of the line buffer.\
-";
+PyDoc_STRVAR(doc_get_line_buffer,
+"get_line_buffer() -> string\n\
+return the current contents of the line buffer.");
 
 /* Exported function to insert text into the line buffer */
 
@@ -389,10 +377,9 @@
 	return Py_None;
 }
 
-static char doc_insert_text[] = "\
-insert_text(string) -> None\n\
-Insert text into the command line.\
-";
+PyDoc_STRVAR(doc_insert_text,
+"insert_text(string) -> None\n\
+Insert text into the command line.");
 
 static PyObject *
 redisplay(PyObject *self)
@@ -402,11 +389,10 @@
 	return Py_None;
 }
 
-static char doc_redisplay[] = "\
-redisplay() -> None\n\
+PyDoc_STRVAR(doc_redisplay,
+"redisplay() -> None\n\
 Change what's displayed on the screen to reflect the current\n\
-contents of the line buffer.\
-";
+contents of the line buffer.");
 
 /* Table of functions exported by the module */
 
@@ -663,8 +649,8 @@
 
 /* Initialize the module */
 
-static char doc_module[] =
-"Importing this module enables command line editing using GNU readline.";
+PyDoc_STRVAR(doc_module,
+"Importing this module enables command line editing using GNU readline.");
 
 DL_EXPORT(void)
 initreadline(void)
diff --git a/Modules/resource.c b/Modules/resource.c
index 9881314..5ed98a1 100644
--- a/Modules/resource.c
+++ b/Modules/resource.c
@@ -17,12 +17,12 @@
 
 static PyObject *ResourceError;
 
-static char struct_rusage__doc__[] =
-	"struct_rusage: Result from getrusage.\n\n"
-	"This object may be accessed either as a tuple of\n"
-	"    (utime,stime,maxrss,ixrss,idrss,isrss,minflt,majflt,\n"
-	"    nswap,inblock,oublock,msgsnd,msgrcv,nsignals,nvcsw,nivcsw)\n"
-	"or via the attributes ru_utime, ru_stime, ru_maxrss, and so on.\n";
+PyDoc_STRVAR(struct_rusage__doc__,
+"struct_rusage: Result from getrusage.\n\n"
+"This object may be accessed either as a tuple of\n"
+"    (utime,stime,maxrss,ixrss,idrss,isrss,minflt,majflt,\n"
+"    nswap,inblock,oublock,msgsnd,msgrcv,nsignals,nvcsw,nivcsw)\n"
+"or via the attributes ru_utime, ru_stime, ru_maxrss, and so on.");
 
 static PyStructSequence_Field struct_rusage_fields[] = {
 	{"ru_utime",	"user time used"},
diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c
index bdd3a52..73abd4f 100644
--- a/Modules/selectmodule.c
+++ b/Modules/selectmodule.c
@@ -351,12 +351,12 @@
 	return 1;
 }
 
-static char poll_register_doc[] =
+PyDoc_STRVAR(poll_register_doc,
 "register(fd [, eventmask] ) -> None\n\n\
 Register a file descriptor with the polling object.\n\
 fd -- either an integer, or an object with a fileno() method returning an\n\
       int.\n\
-events -- an optional bitmask describing the type of events to check for";
+events -- an optional bitmask describing the type of events to check for");
 
 static PyObject *
 poll_register(pollObject *self, PyObject *args) 
@@ -394,9 +394,9 @@
 	return Py_None;
 }
 
-static char poll_unregister_doc[] =
+PyDoc_STRVAR(poll_unregister_doc,
 "unregister(fd) -> None\n\n\
-Remove a file descriptor being tracked by the polling object.";
+Remove a file descriptor being tracked by the polling object.");
 
 static PyObject *
 poll_unregister(pollObject *self, PyObject *args) 
@@ -431,10 +431,10 @@
 	return Py_None;
 }
 
-static char poll_poll_doc[] =
+PyDoc_STRVAR(poll_poll_doc,
 "poll( [timeout] ) -> list of (fd, event) 2-tuples\n\n\
 Polls the set of registered file descriptors, returning a list containing \n\
-any descriptors that have events or errors to report.";
+any descriptors that have events or errors to report.");
 
 static PyObject *
 poll_poll(pollObject *self, PyObject *args) 
@@ -580,9 +580,9 @@
 	0,			/*tp_hash*/
 };
 
-static char poll_doc[] = 
+PyDoc_STRVAR(poll_doc,
 "Returns a polling object, which supports registering and\n\
-unregistering file descriptors, and then polling them for I/O events.";
+unregistering file descriptors, and then polling them for I/O events.");
 
 static PyObject *
 select_poll(PyObject *self, PyObject *args)
@@ -598,7 +598,7 @@
 }
 #endif /* HAVE_POLL */
 
-static char select_doc[] =
+PyDoc_STRVAR(select_doc,
 "select(rlist, wlist, xlist[, timeout]) -> (rlist, wlist, xlist)\n\
 \n\
 Wait until one or more file descriptors are ready for some kind of I/O.\n\
@@ -619,7 +619,7 @@
 that are ready.\n\
 \n\
 *** IMPORTANT NOTICE ***\n\
-On Windows, only sockets are supported; on Unix, all file descriptors.";
+On Windows, only sockets are supported; on Unix, all file descriptors.");
 
 static PyMethodDef select_methods[] = {
     {"select",	select_select, METH_VARARGS, select_doc},
@@ -629,11 +629,11 @@
     {0,  	0},			     /* sentinel */
 };
 
-static char module_doc[] =
+PyDoc_STRVAR(module_doc,
 "This module supports asynchronous I/O on multiple file descriptors.\n\
 \n\
 *** IMPORTANT NOTICE ***\n\
-On Windows, only sockets are supported; on Unix, all file descriptors.";
+On Windows, only sockets are supported; on Unix, all file descriptors.");
 
 DL_EXPORT(void)
 initselect(void)
diff --git a/Modules/shamodule.c b/Modules/shamodule.c
index bb9d37a..94b1eff 100644
--- a/Modules/shamodule.c
+++ b/Modules/shamodule.c
@@ -350,8 +350,7 @@
 
 /* External methods for a hashing object */
 
-static char SHA_copy__doc__[] = 
-"Return a copy of the hashing object.";
+PyDoc_STRVAR(SHA_copy__doc__, "Return a copy of the hashing object.");
 
 static PyObject *
 SHA_copy(SHAobject *self, PyObject *args)
@@ -368,8 +367,8 @@
     return (PyObject *)newobj;
 }
 
-static char SHA_digest__doc__[] = 
-"Return the digest value as a string of binary data.";
+PyDoc_STRVAR(SHA_digest__doc__,
+"Return the digest value as a string of binary data.");
 
 static PyObject *
 SHA_digest(SHAobject *self, PyObject *args)
@@ -385,8 +384,8 @@
     return PyString_FromStringAndSize((const char *)digest, sizeof(digest));
 }
 
-static char SHA_hexdigest__doc__[] = 
-"Return the digest value as a string of hexadecimal digits.";
+PyDoc_STRVAR(SHA_hexdigest__doc__,
+"Return the digest value as a string of hexadecimal digits.");
 
 static PyObject *
 SHA_hexdigest(SHAobject *self, PyObject *args)
@@ -427,8 +426,8 @@
     return retval;
 }
 
-static char SHA_update__doc__[] = 
-"Update this hashing object's state with the provided string.";
+PyDoc_STRVAR(SHA_update__doc__,
+"Update this hashing object's state with the provided string.");
 
 static PyObject *
 SHA_update(SHAobject *self, PyObject *args)
@@ -479,10 +478,10 @@
 
 /* The single module-level function: new() */
 
-static char SHA_new__doc__[] =
- "Return a new SHA hashing object.  An optional string "
- "argument may be provided; if present, this string will be "
- " automatically hashed."; 
+PyDoc_STRVAR(SHA_new__doc__,
+"Return a new SHA hashing object.  An optional string argument\n\
+may be provided; if present, this string will be automatically\n\
+hashed.");
 
 static PyObject *
 SHA_new(PyObject *self, PyObject *args, PyObject *kwdict)
diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c
index 3cea2dd..395e654 100644
--- a/Modules/signalmodule.c
+++ b/Modules/signalmodule.c
@@ -96,11 +96,11 @@
 	return NULL;
 }
 
-static char default_int_handler_doc[] =
+PyDoc_STRVAR(default_int_handler_doc,
 "default_int_handler(...)\n\
 \n\
 The default handler for SIGINT instated by Python.\n\
-It raises KeyboardInterrupt.";
+It raises KeyboardInterrupt.");
 
 
 static int
@@ -155,10 +155,10 @@
 	return PyInt_FromLong((long)alarm(t));
 }
 
-static char alarm_doc[] =
+PyDoc_STRVAR(alarm_doc,
 "alarm(seconds)\n\
 \n\
-Arrange for SIGALRM to arrive after the given number of seconds.";
+Arrange for SIGALRM to arrive after the given number of seconds.");
 #endif
 
 #ifdef HAVE_PAUSE
@@ -177,10 +177,10 @@
 	Py_INCREF(Py_None);
 	return Py_None;
 }
-static char pause_doc[] =
+PyDoc_STRVAR(pause_doc,
 "pause()\n\
 \n\
-Wait until a signal arrives.";
+Wait until a signal arrives.");
 
 #endif
 
@@ -231,7 +231,7 @@
 	return old_handler;
 }
 
-static char signal_doc[] =
+PyDoc_STRVAR(signal_doc,
 "signal(sig, action) -> action\n\
 \n\
 Set the action for the given signal.  The action can be SIG_DFL,\n\
@@ -240,7 +240,7 @@
 \n\
 *** IMPORTANT NOTICE ***\n\
 A signal handler function is called with two arguments:\n\
-the first is the signal number, the second is the interrupted stack frame.";
+the first is the signal number, the second is the interrupted stack frame.");
 
 
 static PyObject *
@@ -260,15 +260,14 @@
 	return old_handler;
 }
 
-static char getsignal_doc[] =
+PyDoc_STRVAR(getsignal_doc,
 "getsignal(sig) -> action\n\
 \n\
 Return the current action for the given signal.  The return value can be:\n\
 SIG_IGN -- if the signal is being ignored\n\
 SIG_DFL -- if the default action for the signal is in effect\n\
 None -- if an unknown handler is in effect\n\
-anything else -- the callable Python object used as a handler\n\
-";
+anything else -- the callable Python object used as a handler");
 
 #ifdef HAVE_SIGPROCMASK /* we assume that having SIGPROCMASK is enough
 			   to guarantee full POSIX signal handling */
@@ -353,7 +352,7 @@
 	return _signal_sigset_to_list(&oldset);
 }
 
-static char sigprocmask_doc[] = 
+PyDoc_STRVAR(sigprocmask_doc,
 "sigprocmask(how, sigset) -> sigset\n\
 \n\
 Change the list of currently blocked signals.  The parameter how should be\n\
@@ -371,7 +370,7 @@
   SIG_SETMASK\n\
     The set of blocked signals is set to the argument set.\n\
 \n\
-A list contating the numbers of the previously blocked signals is returned.";
+A list contating the numbers of the previously blocked signals is returned.");
 
 static PyObject*
 signal_sigpending(PyObject* self)
@@ -385,11 +384,11 @@
 	return _signal_sigset_to_list(&set);
 }
 
-static char sigpending_doc[] = 
+PyDoc_STRVAR(sigpending_doc,
 "sigpending() -> sigset\n\
 \n\
 Return the set of pending signals, i.e. a list containing the numbers of\n\
-those signals that have been raised while blocked.";
+those signals that have been raised while blocked.");
 
 static PyObject*
 signal_sigsuspend(PyObject* self, PyObject* arg)
@@ -411,11 +410,11 @@
 	return Py_None;
 }
 
-static char sigsuspend_doc[] = 
+PyDoc_STRVAR(sigsuspend_doc,
 "sigsuspend(sigset) -> None\n\
 \n\
 Temporarily replace the signal mask with sigset (which should be a sequence\n\
-of signal numbers) and suspend the process until a signal is received.";
+of signal numbers) and suspend the process until a signal is received.");
 #endif
 
 /* List of functions defined in the module */
@@ -443,7 +442,7 @@
 };
 
 
-static char module_doc[] =
+PyDoc_STRVAR(module_doc,
 "This module provides mechanisms to use signal handlers in Python.\n\
 \n\
 Functions:\n\
@@ -468,7 +467,7 @@
 \n\
 *** IMPORTANT NOTICE ***\n\
 A signal handler function is called with two arguments:\n\
-the first is the signal number, the second is the interrupted stack frame.";
+the first is the signal number, the second is the interrupted stack frame.");
 
 DL_EXPORT(void)
 initsignal(void)
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index 1da9afb..477dc31 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -56,8 +56,10 @@
 
 */
 
+#include "Python.h"
+
 /* Socket object documentation */
-static char sock_doc[] =
+PyDoc_STRVAR(sock_doc,
 "socket([family[, type[, proto]]]) -> socket object\n\
 \n\
 Open a socket of the given type.  The family argument specifies the\n\
@@ -93,9 +95,7 @@
 settimeout(None | float) -- set or clear the timeout\n\
 shutdown(how) -- shut down traffic in one or both directions\n\
 \n\
- [*] not available on all platforms!";
-
-#include "Python.h"
+ [*] not available on all platforms!");
 
 /* XXX This is a terrible mess of of platform-dependent preprocessor hacks.
    I hope some day someone can clean this up please... */
@@ -1001,12 +1001,12 @@
 	return res;
 }
 
-static char accept_doc[] =
+PyDoc_STRVAR(accept_doc,
 "accept() -> (socket object, address info)\n\
 \n\
 Wait for an incoming connection.  Return a new socket representing the\n\
 connection, and the address of the client.  For IP sockets, the address\n\
-info is a pair (hostaddr, port).";
+info is a pair (hostaddr, port).");
 
 /* s.setblocking(flag) method.  Argument:
    False -- non-blocking mode; same as settimeout(0)
@@ -1029,12 +1029,12 @@
 	return Py_None;
 }
 
-static char setblocking_doc[] =
+PyDoc_STRVAR(setblocking_doc,
 "setblocking(flag)\n\
 \n\
 Set the socket to blocking (flag is true) or non-blocking (false).\n\
 setblocking(True) is equivalent to settimeout(None);\n\
-setblocking(False) is equivalent to settimeout(0.0).";
+setblocking(False) is equivalent to settimeout(0.0).");
 
 /* s.settimeout(timeout) method.  Argument:
    None -- no timeout, blocking mode; same as setblocking(True)
@@ -1066,13 +1066,13 @@
 	return Py_None;
 }
 
-static char settimeout_doc[] =
+PyDoc_STRVAR(settimeout_doc,
 "settimeout(timeout)\n\
 \n\
 Set a timeout on socket operations.  'timeout' can be a float,\n\
 giving in seconds, or None.  Setting a timeout of None disables\n\
 the timeout feature and is equivalent to setblocking(1).\n\
-Setting a timeout of zero is the same as setblocking(0).";
+Setting a timeout of zero is the same as setblocking(0).");
 
 /* s.gettimeout() method.
    Returns the timeout associated with a socket. */
@@ -1087,12 +1087,12 @@
 		return PyFloat_FromDouble(s->sock_timeout);
 }
 
-static char gettimeout_doc[] =
+PyDoc_STRVAR(gettimeout_doc,
 "gettimeout()\n\
 \n\
 Returns the timeout in floating seconds associated with socket \n\
 operations. A timeout of None indicates that timeouts on socket \n\
-operations are disabled.";
+operations are disabled.");
 
 #ifdef RISCOS
 /* s.sleeptaskw(1 | 0) method */
@@ -1111,10 +1111,10 @@
 	Py_INCREF(Py_None);
 	return Py_None;
 }
-static char sleeptaskw_doc[] =
+PyDoc_STRVAR(sleeptaskw_doc,
 "sleeptaskw(flag)\n\
 \n\
-Allow sleeps in taskwindows.";
+Allow sleeps in taskwindows.");
 #endif
 
 
@@ -1151,11 +1151,11 @@
 	return Py_None;
 }
 
-static char setsockopt_doc[] =
+PyDoc_STRVAR(setsockopt_doc,
 "setsockopt(level, option, value)\n\
 \n\
 Set a socket option.  See the Unix manual for level and option.\n\
-The value argument can either be an integer or a string.";
+The value argument can either be an integer or a string.");
 
 
 /* s.getsockopt() method.
@@ -1210,12 +1210,12 @@
 #endif /* __BEOS__ */
 }
 
-static char getsockopt_doc[] =
+PyDoc_STRVAR(getsockopt_doc,
 "getsockopt(level, option[, buffersize]) -> value\n\
 \n\
 Get a socket option.  See the Unix manual for level and option.\n\
 If a nonzero buffersize argument is given, the return value is a\n\
-string of that length; otherwise it is an integer.";
+string of that length; otherwise it is an integer.");
 
 
 /* s.bind(sockaddr) method */
@@ -1238,12 +1238,12 @@
 	return Py_None;
 }
 
-static char bind_doc[] =
+PyDoc_STRVAR(bind_doc,
 "bind(address)\n\
 \n\
 Bind the socket to a local address.  For IP sockets, the address is a\n\
 pair (host, port); the host must refer to the local host. For raw packet\n\
-sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])";
+sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
 
 
 /* s.close() method.
@@ -1265,10 +1265,10 @@
 	return Py_None;
 }
 
-static char close_doc[] =
+PyDoc_STRVAR(close_doc,
 "close()\n\
 \n\
-Close the socket.  It cannot be used after this call.";
+Close the socket.  It cannot be used after this call.");
 
 static int
 internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen)
@@ -1330,11 +1330,11 @@
 	return Py_None;
 }
 
-static char connect_doc[] =
+PyDoc_STRVAR(connect_doc,
 "connect(address)\n\
 \n\
 Connect the socket to a remote address.  For IP sockets, the address\n\
-is a pair (host, port).";
+is a pair (host, port).");
 
 
 /* s.connect_ex(sockaddr) method */
@@ -1356,11 +1356,11 @@
 	return PyInt_FromLong((long) res);
 }
 
-static char connect_ex_doc[] =
+PyDoc_STRVAR(connect_ex_doc,
 "connect_ex(address)\n\
 \n\
 This is like connect(address), but returns an error code (the errno value)\n\
-instead of raising an exception when an error occurs.";
+instead of raising an exception when an error occurs.");
 
 
 /* s.fileno() method */
@@ -1375,10 +1375,10 @@
 #endif
 }
 
-static char fileno_doc[] =
+PyDoc_STRVAR(fileno_doc,
 "fileno() -> integer\n\
 \n\
-Return the integer file descriptor of the socket.";
+Return the integer file descriptor of the socket.");
 
 
 #ifndef NO_DUP
@@ -1402,10 +1402,10 @@
 	return sock;
 }
 
-static char dup_doc[] =
+PyDoc_STRVAR(dup_doc,
 "dup() -> socket object\n\
 \n\
-Return a new socket object connected to the same system resource.";
+Return a new socket object connected to the same system resource.");
 
 #endif
 
@@ -1430,11 +1430,11 @@
 	return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
 }
 
-static char getsockname_doc[] =
+PyDoc_STRVAR(getsockname_doc,
 "getsockname() -> address info\n\
 \n\
 Return the address of the local endpoint.  For IP sockets, the address\n\
-info is a pair (hostaddr, port).";
+info is a pair (hostaddr, port).");
 
 
 #ifdef HAVE_GETPEERNAME		/* Cray APP doesn't have this :-( */
@@ -1458,11 +1458,11 @@
 	return makesockaddr(s->sock_fd, (struct sockaddr *) addrbuf, addrlen);
 }
 
-static char getpeername_doc[] =
+PyDoc_STRVAR(getpeername_doc,
 "getpeername() -> address info\n\
 \n\
 Return the address of the remote endpoint.  For IP sockets, the address\n\
-info is a pair (hostaddr, port).";
+info is a pair (hostaddr, port).");
 
 #endif /* HAVE_GETPEERNAME */
 
@@ -1489,12 +1489,12 @@
 	return Py_None;
 }
 
-static char listen_doc[] =
+PyDoc_STRVAR(listen_doc,
 "listen(backlog)\n\
 \n\
 Enable a server to accept connections.  The backlog argument must be at\n\
 least 1; it specifies the number of unaccepted connection that the system\n\
-will allow before refusing new connections.";
+will allow before refusing new connections.");
 
 
 #ifndef NO_DUP
@@ -1543,11 +1543,11 @@
 	return f;
 }
 
-static char makefile_doc[] =
+PyDoc_STRVAR(makefile_doc,
 "makefile([mode[, buffersize]]) -> file object\n\
 \n\
 Return a regular file object corresponding to the socket.\n\
-The mode and buffersize arguments are as for the built-in open() function.";
+The mode and buffersize arguments are as for the built-in open() function.");
 
 #endif /* NO_DUP */
 
@@ -1587,13 +1587,13 @@
 	return buf;
 }
 
-static char recv_doc[] =
+PyDoc_STRVAR(recv_doc,
 "recv(buffersize[, flags]) -> data\n\
 \n\
 Receive up to buffersize bytes from the socket.  For the optional flags\n\
 argument, see the Unix manual.  When no data is available, block until\n\
 at least one byte is available or until the remote end is closed.  When\n\
-the remote end is closed and all data is read, return the empty string.";
+the remote end is closed and all data is read, return the empty string.");
 
 
 /* s.recvfrom(nbytes [,flags]) method */
@@ -1653,10 +1653,10 @@
 	return ret;
 }
 
-static char recvfrom_doc[] =
+PyDoc_STRVAR(recvfrom_doc,
 "recvfrom(buffersize[, flags]) -> (data, address info)\n\
 \n\
-Like recv(buffersize, flags) but also return the sender's address info.";
+Like recv(buffersize, flags) but also return the sender's address info.");
 
 /* s.send(data [,flags]) method */
 
@@ -1679,12 +1679,12 @@
 	return PyInt_FromLong((long)n);
 }
 
-static char send_doc[] =
+PyDoc_STRVAR(send_doc,
 "send(data[, flags]) -> count\n\
 \n\
 Send a data string to the socket.  For the optional flags\n\
 argument, see the Unix manual.  Return the number of bytes\n\
-sent; this may be less than len(data) if the network is busy.";
+sent; this may be less than len(data) if the network is busy.");
 
 
 /* s.sendall(data [,flags]) method */
@@ -1716,13 +1716,13 @@
 	return Py_None;
 }
 
-static char sendall_doc[] =
+PyDoc_STRVAR(sendall_doc,
 "sendall(data[, flags])\n\
 \n\
 Send a data string to the socket.  For the optional flags\n\
 argument, see the Unix manual.  This calls send() repeatedly\n\
 until all data is sent.  If an error occurs, it's impossible\n\
-to tell how much data has been sent.";
+to tell how much data has been sent.");
 
 
 /* s.sendto(data, [flags,] sockaddr) method */
@@ -1756,11 +1756,11 @@
 	return PyInt_FromLong((long)n);
 }
 
-static char sendto_doc[] =
+PyDoc_STRVAR(sendto_doc,
 "sendto(data[, flags], address)\n\
 \n\
 Like send(data, flags) but allows specifying the destination address.\n\
-For IP sockets, the address is a pair (hostaddr, port).";
+For IP sockets, the address is a pair (hostaddr, port).");
 
 
 /* s.shutdown(how) method */
@@ -1783,11 +1783,11 @@
 	return Py_None;
 }
 
-static char shutdown_doc[] =
+PyDoc_STRVAR(shutdown_doc,
 "shutdown(flag)\n\
 \n\
 Shut down the reading side of the socket (flag == 0), the writing side\n\
-of the socket (flag == 1), or both ends (flag == 2).";
+of the socket (flag == 1), or both ends (flag == 2).");
 
 
 /* List of methods for socket objects */
@@ -2011,10 +2011,10 @@
 	return PyString_FromString(buf);
 }
 
-static char gethostname_doc[] =
+PyDoc_STRVAR(gethostname_doc,
 "gethostname() -> string\n\
 \n\
-Return the current host name.";
+Return the current host name.");
 
 
 /* Python interface to gethostbyname(name). */
@@ -2034,10 +2034,10 @@
 		sizeof(struct sockaddr_in));
 }
 
-static char gethostbyname_doc[] =
+PyDoc_STRVAR(gethostbyname_doc,
 "gethostbyname(host) -> address\n\
 \n\
-Return the IP address (a string of the form '255.255.255.255') for a host.";
+Return the IP address (a string of the form '255.255.255.255') for a host.");
 
 
 /* Convenience function common to gethostbyname_ex and gethostbyaddr */
@@ -2235,11 +2235,11 @@
 	return ret;
 }
 
-static char ghbn_ex_doc[] =
+PyDoc_STRVAR(ghbn_ex_doc,
 "gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
 \n\
 Return the true host name, a list of aliases, and a list of IP addresses,\n\
-for a host.  The host argument is a string giving a host name or IP number.";
+for a host.  The host argument is a string giving a host name or IP number.");
 
 
 /* Python interface to gethostbyaddr(IP). */
@@ -2325,11 +2325,11 @@
 	return ret;
 }
 
-static char gethostbyaddr_doc[] =
+PyDoc_STRVAR(gethostbyaddr_doc,
 "gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
 \n\
 Return the true host name, a list of aliases, and a list of IP addresses,\n\
-for a host.  The host argument is a string giving a host name or IP number.";
+for a host.  The host argument is a string giving a host name or IP number.");
 
 
 /* Python interface to getservbyname(name).
@@ -2354,11 +2354,11 @@
 	return PyInt_FromLong((long) ntohs(sp->s_port));
 }
 
-static char getservbyname_doc[] =
+PyDoc_STRVAR(getservbyname_doc,
 "getservbyname(servicename, protocolname) -> integer\n\
 \n\
 Return a port number from a service name and protocol name.\n\
-The protocol name should be 'tcp' or 'udp'.";
+The protocol name should be 'tcp' or 'udp'.");
 
 
 /* Python interface to getprotobyname(name).
@@ -2389,10 +2389,10 @@
 #endif
 }
 
-static char getprotobyname_doc[] =
+PyDoc_STRVAR(getprotobyname_doc,
 "getprotobyname(name) -> integer\n\
 \n\
-Return the protocol number for the named protocol.  (Rarely used.)";
+Return the protocol number for the named protocol.  (Rarely used.)");
 
 
 #ifndef NO_DUP
@@ -2423,11 +2423,11 @@
 	return (PyObject *) s;
 }
 
-static char fromfd_doc[] =
+PyDoc_STRVAR(fromfd_doc,
 "fromfd(fd, family, type[, proto]) -> socket object\n\
 \n\
 Create a socket object from the given file descriptor.\n\
-The remaining arguments are the same as for socket().";
+The remaining arguments are the same as for socket().");
 
 #endif /* NO_DUP */
 
@@ -2444,10 +2444,10 @@
 	return PyInt_FromLong(x2);
 }
 
-static char ntohs_doc[] =
+PyDoc_STRVAR(ntohs_doc,
 "ntohs(integer) -> integer\n\
 \n\
-Convert a 16-bit integer from network to host byte order.";
+Convert a 16-bit integer from network to host byte order.");
 
 
 static PyObject *
@@ -2462,10 +2462,10 @@
 	return PyInt_FromLong(x2);
 }
 
-static char ntohl_doc[] =
+PyDoc_STRVAR(ntohl_doc,
 "ntohl(integer) -> integer\n\
 \n\
-Convert a 32-bit integer from network to host byte order.";
+Convert a 32-bit integer from network to host byte order.");
 
 
 static PyObject *
@@ -2480,10 +2480,10 @@
 	return PyInt_FromLong(x2);
 }
 
-static char htons_doc[] =
+PyDoc_STRVAR(htons_doc,
 "htons(integer) -> integer\n\
 \n\
-Convert a 16-bit integer from host to network byte order.";
+Convert a 16-bit integer from host to network byte order.");
 
 
 static PyObject *
@@ -2498,18 +2498,18 @@
 	return PyInt_FromLong(x2);
 }
 
-static char htonl_doc[] =
+PyDoc_STRVAR(htonl_doc,
 "htonl(integer) -> integer\n\
 \n\
-Convert a 32-bit integer from host to network byte order.";
+Convert a 32-bit integer from host to network byte order.");
 
 /* socket.inet_aton() and socket.inet_ntoa() functions. */
 
-static char inet_aton_doc[] =
+PyDoc_STRVAR(inet_aton_doc,
 "inet_aton(string) -> packed 32-bit IP representation\n\
 \n\
 Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\
-binary format used in low-level network functions.";
+binary format used in low-level network functions.");
 
 static PyObject*
 socket_inet_aton(PyObject *self, PyObject *args)
@@ -2537,10 +2537,10 @@
 					  sizeof(packed_addr));
 }
 
-static char inet_ntoa_doc[] =
+PyDoc_STRVAR(inet_ntoa_doc,
 "inet_ntoa(packed_ip) -> ip_address_string\n\
 \n\
-Convert an IP address from 32-bit packed binary format to string format";
+Convert an IP address from 32-bit packed binary format to string format");
 
 static PyObject*
 socket_inet_ntoa(PyObject *self, PyObject *args)
@@ -2637,11 +2637,11 @@
 	return (PyObject *)NULL;
 }
 
-static char getaddrinfo_doc[] =
+PyDoc_STRVAR(getaddrinfo_doc,
 "socket.getaddrinfo(host, port [, family, socktype, proto, flags])\n\
 	--> List of (family, socktype, proto, canonname, sockaddr)\n\
 \n\
-Resolve host and port into addrinfo struct.";
+Resolve host and port into addrinfo struct.");
 
 /* Python interface to getnameinfo(sa, flags). */
 
@@ -2715,10 +2715,10 @@
 	return ret;
 }
 
-static char getnameinfo_doc[] =
+PyDoc_STRVAR(getnameinfo_doc,
 "socket.getnameinfo(sockaddr, flags) --> (host, port)\n\
 \n\
-Get host and port for a sockaddr.";
+Get host and port for a sockaddr.");
 
 /* List of functions exported by this module. */
 
@@ -2882,9 +2882,9 @@
    made at exit time.
 */
 
-static char socket_doc[] =
+PyDoc_STRVAR(socket_doc,
 "Implementation module for socket operations.  See the socket module\n\
-for documentation.";
+for documentation.");
 
 DL_EXPORT(void)
 init_socket(void)
diff --git a/Modules/stropmodule.c b/Modules/stropmodule.c
index 9a68b20..09bcc3d 100644
--- a/Modules/stropmodule.c
+++ b/Modules/stropmodule.c
@@ -1,14 +1,14 @@
 /* strop module */
 
-static char strop_module__doc__[] =
+#include "Python.h"
+#include <ctype.h>
+
+PyDoc_STRVAR(strop_module__doc__,
 "Common string manipulations, optimized for speed.\n"
 "\n"
 "Always use \"import string\" rather than referencing\n"
-"this module directly.";
+"this module directly.");
 
-#include "Python.h"
-
-#include <ctype.h>
 /* XXX This file assumes that the <ctype.h> is*() functions
    XXX are defined for all 8-bit characters! */
 
@@ -80,7 +80,7 @@
 }
 
 
-static char splitfields__doc__[] =
+PyDoc_STRVAR(splitfields__doc__,
 "split(s [,sep [,maxsplit]]) -> list of strings\n"
 "splitfields(s [,sep [,maxsplit]]) -> list of strings\n"
 "\n"
@@ -89,7 +89,7 @@
 "maxsplit words.  If sep is not specified, any whitespace string\n"
 "is a separator.  Maxsplit defaults to 0.\n"
 "\n"
-"(split and splitfields are synonymous)";
+"(split and splitfields are synonymous)");
 
 static PyObject *
 strop_splitfields(PyObject *self, PyObject *args)
@@ -151,7 +151,7 @@
 }
 
 
-static char joinfields__doc__[] =
+PyDoc_STRVAR(joinfields__doc__,
 "join(list [,sep]) -> string\n"
 "joinfields(list [,sep]) -> string\n"
 "\n"
@@ -159,7 +159,7 @@
 "intervening occurrences of sep.  Sep defaults to a single\n"
 "space.\n"
 "\n"
-"(join and joinfields are synonymous)";
+"(join and joinfields are synonymous)");
 
 static PyObject *
 strop_joinfields(PyObject *self, PyObject *args)
@@ -274,14 +274,14 @@
 }
 
 
-static char find__doc__[] =
+PyDoc_STRVAR(find__doc__,
 "find(s, sub [,start [,end]]) -> in\n"
 "\n"
 "Return the lowest index in s where substring sub is found,\n"
 "such that sub is contained within s[start,end].  Optional\n"
 "arguments start and end are interpreted as in slice notation.\n"
 "\n"
-"Return -1 on failure.";
+"Return -1 on failure.");
 
 static PyObject *
 strop_find(PyObject *self, PyObject *args)
@@ -317,14 +317,14 @@
 }
 
 
-static char rfind__doc__[] =
+PyDoc_STRVAR(rfind__doc__,
 "rfind(s, sub [,start [,end]]) -> int\n"
 "\n"
 "Return the highest index in s where substring sub is found,\n"
 "such that sub is contained within s[start,end].  Optional\n"
 "arguments start and end are interpreted as in slice notation.\n"
 "\n"
-"Return -1 on failure.";
+"Return -1 on failure.");
 
 static PyObject *
 strop_rfind(PyObject *self, PyObject *args)
@@ -394,11 +394,11 @@
 }
 
 
-static char strip__doc__[] =
+PyDoc_STRVAR(strip__doc__,
 "strip(s) -> string\n"
 "\n"
 "Return a copy of the string s with leading and trailing\n"
-"whitespace removed.";
+"whitespace removed.");
 
 static PyObject *
 strop_strip(PyObject *self, PyObject *args)
@@ -408,10 +408,10 @@
 }
 
 
-static char lstrip__doc__[] =
+PyDoc_STRVAR(lstrip__doc__,
 "lstrip(s) -> string\n"
 "\n"
-"Return a copy of the string s with leading whitespace removed.";
+"Return a copy of the string s with leading whitespace removed.");
 
 static PyObject *
 strop_lstrip(PyObject *self, PyObject *args)
@@ -421,10 +421,10 @@
 }
 
 
-static char rstrip__doc__[] =
+PyDoc_STRVAR(rstrip__doc__,
 "rstrip(s) -> string\n"
 "\n"
-"Return a copy of the string s with trailing whitespace removed.";
+"Return a copy of the string s with trailing whitespace removed.");
 
 static PyObject *
 strop_rstrip(PyObject *self, PyObject *args)
@@ -434,10 +434,10 @@
 }
 
 
-static char lower__doc__[] =
+PyDoc_STRVAR(lower__doc__,
 "lower(s) -> string\n"
 "\n"
-"Return a copy of the string s converted to lowercase.";
+"Return a copy of the string s converted to lowercase.");
 
 static PyObject *
 strop_lower(PyObject *self, PyObject *args)
@@ -473,10 +473,10 @@
 }
 
 
-static char upper__doc__[] =
+PyDoc_STRVAR(upper__doc__,
 "upper(s) -> string\n"
 "\n"
-"Return a copy of the string s converted to uppercase.";
+"Return a copy of the string s converted to uppercase.");
 
 static PyObject *
 strop_upper(PyObject *self, PyObject *args)
@@ -512,11 +512,11 @@
 }
 
 
-static char capitalize__doc__[] =
+PyDoc_STRVAR(capitalize__doc__,
 "capitalize(s) -> string\n"
 "\n"
 "Return a copy of the string s with only its first character\n"
-"capitalized.";
+"capitalized.");
 
 static PyObject *
 strop_capitalize(PyObject *self, PyObject *args)
@@ -561,13 +561,13 @@
 }
 
 
-static char expandtabs__doc__[] =
+PyDoc_STRVAR(expandtabs__doc__,
 "expandtabs(string, [tabsize]) -> string\n"
 "\n"
 "Expand tabs in a string, i.e. replace them by one or more spaces,\n"
 "depending on the current column and the given tab size (default 8).\n"
 "The column number is reset to zero after each newline occurring in the\n"
-"string.  This doesn't understand other non-printing characters.";
+"string.  This doesn't understand other non-printing characters.");
 
 static PyObject *
 strop_expandtabs(PyObject *self, PyObject *args)
@@ -633,12 +633,12 @@
 }
 
 
-static char count__doc__[] =
+PyDoc_STRVAR(count__doc__,
 "count(s, sub[, start[, end]]) -> int\n"
 "\n"
 "Return the number of occurrences of substring sub in string\n"
 "s[start:end].  Optional arguments start and end are\n"
-"interpreted as in slice notation.";
+"interpreted as in slice notation.");
 
 static PyObject *
 strop_count(PyObject *self, PyObject *args)
@@ -678,11 +678,11 @@
 }
 
 
-static char swapcase__doc__[] =
+PyDoc_STRVAR(swapcase__doc__,
 "swapcase(s) -> string\n"
 "\n"
 "Return a copy of the string s with upper case characters\n"
-"converted to lowercase and vice versa.";
+"converted to lowercase and vice versa.");
 
 static PyObject *
 strop_swapcase(PyObject *self, PyObject *args)
@@ -723,7 +723,7 @@
 }
 
 
-static char atoi__doc__[] =
+PyDoc_STRVAR(atoi__doc__,
 "atoi(s [,base]) -> int\n"
 "\n"
 "Return the integer represented by the string s in the given\n"
@@ -731,7 +731,7 @@
 "or more digits, possibly preceded by a sign.  If base is 0, it\n"
 "is chosen from the leading characters of s, 0 for octal, 0x or\n"
 "0X for hexadecimal.  If base is 16, a preceding 0x or 0X is\n"
-"accepted.";
+"accepted.");
 
 static PyObject *
 strop_atoi(PyObject *self, PyObject *args)
@@ -778,7 +778,7 @@
 }
 
 
-static char atol__doc__[] =
+PyDoc_STRVAR(atol__doc__,
 "atol(s [,base]) -> long\n"
 "\n"
 "Return the long integer represented by the string s in the\n"
@@ -787,7 +787,7 @@
 "is 0, it is chosen from the leading characters of s, 0 for\n"
 "octal, 0x or 0X for hexadecimal.  If base is 16, a preceding\n"
 "0x or 0X is accepted.  A trailing L or l is not accepted,\n"
-"unless base is 0.";
+"unless base is 0.");
 
 static PyObject *
 strop_atol(PyObject *self, PyObject *args)
@@ -830,10 +830,10 @@
 }
 
 
-static char atof__doc__[] =
+PyDoc_STRVAR(atof__doc__,
 "atof(s) -> float\n"
 "\n"
-"Return the floating point number represented by the string s.";
+"Return the floating point number represented by the string s.");
 
 static PyObject *
 strop_atof(PyObject *self, PyObject *args)
@@ -874,12 +874,12 @@
 }
 
 
-static char maketrans__doc__[] =
+PyDoc_STRVAR(maketrans__doc__,
 "maketrans(frm, to) -> string\n"
 "\n"
 "Return a translation table (a string of 256 bytes long)\n"
 "suitable for use in string.translate.  The strings frm and to\n"
-"must be of the same length.";
+"must be of the same length.");
 
 static PyObject *
 strop_maketrans(PyObject *self, PyObject *args)
@@ -910,13 +910,13 @@
 }
 
 
-static char translate__doc__[] =
+PyDoc_STRVAR(translate__doc__,
 "translate(s,table [,deletechars]) -> string\n"
 "\n"
 "Return a copy of the string s, where all characters occurring\n"
 "in the optional argument deletechars are removed, and the\n"
 "remaining characters have been mapped through the given\n"
-"translation table, which must be a string of length 256.";
+"translation table, which must be a string of length 256.");
 
 static PyObject *
 strop_translate(PyObject *self, PyObject *args)
@@ -1126,12 +1126,12 @@
 }
 
 
-static char replace__doc__[] =
+PyDoc_STRVAR(replace__doc__,
 "replace (str, old, new[, maxsplit]) -> string\n"
 "\n"
 "Return a copy of string str with all occurrences of substring\n"
 "old replaced by new. If the optional argument maxsplit is\n"
-"given, only the first maxsplit occurrences are replaced.";
+"given, only the first maxsplit occurrences are replaced.");
 
 static PyObject *
 strop_replace(PyObject *self, PyObject *args)
diff --git a/Modules/structmodule.c b/Modules/structmodule.c
index bf871ee..5d4de11 100644
--- a/Modules/structmodule.c
+++ b/Modules/structmodule.c
@@ -4,8 +4,11 @@
 /* New version supporting byte order, alignment and size options,
    character strings, and unsigned numbers */
 
-static char struct__doc__[] = "\
-Functions to convert between Python values and C structs.\n\
+#include "Python.h"
+#include <ctype.h>
+
+PyDoc_STRVAR(struct__doc__,
+"Functions to convert between Python values and C structs.\n\
 Python strings are used to hold the data representing the C struct\n\
 and also as format strings to describe the layout of data in the C struct.\n\
 \n\
@@ -29,11 +32,7 @@
  q:long long; Q:unsigned long long\n\
 Whitespace between formats is ignored.\n\
 \n\
-The variable struct.error is an exception raised on errors.";
-
-#include "Python.h"
-
-#include <ctype.h>
+The variable struct.error is an exception raised on errors.");
 
 
 /* Exception */
@@ -1227,10 +1226,10 @@
 }
 
 
-static char calcsize__doc__[] = "\
-calcsize(fmt) -> int\n\
+PyDoc_STRVAR(calcsize__doc__,
+"calcsize(fmt) -> int\n\
 Return size of C struct described by format string fmt.\n\
-See struct.__doc__ for more on format strings.";
+See struct.__doc__ for more on format strings.");
 
 static PyObject *
 struct_calcsize(PyObject *self, PyObject *args)
@@ -1249,10 +1248,10 @@
 }
 
 
-static char pack__doc__[] = "\
-pack(fmt, v1, v2, ...) -> string\n\
+PyDoc_STRVAR(pack__doc__,
+"pack(fmt, v1, v2, ...) -> string\n\
 Return string containing values v1, v2, ... packed according to fmt.\n\
-See struct.__doc__ for more on format strings.";
+See struct.__doc__ for more on format strings.");
 
 static PyObject *
 struct_pack(PyObject *self, PyObject *args)
@@ -1389,11 +1388,11 @@
 }
 
 
-static char unpack__doc__[] = "\
-unpack(fmt, string) -> (v1, v2, ...)\n\
+PyDoc_STRVAR(unpack__doc__,
+"unpack(fmt, string) -> (v1, v2, ...)\n\
 Unpack the string, containing packed C structure data, according\n\
 to fmt.  Requires len(string)==calcsize(fmt).\n\
-See struct.__doc__ for more on format strings.";
+See struct.__doc__ for more on format strings.");
 
 static PyObject *
 struct_unpack(PyObject *self, PyObject *args)
diff --git a/Modules/termios.c b/Modules/termios.c
index 0c5697f..ed78ece 100644
--- a/Modules/termios.c
+++ b/Modules/termios.c
@@ -20,15 +20,15 @@
 #include <sys/modem.h>
 #endif
 
-static char termios__doc__[] = "\
-This module provides an interface to the Posix calls for tty I/O control.\n\
+PyDoc_STRVAR(termios__doc__,
+"This module provides an interface to the Posix calls for tty I/O control.\n\
 For a complete description of these calls, see the Posix or Unix manual\n\
 pages. It is only available for those Unix versions that support Posix\n\
 termios style tty I/O control.\n\
 \n\
 All functions in this module take a file descriptor fd as their first\n\
 argument. This can be an integer file descriptor, such as returned by\n\
-sys.stdin.fileno(), or a file object, such as sys.stdin itself.";
+sys.stdin.fileno(), or a file object, such as sys.stdin itself.");
 
 static PyObject *TermiosError;
 
@@ -44,8 +44,8 @@
 	return 0;
 }
 
-static char termios_tcgetattr__doc__[] = "\
-tcgetattr(fd) -> list_of_attrs\n\
+PyDoc_STRVAR(termios_tcgetattr__doc__,
+"tcgetattr(fd) -> list_of_attrs\n\
 \n\
 Get the tty attributes for file descriptor fd, as follows:\n\
 [iflag, oflag, cflag, lflag, ispeed, ospeed, cc] where cc is a list\n\
@@ -53,7 +53,7 @@
 with indices VMIN and VTIME, which are integers when these fields are\n\
 defined).  The interpretation of the flags and the speeds as well as the\n\
 indexing in the cc array must be done using the symbolic constants defined\n\
-in this module.";
+in this module.");
 
 static PyObject *
 termios_tcgetattr(PyObject *self, PyObject *args)
@@ -121,8 +121,8 @@
 	return NULL;
 }
 
-static char termios_tcsetattr__doc__[] = "\
-tcsetattr(fd, when, attributes) -> None\n\
+PyDoc_STRVAR(termios_tcsetattr__doc__,
+"tcsetattr(fd, when, attributes) -> None\n\
 \n\
 Set the tty attributes for file descriptor fd.\n\
 The attributes to be set are taken from the attributes argument, which\n\
@@ -130,7 +130,7 @@
 determines when the attributes are changed: termios.TCSANOW to\n\
 change immediately, termios.TCSADRAIN to change after transmitting all\n\
 queued output, or termios.TCSAFLUSH to change after transmitting all\n\
-queued output and discarding all queued input. ";
+queued output and discarding all queued input. ");
 
 static PyObject *
 termios_tcsetattr(PyObject *self, PyObject *args)
@@ -195,12 +195,12 @@
 	return Py_None;
 }
 
-static char termios_tcsendbreak__doc__[] = "\
-tcsendbreak(fd, duration) -> None\n\
+PyDoc_STRVAR(termios_tcsendbreak__doc__,
+"tcsendbreak(fd, duration) -> None\n\
 \n\
 Send a break on file descriptor fd.\n\
 A zero duration sends a break for 0.25-0.5 seconds; a nonzero duration\n\
-has a system dependent meaning.";
+has a system dependent meaning.");
 
 static PyObject *
 termios_tcsendbreak(PyObject *self, PyObject *args)
@@ -217,10 +217,10 @@
 	return Py_None;
 }
 
-static char termios_tcdrain__doc__[] = "\
-tcdrain(fd) -> None\n\
+PyDoc_STRVAR(termios_tcdrain__doc__,
+"tcdrain(fd) -> None\n\
 \n\
-Wait until all output written to file descriptor fd has been transmitted.";
+Wait until all output written to file descriptor fd has been transmitted.");
 
 static PyObject *
 termios_tcdrain(PyObject *self, PyObject *args)
@@ -237,13 +237,13 @@
 	return Py_None;
 }
 
-static char termios_tcflush__doc__[] = "\
-tcflush(fd, queue) -> None\n\
+PyDoc_STRVAR(termios_tcflush__doc__,
+"tcflush(fd, queue) -> None\n\
 \n\
 Discard queued data on file descriptor fd.\n\
 The queue selector specifies which queue: termios.TCIFLUSH for the input\n\
 queue, termios.TCOFLUSH for the output queue, or termios.TCIOFLUSH for\n\
-both queues. ";
+both queues. ");
 
 static PyObject *
 termios_tcflush(PyObject *self, PyObject *args)
@@ -260,13 +260,13 @@
 	return Py_None;
 }
 
-static char termios_tcflow__doc__[] = "\
-tcflow(fd, action) -> None\n\
+PyDoc_STRVAR(termios_tcflow__doc__,
+"tcflow(fd, action) -> None\n\
 \n\
 Suspend or resume input or output on file descriptor fd.\n\
 The action argument can be termios.TCOOFF to suspend output,\n\
 termios.TCOON to restart output, termios.TCIOFF to suspend input,\n\
-or termios.TCION to restart input.";
+or termios.TCION to restart input.");
 
 static PyObject *
 termios_tcflow(PyObject *self, PyObject *args)
diff --git a/Modules/threadmodule.c b/Modules/threadmodule.c
index ba149dc..aa9d3c9 100644
--- a/Modules/threadmodule.c
+++ b/Modules/threadmodule.c
@@ -71,7 +71,7 @@
 		return PyBool_FromLong((long)i);
 }
 
-static char acquire_doc[] =
+PyDoc_STRVAR(acquire_doc,
 "acquire([wait]) -> None or bool\n\
 (PyThread_acquire_lock() is an obsolete synonym)\n\
 \n\
@@ -80,7 +80,7 @@
 the lock, and return None once the lock is acquired.\n\
 With an argument, this will only block if the argument is true,\n\
 and the return value reflects whether the lock is acquired.\n\
-The blocking operation is not interruptible.";
+The blocking operation is not interruptible.");
 
 static PyObject *
 lock_PyThread_release_lock(lockobject *self)
@@ -97,13 +97,13 @@
 	return Py_None;
 }
 
-static char release_doc[] =
+PyDoc_STRVAR(release_doc,
 "release()\n\
 (PyThread_release_lock() is an obsolete synonym)\n\
 \n\
 Release the lock, allowing another thread that is blocked waiting for\n\
 the lock to acquire the lock.  The lock must be in the locked state,\n\
-but it needn't be locked by the same thread that unlocks it.";
+but it needn't be locked by the same thread that unlocks it.");
 
 static PyObject *
 lock_locked_lock(lockobject *self)
@@ -115,11 +115,11 @@
 	return PyBool_FromLong(1L);
 }
 
-static char locked_doc[] =
+PyDoc_STRVAR(locked_doc,
 "locked() -> bool\n\
 (locked_lock() is an obsolete synonym)\n\
 \n\
-Return whether the lock is in the locked state.";
+Return whether the lock is in the locked state.");
 
 static PyMethodDef lock_methods[] = {
 	{"acquire_lock", (PyCFunction)lock_PyThread_acquire_lock, 
@@ -245,7 +245,7 @@
 	return PyInt_FromLong(ident);
 }
 
-static char start_new_doc[] =
+PyDoc_STRVAR(start_new_doc,
 "start_new_thread(function, args[, kwargs])\n\
 (start_new() is an obsolete synonym)\n\
 \n\
@@ -254,7 +254,7 @@
 taken from the optional dictionary kwargs.  The thread exits when the\n\
 function returns; the return value is ignored.  The thread will also exit\n\
 when the function raises an unhandled exception; a stack trace will be\n\
-printed unless the exception is SystemExit.\n";
+printed unless the exception is SystemExit.\n");
 
 static PyObject *
 thread_PyThread_exit_thread(PyObject *self)
@@ -263,12 +263,12 @@
 	return NULL;
 }
 
-static char exit_doc[] =
+PyDoc_STRVAR(exit_doc,
 "exit()\n\
 (PyThread_exit_thread() is an obsolete synonym)\n\
 \n\
 This is synonymous to ``raise SystemExit''.  It will cause the current\n\
-thread to exit silently unless the exception is caught.";
+thread to exit silently unless the exception is caught.");
 
 #ifndef NO_EXIT_PROG
 static PyObject *
@@ -288,11 +288,11 @@
 	return (PyObject *) newlockobject();
 }
 
-static char allocate_doc[] =
+PyDoc_STRVAR(allocate_doc,
 "allocate_lock() -> lock object\n\
 (allocate() is an obsolete synonym)\n\
 \n\
-Create a new lock object.  See LockType.__doc__ for information about locks.";
+Create a new lock object.  See LockType.__doc__ for information about locks.");
 
 static PyObject *
 thread_get_ident(PyObject *self)
@@ -306,7 +306,7 @@
 	return PyInt_FromLong(ident);
 }
 
-static char get_ident_doc[] =
+PyDoc_STRVAR(get_ident_doc,
 "get_ident() -> integer\n\
 \n\
 Return a non-zero integer that uniquely identifies the current thread\n\
@@ -315,7 +315,7 @@
 Even though on some platforms threads identities may appear to be\n\
 allocated consecutive numbers starting at 1, this behavior should not\n\
 be relied upon, and the number should be seen purely as a magic cookie.\n\
-A thread's identity may be reused for another thread after it exits.";
+A thread's identity may be reused for another thread after it exits.");
 
 static PyMethodDef thread_methods[] = {
 	{"start_new_thread",	(PyCFunction)thread_PyThread_start_new_thread,
@@ -344,11 +344,11 @@
 
 /* Initialization function */
 
-static char thread_doc[] =
+PyDoc_STRVAR(thread_doc,
 "This module provides primitive operations to write multi-threaded programs.\n\
-The 'threading' module provides a more convenient interface.";
+The 'threading' module provides a more convenient interface.");
 
-static char lock_doc[] =
+PyDoc_STRVAR(lock_doc,
 "A lock object is a synchronization primitive.  To create a lock,\n\
 call the PyThread_allocate_lock() function.  Methods are:\n\
 \n\
@@ -358,7 +358,7 @@
 \n\
 A lock is not owned by the thread that locked it; another thread may\n\
 unlock it.  A thread attempting to lock a lock that it has already locked\n\
-will block until another thread unlocks it.  Deadlocks may ensue.";
+will block until another thread unlocks it.  Deadlocks may ensue.");
 
 DL_EXPORT(void)
 initthread(void)
diff --git a/Modules/timemodule.c b/Modules/timemodule.c
index dda2ce4..b2b58bf 100644
--- a/Modules/timemodule.c
+++ b/Modules/timemodule.c
@@ -116,11 +116,11 @@
 	return PyFloat_FromDouble(secs);
 }
 
-static char time_doc[] =
+PyDoc_STRVAR(time_doc,
 "time() -> floating point number\n\
 \n\
 Return the current time in seconds since the Epoch.\n\
-Fractions of a second may be present if the system clock provides them.";
+Fractions of a second may be present if the system clock provides them.");
 
 #ifdef HAVE_CLOCK
 
@@ -173,11 +173,12 @@
 #endif /* MS_WIN32 && !MS_WIN64 */
 
 #ifdef HAVE_CLOCK
-static char clock_doc[] =
+PyDoc_STRVAR(clock_doc,
 "clock() -> floating point number\n\
 \n\
 Return the CPU time or real time since the start of the process or since\n\
-the first call to clock().  This has as much precision as the system records.";
+the first call to clock().  This has as much precision as the system\n\
+records.");
 #endif
 
 static PyObject *
@@ -192,11 +193,11 @@
 	return Py_None;
 }
 
-static char sleep_doc[] =
+PyDoc_STRVAR(sleep_doc,
 "sleep(seconds)\n\
 \n\
 Delay execution for a given number of seconds.  The argument may be\n\
-a floating point number for subsecond precision.";
+a floating point number for subsecond precision.");
 
 static PyStructSequence_Field struct_time_type_fields[] = {
 	{"tm_year", NULL},
@@ -274,12 +275,12 @@
 	return time_convert((time_t)when, gmtime);
 }
 
-static char gmtime_doc[] =
+PyDoc_STRVAR(gmtime_doc,
 "gmtime([seconds]) -> (tm_year, tm_mon, tm_day, tm_hour, tm_min,\n\
                        tm_sec, tm_wday, tm_yday, tm_isdst)\n\
 \n\
 Convert seconds since the Epoch to a time tuple expressing UTC (a.k.a.\n\
-GMT).  When 'seconds' is not passed in, convert the current time instead.";
+GMT).  When 'seconds' is not passed in, convert the current time instead.");
 
 static PyObject *
 time_localtime(PyObject *self, PyObject *args)
@@ -292,11 +293,11 @@
 	return time_convert((time_t)when, localtime);
 }
 
-static char localtime_doc[] =
+PyDoc_STRVAR(localtime_doc,
 "localtime([seconds]) -> (tm_year,tm_mon,tm_day,tm_hour,tm_min,tm_sec,tm_wday,tm_yday,tm_isdst)\n\
 \n\
 Convert seconds since the Epoch to a time tuple expressing local time.\n\
-When 'seconds' is not passed in, convert the current time instead.";
+When 'seconds' is not passed in, convert the current time instead.");
 
 static int
 gettmarg(PyObject *args, struct tm *p)
@@ -389,12 +390,12 @@
 	}
 }
 
-static char strftime_doc[] =
+PyDoc_STRVAR(strftime_doc,
 "strftime(format[, tuple]) -> string\n\
 \n\
 Convert a time tuple to a string according to a format specification.\n\
 See the library reference manual for formatting codes. When the time tuple\n\
-is not present, current time as returned by localtime() is used.";
+is not present, current time as returned by localtime() is used.");
 #endif /* HAVE_STRFTIME */
 
 #ifdef HAVE_STRPTIME
@@ -430,11 +431,11 @@
 	return tmtotuple(&tm);
 }
 
-static char strptime_doc[] =
+PyDoc_STRVAR(strptime_doc,
 "strptime(string, format) -> tuple\n\
 \n\
 Parse a string to a time tuple according to a format specification.\n\
-See the library reference manual for formatting codes (same as strftime()).";
+See the library reference manual for formatting codes (same as strftime()).");
 #endif /* HAVE_STRPTIME */
 
 static PyObject *
@@ -456,12 +457,12 @@
 	return PyString_FromString(p);
 }
 
-static char asctime_doc[] =
+PyDoc_STRVAR(asctime_doc,
 "asctime([tuple]) -> string\n\
 \n\
 Convert a time tuple to a string, e.g. 'Sat Jun 06 16:26:11 1998'.\n\
 When the time tuple is not present, current time as returned by localtime()\n\
-is used.";
+is used.");
 
 static PyObject *
 time_ctime(PyObject *self, PyObject *args)
@@ -487,12 +488,12 @@
 	return PyString_FromString(p);
 }
 
-static char ctime_doc[] =
+PyDoc_STRVAR(ctime_doc,
 "ctime(seconds) -> string\n\
 \n\
 Convert a time in seconds since the Epoch to a string in local time.\n\
 This is equivalent to asctime(localtime(seconds)). When the time tuple is\n\
-not present, current time as returned by localtime() is used.";
+not present, current time as returned by localtime() is used.");
 
 #ifdef HAVE_MKTIME
 static PyObject *
@@ -516,10 +517,10 @@
 	return PyFloat_FromDouble((double)tt);
 }
 
-static char mktime_doc[] =
+PyDoc_STRVAR(mktime_doc,
 "mktime(tuple) -> floating point number\n\
 \n\
-Convert a time tuple in local time to seconds since the Epoch.";
+Convert a time tuple in local time to seconds since the Epoch.");
 #endif /* HAVE_MKTIME */
 
 static PyMethodDef time_methods[] = {
@@ -545,7 +546,7 @@
 };
 
 
-static char module_doc[] =
+PyDoc_STRVAR(module_doc,
 "This module provides various functions to manipulate time values.\n\
 \n\
 There are two standard representations of time.  One is the number\n\
@@ -587,8 +588,7 @@
 ctime() -- convert time in seconds to string\n\
 mktime() -- convert local time tuple to seconds since Epoch\n\
 strftime() -- convert time tuple to string according to format specification\n\
-strptime() -- parse string to time tuple according to format specification\n\
-";
+strptime() -- parse string to time tuple according to format specification");
 
 
 DL_EXPORT(void)
diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c
index 60cb412..966c8ba 100644
--- a/Modules/unicodedata.c
+++ b/Modules/unicodedata.c
@@ -458,7 +458,7 @@
     {NULL, NULL}		/* sentinel */
 };
 
-static char *unicodedata_docstring = "unicode character database";
+PyDoc_STRVAR(unicodedata_docstring, "unicode character database");
 
 DL_EXPORT(void)
 initunicodedata(void)
diff --git a/Modules/xreadlinesmodule.c b/Modules/xreadlinesmodule.c
index 4511f17..7fba5db 100644
--- a/Modules/xreadlinesmodule.c
+++ b/Modules/xreadlinesmodule.c
@@ -1,9 +1,9 @@
 #include "Python.h"
 
-static char xreadlines_doc [] =
+PyDoc_STRVAR(xreadlines_doc,
 "xreadlines(f)\n\
 \n\
-Return an xreadlines object for the file f.";
+Return an xreadlines object for the file f.");
 
 typedef struct {
 	PyObject_HEAD
@@ -112,7 +112,7 @@
 	return res;
 }
 
-static char next_doc[] = "x.next() -> the next line or raise StopIteration";
+PyDoc_STRVAR(next_doc, "x.next() -> the next line or raise StopIteration");
 
 static PyMethodDef xreadlines_methods[] = {
 	{"next", (PyCFunction)xreadlines_next, METH_VARARGS, next_doc},
diff --git a/Modules/xxsubtype.c b/Modules/xxsubtype.c
index 7a7cc1e..353f773 100644
--- a/Modules/xxsubtype.c
+++ b/Modules/xxsubtype.c
@@ -1,11 +1,11 @@
 #include "Python.h"
 #include "structmember.h"
 
-static char xxsubtype__doc__[] =
+PyDoc_STRVAR(xxsubtype__doc__,
 "xxsubtype is an example module showing how to subtype builtin types from C.\n"
 "test_descr.py in the standard test suite requires it in order to complete.\n"
 "If you don't care about the examples, and don't intend to run the Python\n"
-"test suite, you can recompile Python without Modules/xxsubtype.c.";
+"test suite, you can recompile Python without Modules/xxsubtype.c.");
 
 /* We link this module statically for convenience.  If compiled as a shared
    library instead, some compilers don't allow addresses of Python objects
diff --git a/Modules/zlibmodule.c b/Modules/zlibmodule.c
index cfb71ae..3e979a3 100644
--- a/Modules/zlibmodule.c
+++ b/Modules/zlibmodule.c
@@ -78,15 +78,15 @@
 	PyErr_Format(ZlibError, "Error %d %s: %.200s", err, msg, zst.msg);
 }
 
-static char compressobj__doc__[] =
+PyDoc_STRVAR(compressobj__doc__,
 "compressobj([level]) -- Return a compressor object.\n"
 "\n"
-"Optional arg level is the compression level, in 1-9.";
+"Optional arg level is the compression level, in 1-9.");
 
-static char decompressobj__doc__[] =
+PyDoc_STRVAR(decompressobj__doc__,
 "decompressobj([wbits]) -- Return a decompressor object.\n"
 "\n"
-"Optional arg wbits is the window buffer size.";
+"Optional arg wbits is the window buffer size.");
 
 static compobject *
 newcompobject(PyTypeObject *type)
@@ -109,10 +109,10 @@
     return self;
 }
 
-static char compress__doc__[] =
+PyDoc_STRVAR(compress__doc__,
 "compress(string[, level]) -- Returned compressed string.\n"
 "\n"
-"Optional arg level is the compression level, in 1-9.";
+"Optional arg level is the compression level, in 1-9.");
 
 static PyObject *
 PyZlib_compress(PyObject *self, PyObject *args)
@@ -185,11 +185,11 @@
     return ReturnVal;
 }
 
-static char decompress__doc__[] =
+PyDoc_STRVAR(decompress__doc__,
 "decompress(string[, wbits[, bufsize]]) -- Return decompressed string.\n"
 "\n"
 "Optional arg wbits is the window buffer size.  Optional arg bufsize is\n"
-"the initial output buffer size.";
+"the initial output buffer size.");
 
 static PyObject *
 PyZlib_decompress(PyObject *self, PyObject *args)
@@ -376,12 +376,12 @@
     PyObject_Del(self);
 }
 
-static char comp_compress__doc__[] =
+PyDoc_STRVAR(comp_compress__doc__,
 "compress(data) -- Return a string containing data compressed.\n"
 "\n"
 "After calling this function, some of the input data may still\n"
 "be stored in internal buffers for later processing.\n"
-"Call the flush() method to clear these buffers.";
+"Call the flush() method to clear these buffers.");
 
 
 static PyObject *
@@ -442,7 +442,7 @@
     return RetVal;
 }
 
-static char decomp_decompress__doc__[] =
+PyDoc_STRVAR(decomp_decompress__doc__,
 "decompress(data, max_length) -- Return a string containing the decompressed\n"
 "version of the data.\n"
 "\n"
@@ -451,7 +451,7 @@
 "Call the flush() method to clear these buffers.\n"
 "If the max_length parameter is specified then the return value will be\n"
 "no longer than max_length.  Unconsumed input data will be stored in\n"
-"the unconsumed_tail attribute.";
+"the unconsumed_tail attribute.");
 
 static PyObject *
 PyZlib_objdecompress(compobject *self, PyObject *args)
@@ -562,13 +562,13 @@
     return RetVal;
 }
 
-static char comp_flush__doc__[] =
+PyDoc_STRVAR(comp_flush__doc__,
 "flush( [mode] ) -- Return a string containing any remaining compressed data.\n"
 "\n"
 "mode can be one of the constants Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH; the\n"
 "default value used when mode is not specified is Z_FINISH.\n"
 "If mode == Z_FINISH, the compressor object can no longer be used after\n"
-"calling the flush() method.  Otherwise, more data can still be compressed.\n";
+"calling the flush() method.  Otherwise, more data can still be compressed.");
 
 static PyObject *
 PyZlib_flush(compobject *self, PyObject *args)
@@ -649,10 +649,10 @@
     return RetVal;
 }
 
-static char decomp_flush__doc__[] =
+PyDoc_STRVAR(decomp_flush__doc__,
 "flush() -- Return a string containing any remaining decompressed data.\n"
 "\n"
-"The decompressor object can no longer be used after this call.";
+"The decompressor object can no longer be used after this call.");
 
 static PyObject *
 PyZlib_unflush(compobject *self, PyObject *args)
@@ -730,11 +730,11 @@
     return retval;
 }
 
-static char adler32__doc__[] =
+PyDoc_STRVAR(adler32__doc__,
 "adler32(string[, start]) -- Compute an Adler-32 checksum of string.\n"
 "\n"
 "An optional starting value can be specified.  The returned checksum is\n"
-"an integer.";
+"an integer.");
 
 static PyObject *
 PyZlib_adler32(PyObject *self, PyObject *args)
@@ -749,11 +749,11 @@
     return PyInt_FromLong(adler32val);
 }
 
-static char crc32__doc__[] =
+PyDoc_STRVAR(crc32__doc__,
 "crc32(string[, start]) -- Compute a CRC-32 checksum of string.\n"
 "\n"
 "An optional starting value can be specified.  The returned checksum is\n"
-"an integer.";
+"an integer.");
 
 static PyObject *
 PyZlib_crc32(PyObject *self, PyObject *args)
@@ -819,7 +819,7 @@
     0,                              /*tp_as_mapping*/
 };
 
-static char zlib_module_documentation[]=
+PyDoc_STRVAR(zlib_module_documentation,
 "The functions in this module allow compression and decompression using the\n"
 "zlib library, which is based on GNU zip.\n"
 "\n"
@@ -832,7 +832,7 @@
 "\n"
 "'wbits' is window buffer size.\n"
 "Compressor objects support compress() and flush() methods; decompressor\n"
-"objects support decompress() and flush().";
+"objects support decompress() and flush().");
 
 DL_EXPORT(void)
 PyInit_zlib(void)
diff --git a/Objects/boolobject.c b/Objects/boolobject.c
index 89a7ece..a20af00 100644
--- a/Objects/boolobject.c
+++ b/Objects/boolobject.c
@@ -93,12 +93,12 @@
 
 /* Doc string */
 
-static char bool_doc[] =
+PyDoc_STRVAR(bool_doc,
 "bool(x) -> bool\n\
 \n\
 Returns True when the argument x is true, False otherwise.\n\
 The builtins True and False are the only two instances of the class bool.\n\
-The class bool is a subclass of the class int, and cannot be subclassed.";
+The class bool is a subclass of the class int, and cannot be subclassed.");
 
 /* Arithmetic methods -- only so we can override &, |, ^. */
 
diff --git a/Objects/cobject.c b/Objects/cobject.c
index 872e515..cdf4457 100644
--- a/Objects/cobject.c
+++ b/Objects/cobject.c
@@ -112,13 +112,13 @@
 }
 
 
-static char PyCObject_Type__doc__[] = 
+PyDoc_STRVAR(PyCObject_Type__doc__,
 "C objects to be exported from one extension module to another\n\
 \n\
 C objects are used for communication between extension modules.  They\n\
 provide a way for an extension module to export a C interface to other\n\
 extension modules, so that extension modules can use the Python import\n\
-mechanism to link to one another.";
+mechanism to link to one another.");
 
 PyTypeObject PyCObject_Type = {
     PyObject_HEAD_INIT(&PyType_Type)
diff --git a/Objects/complexobject.c b/Objects/complexobject.c
index 58ca6bc..ba1e3cc 100644
--- a/Objects/complexobject.c
+++ b/Objects/complexobject.c
@@ -912,11 +912,11 @@
 	return complex_subtype_from_c_complex(type, cr);
 }
 
-static char complex_doc[] =
+PyDoc_STRVAR(complex_doc,
 "complex(real[, imag]) -> complex number\n"
 "\n"
 "Create a complex number from a real part and an optional imaginary part.\n"
-"This is equivalent to (real + imag*1j) where imag defaults to 0.";
+"This is equivalent to (real + imag*1j) where imag defaults to 0.");
 
 static PyNumberMethods complex_as_number = {
 	(binaryfunc)complex_add, 		/* nb_add */
diff --git a/Objects/descrobject.c b/Objects/descrobject.c
index cbf56a9..1130f86 100644
--- a/Objects/descrobject.c
+++ b/Objects/descrobject.c
@@ -1062,7 +1062,7 @@
 	return 0;
 }
 
-static char property_doc[] =
+PyDoc_STRVAR(property_doc,
 "property(fget=None, fset=None, fdel=None, doc=None) -> property attribute\n"
 "\n"
 "fget is a function to be used for getting an attribute value, and likewise\n"
@@ -1072,7 +1072,7 @@
 "    def getx(self): return self.__x\n"
 "    def setx(self, value): self.__x = value\n"
 "    def delx(self): del self.__x\n"
-"    x = property(getx, setx, delx, \"I'm the 'x' property.\")";
+"    x = property(getx, setx, delx, \"I'm the 'x' property.\")");
 
 static int
 property_traverse(PyObject *self, visitproc visit, void *arg)
diff --git a/Objects/dictobject.c b/Objects/dictobject.c
index 1bd2f64..d7bbef9 100644
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -1660,48 +1660,48 @@
 }
 
 
-static char has_key__doc__[] =
-"D.has_key(k) -> 1 if D has a key k, else 0";
+PyDoc_STRVAR(has_key__doc__,
+"D.has_key(k) -> 1 if D has a key k, else 0");
 
-static char get__doc__[] =
-"D.get(k[,d]) -> D[k] if D.has_key(k), else d.  d defaults to None.";
+PyDoc_STRVAR(get__doc__,
+"D.get(k[,d]) -> D[k] if D.has_key(k), else d.  d defaults to None.");
 
-static char setdefault_doc__[] =
-"D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if not D.has_key(k)";
+PyDoc_STRVAR(setdefault_doc__,
+"D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if not D.has_key(k)");
 
-static char pop__doc__[] =
-"D.pop(k) -> v, remove specified key and return the corresponding value";
+PyDoc_STRVAR(pop__doc__,
+"D.pop(k) -> v, remove specified key and return the corresponding value");
 
-static char popitem__doc__[] =
+PyDoc_STRVAR(popitem__doc__,
 "D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
-2-tuple; but raise KeyError if D is empty";
+2-tuple; but raise KeyError if D is empty");
 
-static char keys__doc__[] =
-"D.keys() -> list of D's keys";
+PyDoc_STRVAR(keys__doc__,
+"D.keys() -> list of D's keys");
 
-static char items__doc__[] =
-"D.items() -> list of D's (key, value) pairs, as 2-tuples";
+PyDoc_STRVAR(items__doc__,
+"D.items() -> list of D's (key, value) pairs, as 2-tuples");
 
-static char values__doc__[] =
-"D.values() -> list of D's values";
+PyDoc_STRVAR(values__doc__,
+"D.values() -> list of D's values");
 
-static char update__doc__[] =
-"D.update(E) -> None.  Update D from E: for k in E.keys(): D[k] = E[k]";
+PyDoc_STRVAR(update__doc__,
+"D.update(E) -> None.  Update D from E: for k in E.keys(): D[k] = E[k]");
 
-static char clear__doc__[] =
-"D.clear() -> None.  Remove all items from D.";
+PyDoc_STRVAR(clear__doc__,
+"D.clear() -> None.  Remove all items from D.");
 
-static char copy__doc__[] =
-"D.copy() -> a shallow copy of D";
+PyDoc_STRVAR(copy__doc__,
+"D.copy() -> a shallow copy of D");
 
-static char iterkeys__doc__[] =
-"D.iterkeys() -> an iterator over the keys of D";
+PyDoc_STRVAR(iterkeys__doc__,
+"D.iterkeys() -> an iterator over the keys of D");
 
-static char itervalues__doc__[] =
-"D.itervalues() -> an iterator over the values of D";
+PyDoc_STRVAR(itervalues__doc__,
+"D.itervalues() -> an iterator over the values of D");
 
-static char iteritems__doc__[] =
-"D.iteritems() -> an iterator over the (key, value) items of D";
+PyDoc_STRVAR(iteritems__doc__,
+"D.iteritems() -> an iterator over the (key, value) items of D");
 
 static PyMethodDef mapp_methods[] = {
 	{"has_key",	(PyCFunction)dict_has_key,      METH_O,
@@ -1816,14 +1816,14 @@
 	return dictiter_new(dict, select_key);
 }
 
-static char dictionary_doc[] =
+PyDoc_STRVAR(dictionary_doc,
 "dict() -> new empty dictionary.\n"
 "dict(mapping) -> new dictionary initialized from a mapping object's\n"
 "    (key, value) pairs.\n"
 "dict(seq) -> new dictionary initialized as if via:\n"
 "    d = {}\n"
 "    for k, v in seq:\n"
-"        d[k] = v";
+"        d[k] = v");
 
 PyTypeObject PyDict_Type = {
 	PyObject_HEAD_INIT(&PyType_Type)
diff --git a/Objects/enumobject.c b/Objects/enumobject.c
index 1964956..148ac3c 100644
--- a/Objects/enumobject.c
+++ b/Objects/enumobject.c
@@ -90,8 +90,8 @@
 	{NULL,      NULL}       /* sentinel */
 };
 
-static char enum_doc[] =
-	"enumerate(iterable) -> create an enumerating-iterator";
+PyDoc_STRVAR(enum_doc,
+"enumerate(iterable) -> create an enumerating-iterator");
 
 PyTypeObject PyEnum_Type = {
 	PyObject_HEAD_INIT(&PyType_Type)
diff --git a/Objects/fileobject.c b/Objects/fileobject.c
index a45a4cf..d4caaf0 100644
--- a/Objects/fileobject.c
+++ b/Objects/fileobject.c
@@ -1462,30 +1462,30 @@
 #undef CHUNKSIZE
 }
 
-static char readline_doc[] =
+PyDoc_STRVAR(readline_doc,
 "readline([size]) -> next line from the file, as a string.\n"
 "\n"
 "Retain newline.  A non-negative size argument limits the maximum\n"
 "number of bytes to return (an incomplete line may be returned then).\n"
-"Return an empty string at EOF.";
+"Return an empty string at EOF.");
 
-static char read_doc[] =
+PyDoc_STRVAR(read_doc,
 "read([size]) -> read at most size bytes, returned as a string.\n"
 "\n"
-"If the size argument is negative or omitted, read until EOF is reached.";
+"If the size argument is negative or omitted, read until EOF is reached.");
 
-static char write_doc[] =
+PyDoc_STRVAR(write_doc,
 "write(str) -> None.  Write string str to file.\n"
 "\n"
 "Note that due to buffering, flush() or close() may be needed before\n"
-"the file on disk reflects the data written.";
+"the file on disk reflects the data written.");
 
-static char fileno_doc[] =
+PyDoc_STRVAR(fileno_doc,
 "fileno() -> integer \"file descriptor\".\n"
 "\n"
-"This is needed for lower-level file interfaces, such os.read().";
+"This is needed for lower-level file interfaces, such os.read().");
 
-static char seek_doc[] =
+PyDoc_STRVAR(seek_doc,
 "seek(offset[, whence]) -> None.  Move to new file position.\n"
 "\n"
 "Argument offset is a byte count.  Optional argument whence defaults to\n"
@@ -1494,53 +1494,53 @@
 "relative to end of file, usually negative, although many platforms allow\n"
 "seeking beyond the end of a file).\n"
 "\n"
-"Note that not all file objects are seekable.";
+"Note that not all file objects are seekable.");
 
 #ifdef HAVE_FTRUNCATE
-static char truncate_doc[] =
+PyDoc_STRVAR(truncate_doc,
 "truncate([size]) -> None.  Truncate the file to at most size bytes.\n"
 "\n"
-"Size defaults to the current file position, as returned by tell().";
+"Size defaults to the current file position, as returned by tell().");
 #endif
 
-static char tell_doc[] =
-"tell() -> current file position, an integer (may be a long integer).";
+PyDoc_STRVAR(tell_doc,
+"tell() -> current file position, an integer (may be a long integer).");
 
-static char readinto_doc[] =
-"readinto() -> Undocumented.  Don't use this; it may go away.";
+PyDoc_STRVAR(readinto_doc,
+"readinto() -> Undocumented.  Don't use this; it may go away.");
 
-static char readlines_doc[] =
+PyDoc_STRVAR(readlines_doc,
 "readlines([size]) -> list of strings, each a line from the file.\n"
 "\n"
 "Call readline() repeatedly and return a list of the lines so read.\n"
 "The optional size argument, if given, is an approximate bound on the\n"
-"total number of bytes in the lines returned.";
+"total number of bytes in the lines returned.");
 
-static char xreadlines_doc[] =
+PyDoc_STRVAR(xreadlines_doc,
 "xreadlines() -> next line from the file, as a string.\n"
 "\n"
 "Equivalent to xreadlines.xreadlines(file).  This is like readline(), but\n"
-"often quicker, due to reading ahead internally.";
+"often quicker, due to reading ahead internally.");
 
-static char writelines_doc[] =
+PyDoc_STRVAR(writelines_doc,
 "writelines(sequence_of_strings) -> None.  Write the strings to the file.\n"
 "\n"
 "Note that newlines are not added.  The sequence can be any iterable object\n"
-"producing strings. This is equivalent to calling write() for each string.";
+"producing strings. This is equivalent to calling write() for each string.");
 
-static char flush_doc[] =
-"flush() -> None.  Flush the internal I/O buffer.";
+PyDoc_STRVAR(flush_doc,
+"flush() -> None.  Flush the internal I/O buffer.");
 
-static char close_doc[] =
+PyDoc_STRVAR(close_doc,
 "close() -> None or (perhaps) an integer.  Close the file.\n"
 "\n"
 "Sets data attribute .closed to True.  A closed file cannot be used for\n"
 "further I/O operations.  close() may be called more than once without\n"
 "error.  Some kinds of file objects (for example, opened by popen())\n"
-"may return an exit status upon closing.";
+"may return an exit status upon closing.");
 
-static char isatty_doc[] =
-"isatty() -> true or false.  True if the file is connected to a tty device.";
+PyDoc_STRVAR(isatty_doc,
+"isatty() -> true or false.  True if the file is connected to a tty device.");
 
 static PyMethodDef file_methods[] = {
 	{"readline",	(PyCFunction)file_readline,   METH_VARARGS, readline_doc},
@@ -1687,7 +1687,8 @@
 	return ret;
 }
 
-static char file_doc[] =
+PyDoc_VAR(file_doc) =
+PyDoc_STR(
 "file(name[, mode[, buffering]]) -> file object\n"
 "\n"
 "Open a file.  The mode can be 'r', 'w' or 'a' for reading (default),\n"
@@ -1697,7 +1698,9 @@
 "Add a '+' to the mode to allow simultaneous reading and writing.\n"
 "If the buffering argument is given, 0 means unbuffered, 1 means line\n"
 "buffered, and larger numbers specify the buffer size.\n"
+)
 #ifdef WITH_UNIVERSAL_NEWLINES
+PyDoc_STR(
 "Add a 'U' to mode to open the file for input with universal newline\n"
 "support.  Any line ending in the input file will be seen as a '\\n'\n"
 "in Python.  Also, a file so opened gains the attribute 'newlines';\n"
@@ -1705,9 +1708,12 @@
 "'\\r', '\\n', '\\r\\n' or a tuple containing all the newline types seen.\n"
 "\n"
 "'U' cannot be combined with 'w' or '+' mode.\n"
+)
 #endif /* WITH_UNIVERSAL_NEWLINES */
+PyDoc_STR(
 "\n"
-"Note:  open() is an alias for file().\n";
+"Note:  open() is an alias for file()."
+);
 
 PyTypeObject PyFile_Type = {
 	PyObject_HEAD_INIT(&PyType_Type)
diff --git a/Objects/floatobject.c b/Objects/floatobject.c
index 5fd13bc..d711726 100644
--- a/Objects/floatobject.c
+++ b/Objects/floatobject.c
@@ -719,10 +719,10 @@
 	return new;
 }
 
-static char float_doc[] =
+PyDoc_STRVAR(float_doc,
 "float(x) -> floating point number\n\
 \n\
-Convert a string or number to a floating point number, if possible.";
+Convert a string or number to a floating point number, if possible.");
 
 
 static PyNumberMethods float_as_number = {
diff --git a/Objects/funcobject.c b/Objects/funcobject.c
index a3541e4..f96d0dd 100644
--- a/Objects/funcobject.c
+++ b/Objects/funcobject.c
@@ -493,7 +493,7 @@
 	return 0;
 }
 
-static char classmethod_doc[] =
+PyDoc_STRVAR(classmethod_doc,
 "classmethod(function) -> method\n\
 \n\
 Convert a function to be a class method.\n\
@@ -512,7 +512,7 @@
 object is passed as the implied first argument.\n\
 \n\
 Class methods are different than C++ or Java static methods.\n\
-If you want those, see the staticmethod builtin.";
+If you want those, see the staticmethod builtin.");
 
 PyTypeObject PyClassMethod_Type = {
 	PyObject_HEAD_INIT(&PyType_Type)
@@ -625,7 +625,7 @@
 	return 0;
 }
 
-static char staticmethod_doc[] =
+PyDoc_STRVAR(staticmethod_doc,
 "staticmethod(function) -> method\n\
 \n\
 Convert a function to be a static method.\n\
@@ -641,7 +641,7 @@
 (e.g. C().f()).  The instance is ignored except for its class.\n\
 \n\
 Static methods in Python are similar to those found in Java or C++.\n\
-For a more advanced concept, see the classmethod builtin.";
+For a more advanced concept, see the classmethod builtin.");
 
 PyTypeObject PyStaticMethod_Type = {
 	PyObject_HEAD_INIT(&PyType_Type)
diff --git a/Objects/intobject.c b/Objects/intobject.c
index ccd328d..444ada3 100644
--- a/Objects/intobject.c
+++ b/Objects/intobject.c
@@ -830,14 +830,14 @@
 	return new;
 }
 
-static char int_doc[] =
+PyDoc_STRVAR(int_doc,
 "int(x[, base]) -> integer\n\
 \n\
 Convert a string or number to an integer, if possible.  A floating point\n\
 argument will be truncated towards zero (this does not include a string\n\
 representation of a floating point number!)  When converting a string, use\n\
 the optional base.  It is an error to supply a base when converting a\n\
-non-string.";
+non-string.");
 
 static PyNumberMethods int_as_number = {
 	(binaryfunc)int_add,	/*nb_add*/
diff --git a/Objects/listobject.c b/Objects/listobject.c
index 063ebfb..f29774e 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -1633,24 +1633,24 @@
 	return -1;
 }
 
-static char append_doc[] =
-"L.append(object) -- append object to end";
-static char extend_doc[] =
-"L.extend(list) -- extend list by appending list elements";
-static char insert_doc[] =
-"L.insert(index, object) -- insert object before index";
-static char pop_doc[] =
-"L.pop([index]) -> item -- remove and return item at index (default last)";
-static char remove_doc[] =
-"L.remove(value) -- remove first occurrence of value";
-static char index_doc[] =
-"L.index(value) -> integer -- return index of first occurrence of value";
-static char count_doc[] =
-"L.count(value) -> integer -- return number of occurrences of value";
-static char reverse_doc[] =
-"L.reverse() -- reverse *IN PLACE*";
-static char sort_doc[] =
-"L.sort([cmpfunc]) -- sort *IN PLACE*; if given, cmpfunc(x, y) -> -1, 0, 1";
+PyDoc_STRVAR(append_doc,
+"L.append(object) -- append object to end");
+PyDoc_STRVAR(extend_doc,
+"L.extend(list) -- extend list by appending list elements");
+PyDoc_STRVAR(insert_doc,
+"L.insert(index, object) -- insert object before index");
+PyDoc_STRVAR(pop_doc,
+"L.pop([index]) -> item -- remove and return item at index (default last)");
+PyDoc_STRVAR(remove_doc,
+"L.remove(value) -- remove first occurrence of value");
+PyDoc_STRVAR(index_doc,
+"L.index(value) -> integer -- return index of first occurrence of value");
+PyDoc_STRVAR(count_doc,
+"L.count(value) -> integer -- return number of occurrences of value");
+PyDoc_STRVAR(reverse_doc,
+"L.reverse() -- reverse *IN PLACE*");
+PyDoc_STRVAR(sort_doc,
+"L.sort([cmpfunc]) -- sort *IN PLACE*; if given, cmpfunc(x, y) -> -1, 0, 1");
 
 static PyMethodDef list_methods[] = {
 	{"append",	(PyCFunction)listappend,  METH_O, append_doc},
diff --git a/Objects/longobject.c b/Objects/longobject.c
index cbc9f68..89fc8b4 100644
--- a/Objects/longobject.c
+++ b/Objects/longobject.c
@@ -2261,14 +2261,14 @@
 	return (PyObject *)new;
 }
 
-static char long_doc[] =
+PyDoc_STRVAR(long_doc,
 "long(x[, base]) -> integer\n\
 \n\
 Convert a string or number to a long integer, if possible.  A floating\n\
 point argument will be truncated towards zero (this does not include a\n\
 string representation of a floating point number!)  When converting a\n\
 string, use the optional base.  It is an error to supply a base when\n\
-converting a non-string.";
+converting a non-string.");
 
 static PyNumberMethods long_as_number = {
 	(binaryfunc)	long_add,	/*nb_add*/
diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c
index b46805d..812cbc4 100644
--- a/Objects/moduleobject.c
+++ b/Objects/moduleobject.c
@@ -209,11 +209,11 @@
 	return 0;
 }
 
-static char module_doc[] =
+PyDoc_STRVAR(module_doc,
 "module(name[, doc])\n\
 \n\
 Create a module object.\n\
-The name must be a string; the optional doc argument can have any type.";
+The name must be a string; the optional doc argument can have any type.");
 
 PyTypeObject PyModule_Type = {
 	PyObject_HEAD_INIT(&PyType_Type)
diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c
index 1360864..c3c6050 100644
--- a/Objects/rangeobject.c
+++ b/Objects/rangeobject.c
@@ -110,12 +110,12 @@
 	return PyRange_New(ilow, n, istep, 1);
 }
 
-static char range_doc[] =
+PyDoc_STRVAR(range_doc,
 "xrange([start,] stop[, step]) -> xrange object\n\
 \n\
 Like range(), but instead of returning a list, returns an object that\n\
 generates the numbers in the range on demand.  This is slightly slower\n\
-than range() but more memory efficient.";
+than range() but more memory efficient.");
 
 static PyObject *
 range_item(rangeobject *r, int i)
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index b88778e..243fcc6 100644
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -1117,13 +1117,13 @@
 }
 
 
-static char split__doc__[] =
+PyDoc_STRVAR(split__doc__,
 "S.split([sep [,maxsplit]]) -> list of strings\n\
 \n\
 Return a list of the words in the string S, using sep as the\n\
 delimiter string.  If maxsplit is given, at most maxsplit\n\
 splits are done. If sep is not specified, any whitespace string\n\
-is a separator.";
+is a separator.");
 
 static PyObject *
 string_split(PyStringObject *self, PyObject *args)
@@ -1191,11 +1191,11 @@
 }
 
 
-static char join__doc__[] =
+PyDoc_STRVAR(join__doc__,
 "S.join(sequence) -> string\n\
 \n\
 Return a string which is the concatenation of the strings in the\n\
-sequence.  The separator between elements is S.";
+sequence.  The separator between elements is S.");
 
 static PyObject *
 string_join(PyStringObject *self, PyObject *orig)
@@ -1365,14 +1365,14 @@
 }
 
 
-static char find__doc__[] =
+PyDoc_STRVAR(find__doc__,
 "S.find(sub [,start [,end]]) -> int\n\
 \n\
 Return the lowest index in S where substring sub is found,\n\
 such that sub is contained within s[start,end].  Optional\n\
 arguments start and end are interpreted as in slice notation.\n\
 \n\
-Return -1 on failure.";
+Return -1 on failure.");
 
 static PyObject *
 string_find(PyStringObject *self, PyObject *args)
@@ -1384,10 +1384,10 @@
 }
 
 
-static char index__doc__[] =
+PyDoc_STRVAR(index__doc__,
 "S.index(sub [,start [,end]]) -> int\n\
 \n\
-Like S.find() but raise ValueError when the substring is not found.";
+Like S.find() but raise ValueError when the substring is not found.");
 
 static PyObject *
 string_index(PyStringObject *self, PyObject *args)
@@ -1404,14 +1404,14 @@
 }
 
 
-static char rfind__doc__[] =
+PyDoc_STRVAR(rfind__doc__,
 "S.rfind(sub [,start [,end]]) -> int\n\
 \n\
 Return the highest index in S where substring sub is found,\n\
 such that sub is contained within s[start,end].  Optional\n\
 arguments start and end are interpreted as in slice notation.\n\
 \n\
-Return -1 on failure.";
+Return -1 on failure.");
 
 static PyObject *
 string_rfind(PyStringObject *self, PyObject *args)
@@ -1423,10 +1423,10 @@
 }
 
 
-static char rindex__doc__[] =
+PyDoc_STRVAR(rindex__doc__,
 "S.rindex(sub [,start [,end]]) -> int\n\
 \n\
-Like S.rfind() but raise ValueError when the substring is not found.";
+Like S.rfind() but raise ValueError when the substring is not found.");
 
 static PyObject *
 string_rindex(PyStringObject *self, PyObject *args)
@@ -1546,13 +1546,13 @@
 }
 
 
-static char strip__doc__[] =
+PyDoc_STRVAR(strip__doc__,
 "S.strip([sep]) -> string or unicode\n\
 \n\
 Return a copy of the string S with leading and trailing\n\
 whitespace removed.\n\
 If sep is given and not None, remove characters in sep instead.\n\
-If sep is unicode, S will be converted to unicode before stripping";
+If sep is unicode, S will be converted to unicode before stripping");
 
 static PyObject *
 string_strip(PyStringObject *self, PyObject *args)
@@ -1564,12 +1564,12 @@
 }
 
 
-static char lstrip__doc__[] =
+PyDoc_STRVAR(lstrip__doc__,
 "S.lstrip([sep]) -> string or unicode\n\
 \n\
 Return a copy of the string S with leading whitespace removed.\n\
 If sep is given and not None, remove characters in sep instead.\n\
-If sep is unicode, S will be converted to unicode before stripping";
+If sep is unicode, S will be converted to unicode before stripping");
 
 static PyObject *
 string_lstrip(PyStringObject *self, PyObject *args)
@@ -1581,12 +1581,12 @@
 }
 
 
-static char rstrip__doc__[] =
+PyDoc_STRVAR(rstrip__doc__,
 "S.rstrip([sep]) -> string or unicode\n\
 \n\
 Return a copy of the string S with trailing whitespace removed.\n\
 If sep is given and not None, remove characters in sep instead.\n\
-If sep is unicode, S will be converted to unicode before stripping";
+If sep is unicode, S will be converted to unicode before stripping");
 
 static PyObject *
 string_rstrip(PyStringObject *self, PyObject *args)
@@ -1598,10 +1598,10 @@
 }
 
 
-static char lower__doc__[] =
+PyDoc_STRVAR(lower__doc__,
 "S.lower() -> string\n\
 \n\
-Return a copy of the string S converted to lowercase.";
+Return a copy of the string S converted to lowercase.");
 
 static PyObject *
 string_lower(PyStringObject *self)
@@ -1626,10 +1626,10 @@
 }
 
 
-static char upper__doc__[] =
+PyDoc_STRVAR(upper__doc__,
 "S.upper() -> string\n\
 \n\
-Return a copy of the string S converted to uppercase.";
+Return a copy of the string S converted to uppercase.");
 
 static PyObject *
 string_upper(PyStringObject *self)
@@ -1654,11 +1654,11 @@
 }
 
 
-static char title__doc__[] =
+PyDoc_STRVAR(title__doc__,
 "S.title() -> string\n\
 \n\
 Return a titlecased version of S, i.e. words start with uppercase\n\
-characters, all remaining cased characters have lowercase.";
+characters, all remaining cased characters have lowercase.");
 
 static PyObject*
 string_title(PyStringObject *self)
@@ -1689,11 +1689,11 @@
 	return new;
 }
 
-static char capitalize__doc__[] =
+PyDoc_STRVAR(capitalize__doc__,
 "S.capitalize() -> string\n\
 \n\
 Return a copy of the string S with only its first character\n\
-capitalized.";
+capitalized.");
 
 static PyObject *
 string_capitalize(PyStringObject *self)
@@ -1726,12 +1726,12 @@
 }
 
 
-static char count__doc__[] =
+PyDoc_STRVAR(count__doc__,
 "S.count(sub[, start[, end]]) -> int\n\
 \n\
 Return the number of occurrences of substring sub in string\n\
 S[start:end].  Optional arguments start and end are\n\
-interpreted as in slice notation.";
+interpreted as in slice notation.");
 
 static PyObject *
 string_count(PyStringObject *self, PyObject *args)
@@ -1790,11 +1790,11 @@
 }
 
 
-static char swapcase__doc__[] =
+PyDoc_STRVAR(swapcase__doc__,
 "S.swapcase() -> string\n\
 \n\
 Return a copy of the string S with uppercase characters\n\
-converted to lowercase and vice versa.";
+converted to lowercase and vice versa.");
 
 static PyObject *
 string_swapcase(PyStringObject *self)
@@ -1823,13 +1823,13 @@
 }
 
 
-static char translate__doc__[] =
+PyDoc_STRVAR(translate__doc__,
 "S.translate(table [,deletechars]) -> string\n\
 \n\
 Return a copy of the string S, where all characters occurring\n\
 in the optional argument deletechars are removed, and the\n\
 remaining characters have been mapped through the given\n\
-translation table, which must be a string of length 256.";
+translation table, which must be a string of length 256.");
 
 static PyObject *
 string_translate(PyStringObject *self, PyObject *args)
@@ -2079,12 +2079,12 @@
 }
 
 
-static char replace__doc__[] =
+PyDoc_STRVAR(replace__doc__,
 "S.replace (old, new[, maxsplit]) -> string\n\
 \n\
 Return a copy of string S with all occurrences of substring\n\
 old replaced by new.  If the optional argument maxsplit is\n\
-given, only the first maxsplit occurrences are replaced.";
+given, only the first maxsplit occurrences are replaced.");
 
 static PyObject *
 string_replace(PyStringObject *self, PyObject *args)
@@ -2154,12 +2154,12 @@
 }
 
 
-static char startswith__doc__[] =
+PyDoc_STRVAR(startswith__doc__,
 "S.startswith(prefix[, start[, end]]) -> bool\n\
 \n\
 Return True if S starts with the specified prefix, False otherwise.  With\n\
 optional start, test S beginning at that position.  With optional end, stop\n\
-comparing S at that position.";
+comparing S at that position.");
 
 static PyObject *
 string_startswith(PyStringObject *self, PyObject *args)
@@ -2213,12 +2213,12 @@
 }
 
 
-static char endswith__doc__[] =
+PyDoc_STRVAR(endswith__doc__,
 "S.endswith(suffix[, start[, end]]) -> bool\n\
 \n\
 Return True if S ends with the specified suffix, False otherwise.  With\n\
 optional start, test S beginning at that position.  With optional end, stop\n\
-comparing S at that position.";
+comparing S at that position.");
 
 static PyObject *
 string_endswith(PyStringObject *self, PyObject *args)
@@ -2265,13 +2265,13 @@
 }
 
 
-static char encode__doc__[] =
+PyDoc_STRVAR(encode__doc__,
 "S.encode([encoding[,errors]]) -> object\n\
 \n\
 Encodes S using the codec registered for encoding. encoding defaults\n\
 to the default encoding. errors may be given to set a different error\n\
 handling scheme. Default is 'strict' meaning that encoding errors raise\n\
-a ValueError. Other possible values are 'ignore' and 'replace'.";
+a ValueError. Other possible values are 'ignore' and 'replace'.");
 
 static PyObject *
 string_encode(PyStringObject *self, PyObject *args)
@@ -2284,13 +2284,13 @@
 }
 
 
-static char decode__doc__[] =
+PyDoc_STRVAR(decode__doc__,
 "S.decode([encoding[,errors]]) -> object\n\
 \n\
 Decodes S using the codec registered for encoding. encoding defaults\n\
 to the default encoding. errors may be given to set a different error\n\
 handling scheme. Default is 'strict' meaning that encoding errors raise\n\
-a ValueError. Other possible values are 'ignore' and 'replace'.";
+a ValueError. Other possible values are 'ignore' and 'replace'.");
 
 static PyObject *
 string_decode(PyStringObject *self, PyObject *args)
@@ -2303,11 +2303,11 @@
 }
 
 
-static char expandtabs__doc__[] =
+PyDoc_STRVAR(expandtabs__doc__,
 "S.expandtabs([tabsize]) -> string\n\
 \n\
 Return a copy of S where all tab characters are expanded using spaces.\n\
-If tabsize is not given, a tab size of 8 characters is assumed.";
+If tabsize is not given, a tab size of 8 characters is assumed.");
 
 static PyObject*
 string_expandtabs(PyStringObject *self, PyObject *args)
@@ -2395,11 +2395,11 @@
     return u;
 }
 
-static char ljust__doc__[] =
+PyDoc_STRVAR(ljust__doc__,
 "S.ljust(width) -> string\n"
 "\n"
 "Return S left justified in a string of length width. Padding is\n"
-"done using spaces.";
+"done using spaces.");
 
 static PyObject *
 string_ljust(PyStringObject *self, PyObject *args)
@@ -2417,11 +2417,11 @@
 }
 
 
-static char rjust__doc__[] =
+PyDoc_STRVAR(rjust__doc__,
 "S.rjust(width) -> string\n"
 "\n"
 "Return S right justified in a string of length width. Padding is\n"
-"done using spaces.";
+"done using spaces.");
 
 static PyObject *
 string_rjust(PyStringObject *self, PyObject *args)
@@ -2439,11 +2439,11 @@
 }
 
 
-static char center__doc__[] =
+PyDoc_STRVAR(center__doc__,
 "S.center(width) -> string\n"
 "\n"
 "Return S centered in a string of length width. Padding is done\n"
-"using spaces.";
+"using spaces.");
 
 static PyObject *
 string_center(PyStringObject *self, PyObject *args)
@@ -2465,11 +2465,11 @@
     return pad(self, left, marg - left, ' ');
 }
 
-static char zfill__doc__[] =
+PyDoc_STRVAR(zfill__doc__,
 "S.zfill(width) -> string\n"
 "\n"
 "Pad a numeric string S with zeros on the left, to fill a field\n"
-"of the specified width.  The string S is never truncated.";
+"of the specified width.  The string S is never truncated.");
 
 static PyObject *
 string_zfill(PyStringObject *self, PyObject *args)
@@ -2511,11 +2511,11 @@
     return (PyObject*) s;
 }
 
-static char isspace__doc__[] =
+PyDoc_STRVAR(isspace__doc__,
 "S.isspace() -> bool\n"
 "\n"
 "Return True if there are only whitespace characters in S,\n"
-"False otherwise.";
+"False otherwise.");
 
 static PyObject*
 string_isspace(PyStringObject *self)
@@ -2542,11 +2542,11 @@
 }
 
 
-static char isalpha__doc__[] =
+PyDoc_STRVAR(isalpha__doc__,
 "S.isalpha() -> bool\n\
 \n\
 Return True if  all characters in S are alphabetic\n\
-and there is at least one character in S, False otherwise.";
+and there is at least one character in S, False otherwise.");
 
 static PyObject*
 string_isalpha(PyStringObject *self)
@@ -2573,11 +2573,11 @@
 }
 
 
-static char isalnum__doc__[] =
+PyDoc_STRVAR(isalnum__doc__,
 "S.isalnum() -> bool\n\
 \n\
 Return True if  all characters in S are alphanumeric\n\
-and there is at least one character in S, False otherwise.";
+and there is at least one character in S, False otherwise.");
 
 static PyObject*
 string_isalnum(PyStringObject *self)
@@ -2604,11 +2604,11 @@
 }
 
 
-static char isdigit__doc__[] =
+PyDoc_STRVAR(isdigit__doc__,
 "S.isdigit() -> bool\n\
 \n\
 Return True if there are only digit characters in S,\n\
-False otherwise.";
+False otherwise.");
 
 static PyObject*
 string_isdigit(PyStringObject *self)
@@ -2635,11 +2635,11 @@
 }
 
 
-static char islower__doc__[] =
+PyDoc_STRVAR(islower__doc__,
 "S.islower() -> bool\n\
 \n\
 Return True if all cased characters in S are lowercase and there is\n\
-at least one cased character in S, False otherwise.";
+at least one cased character in S, False otherwise.");
 
 static PyObject*
 string_islower(PyStringObject *self)
@@ -2669,11 +2669,11 @@
 }
 
 
-static char isupper__doc__[] =
+PyDoc_STRVAR(isupper__doc__,
 "S.isupper() -> bool\n\
 \n\
 Return True if  all cased characters in S are uppercase and there is\n\
-at least one cased character in S, False otherwise.";
+at least one cased character in S, False otherwise.");
 
 static PyObject*
 string_isupper(PyStringObject *self)
@@ -2703,12 +2703,12 @@
 }
 
 
-static char istitle__doc__[] =
+PyDoc_STRVAR(istitle__doc__,
 "S.istitle() -> bool\n\
 \n\
 Return True if S is a titlecased string, i.e. uppercase characters\n\
 may only follow uncased characters and lowercase characters only cased\n\
-ones. Return False otherwise.";
+ones. Return False otherwise.");
 
 static PyObject*
 string_istitle(PyStringObject *self, PyObject *uncased)
@@ -2751,12 +2751,12 @@
 }
 
 
-static char splitlines__doc__[] =
+PyDoc_STRVAR(splitlines__doc__,
 "S.splitlines([keepends]) -> list of strings\n\
 \n\
 Return a list of the lines in S, breaking at line boundaries.\n\
 Line breaks are not included in the resulting list unless keepends\n\
-is given and true.";
+is given and true.");
 
 #define SPLIT_APPEND(data, left, right)					\
 	str = PyString_FromStringAndSize(data + left, right - left);	\
@@ -2923,8 +2923,8 @@
 	return NULL;
 }
 
-static char basestring_doc[] =
-"Type basestring cannot be instantiated; it is the base for str and unicode.";
+PyDoc_STRVAR(basestring_doc,
+"Type basestring cannot be instantiated; it is the base for str and unicode.");
 
 PyTypeObject PyBaseString_Type = {
 	PyObject_HEAD_INIT(&PyType_Type)
@@ -2969,11 +2969,11 @@
 	0,		                	/* tp_free */
 };
 
-static char string_doc[] =
+PyDoc_STRVAR(string_doc,
 "str(object) -> string\n\
 \n\
 Return a nice string representation of the object.\n\
-If the argument is a string, the return value is the same object.";
+If the argument is a string, the return value is the same object.");
 
 PyTypeObject PyString_Type = {
 	PyObject_HEAD_INIT(&PyType_Type)
diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c
index 203801e..a207102 100644
--- a/Objects/tupleobject.c
+++ b/Objects/tupleobject.c
@@ -524,11 +524,11 @@
 	return new;
 }
 
-static char tuple_doc[] =
+PyDoc_STRVAR(tuple_doc,
 "tuple() -> an empty tuple\n"
 "tuple(sequence) -> tuple initialized from sequence's items\n"
 "\n"
-"If the argument is a tuple, the return value is the same object.";
+"If the argument is a tuple, the return value is the same object.");
 
 static PySequenceMethods tuple_as_sequence = {
 	(inquiry)tuplelength,			/* sq_length */
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index 26222fa..b9890ea 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -1487,9 +1487,9 @@
 	{0}
 };
 
-static char type_doc[] =
+PyDoc_STRVAR(type_doc,
 "type(object) -> the object's type\n"
-"type(name, bases, dict) -> a new type";
+"type(name, bases, dict) -> a new type");
 
 static int
 type_traverse(PyTypeObject *type, visitproc visit, void *arg)
@@ -4355,14 +4355,14 @@
 	return 0;
 }
 
-static char super_doc[] =
+PyDoc_STRVAR(super_doc,
 "super(type) -> unbound super object\n"
 "super(type, obj) -> bound super object; requires isinstance(obj, type)\n"
 "super(type, type2) -> bound super object; requires issubclass(type2, type)\n"
 "Typical use to call a cooperative superclass method:\n"
 "class C(B):\n"
 "    def meth(self, arg):\n"
-"        super(C, self).meth(arg)";
+"        super(C, self).meth(arg)");
 
 static int
 super_traverse(PyObject *self, visitproc visit, void *arg)
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index 6e0fd9f..cd081ad 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -3527,11 +3527,11 @@
 
 /* --- Unicode Object Methods --------------------------------------------- */
 
-static char title__doc__[] =
+PyDoc_STRVAR(title__doc__,
 "S.title() -> unicode\n\
 \n\
 Return a titlecased version of S, i.e. words start with title case\n\
-characters, all remaining cased characters have lower case.";
+characters, all remaining cased characters have lower case.");
 
 static PyObject*
 unicode_title(PyUnicodeObject *self)
@@ -3539,11 +3539,11 @@
     return fixup(self, fixtitle);
 }
 
-static char capitalize__doc__[] =
+PyDoc_STRVAR(capitalize__doc__,
 "S.capitalize() -> unicode\n\
 \n\
 Return a capitalized version of S, i.e. make the first character\n\
-have upper case.";
+have upper case.");
 
 static PyObject*
 unicode_capitalize(PyUnicodeObject *self)
@@ -3552,11 +3552,11 @@
 }
 
 #if 0
-static char capwords__doc__[] =
+PyDoc_STRVAR(capwords__doc__,
 "S.capwords() -> unicode\n\
 \n\
 Apply .capitalize() to all words in S and return the result with\n\
-normalized whitespace (all whitespace strings are replaced by ' ').";
+normalized whitespace (all whitespace strings are replaced by ' ').");
 
 static PyObject*
 unicode_capwords(PyUnicodeObject *self)
@@ -3589,11 +3589,11 @@
 }
 #endif
 
-static char center__doc__[] =
+PyDoc_STRVAR(center__doc__,
 "S.center(width) -> unicode\n\
 \n\
 Return S centered in a Unicode string of length width. Padding is done\n\
-using spaces.";
+using spaces.");
 
 static PyObject *
 unicode_center(PyUnicodeObject *self, PyObject *args)
@@ -3818,12 +3818,12 @@
     return NULL;
 }
 
-static char count__doc__[] =
+PyDoc_STRVAR(count__doc__,
 "S.count(sub[, start[, end]]) -> int\n\
 \n\
 Return the number of occurrences of substring sub in Unicode string\n\
 S[start:end].  Optional arguments start and end are\n\
-interpreted as in slice notation.";
+interpreted as in slice notation.");
 
 static PyObject *
 unicode_count(PyUnicodeObject *self, PyObject *args)
@@ -3859,13 +3859,13 @@
     return result;
 }
 
-static char encode__doc__[] =
+PyDoc_STRVAR(encode__doc__,
 "S.encode([encoding[,errors]]) -> string\n\
 \n\
 Return an encoded string version of S. Default encoding is the current\n\
 default string encoding. errors may be given to set a different error\n\
 handling scheme. Default is 'strict' meaning that encoding errors raise\n\
-a ValueError. Other possible values are 'ignore' and 'replace'.";
+a ValueError. Other possible values are 'ignore' and 'replace'.");
 
 static PyObject *
 unicode_encode(PyUnicodeObject *self, PyObject *args)
@@ -3877,11 +3877,11 @@
     return PyUnicode_AsEncodedString((PyObject *)self, encoding, errors);
 }
 
-static char expandtabs__doc__[] =
+PyDoc_STRVAR(expandtabs__doc__,
 "S.expandtabs([tabsize]) -> unicode\n\
 \n\
 Return a copy of S where all tab characters are expanded using spaces.\n\
-If tabsize is not given, a tab size of 8 characters is assumed.";
+If tabsize is not given, a tab size of 8 characters is assumed.");
 
 static PyObject*
 unicode_expandtabs(PyUnicodeObject *self, PyObject *args)
@@ -3939,14 +3939,14 @@
     return (PyObject*) u;
 }
 
-static char find__doc__[] =
+PyDoc_STRVAR(find__doc__,
 "S.find(sub [,start [,end]]) -> int\n\
 \n\
 Return the lowest index in S where substring sub is found,\n\
 such that sub is contained within s[start,end].  Optional\n\
 arguments start and end are interpreted as in slice notation.\n\
 \n\
-Return -1 on failure.";
+Return -1 on failure.");
 
 static PyObject *
 unicode_find(PyUnicodeObject *self, PyObject *args)
@@ -4008,10 +4008,10 @@
     return x;
 }
 
-static char index__doc__[] =
+PyDoc_STRVAR(index__doc__,
 "S.index(sub [,start [,end]]) -> int\n\
 \n\
-Like S.find() but raise ValueError when the substring is not found.";
+Like S.find() but raise ValueError when the substring is not found.");
 
 static PyObject *
 unicode_index(PyUnicodeObject *self, PyObject *args)
@@ -4040,11 +4040,11 @@
     return PyInt_FromLong(result);
 }
 
-static char islower__doc__[] =
+PyDoc_STRVAR(islower__doc__,
 "S.islower() -> bool\n\
 \n\
 Return True if all cased characters in S are lowercase and there is\n\
-at least one cased character in S, False otherwise.";
+at least one cased character in S, False otherwise.");
 
 static PyObject*
 unicode_islower(PyUnicodeObject *self)
@@ -4074,11 +4074,11 @@
     return PyBool_FromLong(cased);
 }
 
-static char isupper__doc__[] =
+PyDoc_STRVAR(isupper__doc__,
 "S.isupper() -> bool\n\
 \n\
 Return True if  all cased characters in S are uppercase and there is\n\
-at least one cased character in S, False otherwise.";
+at least one cased character in S, False otherwise.");
 
 static PyObject*
 unicode_isupper(PyUnicodeObject *self)
@@ -4108,12 +4108,12 @@
     return PyBool_FromLong(cased);
 }
 
-static char istitle__doc__[] =
+PyDoc_STRVAR(istitle__doc__,
 "S.istitle() -> bool\n\
 \n\
 Return True if S is a titlecased string, i.e. upper- and titlecase\n\
 characters may only follow uncased characters and lowercase characters\n\
-only cased ones. Return False otherwise.";
+only cased ones. Return False otherwise.");
 
 static PyObject*
 unicode_istitle(PyUnicodeObject *self)
@@ -4155,11 +4155,11 @@
     return PyBool_FromLong(cased);
 }
 
-static char isspace__doc__[] =
+PyDoc_STRVAR(isspace__doc__,
 "S.isspace() -> bool\n\
 \n\
 Return True if there are only whitespace characters in S,\n\
-False otherwise.";
+False otherwise.");
 
 static PyObject*
 unicode_isspace(PyUnicodeObject *self)
@@ -4184,11 +4184,11 @@
     return PyBool_FromLong(1);
 }
 
-static char isalpha__doc__[] =
+PyDoc_STRVAR(isalpha__doc__,
 "S.isalpha() -> bool\n\
 \n\
 Return True if  all characters in S are alphabetic\n\
-and there is at least one character in S, False otherwise.";
+and there is at least one character in S, False otherwise.");
 
 static PyObject*
 unicode_isalpha(PyUnicodeObject *self)
@@ -4213,11 +4213,11 @@
     return PyBool_FromLong(1);
 }
 
-static char isalnum__doc__[] =
+PyDoc_STRVAR(isalnum__doc__,
 "S.isalnum() -> bool\n\
 \n\
 Return True if  all characters in S are alphanumeric\n\
-and there is at least one character in S, False otherwise.";
+and there is at least one character in S, False otherwise.");
 
 static PyObject*
 unicode_isalnum(PyUnicodeObject *self)
@@ -4242,11 +4242,11 @@
     return PyBool_FromLong(1);
 }
 
-static char isdecimal__doc__[] =
+PyDoc_STRVAR(isdecimal__doc__,
 "S.isdecimal() -> bool\n\
 \n\
 Return True if there are only decimal characters in S,\n\
-False otherwise.";
+False otherwise.");
 
 static PyObject*
 unicode_isdecimal(PyUnicodeObject *self)
@@ -4271,11 +4271,11 @@
     return PyBool_FromLong(1);
 }
 
-static char isdigit__doc__[] =
+PyDoc_STRVAR(isdigit__doc__,
 "S.isdigit() -> bool\n\
 \n\
 Return True if there are only digit characters in S,\n\
-False otherwise.";
+False otherwise.");
 
 static PyObject*
 unicode_isdigit(PyUnicodeObject *self)
@@ -4300,11 +4300,11 @@
     return PyBool_FromLong(1);
 }
 
-static char isnumeric__doc__[] =
+PyDoc_STRVAR(isnumeric__doc__,
 "S.isnumeric() -> bool\n\
 \n\
 Return True if there are only numeric characters in S,\n\
-False otherwise.";
+False otherwise.");
 
 static PyObject*
 unicode_isnumeric(PyUnicodeObject *self)
@@ -4329,11 +4329,11 @@
     return PyBool_FromLong(1);
 }
 
-static char join__doc__[] =
+PyDoc_STRVAR(join__doc__,
 "S.join(sequence) -> unicode\n\
 \n\
 Return a string which is the concatenation of the strings in the\n\
-sequence.  The separator between elements is S.";
+sequence.  The separator between elements is S.");
 
 static PyObject*
 unicode_join(PyObject *self, PyObject *data)
@@ -4347,11 +4347,11 @@
     return self->length;
 }
 
-static char ljust__doc__[] =
+PyDoc_STRVAR(ljust__doc__,
 "S.ljust(width) -> unicode\n\
 \n\
 Return S left justified in a Unicode string of length width. Padding is\n\
-done using spaces.";
+done using spaces.");
 
 static PyObject *
 unicode_ljust(PyUnicodeObject *self, PyObject *args)
@@ -4368,10 +4368,10 @@
     return (PyObject*) pad(self, 0, width - self->length, ' ');
 }
 
-static char lower__doc__[] =
+PyDoc_STRVAR(lower__doc__,
 "S.lower() -> unicode\n\
 \n\
-Return a copy of the string S converted to lowercase.";
+Return a copy of the string S converted to lowercase.");
 
 static PyObject*
 unicode_lower(PyUnicodeObject *self)
@@ -4494,13 +4494,13 @@
 }
 
 
-static char strip__doc__[] =
+PyDoc_STRVAR(strip__doc__,
 "S.strip([sep]) -> unicode\n\
 \n\
 Return a copy of the string S with leading and trailing\n\
 whitespace removed.\n\
 If sep is given and not None, remove characters in sep instead.\n\
-If sep is a str, it will be converted to unicode before stripping";
+If sep is a str, it will be converted to unicode before stripping");
 
 static PyObject *
 unicode_strip(PyUnicodeObject *self, PyObject *args)
@@ -4512,12 +4512,12 @@
 }
 
 
-static char lstrip__doc__[] =
+PyDoc_STRVAR(lstrip__doc__,
 "S.lstrip([sep]) -> unicode\n\
 \n\
 Return a copy of the string S with leading whitespace removed.\n\
 If sep is given and not None, remove characters in sep instead.\n\
-If sep is a str, it will be converted to unicode before stripping";
+If sep is a str, it will be converted to unicode before stripping");
 
 static PyObject *
 unicode_lstrip(PyUnicodeObject *self, PyObject *args)
@@ -4529,12 +4529,12 @@
 }
 
 
-static char rstrip__doc__[] =
+PyDoc_STRVAR(rstrip__doc__,
 "S.rstrip([sep]) -> unicode\n\
 \n\
 Return a copy of the string S with trailing whitespace removed.\n\
 If sep is given and not None, remove characters in sep instead.\n\
-If sep is a str, it will be converted to unicode before stripping";
+If sep is a str, it will be converted to unicode before stripping");
 
 static PyObject *
 unicode_rstrip(PyUnicodeObject *self, PyObject *args)
@@ -4626,12 +4626,12 @@
     return result;
 }
 
-static char replace__doc__[] =
+PyDoc_STRVAR(replace__doc__,
 "S.replace (old, new[, maxsplit]) -> unicode\n\
 \n\
 Return a copy of S with all occurrences of substring\n\
 old replaced by new.  If the optional argument maxsplit is\n\
-given, only the first maxsplit occurrences are replaced.";
+given, only the first maxsplit occurrences are replaced.");
 
 static PyObject*
 unicode_replace(PyUnicodeObject *self, PyObject *args)
@@ -4665,14 +4665,14 @@
 				1);
 }
 
-static char rfind__doc__[] =
+PyDoc_STRVAR(rfind__doc__,
 "S.rfind(sub [,start [,end]]) -> int\n\
 \n\
 Return the highest index in S where substring sub is found,\n\
 such that sub is contained within s[start,end].  Optional\n\
 arguments start and end are interpreted as in slice notation.\n\
 \n\
-Return -1 on failure.";
+Return -1 on failure.");
 
 static PyObject *
 unicode_rfind(PyUnicodeObject *self, PyObject *args)
@@ -4696,10 +4696,10 @@
     return result;
 }
 
-static char rindex__doc__[] =
+PyDoc_STRVAR(rindex__doc__,
 "S.rindex(sub [,start [,end]]) -> int\n\
 \n\
-Like S.rfind() but raise ValueError when the substring is not found.";
+Like S.rfind() but raise ValueError when the substring is not found.");
 
 static PyObject *
 unicode_rindex(PyUnicodeObject *self, PyObject *args)
@@ -4727,11 +4727,11 @@
     return PyInt_FromLong(result);
 }
 
-static char rjust__doc__[] =
+PyDoc_STRVAR(rjust__doc__,
 "S.rjust(width) -> unicode\n\
 \n\
 Return S right justified in a Unicode string of length width. Padding is\n\
-done using spaces.";
+done using spaces.");
 
 static PyObject *
 unicode_rjust(PyUnicodeObject *self, PyObject *args)
@@ -4794,13 +4794,13 @@
     return result;
 }
 
-static char split__doc__[] =
+PyDoc_STRVAR(split__doc__,
 "S.split([sep [,maxsplit]]) -> list of strings\n\
 \n\
 Return a list of the words in S, using sep as the\n\
 delimiter string.  If maxsplit is given, at most maxsplit\n\
 splits are done. If sep is not specified, any whitespace string\n\
-is a separator.";
+is a separator.");
 
 static PyObject*
 unicode_split(PyUnicodeObject *self, PyObject *args)
@@ -4819,12 +4819,12 @@
 	return PyUnicode_Split((PyObject *)self, substring, maxcount);
 }
 
-static char splitlines__doc__[] =
+PyDoc_STRVAR(splitlines__doc__,
 "S.splitlines([keepends]]) -> list of strings\n\
 \n\
 Return a list of the lines in S, breaking at line boundaries.\n\
 Line breaks are not included in the resulting list unless keepends\n\
-is given and true.";
+is given and true.");
 
 static PyObject*
 unicode_splitlines(PyUnicodeObject *self, PyObject *args)
@@ -4843,11 +4843,11 @@
     return PyUnicode_AsEncodedString((PyObject *)self, NULL, NULL);
 }
 
-static char swapcase__doc__[] =
+PyDoc_STRVAR(swapcase__doc__,
 "S.swapcase() -> unicode\n\
 \n\
 Return a copy of S with uppercase characters converted to lowercase\n\
-and vice versa.";
+and vice versa.");
 
 static PyObject*
 unicode_swapcase(PyUnicodeObject *self)
@@ -4855,13 +4855,13 @@
     return fixup(self, fixswapcase);
 }
 
-static char translate__doc__[] =
+PyDoc_STRVAR(translate__doc__,
 "S.translate(table) -> unicode\n\
 \n\
 Return a copy of the string S, where all characters have been mapped\n\
 through the given translation table, which must be a mapping of\n\
 Unicode ordinals to Unicode ordinals or None. Unmapped characters\n\
-are left untouched. Characters mapped to None are deleted.";
+are left untouched. Characters mapped to None are deleted.");
 
 static PyObject*
 unicode_translate(PyUnicodeObject *self, PyObject *table)
@@ -4872,10 +4872,10 @@
 				      "ignore");
 }
 
-static char upper__doc__[] =
+PyDoc_STRVAR(upper__doc__,
 "S.upper() -> unicode\n\
 \n\
-Return a copy of S converted to uppercase.";
+Return a copy of S converted to uppercase.");
 
 static PyObject*
 unicode_upper(PyUnicodeObject *self)
@@ -4883,11 +4883,11 @@
     return fixup(self, fixupper);
 }
 
-static char zfill__doc__[] =
+PyDoc_STRVAR(zfill__doc__,
 "S.zfill(width) -> unicode\n\
 \n\
 Pad a numeric string x with zeros on the left, to fill a field\n\
-of the specified width. The string x is never truncated.";
+of the specified width. The string x is never truncated.");
 
 static PyObject *
 unicode_zfill(PyUnicodeObject *self, PyObject *args)
@@ -4935,12 +4935,12 @@
 }
 #endif
 
-static char startswith__doc__[] =
+PyDoc_STRVAR(startswith__doc__,
 "S.startswith(prefix[, start[, end]]) -> bool\n\
 \n\
 Return True if S starts with the specified prefix, False otherwise.  With\n\
 optional start, test S beginning at that position.  With optional end, stop\n\
-comparing S at that position.";
+comparing S at that position.");
 
 static PyObject *
 unicode_startswith(PyUnicodeObject *self,
@@ -4966,12 +4966,12 @@
 }
 
 
-static char endswith__doc__[] =
+PyDoc_STRVAR(endswith__doc__,
 "S.endswith(suffix[, start[, end]]) -> bool\n\
 \n\
 Return True if S ends with the specified suffix, False otherwise.  With\n\
 optional start, test S beginning at that position.  With optional end, stop\n\
-comparing S at that position.";
+comparing S at that position.");
 
 static PyObject *
 unicode_endswith(PyUnicodeObject *self,
@@ -5847,12 +5847,12 @@
 	return (PyObject *)pnew;
 }
 
-static char unicode_doc[] =
+PyDoc_STRVAR(unicode_doc,
 "unicode(string [, encoding[, errors]]) -> object\n\
 \n\
 Create a new Unicode object from the given encoded string.\n\
 encoding defaults to the current default string encoding and \n\
-errors, defining the error handling, to 'strict'.";
+errors, defining the error handling, to 'strict'.");
 
 PyTypeObject PyUnicode_Type = {
     PyObject_HEAD_INIT(&PyType_Type)
diff --git a/PC/_winreg.c b/PC/_winreg.c
index c86d2bb..407a4b6 100644
--- a/PC/_winreg.c
+++ b/PC/_winreg.c
@@ -34,7 +34,7 @@
 /* Forward declares */
 
 /* Doc strings */
-static char module_doc[] =
+PyDoc_STRVAR(module_doc,
 "This module provides access to the Windows registry API.\n"
 "\n"
 "Functions:\n"
@@ -68,18 +68,18 @@
 "\n"
 "Integer constants:\n"
 "Many constants are defined - see the documentation for each function\n"
-"to see what constants are used, and where.";
+"to see what constants are used, and where.");
 
 
-static char CloseKey_doc[] =
+PyDoc_STRVAR(CloseKey_doc,
 "CloseKey(hkey) - Closes a previously opened registry key.\n"
 "\n"
 "The hkey argument specifies a previously opened key.\n"
 "\n"
 "Note that if the key is not closed using this method, it will be\n"
-"closed when the hkey object is destroyed by Python.";
+"closed when the hkey object is destroyed by Python.");
 
-static char ConnectRegistry_doc[] =
+PyDoc_STRVAR(ConnectRegistry_doc,
 "key = ConnectRegistry(computer_name, key) - "
 "Establishes a connection to a predefined registry handle on another computer.\n"
 "\n"
@@ -88,9 +88,9 @@
 "key is the predefined handle to connect to.\n"
 "\n"
 "The return value is the handle of the opened key.\n"
-"If the function fails, an EnvironmentError exception is raised.";
+"If the function fails, an EnvironmentError exception is raised.");
 
-static char CreateKey_doc[] =
+PyDoc_STRVAR(CreateKey_doc,
 "key = CreateKey(key, sub_key) - Creates or opens the specified key.\n"
 "\n"
 "key is an already open key, or one of the predefined HKEY_* constants\n"
@@ -101,9 +101,9 @@
 "If the key already exists, this function opens the existing key\n"
 "\n"
 "The return value is the handle of the opened key.\n"
-"If the function fails, an exception is raised.";
+"If the function fails, an exception is raised.");
 
-static char DeleteKey_doc[] =
+PyDoc_STRVAR(DeleteKey_doc,
 "DeleteKey(key, sub_key) - Deletes the specified key.\n"
 "\n"
 "key is an already open key, or any one of the predefined HKEY_* constants.\n"
@@ -113,15 +113,15 @@
 "This method can not delete keys with subkeys.\n"
 "\n"
 "If the method succeeds, the entire key, including all of its values,\n"
-"is removed.  If the method fails, an EnvironmentError exception is raised.";
+"is removed.  If the method fails, an EnvironmentError exception is raised.");
 
-static char DeleteValue_doc[] =
+PyDoc_STRVAR(DeleteValue_doc,
 "DeleteValue(key, value) - Removes a named value from a registry key.\n"
 "\n"
 "key is an already open key, or any one of the predefined HKEY_* constants.\n"
-"value is a string that identifies the value to remove.";
+"value is a string that identifies the value to remove.");
 
-static char EnumKey_doc[] =
+PyDoc_STRVAR(EnumKey_doc,
 "string = EnumKey(key, index) - Enumerates subkeys of an open registry key.\n"
 "\n"
 "key is an already open key, or any one of the predefined HKEY_* constants.\n"
@@ -129,9 +129,9 @@
 "\n"
 "The function retrieves the name of one subkey each time it is called.\n"
 "It is typically called repeatedly until an EnvironmentError exception is\n"
-"raised, indicating no more values are available.\n";
+"raised, indicating no more values are available.");
 
-static char EnumValue_doc[] =
+PyDoc_STRVAR(EnumValue_doc,
 "tuple = EnumValue(key, index) - Enumerates values of an open registry key.\n"
 "key is an already open key, or any one of the predefined HKEY_* constants.\n"
 "index is an integer that identifies the index of the value to retrieve.\n"
@@ -144,9 +144,9 @@
 "value_name is a string that identifies the value.\n"
 "value_data is an object that holds the value data, and whose type depends\n"
 " on the underlying registry type.\n"
-"data_type is an integer that identifies the type of the value data.";
+"data_type is an integer that identifies the type of the value data.");
 
-static char FlushKey_doc[] =
+PyDoc_STRVAR(FlushKey_doc,
 "FlushKey(key) - Writes all the attributes of a key to the registry.\n"
 "\n"
 "key is an already open key, or any one of the predefined HKEY_* constants.\n"
@@ -157,9 +157,9 @@
 "Unlike CloseKey(), the FlushKey() method returns only when all the data has\n"
 "been written to the registry.\n"
 "An application should only call FlushKey() if it requires absolute certainty that registry changes are on disk.\n"
-"If you don't know whether a FlushKey() call is required, it probably isn't.\n";
+"If you don't know whether a FlushKey() call is required, it probably isn't.");
 
-static char LoadKey_doc[] =
+PyDoc_STRVAR(LoadKey_doc,
 "LoadKey(key, sub_key, file_name) - Creates a subkey under the specified key\n"
 "and stores registration information from a specified file into that subkey.\n"
 "\n"
@@ -176,9 +176,9 @@
 "If key is a handle returned by ConnectRegistry(), then the path specified\n"
 "in fileName is relative to the remote computer.\n"
 "\n"
-"The docs imply key must be in the HKEY_USER or HKEY_LOCAL_MACHINE tree";
+"The docs imply key must be in the HKEY_USER or HKEY_LOCAL_MACHINE tree");
 
-static char OpenKey_doc[] =
+PyDoc_STRVAR(OpenKey_doc,
 "key = OpenKey(key, sub_key, res = 0, sam = KEY_READ) - Opens the specified key.\n"
 "\n"
 "key is an already open key, or any one of the predefined HKEY_* constants.\n"
@@ -188,12 +188,11 @@
 " security access for the key.  Default is KEY_READ\n"
 "\n"
 "The result is a new handle to the specified key\n"
-"If the function fails, an EnvironmentError exception is raised.\n";
+"If the function fails, an EnvironmentError exception is raised.");
 
-static char OpenKeyEx_doc[] =
-"See OpenKey()";
+PyDoc_STRVAR(OpenKeyEx_doc, "See OpenKey()");
 
-static char QueryInfoKey_doc[] =
+PyDoc_STRVAR(QueryInfoKey_doc,
 "tuple = QueryInfoKey(key) - Returns information about a key.\n"
 "\n"
 "key is an already open key, or any one of the predefined HKEY_* constants.\n"
@@ -202,9 +201,9 @@
 "An integer that identifies the number of sub keys this key has.\n"
 "An integer that identifies the number of values this key has.\n"
 "A long integer that identifies when the key was last modified (if available)\n"
-" as 100's of nanoseconds since Jan 1, 1600.\n";
+" as 100's of nanoseconds since Jan 1, 1600.");
 
-static char QueryValue_doc[] =
+PyDoc_STRVAR(QueryValue_doc,
 "string = QueryValue(key, sub_key) - retrieves the unnamed value for a key.\n"
 "\n"
 "key is an already open key, or any one of the predefined HKEY_* constants.\n"
@@ -214,15 +213,15 @@
 "\n"
 "Values in the registry have name, type, and data components. This method\n"
 "retrieves the data for a key's first value that has a NULL name.\n"
-"But the underlying API call doesn't return the type, Lame Lame Lame, DONT USE THIS!!!";
+"But the underlying API call doesn't return the type, Lame Lame Lame, DONT USE THIS!!!");
 
-static char QueryValueEx_doc[] =
+PyDoc_STRVAR(QueryValueEx_doc,
 "value,type_id = QueryValueEx(key, value_name) - Retrieves the type and data for a specified value name associated with an open registry key.\n"
 "\n"
 "key is an already open key, or any one of the predefined HKEY_* constants.\n"
-"value_name is a string indicating the value to query";
+"value_name is a string indicating the value to query");
 
-static char SaveKey_doc[] =
+PyDoc_STRVAR(SaveKey_doc,
 "SaveKey(key, file_name) - Saves the specified key, and all its subkeys to the specified file.\n"
 "\n"
 "key is an already open key, or any one of the predefined HKEY_* constants.\n"
@@ -234,9 +233,9 @@
 "If key represents a key on a remote computer, the path described by\n"
 "file_name is relative to the remote computer.\n"
 "The caller of this method must possess the SeBackupPrivilege security privilege.\n"
-"This function passes NULL for security_attributes to the API.";
+"This function passes NULL for security_attributes to the API.");
 
-static char SetValue_doc[] =
+PyDoc_STRVAR(SetValue_doc,
 "SetValue(key, sub_key, type, value) - Associates a value with a specified key.\n"
 "\n"
 "key is an already open key, or any one of the predefined HKEY_* constants.\n"
@@ -253,9 +252,9 @@
 "the configuration registry.  This helps the registry perform efficiently.\n"
 "\n"
 "The key identified by the key parameter must have been opened with\n"
-"KEY_SET_VALUE access.";
+"KEY_SET_VALUE access.");
 
-static char SetValueEx_doc[] =
+PyDoc_STRVAR(SetValueEx_doc,
 "SetValueEx(key, value_name, reserved, type, value) - Stores data in the value field of an open registry key.\n"
 "\n"
 "key is an already open key, or any one of the predefined HKEY_* constants.\n"
@@ -285,10 +284,10 @@
 "\n"
 "Value lengths are limited by available memory. Long values (more than\n"
 "2048 bytes) should be stored as files with the filenames stored in \n"
-"the configuration registry.  This helps the registry perform efficiently.\n";
+"the configuration registry.  This helps the registry perform efficiently.");
 
 /* PyHKEY docstrings */
-static char PyHKEY_doc[] =
+PyDoc_STRVAR(PyHKEY_doc,
 "PyHKEY Object - A Python object, representing a win32 registry key.\n"
 "\n"
 "This object wraps a Windows HKEY object, automatically closing it when\n"
@@ -308,15 +307,15 @@
 "Operations:\n"
 "__nonzero__ - Handles with an open object return true, otherwise false.\n"
 "__int__ - Converting a handle to an integer returns the Win32 handle.\n"
-"__cmp__ - Handle objects are compared using the handle value.\n";
+"__cmp__ - Handle objects are compared using the handle value.");
 
 
-static char PyHKEY_Close_doc[] =
+PyDoc_STRVAR(PyHKEY_Close_doc,
 "key.Close() - Closes the underlying Windows handle.\n"
 "\n"
-"If the handle is already closed, no error is raised.";
+"If the handle is already closed, no error is raised.");
 
-static char PyHKEY_Detach_doc[] =
+PyDoc_STRVAR(PyHKEY_Detach_doc,
 "int = key.Detach() - Detaches the Windows handle from the handle object.\n"
 "\n"
 "The result is the value of the handle before it is detached.  If the\n"
@@ -326,7 +325,7 @@
 "but the handle is not closed.  You would call this function when you\n"
 "need the underlying win32 handle to exist beyond the lifetime of the\n"
 "handle object.\n"
-"On 64 bit windows, the result of this function is a long integer\n";
+"On 64 bit windows, the result of this function is a long integer");
 
 
 /************************************************************************
diff --git a/PC/winsound.c b/PC/winsound.c
index 704af6c..26508b6 100644
--- a/PC/winsound.c
+++ b/PC/winsound.c
@@ -40,13 +40,13 @@
 #include <conio.h>	/* port functions on Win9x */
 #include <Python.h>
 
-static char sound_playsound_doc[] =
+PyDoc_STRVAR(sound_playsound_doc,
 "PlaySound(sound, flags) - a wrapper around the Windows PlaySound API\n"
 "\n"
 "The sound argument can be a filename, data, or None.\n"
-"For flag values, ored together, see module documentation.\n";
+"For flag values, ored together, see module documentation.");
 
-static char sound_beep_doc[] =
+PyDoc_STRVAR(sound_beep_doc,
 "Beep(frequency, duration) - a wrapper around the Windows Beep API\n"
 "\n"
 "The frequency argument specifies frequency, in hertz, of the sound.\n"
@@ -54,9 +54,9 @@
 "The duration argument specifies the number of milliseconds.\n"
 "On WinNT and 2000, the platform Beep API is used directly.  Else funky\n"
 "code doing direct port manipulation is used; it's unknown whether that\n"
-"will work on all systems.\n";
+"will work on all systems.");
 
-static char sound_module_doc[] =
+PyDoc_STRVAR(sound_module_doc,
 "PlaySound(sound, flags) - play a sound\n"
 "SND_FILENAME - sound is a wav file name\n"
 "SND_ALIAS - sound is a registry sound association name\n"
@@ -68,7 +68,7 @@
 "SND_NOSTOP - Do not interrupt any sounds currently playing\n"  // Raising RuntimeError if needed
 "SND_NOWAIT - Return immediately if the sound driver is busy\n" // Without any errors
 "\n"
-"Beep(frequency, duration) - Make a beep through the PC speaker.\n";
+"Beep(frequency, duration) - Make a beep through the PC speaker.");
 
 PyObject *
 sound_playsound(PyObject *s, PyObject *args)
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 5aa6bc7..8f28ea6 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -40,7 +40,7 @@
 	return PyImport_ImportModuleEx(name, globals, locals, fromlist);
 }
 
-static char import_doc[] =
+PyDoc_STRVAR(import_doc,
 "__import__(name, globals, locals, fromlist) -> module\n\
 \n\
 Import a module.  The globals are only used to determine the context;\n\
@@ -49,7 +49,7 @@
 empty list to emulate ``import name''.\n\
 When importing a module from a package, note that __import__('A.B', ...)\n\
 returns package A when fromlist is empty, but its submodule B when\n\
-fromlist is not empty.";
+fromlist is not empty.");
 
 
 static PyObject *
@@ -58,10 +58,10 @@
 	return PyNumber_Absolute(v);
 }
 
-static char abs_doc[] =
+PyDoc_STRVAR(abs_doc,
 "abs(number) -> number\n\
 \n\
-Return the absolute value of the argument.";
+Return the absolute value of the argument.");
 
 
 static PyObject *
@@ -98,12 +98,12 @@
 	return retval;
 }
 
-static char apply_doc[] =
+PyDoc_STRVAR(apply_doc,
 "apply(object[, args[, kwargs]]) -> value\n\
 \n\
 Call a callable object with positional arguments taken from the tuple args,\n\
 and keyword arguments taken from the optional dictionary kwargs.\n\
-Note that classes are callable, as are instances with a __call__() method.";
+Note that classes are callable, as are instances with a __call__() method.");
 
 
 static PyObject *
@@ -118,13 +118,13 @@
 	return PyBuffer_FromObject(ob, offset, size);
 }
 
-static char buffer_doc[] =
+PyDoc_STRVAR(buffer_doc,
 "buffer(object [, offset[, size]]) -> object\n\
 \n\
 Create a new buffer object which references the given object.\n\
 The buffer will reference a slice of the target object from the\n\
 start of the object (or at the specified offset). The slice will\n\
-extend to the end of the target object (or with the specified size).";
+extend to the end of the target object (or with the specified size).");
 
 
 static PyObject *
@@ -133,11 +133,11 @@
 	return PyBool_FromLong((long)PyCallable_Check(v));
 }
 
-static char callable_doc[] =
+PyDoc_STRVAR(callable_doc,
 "callable(object) -> bool\n\
 \n\
 Return whether the object is callable (i.e., some kind of function).\n\
-Note that classes are callable, as are instances with a __call__() method.";
+Note that classes are callable, as are instances with a __call__() method.");
 
 
 static PyObject *
@@ -246,12 +246,12 @@
 	return NULL;
 }
 
-static char filter_doc[] =
+PyDoc_STRVAR(filter_doc,
 "filter(function or None, sequence) -> list, tuple, or string\n"
 "\n"
 "Return those items of sequence for which function(item) is true.  If\n"
 "function is None, return the items that are true.  If sequence is a tuple\n"
-"or string, return the same type, else return a list.";
+"or string, return the same type, else return a list.");
 
 static PyObject *
 builtin_chr(PyObject *self, PyObject *args)
@@ -270,10 +270,10 @@
 	return PyString_FromStringAndSize(s, 1);
 }
 
-static char chr_doc[] =
+PyDoc_STRVAR(chr_doc,
 "chr(i) -> character\n\
 \n\
-Return a string of one character with ordinal i; 0 <= i < 256.";
+Return a string of one character with ordinal i; 0 <= i < 256.");
 
 
 #ifdef Py_USING_UNICODE
@@ -321,10 +321,10 @@
 	}
 }
 
-static char unichr_doc[] =
+PyDoc_STRVAR(unichr_doc,
 "unichr(i) -> Unicode character\n\
 \n\
-Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff.";
+Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff.");
 #endif
 
 
@@ -341,10 +341,10 @@
 	return PyInt_FromLong((long)c);
 }
 
-static char cmp_doc[] =
+PyDoc_STRVAR(cmp_doc,
 "cmp(x, y) -> integer\n\
 \n\
-Return negative if x<y, zero if x==y, positive if x>y.";
+Return negative if x<y, zero if x==y, positive if x>y.");
 
 
 static PyObject *
@@ -363,11 +363,11 @@
 	return res;
 }
 
-static char coerce_doc[] =
+PyDoc_STRVAR(coerce_doc,
 "coerce(x, y) -> None or (x1, y1)\n\
 \n\
 When x and y can be coerced to values of the same type, return a tuple\n\
-containing the coerced values.  When they can't be coerced, return None.";
+containing the coerced values.  When they can't be coerced, return None.");
 
 
 static PyObject *
@@ -411,7 +411,7 @@
 	return Py_CompileStringFlags(str, filename, start, &cf);
 }
 
-static char compile_doc[] =
+PyDoc_STRVAR(compile_doc,
 "compile(source, filename, mode[, flags[, dont_inherit]]) -> code object\n\
 \n\
 Compile the source string (a Python module, statement or expression)\n\
@@ -424,7 +424,7 @@
 The dont_inherit argument, if non-zero, stops the compilation inheriting\n\
 the effects of any future statements in effect in the code calling\n\
 compile; if absent or zero these statements do influence the compilation,\n\
-in addition to any features explicitly specified.";
+in addition to any features explicitly specified.");
 
 static PyObject *
 builtin_dir(PyObject *self, PyObject *args)
@@ -436,7 +436,7 @@
 	return PyObject_Dir(arg);
 }
 
-static char dir_doc[] =
+PyDoc_STRVAR(dir_doc,
 "dir([object]) -> list of strings\n"
 "\n"
 "Return an alphabetized list of names comprising (some of) the attributes\n"
@@ -447,7 +447,7 @@
 "Type or class object:  its attributes, and recursively the attributes of\n"
 "    its bases.\n"
 "Otherwise:  its attributes, its class's attributes, and recursively the\n"
-"    attributes of its class's base classes.";
+"    attributes of its class's base classes.");
 
 static PyObject *
 builtin_divmod(PyObject *self, PyObject *args)
@@ -459,10 +459,10 @@
 	return PyNumber_Divmod(v, w);
 }
 
-static char divmod_doc[] =
+PyDoc_STRVAR(divmod_doc,
 "divmod(x, y) -> (div, mod)\n\
 \n\
-Return the tuple ((x-x%y)/y, x%y).  Invariant: div*y + mod == x.";
+Return the tuple ((x-x%y)/y, x%y).  Invariant: div*y + mod == x.");
 
 
 static PyObject *
@@ -517,14 +517,14 @@
 	return PyRun_StringFlags(str, Py_eval_input, globals, locals, &cf);
 }
 
-static char eval_doc[] =
+PyDoc_STRVAR(eval_doc,
 "eval(source[, globals[, locals]]) -> value\n\
 \n\
 Evaluate the source in the context of globals and locals.\n\
 The source may be a string representing a Python expression\n\
 or a code object as returned by compile().\n\
 The globals and locals are dictionaries, defaulting to the current\n\
-globals and locals.  If only globals is given, locals defaults to it.";
+globals and locals.  If only globals is given, locals defaults to it.");
 
 
 static PyObject *
@@ -616,12 +616,12 @@
 	return res;
 }
 
-static char execfile_doc[] =
+PyDoc_STRVAR(execfile_doc,
 "execfile(filename[, globals[, locals]])\n\
 \n\
 Read and execute a Python script from a file.\n\
 The globals and locals are dictionaries, defaulting to the current\n\
-globals and locals.  If only globals is given, locals defaults to it.";
+globals and locals.  If only globals is given, locals defaults to it.");
 
 
 static PyObject *
@@ -656,12 +656,12 @@
 	return result;
 }
 
-static char getattr_doc[] =
+PyDoc_STRVAR(getattr_doc,
 "getattr(object, name[, default]) -> value\n\
 \n\
 Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.\n\
 When a default argument is given, it is returned when the attribute doesn't\n\
-exist; without it, an exception is raised in that case.";
+exist; without it, an exception is raised in that case.");
 
 
 static PyObject *
@@ -674,10 +674,10 @@
 	return d;
 }
 
-static char globals_doc[] =
+PyDoc_STRVAR(globals_doc,
 "globals() -> dictionary\n\
 \n\
-Return the dictionary containing the current scope's global variables.";
+Return the dictionary containing the current scope's global variables.");
 
 
 static PyObject *
@@ -712,11 +712,11 @@
 	return Py_True;
 }
 
-static char hasattr_doc[] =
+PyDoc_STRVAR(hasattr_doc,
 "hasattr(object, name) -> bool\n\
 \n\
 Return whether the object has an attribute with the given name.\n\
-(This is done by calling getattr(object, name) and catching exceptions.)";
+(This is done by calling getattr(object, name) and catching exceptions.)");
 
 
 static PyObject *
@@ -725,11 +725,11 @@
 	return PyLong_FromVoidPtr(v);
 }
 
-static char id_doc[] =
+PyDoc_STRVAR(id_doc,
 "id(object) -> integer\n\
 \n\
 Return the identity of an object.  This is guaranteed to be unique among\n\
-simultaneously existing objects.  (Hint: it's the object's memory address.)";
+simultaneously existing objects.  (Hint: it's the object's memory address.)");
 
 
 static PyObject *
@@ -888,7 +888,7 @@
 	return result;
 }
 
-static char map_doc[] =
+PyDoc_STRVAR(map_doc,
 "map(function, sequence[, sequence, ...]) -> list\n\
 \n\
 Return a list of the results of applying the function to the items of\n\
@@ -896,7 +896,7 @@
 function is called with an argument list consisting of the corresponding\n\
 item of each sequence, substituting None for missing values when not all\n\
 sequences have the same length.  If the function is None, return a list of\n\
-the items of the sequence (or a list of tuples if more than one sequence).";
+the items of the sequence (or a list of tuples if more than one sequence).");
 
 
 static PyObject *
@@ -914,11 +914,11 @@
 	return Py_None;
 }
 
-static char setattr_doc[] =
+PyDoc_STRVAR(setattr_doc,
 "setattr(object, name, value)\n\
 \n\
 Set a named attribute on an object; setattr(x, 'y', v) is equivalent to\n\
-``x.y = v''.";
+``x.y = v''.");
 
 
 static PyObject *
@@ -935,11 +935,11 @@
 	return Py_None;
 }
 
-static char delattr_doc[] =
+PyDoc_STRVAR(delattr_doc,
 "delattr(object, name)\n\
 \n\
 Delete a named attribute on an object; delattr(x, 'y') is equivalent to\n\
-``del x.y''.";
+``del x.y''.");
 
 
 static PyObject *
@@ -953,11 +953,11 @@
 	return PyInt_FromLong(x);
 }
 
-static char hash_doc[] =
+PyDoc_STRVAR(hash_doc,
 "hash(object) -> integer\n\
 \n\
 Return a hash value for the object.  Two objects with the same value have\n\
-the same hash value.  The reverse is not necessarily true, but likely.";
+the same hash value.  The reverse is not necessarily true, but likely.");
 
 
 static PyObject *
@@ -974,10 +974,10 @@
 	return (*nb->nb_hex)(v);
 }
 
-static char hex_doc[] =
+PyDoc_STRVAR(hex_doc,
 "hex(number) -> string\n\
 \n\
-Return the hexadecimal representation of an integer or long integer.";
+Return the hexadecimal representation of an integer or long integer.");
 
 
 static PyObject *builtin_raw_input(PyObject *, PyObject *);
@@ -1009,10 +1009,10 @@
 	return res;
 }
 
-static char input_doc[] =
+PyDoc_STRVAR(input_doc,
 "input([prompt]) -> value\n\
 \n\
-Equivalent to eval(raw_input(prompt)).";
+Equivalent to eval(raw_input(prompt)).");
 
 
 static PyObject *
@@ -1026,13 +1026,13 @@
 	return s;
 }
 
-static char intern_doc[] =
+PyDoc_STRVAR(intern_doc,
 "intern(string) -> string\n\
 \n\
 ``Intern'' the given string.  This enters the string in the (global)\n\
 table of interned strings whose purpose is to speed up dictionary lookups.\n\
 Return the string itself or the previously interned string object with the\n\
-same value.";
+same value.");
 
 
 static PyObject *
@@ -1052,13 +1052,13 @@
 	return PyCallIter_New(v, w);
 }
 
-static char iter_doc[] =
+PyDoc_STRVAR(iter_doc,
 "iter(collection) -> iterator\n\
 iter(callable, sentinel) -> iterator\n\
 \n\
 Get an iterator from an object.  In the first form, the argument must\n\
 supply its own iterator, or be a sequence.\n\
-In the second form, the callable is called until it returns the sentinel.";
+In the second form, the callable is called until it returns the sentinel.");
 
 
 static PyObject *
@@ -1072,10 +1072,10 @@
 	return PyInt_FromLong(res);
 }
 
-static char len_doc[] =
+PyDoc_STRVAR(len_doc,
 "len(object) -> integer\n\
 \n\
-Return the number of items of a sequence or mapping.";
+Return the number of items of a sequence or mapping.");
 
 
 static PyObject *
@@ -1097,10 +1097,10 @@
 	return PySlice_New(start, stop, step);
 }
 
-static char slice_doc[] =
+PyDoc_STRVAR(slice_doc,
 "slice([start,] stop[, step]) -> slice object\n\
 \n\
-Create a slice object.  This is used for slicing by the Numeric extensions.";
+Create a slice object.  This is used for slicing by the Numeric extensions.");
 
 
 static PyObject *
@@ -1113,10 +1113,10 @@
 	return d;
 }
 
-static char locals_doc[] =
+PyDoc_STRVAR(locals_doc,
 "locals() -> dictionary\n\
 \n\
-Return the dictionary containing the current scope's local variables.";
+Return the dictionary containing the current scope's local variables.");
 
 
 static PyObject *
@@ -1176,12 +1176,12 @@
 	return min_max(v, Py_LT);
 }
 
-static char min_doc[] =
+PyDoc_STRVAR(min_doc,
 "min(sequence) -> value\n\
 min(a, b, c, ...) -> value\n\
 \n\
 With a single sequence argument, return its smallest item.\n\
-With two or more arguments, return the smallest argument.";
+With two or more arguments, return the smallest argument.");
 
 
 static PyObject *
@@ -1190,12 +1190,12 @@
 	return min_max(v, Py_GT);
 }
 
-static char max_doc[] =
+PyDoc_STRVAR(max_doc,
 "max(sequence) -> value\n\
 max(a, b, c, ...) -> value\n\
 \n\
 With a single sequence argument, return its largest item.\n\
-With two or more arguments, return the largest argument.";
+With two or more arguments, return the largest argument.");
 
 
 static PyObject *
@@ -1212,10 +1212,10 @@
 	return (*nb->nb_oct)(v);
 }
 
-static char oct_doc[] =
+PyDoc_STRVAR(oct_doc,
 "oct(number) -> string\n\
 \n\
-Return the octal representation of an integer or long integer.";
+Return the octal representation of an integer or long integer.");
 
 
 static PyObject *
@@ -1252,10 +1252,10 @@
 	return NULL;
 }
 
-static char ord_doc[] =
+PyDoc_STRVAR(ord_doc,
 "ord(c) -> integer\n\
 \n\
-Return the integer ordinal of a one-character string.";
+Return the integer ordinal of a one-character string.");
 
 
 static PyObject *
@@ -1268,11 +1268,11 @@
 	return PyNumber_Power(v, w, z);
 }
 
-static char pow_doc[] =
+PyDoc_STRVAR(pow_doc,
 "pow(x, y[, z]) -> number\n\
 \n\
 With two arguments, equivalent to x**y.  With three arguments,\n\
-equivalent to (x**y) % z, but may be more efficient (e.g. for longs).";
+equivalent to (x**y) % z, but may be more efficient (e.g. for longs).");
 
 
 /* Return number of items in range/xrange (lo, hi, step).  step > 0
@@ -1354,14 +1354,14 @@
 	return v;
 }
 
-static char range_doc[] =
+PyDoc_STRVAR(range_doc,
 "range([start,] stop[, step]) -> list of integers\n\
 \n\
 Return a list containing an arithmetic progression of integers.\n\
 range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.\n\
 When step is given, it specifies the increment (or decrement).\n\
 For example, range(4) returns [0, 1, 2, 3].  The end point is omitted!\n\
-These are exactly the valid indices for a list of 4 elements.";
+These are exactly the valid indices for a list of 4 elements.");
 
 
 static PyObject *
@@ -1432,13 +1432,13 @@
 	return PyFile_GetLine(f, -1);
 }
 
-static char raw_input_doc[] =
+PyDoc_STRVAR(raw_input_doc,
 "raw_input([prompt]) -> string\n\
 \n\
 Read a string from standard input.  The trailing newline is stripped.\n\
 If the user hits EOF (Unix: Ctl-D, Windows: Ctl-Z+Return), raise EOFError.\n\
 On Unix, GNU readline is used if enabled.  The prompt string, if given,\n\
-is printed without a trailing newline before reading.";
+is printed without a trailing newline before reading.");
 
 
 static PyObject *
@@ -1504,7 +1504,7 @@
 	return NULL;
 }
 
-static char reduce_doc[] =
+PyDoc_STRVAR(reduce_doc,
 "reduce(function, sequence[, initial]) -> value\n\
 \n\
 Apply a function of two arguments cumulatively to the items of a sequence,\n\
@@ -1512,7 +1512,7 @@
 For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates\n\
 ((((1+2)+3)+4)+5).  If initial is present, it is placed before the items\n\
 of the sequence in the calculation, and serves as a default when the\n\
-sequence is empty.";
+sequence is empty.");
 
 
 static PyObject *
@@ -1521,10 +1521,10 @@
 	return PyImport_ReloadModule(v);
 }
 
-static char reload_doc[] =
+PyDoc_STRVAR(reload_doc,
 "reload(module) -> module\n\
 \n\
-Reload the module.  The module must have been successfully imported before.";
+Reload the module.  The module must have been successfully imported before.");
 
 
 static PyObject *
@@ -1533,11 +1533,11 @@
 	return PyObject_Repr(v);
 }
 
-static char repr_doc[] =
+PyDoc_STRVAR(repr_doc,
 "repr(object) -> string\n\
 \n\
 Return the canonical string representation of the object.\n\
-For most object types, eval(repr(object)) == object.";
+For most object types, eval(repr(object)) == object.");
 
 
 static PyObject *
@@ -1569,11 +1569,11 @@
 	return PyFloat_FromDouble(x);
 }
 
-static char round_doc[] =
+PyDoc_STRVAR(round_doc,
 "round(number[, ndigits]) -> floating point number\n\
 \n\
 Round a number to a given precision in decimal digits (default 0 digits).\n\
-This always returns a floating point number.  Precision may be negative.";
+This always returns a floating point number.  Precision may be negative.");
 
 
 static PyObject *
@@ -1605,11 +1605,11 @@
 	return d;
 }
 
-static char vars_doc[] =
+PyDoc_STRVAR(vars_doc,
 "vars([object]) -> dictionary\n\
 \n\
 Without arguments, equivalent to locals().\n\
-With an argument, equivalent to object.__dict__.";
+With an argument, equivalent to object.__dict__.");
 
 static PyObject *
 builtin_isinstance(PyObject *self, PyObject *args)
@@ -1627,13 +1627,13 @@
 	return PyBool_FromLong(retval);
 }
 
-static char isinstance_doc[] =
+PyDoc_STRVAR(isinstance_doc,
 "isinstance(object, class-or-type-or-tuple) -> bool\n\
 \n\
 Return whether an object is an instance of a class or of a subclass thereof.\n\
 With a type as second argument, return whether that is the object's type.\n\
 The form using a tuple, isinstance(x, (A, B, ...)), is a shortcut for\n\
-isinstance(x, A) or isinstance(x, B) or ... (etc.).";
+isinstance(x, A) or isinstance(x, B) or ... (etc.).");
 
 
 static PyObject *
@@ -1652,10 +1652,10 @@
 	return PyBool_FromLong(retval);
 }
 
-static char issubclass_doc[] =
+PyDoc_STRVAR(issubclass_doc,
 "issubclass(C, B) -> bool\n\
 \n\
-Return whether class C is a subclass (i.e., a derived class) of class B.";
+Return whether class C is a subclass (i.e., a derived class) of class B.");
 
 
 static PyObject*
@@ -1763,12 +1763,12 @@
 }
 
 
-static char zip_doc[] =
+PyDoc_STRVAR(zip_doc,
 "zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]\n\
 \n\
 Return a list of tuples, where each tuple contains the i-th element\n\
 from each of the argument sequences.  The returned list is truncated\n\
-in length to the length of the shortest argument sequence.";
+in length to the length of the shortest argument sequence.");
 
 
 static PyMethodDef builtin_methods[] = {
@@ -1822,10 +1822,10 @@
 	{NULL,		NULL},
 };
 
-static char builtin_doc[] =
+PyDoc_STRVAR(builtin_doc,
 "Built-in functions, exceptions, and other objects.\n\
 \n\
-Noteworthy: None is the `nil' object; Ellipsis represents `...' in slices.";
+Noteworthy: None is the `nil' object; Ellipsis represents `...' in slices.");
 
 PyObject *
 _PyBuiltin_Init(void)
diff --git a/Python/exceptions.c b/Python/exceptions.c
index bd8f55d..afb6a7b 100644
--- a/Python/exceptions.c
+++ b/Python/exceptions.c
@@ -30,8 +30,7 @@
  * Doc/lib/libexcs.tex!
  */
 
-static char
-module__doc__[] =
+PyDoc_STRVAR(module__doc__,
 "Python's standard exception class hierarchy.\n\
 \n\
 Before Python 1.5, the standard exceptions were all simple string objects.\n\
@@ -113,7 +112,8 @@
       +-- PendingDeprecationWarning\n\
       +-- SyntaxWarning\n\
       +-- OverflowWarning\n\
-      +-- RuntimeWarning";
+      +-- RuntimeWarning"
+);
 
 
 /* Helper function for populating a dictionary with method wrappers. */
@@ -230,8 +230,7 @@
  * All classes after Exception can be created using PyErr_NewException().
  */
 
-static char
-Exception__doc__[] = "Common base class for all exceptions.";
+PyDoc_STRVAR(Exception__doc__, "Common base class for all exceptions.");
 
 
 static PyObject *
@@ -372,19 +371,16 @@
 
 
 
-static char
-StandardError__doc__[] = "Base class for all standard Python exceptions.";
+PyDoc_STRVAR(StandardError__doc__,
+"Base class for all standard Python exceptions.");
 
-static char
-TypeError__doc__[] = "Inappropriate argument type.";
+PyDoc_STRVAR(TypeError__doc__, "Inappropriate argument type.");
 
-static char
-StopIteration__doc__[] = "Signal the end from iterator.next().";
+PyDoc_STRVAR(StopIteration__doc__, "Signal the end from iterator.next().");
 
 
 
-static char
-SystemExit__doc__[] = "Request to exit from the interpreter.";
+PyDoc_STRVAR(SystemExit__doc__, "Request to exit from the interpreter.");
 
 
 static PyObject *
@@ -439,17 +435,14 @@
 
 
 
-static char
-KeyboardInterrupt__doc__[] = "Program interrupted by user.";
+PyDoc_STRVAR(KeyboardInterrupt__doc__, "Program interrupted by user.");
 
-static char
-ImportError__doc__[] =
-"Import can't find module, or can't find name in module.";
+PyDoc_STRVAR(ImportError__doc__,
+"Import can't find module, or can't find name in module.");
 
 
 
-static char
-EnvironmentError__doc__[] = "Base class for I/O related errors.";
+PyDoc_STRVAR(EnvironmentError__doc__, "Base class for I/O related errors.");
 
 
 static PyObject *
@@ -627,41 +620,31 @@
 
 
 
-static char
-IOError__doc__[] = "I/O operation failed.";
+PyDoc_STRVAR(IOError__doc__, "I/O operation failed.");
 
-static char
-OSError__doc__[] = "OS system call failed.";
+PyDoc_STRVAR(OSError__doc__, "OS system call failed.");
 
 #ifdef MS_WINDOWS
-static char
-WindowsError__doc__[] = "MS-Windows OS system call failed.";
+PyDoc_STRVAR(WindowsError__doc__, "MS-Windows OS system call failed.");
 #endif /* MS_WINDOWS */
 
-static char
-EOFError__doc__[] = "Read beyond end of file.";
+PyDoc_STRVAR(EOFError__doc__, "Read beyond end of file.");
 
-static char
-RuntimeError__doc__[] = "Unspecified run-time error.";
+PyDoc_STRVAR(RuntimeError__doc__, "Unspecified run-time error.");
 
-static char
-NotImplementedError__doc__[] =
-"Method or function hasn't been implemented yet.";
+PyDoc_STRVAR(NotImplementedError__doc__,
+"Method or function hasn't been implemented yet.");
 
-static char
-NameError__doc__[] = "Name not found globally.";
+PyDoc_STRVAR(NameError__doc__, "Name not found globally.");
 
-static char
-UnboundLocalError__doc__[] =
-"Local name referenced but not bound to a value.";
+PyDoc_STRVAR(UnboundLocalError__doc__,
+"Local name referenced but not bound to a value.");
 
-static char
-AttributeError__doc__[] = "Attribute not found.";
+PyDoc_STRVAR(AttributeError__doc__, "Attribute not found.");
 
 
 
-static char
-SyntaxError__doc__[] = "Invalid syntax.";
+PyDoc_STRVAR(SyntaxError__doc__, "Invalid syntax.");
 
 
 static int
@@ -859,81 +842,65 @@
 
 /* Exception doc strings */
 
-static char
-AssertionError__doc__[] = "Assertion failed.";
+PyDoc_STRVAR(AssertionError__doc__, "Assertion failed.");
 
-static char
-LookupError__doc__[] = "Base class for lookup errors.";
+PyDoc_STRVAR(LookupError__doc__, "Base class for lookup errors.");
 
-static char
-IndexError__doc__[] = "Sequence index out of range.";
+PyDoc_STRVAR(IndexError__doc__, "Sequence index out of range.");
 
-static char
-KeyError__doc__[] = "Mapping key not found.";
+PyDoc_STRVAR(KeyError__doc__, "Mapping key not found.");
 
-static char
-ArithmeticError__doc__[] = "Base class for arithmetic errors.";
+PyDoc_STRVAR(ArithmeticError__doc__, "Base class for arithmetic errors.");
 
-static char
-OverflowError__doc__[] = "Result too large to be represented.";
+PyDoc_STRVAR(OverflowError__doc__, "Result too large to be represented.");
 
-static char
-ZeroDivisionError__doc__[] =
-"Second argument to a division or modulo operation was zero.";
+PyDoc_STRVAR(ZeroDivisionError__doc__,
+"Second argument to a division or modulo operation was zero.");
 
-static char
-FloatingPointError__doc__[] = "Floating point operation failed.";
+PyDoc_STRVAR(FloatingPointError__doc__, "Floating point operation failed.");
 
-static char
-ValueError__doc__[] = "Inappropriate argument value (of correct type).";
+PyDoc_STRVAR(ValueError__doc__,
+"Inappropriate argument value (of correct type).");
 
-static char
-UnicodeError__doc__[] = "Unicode related error.";
+PyDoc_STRVAR(UnicodeError__doc__, "Unicode related error.");
 
-static char
-SystemError__doc__[] = "Internal error in the Python interpreter.\n\
+PyDoc_STRVAR(SystemError__doc__,
+"Internal error in the Python interpreter.\n\
 \n\
 Please report this to the Python maintainer, along with the traceback,\n\
-the Python version, and the hardware/OS platform and version.";
+the Python version, and the hardware/OS platform and version.");
 
-static char
-ReferenceError__doc__[] = "Weak ref proxy used after referent went away.";
+PyDoc_STRVAR(ReferenceError__doc__,
+"Weak ref proxy used after referent went away.");
 
-static char
-MemoryError__doc__[] = "Out of memory.";
+PyDoc_STRVAR(MemoryError__doc__, "Out of memory.");
 
-static char
-IndentationError__doc__[] = "Improper indentation.";
+PyDoc_STRVAR(IndentationError__doc__, "Improper indentation.");
 
-static char
-TabError__doc__[] = "Improper mixture of spaces and tabs.";
+PyDoc_STRVAR(TabError__doc__, "Improper mixture of spaces and tabs.");
 
 /* Warning category docstrings */
 
-static char
-Warning__doc__[] = "Base class for warning categories.";
+PyDoc_STRVAR(Warning__doc__, "Base class for warning categories.");
 
-static char
-UserWarning__doc__[] = "Base class for warnings generated by user code.";
+PyDoc_STRVAR(UserWarning__doc__,
+"Base class for warnings generated by user code.");
 
-static char
-DeprecationWarning__doc__[] =
-"Base class for warnings about deprecated features.";
+PyDoc_STRVAR(DeprecationWarning__doc__,
+"Base class for warnings about deprecated features.");
 
-static char
-PendingDeprecationWarning__doc__[] =
+PyDoc_STRVAR(PendingDeprecationWarning__doc__,
 "Base class for warnings about features which will be deprecated "
-"in the future.";
+"in the future.");
 
-static char
-SyntaxWarning__doc__[] = "Base class for warnings about dubious syntax.";
+PyDoc_STRVAR(SyntaxWarning__doc__,
+"Base class for warnings about dubious syntax.");
 
-static char
-OverflowWarning__doc__[] = "Base class for warnings about numeric overflow.";
+PyDoc_STRVAR(OverflowWarning__doc__,
+"Base class for warnings about numeric overflow.");
 
-static char
-RuntimeWarning__doc__[] =
-"Base class for warnings about dubious runtime behavior.";
+PyDoc_STRVAR(RuntimeWarning__doc__,
+"Base class for warnings about dubious runtime behavior.");
 
 
 
diff --git a/Python/import.c b/Python/import.c
index 8c9cd2f..e3efffe 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -2455,47 +2455,40 @@
 
 /* Doc strings */
 
-static char doc_imp[] = "\
-This module provides the components needed to build your own\n\
-__import__ function.  Undocumented functions are obsolete.\n\
-";
+PyDoc_STRVAR(doc_imp,
+"This module provides the components needed to build your own\n\
+__import__ function.  Undocumented functions are obsolete.");
 
-static char doc_find_module[] = "\
-find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
+PyDoc_STRVAR(doc_find_module,
+"find_module(name, [path]) -> (file, filename, (suffix, mode, type))\n\
 Search for a module.  If path is omitted or None, search for a\n\
 built-in, frozen or special module and continue search in sys.path.\n\
 The module name cannot contain '.'; to search for a submodule of a\n\
-package, pass the submodule name and the package's __path__.\
-";
+package, pass the submodule name and the package's __path__.");
 
-static char doc_load_module[] = "\
-load_module(name, file, filename, (suffix, mode, type)) -> module\n\
+PyDoc_STRVAR(doc_load_module,
+"load_module(name, file, filename, (suffix, mode, type)) -> module\n\
 Load a module, given information returned by find_module().\n\
-The module name must include the full package name, if any.\
-";
+The module name must include the full package name, if any.");
 
-static char doc_get_magic[] = "\
-get_magic() -> string\n\
-Return the magic number for .pyc or .pyo files.\
-";
+PyDoc_STRVAR(doc_get_magic,
+"get_magic() -> string\n\
+Return the magic number for .pyc or .pyo files.");
 
-static char doc_get_suffixes[] = "\
-get_suffixes() -> [(suffix, mode, type), ...]\n\
+PyDoc_STRVAR(doc_get_suffixes,
+"get_suffixes() -> [(suffix, mode, type), ...]\n\
 Return a list of (suffix, mode, type) tuples describing the files\n\
-that find_module() looks for.\
-";
+that find_module() looks for.");
 
-static char doc_new_module[] = "\
-new_module(name) -> module\n\
+PyDoc_STRVAR(doc_new_module,
+"new_module(name) -> module\n\
 Create a new module.  Do not enter it in sys.modules.\n\
-The module name must include the full package name, if any.\
-";
+The module name must include the full package name, if any.");
 
-static char doc_lock_held[] = "\
-lock_held() -> 0 or 1\n\
+PyDoc_STRVAR(doc_lock_held,
+"lock_held() -> 0 or 1\n\
 Return 1 if the import lock is currently held.\n\
-On platforms without threads, return 0.\
-";
+On platforms without threads, return 0.");
 
 static PyMethodDef imp_methods[] = {
 	{"find_module",		imp_find_module, METH_VARARGS, doc_find_module},
diff --git a/RISCOS/Modules/riscosmodule.c b/RISCOS/Modules/riscosmodule.c
index cb4289d..adcc128 100644
--- a/RISCOS/Modules/riscosmodule.c
+++ b/RISCOS/Modules/riscosmodule.c
@@ -120,7 +120,7 @@
 	return d;
 }
 
-static char stat_result__doc__[] = 
+PyDoc_STRVAR(stat_result__doc__,
 "stat_result: Result from stat or lstat.\n\n\
 This object may be accessed either as a tuple of\n\
   (mode,ino,dev,nlink,uid,gid,size,atime,mtime,ctime)\n\
@@ -128,7 +128,7 @@
 \n\
 RiscOS: The fields st_ftype, st_attrs, and st_obtype are also available.\n\
 \n\
-See os.stat for more information.\n";
+See os.stat for more information.");
 
 static PyStructSequence_Field stat_result_fields[] = {
         { "st_mode",  "protection bits" },