in SharpGen/Generator/Marshallers/StringMarshaller.cs [293:348]
private StatementSyntax GenerateStringToArray(CsMarshalBase marshallable)
{
var lengthIdentifier = LengthVariableName(marshallable);
return FixedStatement(
VariableDeclaration(
PointerType(PredefinedType(Token(SyntaxKind.CharKeyword))),
SeparatedList(
new[]
{
VariableDeclarator(FromIdentifier)
.WithInitializer(EqualsValueClause(IdentifierName(marshallable.Name))),
VariableDeclarator(ToIdentifier)
.WithInitializer(EqualsValueClause(
PrefixUnaryExpression(SyntaxKind.AddressOfExpression,
GetMarshalStorageLocation(marshallable))))
})
),
Block(
LocalDeclarationStatement(
VariableDeclaration(
TypeInt32,
SingletonSeparatedList(
VariableDeclarator(lengthIdentifier)
.WithInitializer(EqualsValueClause(
InvocationExpression(MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression,
GlobalNamespace.GetTypeNameSyntax(BuiltinType.Math),
IdentifierName(nameof(Math.Min))),
ArgumentList(
SeparatedList(
new[]
{
Argument(
BinaryExpression(
SyntaxKind.MultiplyExpression,
ParenthesizedExpression(
GeneratorHelpers.OptionalLengthExpression(IdentifierName(marshallable.Name))
),
LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(2))
)),
Argument(
BinaryExpression(SyntaxKind.MultiplyExpression,
LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(marshallable.ArrayDimensionValue - 1)),
LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(2))))
}
)
))))))),
GenerateCopyMemoryInvocation(IdentifierName(lengthIdentifier), castTo: false, castFrom: false),
ExpressionStatement(
AssignmentExpression(SyntaxKind.SimpleAssignmentExpression,
ElementAccessExpression(IdentifierName(ToIdentifier),
BracketedArgumentList(
SingletonSeparatedList(
Argument(IdentifierName(lengthIdentifier))))),
LiteralExpression(SyntaxKind.CharacterLiteralExpression, Literal('\0'))))));
}