o pbl)@sddlZGdddZddZddZ dd Zd d Zd d Zd*ddZ d+ddZddZ ddZ e dkrddl Z ddl Ze jddZejdddejdddd d!ejd"d#dd d!ejd$d%dd d!ejd&d'dd d!eZejejsed(ejeeejd)/ZeeeZejsejseeZejrej seeej ej Ze eWddS1swYdSdS),Nc@s|eZdZdZdZdZdZdZdZdZ e ee ee ee ee ee Z e dZe d Ze d Zd S) CobolPatternsz({})?z!^(?P\d{2})\s+(?P\S+)z\s+OCCURS (?P\d+) TIMESz"\s+INDEXED BY\s(?P\S+)z \s+REDEFINES\s(?P\S+)z\s+PIC\s+(?P\S+)z\.$z (.)\((\d+)\)zS?[9Z]*[.V][9Z]+zS?[9Z]+N)__name__ __module__ __qualname__Zopt_pattern_formatZrow_pattern_baseZrow_pattern_occursZrow_pattern_indexed_byZrow_pattern_redefinesZrow_pattern_picZrow_pattern_endrecompileformat row_patternpic_pattern_repeatspic_pattern_floatpic_pattern_integerr r ;d:\MyWork\GitHubRepos\mf-unlock-cobdata\src\python_cobol.pyrs,  rcCs tj|}|s q|dt|d}tj||d}qtj|r(d}n tj|r1d}nd}|ddkrCd |}|dd}d}d |vr\t || d dd}| d d }|t ||d S) NTZFloatZIntegerZCharrSzSigned V)typelengthZ precision) rr searchgroupintsubr matchr lenindexreplace)Zpic_strrZ expanded_strZ data_typeZ decimal_posr r rparse_pic_strings(      rcCsg}g}|D]4}|dd}|dks|ddvrq|t|dkr%|n||ddkr:|d|g}qt|dkrItd d||S) NHrr)*/. z:[WARNING] probably invalid COBOL - found unfinished line: )rstripappendrstripjoinprint)linesZholderoutputrowr r r clean_cobol?s  r.c s6g}ddg}|D]}tj|std|q|D]}|dur0t|nd|<q"ddurCtdd<ddurz4fddt|Dd \}}t |d||d d}|d|||t |d d}dd<Wnt ytd d|Ynw| q|S) NleveloccurszFound unmatched rowpicZpic_info redefinescs(g|]\}}|ddkr||fqS)namer2r ).0ritemrr r us(zparse_cobol..rrz9Could not find the field to be redefined ({}) for row: {})rr rr(r* groupdictrr enumerate get_subgroupr IndexErrorrr')r+r,Zintifyr-iZredefinedItemIndexZ redefinedItemZ related_groupr r6r parse_cobol]s."  $   r=cCs0g}|D]}|d|kr||q|S|S)Nr/)r')Z parent_levelr+r,r-r r rr:s   r:cCs t|dS)Nr) handle_occursr+r r rdenormalize_cobols r@rcCsTg}td|dD]}d}|dkr|n|dt|}t|D]\}} ||kr(q| } | d|7<d| d<| ddurL| d|| d<|| q| ddurzd| d<td| ddD]} | } | d|dt| | d<|| q_qt| d||dd} || d| dd}|t| | d||7}|t| d}qq |S) Nrr-r/ indexed_byr0r3r1)rangestrr9copyr'r:r>r)r+r0Z level_diffZ name_postfixr,r<ZskipTillZnew_name_postfixrr-Znew_rowjZ row_to_addZ occur_linesZnew_level_diffr r rr>s4     +r>FcCs&i}|D]}|r0|d|dddd|d<|ddur0|d|dddd|d<|rd}|dkr<|dn |ddt||vr`|d7}|dkrT|dn |ddt||vsHd||dkrj|dn |ddt|<|dkr|ddt||d<|r|ddd|d<q|S)Nr3rArrB_)findrDr)r+Zensure_unique_namesZ strip_prefixZmake_database_safenamesr-r<r r r clean_namess$" "(((rJcCstttt|dddS)NT)rJr@r=r.r?r r r process_cobolsrKc Csg}d}dg}|D]}g}|d|dkr||dn|d|dkr1||d|dks%|t|dd|d|d||d|d dur\|d |d |d durl|d |d |d dur{|d|d |dd}d}|}|D]-} t|t| d|kr|dt|d7}|||t|ddd}|| 7}q|dt|d7}||q td|dS)Nz rr/r#rz z {0:02d} r3rBz INDEXED BY r0z OCCURS {0:04d} TIMESr1z PIC r$BPr%z  )r'poprrr*r)) r+r,Zdefault_paddinglevelsr-Z row_outputZ tot_lengthZmax_data_lengthZoutpdatar r r print_cobols@       rR__main__zParse COBOL Copybooks) descriptionfilenamezThe filename of the copybook.)helpz--skip-all-processingzOnly processes the redefines. store_true)rVdefaultactionz--skip-unique-nameszSkips making all names unique.z--skip-denormalizezSkips denormalizing the COBOL.z--skip-strip-prefixz*Skips stripping the prefix from the names.zCould not findr)rr)FFF)!rrrr.r=r:r@r>rJrKrRrargparseZos.pathosArgumentParserparser add_argument parse_argsargspathisfilerUr*exitopenf readlinesr+Zskip_all_processingZskip_denormalizeZskip_strip_prefixZskip_unique_namesr r r rsH#) 5 5    "