code: def _split_ascii(s, firstlen, restlen, continuation_ws, splitchars):
      lines = []
      maxlen = firstlen
      for line in s.splitlines():
          # Ignore any leading whitespace (i.e. continuation whitespace) already
          # on the line, since we'll be adding our own.
          line = line.lstrip()
          if len(line) < maxlen:
              lines.append(line)
              maxlen = restlen
              continue
          # Attempt to split the line at the highest-level syntactic break
          # possible.  Note that we don't have a lot of smarts about field
          # syntax; we just try to break on semi-colons, then commas, then
          # whitespace.
          for ch in splitchars:
              if ch in line:
                  break
          else:
              # There's nothing useful to split the line on, not even spaces, so
              # just append this line unchanged
              lines.append(line)
              maxlen = restlen
              continue
          # Now split the line on the character plus trailing whitespace
          cre = re.compile(r"%s\s*" % ch)
          if ch in ";,":
              eol = ch
          else:
              eol = ""
          joiner = eol + " "
          joinlen = len(joiner)
          wslen = len(continuation_ws.replace("\t", SPACE8))
          this = []
          linelen = 0
          for part in cre.split(line):
              curlen = linelen + max(0, len(this) - 1) * joinlen
              partlen = len(part)
              onfirstline = not lines
              # We don't want to split after the field name, if we're on the
              # first line and the field name is present in the header string.
              if (
                  ch == " "
                  and onfirstline
                  and len(this) == 1
                  and fcre.match(this[0])
              ):
                  this.append(part)
                  linelen += partlen
              elif curlen + partlen > maxlen:
                  if this:
                      lines.append(joiner.join(this) + eol)
                  # If this part is longer than maxlen and we aren't already
                  # splitting on whitespace, try to recursively split this line
                  # on whitespace.
                  if partlen > maxlen and ch != " ":
                      subl = _split_ascii(
                          part, maxlen, restlen, continuation_ws, " "
                      )
                      lines.extend(subl[:-1])
                      this = [subl[-1]]
                  else:
                      this = [part]
                  linelen = wslen + len(this[-1])
                  maxlen = restlen
              else:
                  this.append(part)
                  linelen += partlen
          # Put any left over parts on a line by themselves
          if this:
              lines.append(joiner.join(this))
      return lines
  
imports: import re
  import binascii
  import email.quoprimime
  import email.base64mime
  from email.errors import HeaderParseError
  from email.charset import Charset
label_desc: Use image node_id 3 for calling a global function with example usage: _split_ascii(s, firstlen, restlen, continuation_ws, splitchars) and returns: lines