o
    @cj2                     @   s   	 d Z ddlZddlmZmZ ddlmZ ddlmZm	Z	 ddl
mZmZmZ e	ed ZddlmZ d	d
 Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  ZdS )!z%Michael Felt <aixtools@felt.demon.nl>    N)environpath)
executable)c_void_psizeof)PopenPIPEDEVNULL   )maxsizec                    s    fdd}t t| |dS )Nc                    sL   |   }g }z|r|dt|  |s
W n	 ty    Y nw |p%tgS )Nr   )splitinsertintpop
ValueErrorr   )libnamepartsnumssep IC:\Users\Chris\AppData\Local\Programs\Python\Python310\lib\ctypes\_aix.py_num_version>   s   

z#_last_version.<locals>._num_version)key)maxreversed)libnamesr   r   r   r   r   _last_version=   s   
r   c                 C   s:   d }| j D ]}|dr|}qd|v r|d  S qd S )N)/z./z../ZINDEX
)stdout
startswithrstrip)p	ld_headerliner   r   r   get_ld_headerJ   s   

r&   c                 C   s0   g }| j D ]}td|r|| q |S |S )Nz[0-9])r    rematchappend)r#   infor%   r   r   r   get_ld_header_infoT   s   
r+   c                 C   s`   	 g }t ddt d| gdttd}	 t|}|r#||t|f nnq|j  |	  |S )Nz/usr/bin/dumpz-Xz-HT)universal_newlinesr    stderr)
r   AIX_ABIr   r	   r&   r)   r+   r    closewait)fileZldr_headersr#   r$   r   r   r   get_ld_headersa   s   	
r2   c                 C   s8   	 g }| D ]\}}d|v r| ||dd  q|S )N[)r)   index)Z
ld_headerssharedr%   _r   r   r   
get_sharedy   s   r8   c                    sH   	 d  d t td  fdd|D }t|dkr"|d dS d S )Nz\[(z)\]c                 3   s    | ]	}t  |V  qd S )N)r'   search).0r%   exprr   r   	<genexpr>   s    z get_one_match.<locals>.<genexpr>   r   )listfilterlengroup)r<   linesmatchesr   r;   r   get_one_match   s   rE   c                 C   sN   	 t dkrd}t|| }|r|S d S dD ]}tt|| }|r$|  S qd S )N@   zshr4?_?64\.o)zshr.ozshr4.o)r.   rE   r'   escape)membersr<   membernamer   r   r   
get_legacy   s   
	rK   c                 C   sh   	 d|  dd|  dg}|D ]"}g }|D ]}t ||}|r'||d q|r1t|d  S qd S )Nlibz\.so\.[0-9]+[0-9.]*z_?64\.so\.[0-9]+[0-9.]*r   .)r'   r9   r)   rB   r   )rJ   rH   exprsr<   versionsr%   mr   r   r   get_version   s   

rQ   c                 C   s`   	 d|  d}t ||}|r|S tdkrd|  d}t ||}|r#|S t| |}|r,|S t|S )NrL   z\.sorF   z64\.so)rE   r.   rQ   rK   )rJ   rH   r<   rI   r   r   r   
get_member   s   	


rR   c                  C   s~   	 t d} | d u rt d} | d u rg } n| d} tt}|D ]\}}|D ]}| d }d|v r;| |d q'q!| S )NLD_LIBRARY_PATHZLIBPATH:r>   r   )r   getr   r2   r   extend)libpathsobjectsr7   rC   r%   r   r   r   r   get_libpaths   s    
	

rY   c                 C   sr   	 | D ]3}|dkr
qd| d}t ||}t |r6tt|}tt||}|d ur3||f  S  dS qdS )N/librL   z.a)NN)r   joinexistsr8   r2   rR   r'   rG   )pathsrJ   dirbasearchiverH   rI   r   r   r   find_shared
  s   
ra   c                 C   sp   	 t  }t|| \}}|d ur| d| dS d|  d}|D ]}|dkr&qt||}t|r5|  S qd S )N()rL   z.sorZ   )rY   ra   r   r[   r\   )rJ   rW   r_   rI   Zsonamer^   Zshlibr   r   r   find_library#  s   
rd   )
__author__r'   osr   r   sysr   ctypesr   r   
subprocessr   r   r	   r.   r   r   r&   r+   r2   r8   rE   rK   rQ   rR   rY   ra   rd   r   r   r   r   <module>   s*    .
&