Xj ddlmZmZmZmZddlmZdejdejfdZdejejzdeejdd fd Z d ejejzdejejzfd Zd ejejzdeejejzeffd Zy ))AnyListTuplecast)c_ast switch_nodereturncvt|tjsJt|jtjs|Stjg|jj }d}|jj xsgD]}t|tjtjfrA|j j|t||j |j d}n||j j||jj|||_|S)a3The 'case' statements in a 'switch' come out of parsing with one child node, so subsequent statements are just tucked to the parent Compound. Additionally, consecutive (fall-through) case statements come out messy. This is a peculiarity of the C grammar. The following: switch (myvar) { case 10: k = 10; p = k + 1; return 10; case 20: case 30: return 20; default: break; } Creates this tree (pseudo-dump): Switch ID: myvar Compound: Case 10: k = 10 p = k + 1 return 10 Case 20: Case 30: return 20 Default: break The goal of this transform is to fix this mess, turning it into the following: Switch ID: myvar Compound: Case 10: k = 10 p = k + 1 return 10 Case 20: Case 30: return 20 Default: break A fixed AST node is returned. The argument may be modified. N) isinstancerSwitchstmtCompoundcoord block_itemsCaseDefaultappend_extract_nested_casestmts)r new_compound last_casechilds l/mnt/ssd/data/Dropbox/adrian/vault-secondbrain/venv/lib/python3.12/site-packages/pycparser/ast_transforms.pyfix_switch_casesrsf k5<< 00 0 k&& 7>>"k&6&6&<&<=L48I !!--3. eejj%--8 9  $ $ + +E 2  (@(@ A$004I ((//6&&u-."$K  case_node stmts_listNct|jdtjtjfrF|jj }|j |ttt||yy)z{Recursively extract consecutive Case statements that are made nested by the parser and add them to the stmts_list. rN) r rrrrpoprrrr)rrnesteds rrres[ )//!$uzz5==&AB$$&&!T#v. ;Crdeclc~ t|\}}|sn|}t|tjs( |j}t|tjs(d|j vr)d|j vr|j jd|j|j|_|S#t $r|cYSwxYw)a:Atomic specifiers like _Atomic(type) are unusually structured, conferring a qualifier upon the contained type. This function fixes a decl with atomic specifiers to have a sane AST structure, by removing spurious Typename->TypeDecl pairs and attaching the _Atomic qualifier in the right place. _Atomic) _fix_atomic_specifiers_oncer rTypeDecltypeAttributeErrorqualsrdeclnamename)r#foundtyps rfix_atomic_specifiersr/qs 1$7 e  Cenn- ((Cenn- CII)4::"= )$ ||yy K K s B.. B<;B<c|}d}|j}|=t|tjrd|jvrn |}|}|j}|=t|tj sJ|J|jtt|_d|jjvr%|jjjd|dfS#t $r|dfcYSwxYw)z~Performs one 'fix' round of atomic specifiers. Returns (modified_decl, found) where found is True iff a fix was made. Nr%FT) r(r rTypenamer*r)r'rrr)r#parent grandparentnodes rr&r&s FK D   dENN + TZZ0G   KF99D   fenn -- -  "" ""&))Dk ' y) : ;   sC C C )typingrrrrrrrrrNoderDeclTypedefr/boolr&rrr<s*)S%,,S5<<Sl <zzEMM) <7;EJJ7G <  < **u}} $ ZZ%--D **u}} $ 5:: %t +,r