Ignore:
Timestamp:
12/29/08 18:21:43 (6 years ago)
Author:
xi
Message:

Use Cython if available; added Python 3 support to _yaml.pyx.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pyyaml/trunk/ext/_yaml.pyx

    r310 r331  
    252252 
    253253    def __init__(self, stream): 
     254        cdef is_readable 
    254255        if yaml_parser_initialize(&self.parser) == 0: 
    255256            raise MemoryError 
    256257        self.parsed_event.type = YAML_NO_EVENT 
    257         if hasattr(stream, 'read'): 
     258        is_readable = 1 
     259        try: 
     260            stream.read 
     261        except AttributeError: 
     262            is_readable = 0 
     263        if is_readable: 
    258264            self.stream = stream 
    259265            try: 
     
    358364            encoding = None 
    359365            if token.data.stream_start.encoding == YAML_UTF8_ENCODING: 
    360                 encoding = "utf-8" 
     366                encoding = u"utf-8" 
    361367            elif token.data.stream_start.encoding == YAML_UTF16LE_ENCODING: 
    362                 encoding = "utf-16-le" 
     368                encoding = u"utf-16-le" 
    363369            elif token.data.stream_start.encoding == YAML_UTF16BE_ENCODING: 
    364                 encoding = "utf-16-be" 
     370                encoding = u"utf-16-be" 
    365371            return StreamStartToken(start_mark, end_mark, encoding) 
    366372        elif token.type == YAML_STREAM_END_TOKEN: 
    367373            return StreamEndToken(start_mark, end_mark) 
    368374        elif token.type == YAML_VERSION_DIRECTIVE_TOKEN: 
    369             return DirectiveToken("YAML", 
     375            return DirectiveToken(u"YAML", 
    370376                    (token.data.version_directive.major, 
    371377                        token.data.version_directive.minor), 
    372378                    start_mark, end_mark) 
    373379        elif token.type == YAML_TAG_DIRECTIVE_TOKEN: 
    374             return DirectiveToken("TAG", 
    375                     (token.data.tag_directive.handle, 
    376                         token.data.tag_directive.prefix), 
     380            handle = PyUnicode_DecodeUTF8(token.data.tag_directive.handle, 
     381                    strlen(token.data.tag_directive.handle), 'strict') 
     382            prefix = PyUnicode_DecodeUTF8(token.data.tag_directive.prefix, 
     383                    strlen(token.data.tag_directive.prefix), 'strict') 
     384            return DirectiveToken(u"TAG", (handle, prefix), 
    377385                    start_mark, end_mark) 
    378386        elif token.type == YAML_DOCUMENT_START_TOKEN: 
     
    871879    parser = <CParser>data 
    872880    value = parser.stream.read(size) 
     881    if PyUnicode_CheckExact(value) != 0: 
     882        value = PyUnicode_AsUTF8String(value) 
    873883    if PyString_CheckExact(value) == 0: 
    874884        raise TypeError("a string value is expected") 
     
    895905    cdef int last_alias_id 
    896906    cdef int closed 
     907    cdef int decode_output 
    897908 
    898909    def __init__(self, stream, canonical=None, indent=None, width=None, 
     
    902913            raise MemoryError 
    903914        self.stream = stream 
     915        self.decode_output = 1 
     916        try: 
     917            stream.encoding 
     918        except AttributeError: 
     919            self.decode_output = 0 
    904920        yaml_emitter_set_output(&self.emitter, output_handler, <void *>self)     
    905921        if canonical is not None: 
     
    12171233            if self.anchors[node] is None: 
    12181234                self.last_alias_id = self.last_alias_id+1 
    1219                 self.anchors[node] = "id%03d" % self.last_alias_id 
     1235                self.anchors[node] = u"id%03d" % self.last_alias_id 
    12201236        else: 
    12211237            self.anchors[node] = None 
     
    12461262        anchor = NULL 
    12471263        if anchor_object is not None: 
    1248             anchor = PyString_AS_STRING(anchor_object) 
     1264            anchor = PyString_AS_STRING(PyUnicode_AsUTF8String(anchor_object)) 
    12491265        if node in self.serialized_nodes: 
    12501266            if yaml_alias_event_initialize(&event, anchor) == 0: 
     
    13581374    cdef CEmitter emitter 
    13591375    emitter = <CEmitter>data 
    1360     value = PyString_FromStringAndSize(buffer, size) 
     1376    if emitter.decode_output == 0: 
     1377        value = PyString_FromStringAndSize(buffer, size) 
     1378    else: 
     1379        value = PyUnicode_DecodeUTF8(buffer, size, 'strict') 
    13611380    emitter.stream.write(value) 
    13621381    return 1 
Note: See TracChangeset for help on using the changeset viewer.