We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
['SUBSTFILEPREFIX', 'TEXTFILESUFFIX']

**Describe the bug**
From git head, just now.  
File: src/engine/SCons/Tool/textfile.py
Line 165:
_text_varlist = _common_varlist + ['TEXTFILEPREFIX', 'TEXTFILESUFFIX']

Line 174:
_subst_varlist = _common_varlist + ['SUBSTFILEPREFIX', 'TEXTFILESUFFIX']

Looks like a cur/paste/edit error.  My guess, from the rest of the code, is that
 'TEXTFILESUFFIX' should be  'SUBSTFILESUFFIX' on line 174


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `src/engine/SCons/Tool/textfile.py`
Content:
```
1 # -*- python -*-
2 #
3 # __COPYRIGHT__
4 #
5 # Permission is hereby granted, free of charge, to any person obtaining
6 # a copy of this software and associated documentation files (the
7 # "Software"), to deal in the Software without restriction, including
8 # without limitation the rights to use, copy, modify, merge, publish,
9 # distribute, sublicense, and/or sell copies of the Software, and to
10 # permit persons to whom the Software is furnished to do so, subject to
11 # the following conditions:
12 #
13 # The above copyright notice and this permission notice shall be included
14 # in all copies or substantial portions of the Software.
15 #
16 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
17 # KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
18 # WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19 # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20 # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21 # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22 # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 #
24 
25 __doc__ = """
26 Textfile/Substfile builder for SCons.
27 
28     Create file 'target' which typically is a textfile.  The 'source'
29     may be any combination of strings, Nodes, or lists of same.  A
30     'linesep' will be put between any part written and defaults to
31     os.linesep.
32 
33     The only difference between the Textfile builder and the Substfile
34     builder is that strings are converted to Value() nodes for the
35     former and File() nodes for the latter.  To insert files in the
36     former or strings in the latter, wrap them in a File() or Value(),
37     respectively.
38 
39     The values of SUBST_DICT first have any construction variables
40     expanded (its keys are not expanded).  If a value of SUBST_DICT is
41     a python callable function, it is called and the result is expanded
42     as the value.  Values are substituted in a "random" order; if any
43     substitution could be further expanded by another substitution, it
44     is unpredictable whether the expansion will occur.
45 """
46 
47 __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
48 
49 import SCons
50 
51 import os
52 import re
53 
54 from SCons.Node import Node
55 from SCons.Node.Python import Value
56 from SCons.Util import is_String, is_Sequence, is_Dict, to_bytes
57 
58 
59 TEXTFILE_FILE_WRITE_MODE = 'w'
60 
61 LINESEP = '\n'
62 
63 def _do_subst(node, subs):
64     """
65     Fetch the node contents and replace all instances of the keys with
66     their values.  For example, if subs is
67         {'%VERSION%': '1.2345', '%BASE%': 'MyProg', '%prefix%': '/bin'},
68     then all instances of %VERSION% in the file will be replaced with
69     1.2345 and so forth.
70     """
71     contents = node.get_text_contents()
72     if subs:
73         for (k, val) in subs:
74             contents = contents.replace(k, val)
75 
76     if 'b' in TEXTFILE_FILE_WRITE_MODE:
77         try:
78             contents = bytearray(contents, 'utf-8')
79         except UnicodeDecodeError:
80             # contents is already utf-8 encoded python 2 str i.e. a byte array
81             contents = bytearray(contents)
82 
83     return contents
84 
85 
86 def _action(target, source, env):
87 
88     # prepare the line separator
89     linesep = env['LINESEPARATOR']
90     if linesep is None:
91         linesep = LINESEP # os.linesep
92     elif is_String(linesep):
93         pass
94     elif isinstance(linesep, Value):
95         linesep = linesep.get_text_contents()
96     else:
97         raise SCons.Errors.UserError('unexpected type/class for LINESEPARATOR: %s'
98                                      % repr(linesep), None)
99 
100     if 'b' in TEXTFILE_FILE_WRITE_MODE:
101         linesep = to_bytes(linesep)
102 
103     # create a dictionary to use for the substitutions
104     if 'SUBST_DICT' not in env:
105         subs = None    # no substitutions
106     else:
107         subst_dict = env['SUBST_DICT']
108         if is_Dict(subst_dict):
109             subst_dict = list(subst_dict.items())
110         elif is_Sequence(subst_dict):
111             pass
112         else:
113             raise SCons.Errors.UserError('SUBST_DICT must be dict or sequence')
114         subs = []
115         for (k, value) in subst_dict:
116             if callable(value):
117                 value = value()
118             if is_String(value):
119                 value = env.subst(value)
120             else:
121                 value = str(value)
122             subs.append((k, value))
123 
124     # write the file
125     try:
126         target_file = open(target[0].get_path(), TEXTFILE_FILE_WRITE_MODE, newline='')
127     except (OSError, IOError):
128         raise SCons.Errors.UserError("Can't write target file %s" % target[0])
129 
130     # separate lines by 'linesep' only if linesep is not empty
131     lsep = None
132     for line in source:
133         if lsep:
134             target_file.write(lsep)
135 
136         target_file.write(_do_subst(line, subs))
137         lsep = linesep
138     target_file.close()
139 
140 
141 def _strfunc(target, source, env):
142     return "Creating '%s'" % target[0]
143 
144 
145 def _convert_list_R(newlist, sources):
146     for elem in sources:
147         if is_Sequence(elem):
148             _convert_list_R(newlist, elem)
149         elif isinstance(elem, Node):
150             newlist.append(elem)
151         else:
152             newlist.append(Value(elem))
153 
154 
155 def _convert_list(target, source, env):
156     if len(target) != 1:
157         raise SCons.Errors.UserError("Only one target file allowed")
158     newlist = []
159     _convert_list_R(newlist, source)
160     return target, newlist
161 
162 
163 _common_varlist = ['SUBST_DICT', 'LINESEPARATOR']
164 
165 _text_varlist = _common_varlist + ['TEXTFILEPREFIX', 'TEXTFILESUFFIX']
166 _text_builder = SCons.Builder.Builder(
167     action=SCons.Action.Action(_action, _strfunc, varlist=_text_varlist),
168     source_factory=Value,
169     emitter=_convert_list,
170     prefix='$TEXTFILEPREFIX',
171     suffix='$TEXTFILESUFFIX',
172 )
173 
174 _subst_varlist = _common_varlist + ['SUBSTFILEPREFIX', 'TEXTFILESUFFIX']
175 _subst_builder = SCons.Builder.Builder(
176     action=SCons.Action.Action(_action, _strfunc, varlist=_subst_varlist),
177     source_factory=SCons.Node.FS.File,
178     emitter=_convert_list,
179     prefix='$SUBSTFILEPREFIX',
180     suffix='$SUBSTFILESUFFIX',
181     src_suffix=['.in'],
182 )
183 
184 
185 def generate(env):
186     env['LINESEPARATOR'] = LINESEP # os.linesep
187     env['BUILDERS']['Textfile'] = _text_builder
188     env['TEXTFILEPREFIX'] = ''
189     env['TEXTFILESUFFIX'] = '.txt'
190     env['BUILDERS']['Substfile'] = _subst_builder
191     env['SUBSTFILEPREFIX'] = ''
192     env['SUBSTFILESUFFIX'] = ''
193 
194 
195 def exists(env):
196     return 1
197 
198 # Local Variables:
199 # tab-width:4
200 # indent-tabs-mode:nil
201 # End:
202 # vim: set expandtab tabstop=4 shiftwidth=4:
203
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/src/engine/SCons/Tool/textfile.py b/src/engine/SCons/Tool/textfile.py
--- a/src/engine/SCons/Tool/textfile.py
+++ b/src/engine/SCons/Tool/textfile.py
@@ -171,7 +171,7 @@
     suffix='$TEXTFILESUFFIX',
 )
 
-_subst_varlist = _common_varlist + ['SUBSTFILEPREFIX', 'TEXTFILESUFFIX']
+_subst_varlist = _common_varlist + ['SUBSTFILEPREFIX', 'SUBSTFILESUFFIX']
 _subst_builder = SCons.Builder.Builder(
     action=SCons.Action.Action(_action, _strfunc, varlist=_subst_varlist),
     source_factory=SCons.Node.FS.File,

{"golden_diff": "diff --git a/src/engine/SCons/Tool/textfile.py b/src/engine/SCons/Tool/textfile.py\n--- a/src/engine/SCons/Tool/textfile.py\n+++ b/src/engine/SCons/Tool/textfile.py\n@@ -171,7 +171,7 @@\n     suffix='$TEXTFILESUFFIX',\n )\n \n-_subst_varlist = _common_varlist + ['SUBSTFILEPREFIX', 'TEXTFILESUFFIX']\n+_subst_varlist = _common_varlist + ['SUBSTFILEPREFIX', 'SUBSTFILESUFFIX']\n _subst_builder = SCons.Builder.Builder(\n     action=SCons.Action.Action(_action, _strfunc, varlist=_subst_varlist),\n     source_factory=SCons.Node.FS.File,\n", "issue": "['SUBSTFILEPREFIX', 'TEXTFILESUFFIX']\n\r\n**Describe the bug**\r\nFrom git head, just now.  \r\nFile: src/engine/SCons/Tool/textfile.py\r\nLine 165:\r\n_text_varlist = _common_varlist + ['TEXTFILEPREFIX', 'TEXTFILESUFFIX']\r\n\r\nLine 174:\r\n_subst_varlist = _common_varlist + ['SUBSTFILEPREFIX', 'TEXTFILESUFFIX']\r\n\r\nLooks like a cur/paste/edit error.  My guess, from the rest of the code, is that\r\n 'TEXTFILESUFFIX' should be  'SUBSTFILESUFFIX' on line 174\r\n\n", "before_files": [{"content": "# -*- python -*-\n#\n# __COPYRIGHT__\n#\n# Permission is hereby granted, free of charge, to any person obtaining\n# a copy of this software and associated documentation files (the\n# \"Software\"), to deal in the Software without restriction, including\n# without limitation the rights to use, copy, modify, merge, publish,\n# distribute, sublicense, and/or sell copies of the Software, and to\n# permit persons to whom the Software is furnished to do so, subject to\n# the following conditions:\n#\n# The above copyright notice and this permission notice shall be included\n# in all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY\n# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n#\n\n__doc__ = \"\"\"\nTextfile/Substfile builder for SCons.\n\n    Create file 'target' which typically is a textfile.  The 'source'\n    may be any combination of strings, Nodes, or lists of same.  A\n    'linesep' will be put between any part written and defaults to\n    os.linesep.\n\n    The only difference between the Textfile builder and the Substfile\n    builder is that strings are converted to Value() nodes for the\n    former and File() nodes for the latter.  To insert files in the\n    former or strings in the latter, wrap them in a File() or Value(),\n    respectively.\n\n    The values of SUBST_DICT first have any construction variables\n    expanded (its keys are not expanded).  If a value of SUBST_DICT is\n    a python callable function, it is called and the result is expanded\n    as the value.  Values are substituted in a \"random\" order; if any\n    substitution could be further expanded by another substitution, it\n    is unpredictable whether the expansion will occur.\n\"\"\"\n\n__revision__ = \"__FILE__ __REVISION__ __DATE__ __DEVELOPER__\"\n\nimport SCons\n\nimport os\nimport re\n\nfrom SCons.Node import Node\nfrom SCons.Node.Python import Value\nfrom SCons.Util import is_String, is_Sequence, is_Dict, to_bytes\n\n\nTEXTFILE_FILE_WRITE_MODE = 'w'\n\nLINESEP = '\\n'\n\ndef _do_subst(node, subs):\n    \"\"\"\n    Fetch the node contents and replace all instances of the keys with\n    their values.  For example, if subs is\n        {'%VERSION%': '1.2345', '%BASE%': 'MyProg', '%prefix%': '/bin'},\n    then all instances of %VERSION% in the file will be replaced with\n    1.2345 and so forth.\n    \"\"\"\n    contents = node.get_text_contents()\n    if subs:\n        for (k, val) in subs:\n            contents = contents.replace(k, val)\n\n    if 'b' in TEXTFILE_FILE_WRITE_MODE:\n        try:\n            contents = bytearray(contents, 'utf-8')\n        except UnicodeDecodeError:\n            # contents is already utf-8 encoded python 2 str i.e. a byte array\n            contents = bytearray(contents)\n\n    return contents\n\n\ndef _action(target, source, env):\n\n    # prepare the line separator\n    linesep = env['LINESEPARATOR']\n    if linesep is None:\n        linesep = LINESEP # os.linesep\n    elif is_String(linesep):\n        pass\n    elif isinstance(linesep, Value):\n        linesep = linesep.get_text_contents()\n    else:\n        raise SCons.Errors.UserError('unexpected type/class for LINESEPARATOR: %s'\n                                     % repr(linesep), None)\n\n    if 'b' in TEXTFILE_FILE_WRITE_MODE:\n        linesep = to_bytes(linesep)\n\n    # create a dictionary to use for the substitutions\n    if 'SUBST_DICT' not in env:\n        subs = None    # no substitutions\n    else:\n        subst_dict = env['SUBST_DICT']\n        if is_Dict(subst_dict):\n            subst_dict = list(subst_dict.items())\n        elif is_Sequence(subst_dict):\n            pass\n        else:\n            raise SCons.Errors.UserError('SUBST_DICT must be dict or sequence')\n        subs = []\n        for (k, value) in subst_dict:\n            if callable(value):\n                value = value()\n            if is_String(value):\n                value = env.subst(value)\n            else:\n                value = str(value)\n            subs.append((k, value))\n\n    # write the file\n    try:\n        target_file = open(target[0].get_path(), TEXTFILE_FILE_WRITE_MODE, newline='')\n    except (OSError, IOError):\n        raise SCons.Errors.UserError(\"Can't write target file %s\" % target[0])\n\n    # separate lines by 'linesep' only if linesep is not empty\n    lsep = None\n    for line in source:\n        if lsep:\n            target_file.write(lsep)\n\n        target_file.write(_do_subst(line, subs))\n        lsep = linesep\n    target_file.close()\n\n\ndef _strfunc(target, source, env):\n    return \"Creating '%s'\" % target[0]\n\n\ndef _convert_list_R(newlist, sources):\n    for elem in sources:\n        if is_Sequence(elem):\n            _convert_list_R(newlist, elem)\n        elif isinstance(elem, Node):\n            newlist.append(elem)\n        else:\n            newlist.append(Value(elem))\n\n\ndef _convert_list(target, source, env):\n    if len(target) != 1:\n        raise SCons.Errors.UserError(\"Only one target file allowed\")\n    newlist = []\n    _convert_list_R(newlist, source)\n    return target, newlist\n\n\n_common_varlist = ['SUBST_DICT', 'LINESEPARATOR']\n\n_text_varlist = _common_varlist + ['TEXTFILEPREFIX', 'TEXTFILESUFFIX']\n_text_builder = SCons.Builder.Builder(\n    action=SCons.Action.Action(_action, _strfunc, varlist=_text_varlist),\n    source_factory=Value,\n    emitter=_convert_list,\n    prefix='$TEXTFILEPREFIX',\n    suffix='$TEXTFILESUFFIX',\n)\n\n_subst_varlist = _common_varlist + ['SUBSTFILEPREFIX', 'TEXTFILESUFFIX']\n_subst_builder = SCons.Builder.Builder(\n    action=SCons.Action.Action(_action, _strfunc, varlist=_subst_varlist),\n    source_factory=SCons.Node.FS.File,\n    emitter=_convert_list,\n    prefix='$SUBSTFILEPREFIX',\n    suffix='$SUBSTFILESUFFIX',\n    src_suffix=['.in'],\n)\n\n\ndef generate(env):\n    env['LINESEPARATOR'] = LINESEP # os.linesep\n    env['BUILDERS']['Textfile'] = _text_builder\n    env['TEXTFILEPREFIX'] = ''\n    env['TEXTFILESUFFIX'] = '.txt'\n    env['BUILDERS']['Substfile'] = _subst_builder\n    env['SUBSTFILEPREFIX'] = ''\n    env['SUBSTFILESUFFIX'] = ''\n\n\ndef exists(env):\n    return 1\n\n# Local Variables:\n# tab-width:4\n# indent-tabs-mode:nil\n# End:\n# vim: set expandtab tabstop=4 shiftwidth=4:\n", "path": "src/engine/SCons/Tool/textfile.py"}], "after_files": [{"content": "# -*- python -*-\n#\n# __COPYRIGHT__\n#\n# Permission is hereby granted, free of charge, to any person obtaining\n# a copy of this software and associated documentation files (the\n# \"Software\"), to deal in the Software without restriction, including\n# without limitation the rights to use, copy, modify, merge, publish,\n# distribute, sublicense, and/or sell copies of the Software, and to\n# permit persons to whom the Software is furnished to do so, subject to\n# the following conditions:\n#\n# The above copyright notice and this permission notice shall be included\n# in all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY\n# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\n# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n#\n\n__doc__ = \"\"\"\nTextfile/Substfile builder for SCons.\n\n    Create file 'target' which typically is a textfile.  The 'source'\n    may be any combination of strings, Nodes, or lists of same.  A\n    'linesep' will be put between any part written and defaults to\n    os.linesep.\n\n    The only difference between the Textfile builder and the Substfile\n    builder is that strings are converted to Value() nodes for the\n    former and File() nodes for the latter.  To insert files in the\n    former or strings in the latter, wrap them in a File() or Value(),\n    respectively.\n\n    The values of SUBST_DICT first have any construction variables\n    expanded (its keys are not expanded).  If a value of SUBST_DICT is\n    a python callable function, it is called and the result is expanded\n    as the value.  Values are substituted in a \"random\" order; if any\n    substitution could be further expanded by another substitution, it\n    is unpredictable whether the expansion will occur.\n\"\"\"\n\n__revision__ = \"__FILE__ __REVISION__ __DATE__ __DEVELOPER__\"\n\nimport SCons\n\nimport os\nimport re\n\nfrom SCons.Node import Node\nfrom SCons.Node.Python import Value\nfrom SCons.Util import is_String, is_Sequence, is_Dict, to_bytes\n\n\nTEXTFILE_FILE_WRITE_MODE = 'w'\n\nLINESEP = '\\n'\n\ndef _do_subst(node, subs):\n    \"\"\"\n    Fetch the node contents and replace all instances of the keys with\n    their values.  For example, if subs is\n        {'%VERSION%': '1.2345', '%BASE%': 'MyProg', '%prefix%': '/bin'},\n    then all instances of %VERSION% in the file will be replaced with\n    1.2345 and so forth.\n    \"\"\"\n    contents = node.get_text_contents()\n    if subs:\n        for (k, val) in subs:\n            contents = contents.replace(k, val)\n\n    if 'b' in TEXTFILE_FILE_WRITE_MODE:\n        try:\n            contents = bytearray(contents, 'utf-8')\n        except UnicodeDecodeError:\n            # contents is already utf-8 encoded python 2 str i.e. a byte array\n            contents = bytearray(contents)\n\n    return contents\n\n\ndef _action(target, source, env):\n\n    # prepare the line separator\n    linesep = env['LINESEPARATOR']\n    if linesep is None:\n        linesep = LINESEP # os.linesep\n    elif is_String(linesep):\n        pass\n    elif isinstance(linesep, Value):\n        linesep = linesep.get_text_contents()\n    else:\n        raise SCons.Errors.UserError('unexpected type/class for LINESEPARATOR: %s'\n                                     % repr(linesep), None)\n\n    if 'b' in TEXTFILE_FILE_WRITE_MODE:\n        linesep = to_bytes(linesep)\n\n    # create a dictionary to use for the substitutions\n    if 'SUBST_DICT' not in env:\n        subs = None    # no substitutions\n    else:\n        subst_dict = env['SUBST_DICT']\n        if is_Dict(subst_dict):\n            subst_dict = list(subst_dict.items())\n        elif is_Sequence(subst_dict):\n            pass\n        else:\n            raise SCons.Errors.UserError('SUBST_DICT must be dict or sequence')\n        subs = []\n        for (k, value) in subst_dict:\n            if callable(value):\n                value = value()\n            if is_String(value):\n                value = env.subst(value)\n            else:\n                value = str(value)\n            subs.append((k, value))\n\n    # write the file\n    try:\n        target_file = open(target[0].get_path(), TEXTFILE_FILE_WRITE_MODE, newline='')\n    except (OSError, IOError):\n        raise SCons.Errors.UserError(\"Can't write target file %s\" % target[0])\n\n    # separate lines by 'linesep' only if linesep is not empty\n    lsep = None\n    for line in source:\n        if lsep:\n            target_file.write(lsep)\n\n        target_file.write(_do_subst(line, subs))\n        lsep = linesep\n    target_file.close()\n\n\ndef _strfunc(target, source, env):\n    return \"Creating '%s'\" % target[0]\n\n\ndef _convert_list_R(newlist, sources):\n    for elem in sources:\n        if is_Sequence(elem):\n            _convert_list_R(newlist, elem)\n        elif isinstance(elem, Node):\n            newlist.append(elem)\n        else:\n            newlist.append(Value(elem))\n\n\ndef _convert_list(target, source, env):\n    if len(target) != 1:\n        raise SCons.Errors.UserError(\"Only one target file allowed\")\n    newlist = []\n    _convert_list_R(newlist, source)\n    return target, newlist\n\n\n_common_varlist = ['SUBST_DICT', 'LINESEPARATOR']\n\n_text_varlist = _common_varlist + ['TEXTFILEPREFIX', 'TEXTFILESUFFIX']\n_text_builder = SCons.Builder.Builder(\n    action=SCons.Action.Action(_action, _strfunc, varlist=_text_varlist),\n    source_factory=Value,\n    emitter=_convert_list,\n    prefix='$TEXTFILEPREFIX',\n    suffix='$TEXTFILESUFFIX',\n)\n\n_subst_varlist = _common_varlist + ['SUBSTFILEPREFIX', 'SUBSTFILESUFFIX']\n_subst_builder = SCons.Builder.Builder(\n    action=SCons.Action.Action(_action, _strfunc, varlist=_subst_varlist),\n    source_factory=SCons.Node.FS.File,\n    emitter=_convert_list,\n    prefix='$SUBSTFILEPREFIX',\n    suffix='$SUBSTFILESUFFIX',\n    src_suffix=['.in'],\n)\n\n\ndef generate(env):\n    env['LINESEPARATOR'] = LINESEP # os.linesep\n    env['BUILDERS']['Textfile'] = _text_builder\n    env['TEXTFILEPREFIX'] = ''\n    env['TEXTFILESUFFIX'] = '.txt'\n    env['BUILDERS']['Substfile'] = _subst_builder\n    env['SUBSTFILEPREFIX'] = ''\n    env['SUBSTFILESUFFIX'] = ''\n\n\ndef exists(env):\n    return 1\n\n# Local Variables:\n# tab-width:4\n# indent-tabs-mode:nil\n# End:\n# vim: set expandtab tabstop=4 shiftwidth=4:\n", "path": "src/engine/SCons/Tool/textfile.py"}]}