sonarrradarrplexorganizrnginxdashboardmuximuxlandingpagestartpagelandinghtpcserverhomepagesabnzbdheimdallembycouchpotatonzbgetbookmarkapplication-dashboard
		
		
		
		
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							126 lines
						
					
					
						
							3.3 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							126 lines
						
					
					
						
							3.3 KiB
						
					
					
				
								"""
							 | 
						|
								vis.py
							 | 
						|
								======
							 | 
						|
								
							 | 
						|
								Ctypes based module to access libbsd's strvis & strunvis functions.
							 | 
						|
								
							 | 
						|
								The `vis` function is the equivalent of strvis.
							 | 
						|
								The `unvis` function is the equivalent of strunvis.
							 | 
						|
								All functions accept unicode string as input and return a unicode string.
							 | 
						|
								
							 | 
						|
								Constants:
							 | 
						|
								----------
							 | 
						|
								
							 | 
						|
								* to select alternate encoding format
							 | 
						|
								  `VIS_OCTAL`:      use octal \ddd format
							 | 
						|
								  `VIS_CSTYLE`:     use \[nrft0..] where appropiate
							 | 
						|
								
							 | 
						|
								* to alter set of characters encoded
							 | 
						|
								  (default is to encode all non-graphic except space, tab, and newline).
							 | 
						|
								  `VIS_SP`:         also encode space
							 | 
						|
								  `VIS_TAB`:        also encode tab
							 | 
						|
								  `VIS_NL`:         also encode newline
							 | 
						|
								  `VIS_WHITE`:      same as (VIS_SP | VIS_TAB | VIS_NL)
							 | 
						|
								  `VIS_SAFE`:       only encode "unsafe" characters
							 | 
						|
								
							 | 
						|
								* other
							 | 
						|
								  `VIS_NOSLASH`:    inhibit printing '\'
							 | 
						|
								  `VIS_HTTP1808`:   http-style escape % hex hex
							 | 
						|
								  `VIS_HTTPSTYLE`:  http-style escape % hex hex
							 | 
						|
								  `VIS_MIMESTYLE`:  mime-style escape = HEX HEX
							 | 
						|
								  `VIS_HTTP1866`:   http-style &#num; or &string;
							 | 
						|
								  `VIS_NOESCAPE`:   don't decode `\'
							 | 
						|
								  `VIS_GLOB`:       encode glob(3) magic characters
							 | 
						|
								
							 | 
						|
								:Authors:
							 | 
						|
								    - ju1ius (http://github.com/ju1ius)
							 | 
						|
								:Version: 1
							 | 
						|
								:Date: 2014-01-05
							 | 
						|
								"""
							 | 
						|
								from ctypes import CDLL, c_char_p, c_int
							 | 
						|
								from ctypes.util import find_library
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								__all__ = [
							 | 
						|
								    'vis', 'unvis',
							 | 
						|
								    'VIS_OCTAL', 'VIS_CSTYLE',
							 | 
						|
								    'VIS_SP', 'VIS_TAB', 'VIS_NL', 'VIS_WHITE', 'VIS_SAFE',
							 | 
						|
								    'VIS_NOSLASH', 'VIS_HTTP1808', 'VIS_HTTPSTYLE', 'VIS_MIMESTYLE',
							 | 
						|
								    'VIS_HTTP1866', 'VIS_NOESCAPE', 'VIS_GLOB'
							 | 
						|
								]
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								#############################################################
							 | 
						|
								# Constants from bsd/vis.h
							 | 
						|
								#############################################################
							 | 
						|
								
							 | 
						|
								#to select alternate encoding format
							 | 
						|
								VIS_OCTAL = 0x0001
							 | 
						|
								VIS_CSTYLE = 0x0002
							 | 
						|
								# to alter set of characters encoded
							 | 
						|
								# (default is to encode all non-graphic except space, tab, and newline).
							 | 
						|
								VIS_SP = 0x0004
							 | 
						|
								VIS_TAB = 0x0008
							 | 
						|
								VIS_NL = 0x0010
							 | 
						|
								VIS_WHITE = VIS_SP | VIS_TAB | VIS_NL
							 | 
						|
								VIS_SAFE = 0x0020
							 | 
						|
								# other
							 | 
						|
								VIS_NOSLASH = 0x0040
							 | 
						|
								VIS_HTTP1808 = 0x0080
							 | 
						|
								VIS_HTTPSTYLE = 0x0080
							 | 
						|
								VIS_MIMESTYLE = 0x0100
							 | 
						|
								VIS_HTTP1866 = 0x0200
							 | 
						|
								VIS_NOESCAPE = 0x0400
							 | 
						|
								VIS_GLOB = 0x1000
							 | 
						|
								
							 | 
						|
								#############################################################
							 | 
						|
								# Import libbsd/vis functions
							 | 
						|
								#############################################################
							 | 
						|
								
							 | 
						|
								_libbsd = CDLL(find_library('bsd'))
							 | 
						|
								
							 | 
						|
								_strvis = _libbsd.strvis
							 | 
						|
								_strvis.argtypes = [c_char_p, c_char_p, c_int]
							 | 
						|
								_strvis.restype = c_int
							 | 
						|
								
							 | 
						|
								_strunvis = _libbsd.strunvis
							 | 
						|
								_strvis.argtypes = [c_char_p, c_char_p]
							 | 
						|
								_strvis.restype = c_int
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								def vis(src, flags=VIS_WHITE):
							 | 
						|
								    """
							 | 
						|
								    Encodes the string `src` into libbsd's vis encoding.
							 | 
						|
								    `flags` must be one of the VIS_* constants
							 | 
						|
								
							 | 
						|
								    C definition:
							 | 
						|
								    int strvis(char *dst, char *src, int flags);
							 | 
						|
								    """
							 | 
						|
								    src = bytes(src, 'utf-8')
							 | 
						|
								    dst_p = c_char_p(bytes(len(src) * 4))
							 | 
						|
								    src_p = c_char_p(src)
							 | 
						|
								    flags = c_int(flags)
							 | 
						|
								
							 | 
						|
								    bytes_written = _strvis(dst_p, src_p, flags)
							 | 
						|
								    if -1 == bytes_written:
							 | 
						|
								        raise RuntimeError('vis failed to encode string "{}"'.format(src))
							 | 
						|
								
							 | 
						|
								    return dst_p.value.decode('utf-8')
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								def unvis(src):
							 | 
						|
								    """
							 | 
						|
								    Decodes a string encoded by vis.
							 | 
						|
								
							 | 
						|
								    C definition:
							 | 
						|
								    int strunvis(char *dst, char *src);
							 | 
						|
								    """
							 | 
						|
								    src = bytes(src, 'utf-8')
							 | 
						|
								    dst_p = c_char_p(bytes(len(src)))
							 | 
						|
								    src_p = c_char_p(src)
							 | 
						|
								
							 | 
						|
								    bytes_written = _strunvis(dst_p, src_p)
							 | 
						|
								    if -1 == bytes_written:
							 | 
						|
								        raise RuntimeError('unvis failed to decode string "{}"'.format(src))
							 | 
						|
								
							 | 
						|
								    return dst_p.value.decode('utf-8')
							 | 
						|
								
							 |