Changeset 302 for proto/parabix2


Ignore:
Timestamp:
Sep 16, 2009, 10:36:04 AM (10 years ago)
Author:
ksherdy
Message:

Added methods to read and write utf-8 encoded files.
Modified transpose method to transpose utf-8 byte streams.
Added method to print aligned utf-8 encoded byte streams.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • proto/parabix2/bitutil.py

    r300 r302  
    1818#----------------------------------------------------------------------------
    1919#
    20 
     20import sys
     21import codecs
    2122# Utility functions for demo purposes.
    2223#
    23 def readfile(filename):
    24         f = open(filename)
    25         contents = f.read()
     24
     25def writefile(filename, s, charcode='utf-8',):
     26        f = codecs.open(filename, 'w', encoding=charcode)
     27        f.write(s) # writes encoded bytes to file
     28        f.close()
     29
     30def readfile(filename, charcode='utf-8'):
     31        f = codecs.open(filename, 'r', encoding=charcode)
     32        contents = f.read() # returns a unicode string from encoded file bytes
    2633        f.close()
    2734        return contents
     
    4047        bit = (strm >> pos) & 1
    4148        return bit
    42        
    43 #
    44 def transpose_streams(s):
     49
     50def transpose_u8_byte_streams(s):
    4551        b = []
    4652        mask = 128
     
    4955                current = 0
    5056                cursor = 1
    51                 for c in s:
    52                        
    53                         if isinstance(c,str):
    54                                 val = ord(c)
    55                         else:
    56                                 val = c
    57                         if  (val & mask != 0):
     57                for byte in s:
     58                        if  (ord(byte) & mask != 0):
    5859                                current += cursor
    5960                        cursor <<= 1
     
    121122        label_max = max([len(p[0]) for p in stream_list])
    122123        for p in stream_list:
    123                 print (p[0] + " "*(label_max - len(p[0]))) + ": " + p[1]
     124                print (p[0] + " "*(label_max - len(p[0]))) + ": " + p[1] 
    124125
     126def print_aligned_u8_byte_streams(u8_byte_stream):
     127        """Print out a set of 'encoding' aligned streams."""
     128
     129        # Set the system info to print utf-8
     130        info = codecs.lookup('utf-8')
     131        sys.stdout = info.streamwriter(sys.stdout)
     132
     133        label_max = max([len(p[0]) for p in u8_byte_stream])
     134        for p in u8_byte_stream:
     135                sys.stdout.write(p[0] + " "*(label_max - len(p[0])) + ": ")
     136               
     137                for c in (p[1].decode('utf-8')):                        # for each unicode character
     138                        u8_seq_len = len(c.encode('utf-8'))     # encode the unicode character as utf-8 and get the utf-8 sequence length
     139                        if u8_seq_len == 1:
     140                                sys.stdout.write(c)
     141                        elif u8_seq_len == 2:
     142                                sys.stdout.write('2_')                          # align 2 byte sequences with a trailing 2
     143                        elif u8_seq_len == 3:
     144                                sys.stdout.write('3__')                         # align 3 byte sequences with 2 trailing 3's
     145                        elif u8_seq_len == 4:
     146                                sys.stdout.write('4___')                        # align 2 byte sequences with 3 trailing 4's             
     147                        else:
     148                                sys.stdout.write('Error: Invalid UTF-8 character sequence of length: ' + str(u8_seq_len) + '.')                 
     149                sys.stdout.write('\n')   
    125150
    126151def high_nybble_stream(bytes):
Note: See TracChangeset for help on using the changeset viewer.