]> git.proxmox.com Git - mirror_edk2.git/blobdiff - AppPkg/Applications/Python/Python-2.7.2/Lib/email/_parseaddr.py
edk2: Remove AppPkg, StdLib, StdLibPrivateInternalFiles
[mirror_edk2.git] / AppPkg / Applications / Python / Python-2.7.2 / Lib / email / _parseaddr.py
diff --git a/AppPkg/Applications/Python/Python-2.7.2/Lib/email/_parseaddr.py b/AppPkg/Applications/Python/Python-2.7.2/Lib/email/_parseaddr.py
deleted file mode 100644 (file)
index 9375d2d..0000000
+++ /dev/null
@@ -1,497 +0,0 @@
-# Copyright (C) 2002-2007 Python Software Foundation\r
-# Contact: email-sig@python.org\r
-\r
-"""Email address parsing code.\r
-\r
-Lifted directly from rfc822.py.  This should eventually be rewritten.\r
-"""\r
-\r
-__all__ = [\r
-    'mktime_tz',\r
-    'parsedate',\r
-    'parsedate_tz',\r
-    'quote',\r
-    ]\r
-\r
-import time\r
-\r
-SPACE = ' '\r
-EMPTYSTRING = ''\r
-COMMASPACE = ', '\r
-\r
-# Parse a date field\r
-_monthnames = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul',\r
-               'aug', 'sep', 'oct', 'nov', 'dec',\r
-               'january', 'february', 'march', 'april', 'may', 'june', 'july',\r
-               'august', 'september', 'october', 'november', 'december']\r
-\r
-_daynames = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']\r
-\r
-# The timezone table does not include the military time zones defined\r
-# in RFC822, other than Z.  According to RFC1123, the description in\r
-# RFC822 gets the signs wrong, so we can't rely on any such time\r
-# zones.  RFC1123 recommends that numeric timezone indicators be used\r
-# instead of timezone names.\r
-\r
-_timezones = {'UT':0, 'UTC':0, 'GMT':0, 'Z':0,\r
-              'AST': -400, 'ADT': -300,  # Atlantic (used in Canada)\r
-              'EST': -500, 'EDT': -400,  # Eastern\r
-              'CST': -600, 'CDT': -500,  # Central\r
-              'MST': -700, 'MDT': -600,  # Mountain\r
-              'PST': -800, 'PDT': -700   # Pacific\r
-              }\r
-\r
-\r
-def parsedate_tz(data):\r
-    """Convert a date string to a time tuple.\r
-\r
-    Accounts for military timezones.\r
-    """\r
-    data = data.split()\r
-    # The FWS after the comma after the day-of-week is optional, so search and\r
-    # adjust for this.\r
-    if data[0].endswith(',') or data[0].lower() in _daynames:\r
-        # There's a dayname here. Skip it\r
-        del data[0]\r
-    else:\r
-        i = data[0].rfind(',')\r
-        if i >= 0:\r
-            data[0] = data[0][i+1:]\r
-    if len(data) == 3: # RFC 850 date, deprecated\r
-        stuff = data[0].split('-')\r
-        if len(stuff) == 3:\r
-            data = stuff + data[1:]\r
-    if len(data) == 4:\r
-        s = data[3]\r
-        i = s.find('+')\r
-        if i > 0:\r
-            data[3:] = [s[:i], s[i+1:]]\r
-        else:\r
-            data.append('') # Dummy tz\r
-    if len(data) < 5:\r
-        return None\r
-    data = data[:5]\r
-    [dd, mm, yy, tm, tz] = data\r
-    mm = mm.lower()\r
-    if mm not in _monthnames:\r
-        dd, mm = mm, dd.lower()\r
-        if mm not in _monthnames:\r
-            return None\r
-    mm = _monthnames.index(mm) + 1\r
-    if mm > 12:\r
-        mm -= 12\r
-    if dd[-1] == ',':\r
-        dd = dd[:-1]\r
-    i = yy.find(':')\r
-    if i > 0:\r
-        yy, tm = tm, yy\r
-    if yy[-1] == ',':\r
-        yy = yy[:-1]\r
-    if not yy[0].isdigit():\r
-        yy, tz = tz, yy\r
-    if tm[-1] == ',':\r
-        tm = tm[:-1]\r
-    tm = tm.split(':')\r
-    if len(tm) == 2:\r
-        [thh, tmm] = tm\r
-        tss = '0'\r
-    elif len(tm) == 3:\r
-        [thh, tmm, tss] = tm\r
-    else:\r
-        return None\r
-    try:\r
-        yy = int(yy)\r
-        dd = int(dd)\r
-        thh = int(thh)\r
-        tmm = int(tmm)\r
-        tss = int(tss)\r
-    except ValueError:\r
-        return None\r
-    # Check for a yy specified in two-digit format, then convert it to the\r
-    # appropriate four-digit format, according to the POSIX standard. RFC 822\r
-    # calls for a two-digit yy, but RFC 2822 (which obsoletes RFC 822)\r
-    # mandates a 4-digit yy. For more information, see the documentation for\r
-    # the time module.\r
-    if yy < 100:\r
-        # The year is between 1969 and 1999 (inclusive).\r
-        if yy > 68:\r
-            yy += 1900\r
-        # The year is between 2000 and 2068 (inclusive).\r
-        else:\r
-            yy += 2000\r
-    tzoffset = None\r
-    tz = tz.upper()\r
-    if tz in _timezones:\r
-        tzoffset = _timezones[tz]\r
-    else:\r
-        try:\r
-            tzoffset = int(tz)\r
-        except ValueError:\r
-            pass\r
-    # Convert a timezone offset into seconds ; -0500 -> -18000\r
-    if tzoffset:\r
-        if tzoffset < 0:\r
-            tzsign = -1\r
-            tzoffset = -tzoffset\r
-        else:\r
-            tzsign = 1\r
-        tzoffset = tzsign * ( (tzoffset//100)*3600 + (tzoffset % 100)*60)\r
-    # Daylight Saving Time flag is set to -1, since DST is unknown.\r
-    return yy, mm, dd, thh, tmm, tss, 0, 1, -1, tzoffset\r
-\r
-\r
-def parsedate(data):\r
-    """Convert a time string to a time tuple."""\r
-    t = parsedate_tz(data)\r
-    if isinstance(t, tuple):\r
-        return t[:9]\r
-    else:\r
-        return t\r
-\r
-\r
-def mktime_tz(data):\r
-    """Turn a 10-tuple as returned by parsedate_tz() into a UTC timestamp."""\r
-    if data[9] is None:\r
-        # No zone info, so localtime is better assumption than GMT\r
-        return time.mktime(data[:8] + (-1,))\r
-    else:\r
-        t = time.mktime(data[:8] + (0,))\r
-        return t - data[9] - time.timezone\r
-\r
-\r
-def quote(str):\r
-    """Prepare string to be used in a quoted string.\r
-\r
-    Turns backslash and double quote characters into quoted pairs.  These\r
-    are the only characters that need to be quoted inside a quoted string.\r
-    Does not add the surrounding double quotes.\r
-    """\r
-    return str.replace('\\', '\\\\').replace('"', '\\"')\r
-\r
-\r
-class AddrlistClass:\r
-    """Address parser class by Ben Escoto.\r
-\r
-    To understand what this class does, it helps to have a copy of RFC 2822 in\r
-    front of you.\r
-\r
-    Note: this class interface is deprecated and may be removed in the future.\r
-    Use rfc822.AddressList instead.\r
-    """\r
-\r
-    def __init__(self, field):\r
-        """Initialize a new instance.\r
-\r
-        `field' is an unparsed address header field, containing\r
-        one or more addresses.\r
-        """\r
-        self.specials = '()<>@,:;.\"[]'\r
-        self.pos = 0\r
-        self.LWS = ' \t'\r
-        self.CR = '\r\n'\r
-        self.FWS = self.LWS + self.CR\r
-        self.atomends = self.specials + self.LWS + self.CR\r
-        # Note that RFC 2822 now specifies `.' as obs-phrase, meaning that it\r
-        # is obsolete syntax.  RFC 2822 requires that we recognize obsolete\r
-        # syntax, so allow dots in phrases.\r
-        self.phraseends = self.atomends.replace('.', '')\r
-        self.field = field\r
-        self.commentlist = []\r
-\r
-    def gotonext(self):\r
-        """Parse up to the start of the next address."""\r
-        while self.pos < len(self.field):\r
-            if self.field[self.pos] in self.LWS + '\n\r':\r
-                self.pos += 1\r
-            elif self.field[self.pos] == '(':\r
-                self.commentlist.append(self.getcomment())\r
-            else:\r
-                break\r
-\r
-    def getaddrlist(self):\r
-        """Parse all addresses.\r
-\r
-        Returns a list containing all of the addresses.\r
-        """\r
-        result = []\r
-        while self.pos < len(self.field):\r
-            ad = self.getaddress()\r
-            if ad:\r
-                result += ad\r
-            else:\r
-                result.append(('', ''))\r
-        return result\r
-\r
-    def getaddress(self):\r
-        """Parse the next address."""\r
-        self.commentlist = []\r
-        self.gotonext()\r
-\r
-        oldpos = self.pos\r
-        oldcl = self.commentlist\r
-        plist = self.getphraselist()\r
-\r
-        self.gotonext()\r
-        returnlist = []\r
-\r
-        if self.pos >= len(self.field):\r
-            # Bad email address technically, no domain.\r
-            if plist:\r
-                returnlist = [(SPACE.join(self.commentlist), plist[0])]\r
-\r
-        elif self.field[self.pos] in '.@':\r
-            # email address is just an addrspec\r
-            # this isn't very efficient since we start over\r
-            self.pos = oldpos\r
-            self.commentlist = oldcl\r
-            addrspec = self.getaddrspec()\r
-            returnlist = [(SPACE.join(self.commentlist), addrspec)]\r
-\r
-        elif self.field[self.pos] == ':':\r
-            # address is a group\r
-            returnlist = []\r
-\r
-            fieldlen = len(self.field)\r
-            self.pos += 1\r
-            while self.pos < len(self.field):\r
-                self.gotonext()\r
-                if self.pos < fieldlen and self.field[self.pos] == ';':\r
-                    self.pos += 1\r
-                    break\r
-                returnlist = returnlist + self.getaddress()\r
-\r
-        elif self.field[self.pos] == '<':\r
-            # Address is a phrase then a route addr\r
-            routeaddr = self.getrouteaddr()\r
-\r
-            if self.commentlist:\r
-                returnlist = [(SPACE.join(plist) + ' (' +\r
-                               ' '.join(self.commentlist) + ')', routeaddr)]\r
-            else:\r
-                returnlist = [(SPACE.join(plist), routeaddr)]\r
-\r
-        else:\r
-            if plist:\r
-                returnlist = [(SPACE.join(self.commentlist), plist[0])]\r
-            elif self.field[self.pos] in self.specials:\r
-                self.pos += 1\r
-\r
-        self.gotonext()\r
-        if self.pos < len(self.field) and self.field[self.pos] == ',':\r
-            self.pos += 1\r
-        return returnlist\r
-\r
-    def getrouteaddr(self):\r
-        """Parse a route address (Return-path value).\r
-\r
-        This method just skips all the route stuff and returns the addrspec.\r
-        """\r
-        if self.field[self.pos] != '<':\r
-            return\r
-\r
-        expectroute = False\r
-        self.pos += 1\r
-        self.gotonext()\r
-        adlist = ''\r
-        while self.pos < len(self.field):\r
-            if expectroute:\r
-                self.getdomain()\r
-                expectroute = False\r
-            elif self.field[self.pos] == '>':\r
-                self.pos += 1\r
-                break\r
-            elif self.field[self.pos] == '@':\r
-                self.pos += 1\r
-                expectroute = True\r
-            elif self.field[self.pos] == ':':\r
-                self.pos += 1\r
-            else:\r
-                adlist = self.getaddrspec()\r
-                self.pos += 1\r
-                break\r
-            self.gotonext()\r
-\r
-        return adlist\r
-\r
-    def getaddrspec(self):\r
-        """Parse an RFC 2822 addr-spec."""\r
-        aslist = []\r
-\r
-        self.gotonext()\r
-        while self.pos < len(self.field):\r
-            if self.field[self.pos] == '.':\r
-                aslist.append('.')\r
-                self.pos += 1\r
-            elif self.field[self.pos] == '"':\r
-                aslist.append('"%s"' % quote(self.getquote()))\r
-            elif self.field[self.pos] in self.atomends:\r
-                break\r
-            else:\r
-                aslist.append(self.getatom())\r
-            self.gotonext()\r
-\r
-        if self.pos >= len(self.field) or self.field[self.pos] != '@':\r
-            return EMPTYSTRING.join(aslist)\r
-\r
-        aslist.append('@')\r
-        self.pos += 1\r
-        self.gotonext()\r
-        return EMPTYSTRING.join(aslist) + self.getdomain()\r
-\r
-    def getdomain(self):\r
-        """Get the complete domain name from an address."""\r
-        sdlist = []\r
-        while self.pos < len(self.field):\r
-            if self.field[self.pos] in self.LWS:\r
-                self.pos += 1\r
-            elif self.field[self.pos] == '(':\r
-                self.commentlist.append(self.getcomment())\r
-            elif self.field[self.pos] == '[':\r
-                sdlist.append(self.getdomainliteral())\r
-            elif self.field[self.pos] == '.':\r
-                self.pos += 1\r
-                sdlist.append('.')\r
-            elif self.field[self.pos] in self.atomends:\r
-                break\r
-            else:\r
-                sdlist.append(self.getatom())\r
-        return EMPTYSTRING.join(sdlist)\r
-\r
-    def getdelimited(self, beginchar, endchars, allowcomments=True):\r
-        """Parse a header fragment delimited by special characters.\r
-\r
-        `beginchar' is the start character for the fragment.\r
-        If self is not looking at an instance of `beginchar' then\r
-        getdelimited returns the empty string.\r
-\r
-        `endchars' is a sequence of allowable end-delimiting characters.\r
-        Parsing stops when one of these is encountered.\r
-\r
-        If `allowcomments' is non-zero, embedded RFC 2822 comments are allowed\r
-        within the parsed fragment.\r
-        """\r
-        if self.field[self.pos] != beginchar:\r
-            return ''\r
-\r
-        slist = ['']\r
-        quote = False\r
-        self.pos += 1\r
-        while self.pos < len(self.field):\r
-            if quote:\r
-                slist.append(self.field[self.pos])\r
-                quote = False\r
-            elif self.field[self.pos] in endchars:\r
-                self.pos += 1\r
-                break\r
-            elif allowcomments and self.field[self.pos] == '(':\r
-                slist.append(self.getcomment())\r
-                continue        # have already advanced pos from getcomment\r
-            elif self.field[self.pos] == '\\':\r
-                quote = True\r
-            else:\r
-                slist.append(self.field[self.pos])\r
-            self.pos += 1\r
-\r
-        return EMPTYSTRING.join(slist)\r
-\r
-    def getquote(self):\r
-        """Get a quote-delimited fragment from self's field."""\r
-        return self.getdelimited('"', '"\r', False)\r
-\r
-    def getcomment(self):\r
-        """Get a parenthesis-delimited fragment from self's field."""\r
-        return self.getdelimited('(', ')\r', True)\r
-\r
-    def getdomainliteral(self):\r
-        """Parse an RFC 2822 domain-literal."""\r
-        return '[%s]' % self.getdelimited('[', ']\r', False)\r
-\r
-    def getatom(self, atomends=None):\r
-        """Parse an RFC 2822 atom.\r
-\r
-        Optional atomends specifies a different set of end token delimiters\r
-        (the default is to use self.atomends).  This is used e.g. in\r
-        getphraselist() since phrase endings must not include the `.' (which\r
-        is legal in phrases)."""\r
-        atomlist = ['']\r
-        if atomends is None:\r
-            atomends = self.atomends\r
-\r
-        while self.pos < len(self.field):\r
-            if self.field[self.pos] in atomends:\r
-                break\r
-            else:\r
-                atomlist.append(self.field[self.pos])\r
-            self.pos += 1\r
-\r
-        return EMPTYSTRING.join(atomlist)\r
-\r
-    def getphraselist(self):\r
-        """Parse a sequence of RFC 2822 phrases.\r
-\r
-        A phrase is a sequence of words, which are in turn either RFC 2822\r
-        atoms or quoted-strings.  Phrases are canonicalized by squeezing all\r
-        runs of continuous whitespace into one space.\r
-        """\r
-        plist = []\r
-\r
-        while self.pos < len(self.field):\r
-            if self.field[self.pos] in self.FWS:\r
-                self.pos += 1\r
-            elif self.field[self.pos] == '"':\r
-                plist.append(self.getquote())\r
-            elif self.field[self.pos] == '(':\r
-                self.commentlist.append(self.getcomment())\r
-            elif self.field[self.pos] in self.phraseends:\r
-                break\r
-            else:\r
-                plist.append(self.getatom(self.phraseends))\r
-\r
-        return plist\r
-\r
-class AddressList(AddrlistClass):\r
-    """An AddressList encapsulates a list of parsed RFC 2822 addresses."""\r
-    def __init__(self, field):\r
-        AddrlistClass.__init__(self, field)\r
-        if field:\r
-            self.addresslist = self.getaddrlist()\r
-        else:\r
-            self.addresslist = []\r
-\r
-    def __len__(self):\r
-        return len(self.addresslist)\r
-\r
-    def __add__(self, other):\r
-        # Set union\r
-        newaddr = AddressList(None)\r
-        newaddr.addresslist = self.addresslist[:]\r
-        for x in other.addresslist:\r
-            if not x in self.addresslist:\r
-                newaddr.addresslist.append(x)\r
-        return newaddr\r
-\r
-    def __iadd__(self, other):\r
-        # Set union, in-place\r
-        for x in other.addresslist:\r
-            if not x in self.addresslist:\r
-                self.addresslist.append(x)\r
-        return self\r
-\r
-    def __sub__(self, other):\r
-        # Set difference\r
-        newaddr = AddressList(None)\r
-        for x in self.addresslist:\r
-            if not x in other.addresslist:\r
-                newaddr.addresslist.append(x)\r
-        return newaddr\r
-\r
-    def __isub__(self, other):\r
-        # Set difference, in-place\r
-        for x in other.addresslist:\r
-            if x in self.addresslist:\r
-                self.addresslist.remove(x)\r
-        return self\r
-\r
-    def __getitem__(self, index):\r
-        # Make indexing, slices, and 'in' work\r
-        return self.addresslist[index]\r