@@ -339,6 +339,42 @@ class idl2d
339339 }
340340 }
341341
342+ bool hasBalancedBrackets (TokenIterator start, TokenIterator end)
343+ {
344+ int [] brackets;
345+ while (start != end)
346+ {
347+ int type = start.type;
348+ switch (type)
349+ {
350+ case Token .ParenL:
351+ case Token .BracketL:
352+ case Token .BraceL:
353+ brackets ~= type;
354+ break ;
355+ case Token .ParenR:
356+ if (brackets.empty || brackets[$- 1 ] != Token .ParenL)
357+ return false ;
358+ brackets = brackets[0 .. $- 1 ];
359+ break ;
360+ case Token .BracketR:
361+ if (brackets.empty || brackets[$- 1 ] != Token .BracketL)
362+ return false ;
363+ brackets = brackets[0 .. $- 1 ];
364+ break ;
365+ case Token .BraceR:
366+ if (brackets.empty || brackets[$- 1 ] != Token .BraceL)
367+ return false ;
368+ brackets = brackets[0 .. $- 1 ];
369+ break ;
370+ default :
371+ break ;
372+ }
373+ start++ ;
374+ }
375+ return brackets.empty;
376+ }
377+
342378 bool isExpression (TokenIterator start, TokenIterator end)
343379 {
344380 if (start == end || start.type == Token .EOF )
@@ -348,7 +384,7 @@ class idl2d
348384 for (TokenIterator it = start + 1 ; it != end && ! it.atEnd() && it.type != Token .EOF ; ++ it)
349385 if (! isExpressionToken(it, false ))
350386 return false ;
351- return true ;
387+ return hasBalancedBrackets (start, end) ;
352388 }
353389
354390 bool isPrimaryExpr (TokenIterator it)
@@ -569,6 +605,10 @@ class idl2d
569605 case " _M_HYBRID_X86_ARM64" :
570606 return - 1 ;
571607
608+ // Windows SDK 10.0.17134.0
609+ case " IMAGE_POLICY_METADATA_NAME" :
610+ return 1 ;
611+
572612 default :
573613 break ;
574614 }
@@ -876,7 +916,7 @@ version(none){
876916 convert = false ;
877917 if (tokIt[3 ].text == " )" )
878918 {
879- convertMacro = true ;
919+ convertMacro = hasBalancedBrackets(tokIt + 4 , endIt) ;
880920 argtype = " " ;
881921 if (isExpression(tokIt + 4 , endIt))
882922 rettype = getExpressionType(ident, tokIt + 4 , endIt);
@@ -1236,6 +1276,9 @@ version(all)
12361276 replaceTokenSequence(tokens, " template $args _ENUM_FLAG_INTEGER_FOR_SIZE;" , " /*$0*/" , true );
12371277 replaceTokenSequence(tokens, " template <> struct _ENUM_FLAG_INTEGER_FOR_SIZE <$arg> { $def };" , " /*$0*/" , true );
12381278 replaceTokenSequence(tokens, " template <$arg> struct _ENUM_FLAG_SIZED_INTEGER { $def };" , " /*$0*/" , true );
1279+
1280+ // win 10.0.17134.0: typedef enum MEM_EXTENDED_PARAMETER_TYPE {} MEM_EXTENDED_PARAMETER_TYPE, ...
1281+ replaceTokenSequence(tokens, " MEM_EXTENDED_PARAMETER_TYPE, *PMEM_EXTENDED_PARAMETER_TYPE" , " *PMEM_EXTENDED_PARAMETER_TYPE" , true );
12391282 }
12401283
12411284 if (currentModule == " commctrl" )
@@ -1662,7 +1705,10 @@ version(none)
16621705 replaceTokenSequence(tokens, " enum $_ident1 { $enums }; typedef $_identbase $_ident2;" ,
16631706 " enum $_ident2 : $_identbase\n {\n $enums\n }" , true );
16641707} else {
1665- replaceTokenSequence(tokens, " typedef enum $_ident1 { $enums } $_ident1;" ,
1708+ replaceTokenSequence(tokens, " typedef enum $_ident1 : uint { $enums } $_ident1;" ,
1709+ " enum $_ident1 : uint\n {\n $enums\n }\n " , true );
1710+
1711+ replaceTokenSequence(tokens, " typedef enum $_ident1 { $enums } $_ident1;" ,
16661712 " enum /+$_ident1+/\n {\n $enums\n }\n typedef int $_ident1;" , true );
16671713 replaceTokenSequence(tokens, " typedef enum $_ident1 { $enums } $ident2;" ,
16681714 " enum /+$_ident1+/\n {\n $enums\n }\n typedef int $_ident1;\n typedef int $ident2;" , true );
@@ -1941,9 +1987,14 @@ version(all) {
19411987 replaceTokenSequence(tokens, " sizeof($_ident)" , " $_ident.sizeof" , true );
19421988 replaceTokenSequence(tokens, " sizeof($args)" , " ($args).sizeof" , true );
19431989
1990+ // Win SDK 10.0,17136,0
1991+ replaceTokenSequence(tokens, " _Out_writes_z_($args)" , " /+$*+/" , true );
1992+ replaceTokenSequence(tokens, " _IRQL_requires_max_($args)" , " /+$*+/" , true );
1993+
19441994 // bitfields:
19451995 replaceTokenSequence(tokens, " $_identtype $_identname : $_num;" , " __bf $_identtype, __quote $_identname __quote, $_num __eobf" , true );
19461996 replaceTokenSequence(tokens, " $_identtype $_identname : $_ident;" , " __bf $_identtype, __quote $_identname __quote, $_ident __eobf" , true );
1997+ replaceTokenSequence(tokens, " $_identtype $_identname : $_num - $_identconst;" , " __bf $_identtype, __quote $_identname __quote, $_num - $_identconst __eobf" , true );
19471998 replaceTokenSequence(tokens, " $_identtype : $_num;" , " __bf $_identtype, __quote __quote, $_num __eobf" , true );
19481999 replaceTokenSequence(tokens, " __eobf __bf" , " ,\n\t " , true );
19492000 replaceTokenSequence(tokens, " __bf" , " mixin(bitfields!(" , true );
0 commit comments