
    7j"-                     H   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlZddlmZ dd	lmZ d
ddZ ej"                  d      Z ej"                  dej&                        Z ej"                  d      Zd Zd Zd Zd Zd Zd ZddZddZd Zd Zd Z d Z!d Z"d Z#y)z+Functions for working with config.h files.
    )CLexer)Token)lex)islice)PathN)cli)comment_remover)xyz\s+/[/*].*$z/\*(.|\n)*?\*/z^#\s*definec                 <     t                t         fdd      S )z/Break down a collection into smaller parts
    c                  .    t        t                     S N)tupler   itsizes   D/home/hanthebot/chat/keyboard/qmk_firmware/lib/python/qmk/c_parse.py<lambda>z_get_chunks.<locals>.<lambda>   s    fR./      )iterr   s   ``r   _get_chunksr      s     
bB/44r   c                 `    | j                  d      }t        |      }|j                  dd      S )z!Load file and strip comments
    utf-8encoding\
 )	read_textr	   replace)filefile_contentss     r   preprocess_c_filer$      s1     NNGN4M#M2M  ,,r   c                 .    t         j                  d|       S z0Removes comments from a single line string.
    r   )single_comment_regexsubstrings    r   strip_line_commentr+   #   s      ##B//r   c                 .    t         j                  d|       S r&   )multi_comment_regexr(   r)   s    r   strip_multiline_commentr.   )   s     ""2v..r   c                 x    g }| D ]2  }|j                  d t        |      j                  d      D               4 |S )zReturns a list of all *.c, *.h, and *.cpp files for a given list of directories

    Args:

        dir_names
            List of directories relative to `qmk_firmware`.
    c              3   >   K   | ]  }|j                   d v s|  yw))z.cz.hz.cppN)suffix).0r"   s     r   	<genexpr>z!c_source_files.<locals>.<genexpr>9   s     ddOc@cTds   z**/*)extendr   glob)	dir_namesfilesdirs      r   c_source_filesr9   /   s>     E edd3innV&<ddeLr   c                 D   t        |       } i }i }t        |       }|j                  d      D ]  }t        j	                  |j                               rd|v r}d|v rxt        |j                               \  }}}|j                  d      s|j                  d      srt        || |      }dt        d<   |j                         }|j                  d      D 	cg c]  }	t        |	       }
}	t        |
      D ]  \  }}	d|	vr#t        j                  j                  d	| ||       -|	d   |vr&t        j                  j                  d
| |	d   |       Zt!        |j#                  |	d               dkD  rCt        j                  j                  d| |	d   |dj%                  d ||	d      D                     ||	d      d   |	d<    |
t'        |       d||<   d|v s	 |j                         j                  dd      \  }}}|||<    ||fS c c}	w # t(        $ r Y w xY w)zZReturns list of parsed LAYOUT preprocessor macros found in the supplied include file.
    
(LAYOUT	LAYOUT_kcr
   r   ,labelzGInvalid LAYOUT macro in %s: Empty parameter name in macro %s at pos %s.zFInvalid LAYOUT macro in %s: Key %s in macro %s has no matrix position!   zQInvalid LAYOUT macro in %s: Key %s in macro %s has multiple matrix positions (%s)z, c              3   2   K   | ]  }t        |        y wr   )str)r2   r   s     r   r3   zfind_layouts.<locals>.<genexpr>^   s0       aQ  mn  be  fg  bh  aQs   r   matrix)layoutfilename#define    )r   r$   splitlayout_macro_define_regexmatchlstrip_parse_layout_macrostrip
startswith_parse_matrix_locationsdefault_key_entry_default_key	enumerater   logerrorlengetjoinrC   
ValueError)r"   aliasesparsed_layoutsr#   line
macro_namerE   rD   matrix_locationskeyparsed_layouti_pp_macro_namepp_macro_texts                  r   find_layoutsrf   =   s    :DGN &d+M##D) &$**4;;=9cTkhZ^N^)<TZZ\)J&J $$[19N9Nx9X  7vtZP &(c"\\^F:@,,s:KL3\#.LML#M2 F3#%GGMM"kmqs}  @A  B\)99GGMM"jlpruv}r~  AK  L)--c'l;<q@GGMM"uw{  ~A  BI  ~J  LV  X\  Xa  Xa  aQ  rB  CF  GN  CO  rP  aQ  XQ  R$4S\$B1$ECMF (I*N:&
 $26**,2D2DS!2L/=-)6&I&P 7""3 M,  s   H)H	HHc                    |si }t        |       } | j                         rG| j                  d      }|j                  dd      }t	        |      }t        |j                  d            D ]  \  }}t        |      j                         }|s"|j                         }|d   dk(  ret        |      dk(  r%t        j                  j                  | d	|       mt        |      d
k(  r	d||d   <   dj                  |d
d       ||d   <   |d   dk(  st        |      d
k(  r"|d   |v s||d      du r||d   = d||d   <   t        j                  j                  | d|        |S )z*Extract defines from a config.h file.
    r   r   r   r   r;   r   rG   rA   z(: Incomplete #define! On or around line rI   TrH   Nz#undefFz': Incomplete #undef! On or around line )r   existsr    r!   r.   rT   rJ   r+   rO   rW   r   rU   rV   rY   )config_h_fileconfig_hconfig_h_textlinenumr]   s        r   parse_config_h_filerm   r   sj    'M%///A%--fb9/>&}':':4'@A 	lMGT%d+113D::<DAw)#t9>GGMMTacj"klY!^(,HT!W%(+ab(:HT!W%aH$t9>Aw(*#DG,4 (a 105HT!W-GGMMS`bi"jk1	l4 Or   c                 ^    t         dxx   dz  cc<   t         j                         }| r| |d<   |S )z<Increment x and return a copy of the default_key_entry.
    r   rA   r@   )rR   copy)r@   new_keys     r   rS   rS      s4     ca$$&G Nr   c                     | j                  dd      j                  dd      j                  dd      j                  dd      } | j                  dd      \  }}|j                  dd      \  }}|||fS )	z6Split the LAYOUT macro into its constituent parts
    \r   rH   	rG   r<   rA   ))r!   rJ   )layout_macror^   rE   rD   s       r   rN   rN      sx      ''b199#rBJJ4QST\\]fhjkL%++C3J\\#q)NFFvv%%r   c                    i }t        | j                  d            D ]  \  }}|j                  d      r$t        j                  j                  d||        |S |j                  dd      j                  dd      }t        |j                  d            D ]*  \  }}|dk7  s||vrg ||<   ||   j                  ||g       ,  |S )	zLParse raw matrix data into a dictionary keyed by the LAYOUT identifier.
    z},{r=   z@%s: %s: Nested layout macro detected. Matrix data not available!{r   }r?   KC_NO)rT   rJ   rP   r   rU   rV   r!   append)rD   r"   r^   r_   row_numrowcol_num
identifiers           r   rQ   rQ      s     !&,,u"56 
H>>(#GGMM\^bdno  kk#r"**33#,SYYs^#< 	HGZW$%5535$Z0 ,33Wg4FG		H
H r   c                    dddddddd}| t         j                  j                  j                  u rt	        |      S | t         j                  j                  j
                  u rt        |      S | t         j                  j                  j                  u rt	        |d      S | t         j                  u r||j                         v r||   S yy)	z. Convert token to valid info.json content
    N   r   rA   rI         )NO_LEDLED_FLAG_ALLLED_FLAG_NONELED_FLAG_MODIFIERLED_FLAG_UNDERGLOWLED_FLAG_KEYLIGHTLED_FLAG_INDICATOR)
r   LiteralNumberIntegerintFloatfloatHexNamekeys)_typevalue	value_maps      r   _coerce_led_tokenr      s     !"!"I $$,,,5z$$***U|$$(((5!}

u	(88  9r   c           
      H   t        |       |k7  rt        |       |dz  k7  rt        d      t        |       D ]1  \  }}t        |      |k7  st        d| dt        |       d| d       t        |      t        |      k7  r$t        dt        |       dt        |       d      t        |      r:t        |      t        |      k\  r#t        d	t        |       d
t        |             t	        d |D              st        d      t        |      dz  dk7  rt        d      y )NrI   z(Unable to parse g_led_config matrix datazNumber of columns in row z (z) does not match matrix (rt   z+Number of g_led_config physical positions (z") does not match number of flags (z
LED index z& is OOB in g_led_config - should be < c              3   <   K   | ]  }t        |t                y wr   )
isinstancer   )r2   ns     r   r3   z'_validate_led_config.<locals>.<genexpr>   s     :az!S!:s   zmatrix indexes are not all intsr   z$Malformed g_led_config position data)rW   rZ   rT   maxall)	rD   matrix_rowsmatrix_colsmatrix_indexespositionposition_rawflagsindexr|   s	            r   _validate_led_configr      sH   
6{k!c&kkAo&FCDD' u
ss8{"8r#c(Kdepdqqrsttu 8}E
"Fs8}oUwx{  }B  yC  xD  DE  F  G  	G
>N 3s5z A:c.&9%::`adejak`lmnn:>:::;;LA!#?@@ $r   c           	         g }g }g }d}d}d}d}	d}
g }t        t        |       t                     D ]w  \  }}|s|dk(  rd}|s|dk(  sd}|dk(  rd}%|dk(  r|dz  }|d	k(  s5|	dz  }	;|d
k(  r(|	dk(  r|dk(  r|j                  |       g }|
dz  }
|dz  }h|t        j
                  j                  j                  t        j
                  j                  j                  t        j
                  j                  j                  t        j                  fv ru|	dk(  r |dk(  r|j                  t        ||             |	d	k(  r |dk(  r|j                  t        ||             |	dk(  s5|d	k(  s<|j                  t        ||             Y|t        j                  j                  fv sx y t        t        |d	            }t        t!        d t#        |g                   }|	syt%        |||||||       |||fS )z+Return any 'raw' led/rgb matrix config
    Fr   led_config_tTg_led_config;rw   rA   rI   rx      Nc                 
    | d uS r   r   )r   s    r   r   z#_parse_led_config.<locals>.<lambda>   s
    1D= r   )r   r$   r   rz   r   r   r   r   r   r   r   r   CommentPreproclistr   filtersumr   )r"   r   r   rD   r   r   found_led_config_tfound_g_led_configbracket_countsectioncurrent_row_indexcurrent_rowr   r   r   r   s                   r   _parse_led_configr      s    FLEMGK-d3VX> ! u!&%)"#(?%)"c\!& |" A%qLG#a<MQ$6MM+."$K%*%" U]]11995==;O;O;U;UW\WdWdWkWkWoWoqvq{q{||!|(:#**+<UE+JK!|(:$++,=eU,KL!|(:%6ue%DEu}}4455C! H Ka01H&!8#fb/JKN  k>8UachiHe$$r   c                 0   t        | ||      }|sy|\  }}}g }t        |d      D ]#  \  }}	|j                  |	d   |	d   ||   d       % t        t	        |            D ]3  }
t        t	        ||
               D ]  }||
   |   }||
|g||   d<    5 |S )z*Search file for led/rgb matrix config
    Nr   )startrA   )r   r   r   rD   )r   rT   rz   rangerW   )r"   r   r   foundrD   r   r   
led_configr   itemrcs               r   find_led_configr   ,  s     dK=E !&VXu J 3 taa5\
 	 3v; 5s6!9~& 	5A1IaLE /0!f
5!(+	55 r   r   )$__doc__pygments.lexers.c_cppr   pygments.tokenr   pygmentsr   	itertoolsr   pathlibr   remilcr   qmk.comment_removerr	   rR   compiler'   	MULTILINEr-   rK   r   r$   r+   r.   r9   rf   rm   rS   rN   rQ   r   r   r   r   r   r   r   <module>r      s    (      	  /1% !rzz.1  bjj!2BLLA &BJJ~6 5-0/2#j'T	&( ,A"<%~r   