[ffigen] Escaped special characters $ and ' from string macros. (#64)
diff --git a/pkgs/ffigen/lib/src/header_parser/sub_parsers/macro_parser.dart b/pkgs/ffigen/lib/src/header_parser/sub_parsers/macro_parser.dart index 3971daf..87bb642 100644 --- a/pkgs/ffigen/lib/src/header_parser/sub_parsers/macro_parser.dart +++ b/pkgs/ffigen/lib/src/header_parser/sub_parsers/macro_parser.dart
@@ -132,12 +132,16 @@ ); break; case clang_types.CXEvalResultKind.CXEval_StrLiteral: + var value = Utf8.fromUtf8(clang.clang_EvalResult_getAsStr(e).cast()); + // Escape $ character. + value = value.replaceAll(r'$', r'\$'); + // Escape ' character, because our strings are enclosed with '. + value = value.replaceAll("'", r"\'"); constant = Constant( originalName: _savedMacros[macroName], name: macroName, rawType: 'String', - rawValue: - "'${Utf8.fromUtf8(clang.clang_EvalResult_getAsStr(e).cast())}'", + rawValue: "'${value}'", ); break; }
diff --git a/pkgs/ffigen/test/header_parser_tests/macros.h b/pkgs/ffigen/test/header_parser_tests/macros.h index b405db4..d75bcca 100644 --- a/pkgs/ffigen/test/header_parser_tests/macros.h +++ b/pkgs/ffigen/test/header_parser_tests/macros.h
@@ -14,3 +14,7 @@ #define TEST7(x, y) x *y #define TEST8 5,2,3 + +// These tests that special characters are escaped properly. +#define TEST9 "$dollar" +#define TEST10 "test's"
diff --git a/pkgs/ffigen/test/header_parser_tests/macros_test.dart b/pkgs/ffigen/test/header_parser_tests/macros_test.dart index 74bbcfc..e358873 100644 --- a/pkgs/ffigen/test/header_parser_tests/macros_test.dart +++ b/pkgs/ffigen/test/header_parser_tests/macros_test.dart
@@ -64,6 +64,14 @@ expect(actual.getBindingAsString('TEST8'), expected.getBindingAsString('TEST8')); }); + test('TEST9', () { + expect(actual.getBindingAsString('TEST9'), + expected.getBindingAsString('TEST9')); + }); + test('TEST10', () { + expect(actual.getBindingAsString('TEST10'), + expected.getBindingAsString('TEST10')); + }); }); } @@ -78,6 +86,8 @@ Constant(name: 'TEST5', rawType: 'int', rawValue: '4'), Constant(name: 'TEST6', rawType: 'int', rawValue: '1'), Constant(name: 'TEST8', rawType: 'int', rawValue: '5'), + Constant(name: 'TEST9', rawType: 'String', rawValue: r"'\$dollar'"), + Constant(name: 'TEST10', rawType: 'String', rawValue: r"'test\'s'"), ], ); }