aboutsummaryrefslogtreecommitdiff
path: root/src-self-hosted
diff options
context:
space:
mode:
authorhryx <codroid@gmail.com>2019-06-23 15:06:16 -0700
committerhryx <codroid@gmail.com>2019-06-23 15:06:16 -0700
commit69b90e0681bb42980eeb8364e50686a1f9702eb5 (patch)
treec717f2e9981f10b75c60dac5c3f81b368ffaf2a4 /src-self-hosted
parentb2e06c3bf41669e02f07525bb483efedf2d77b95 (diff)
downloadzig-69b90e0681bb42980eeb8364e50686a1f9702eb5.tar.gz
zig-69b90e0681bb42980eeb8364e50686a1f9702eb5.zip
transStringLiteral
Diffstat (limited to 'src-self-hosted')
-rw-r--r--src-self-hosted/clang.zig3
-rw-r--r--src-self-hosted/translate_c.zig36
2 files changed, 39 insertions, 0 deletions
diff --git a/src-self-hosted/clang.zig b/src-self-hosted/clang.zig
index d48c57c0a4..1aa4cbfd6c 100644
--- a/src-self-hosted/clang.zig
+++ b/src-self-hosted/clang.zig
@@ -965,3 +965,6 @@ pub extern fn ZigClangBinaryOperator_getOpcode(*const ZigClangBinaryOperator) Zi
pub extern fn ZigClangBinaryOperator_getBeginLoc(*const ZigClangBinaryOperator) ZigClangSourceLocation;
pub extern fn ZigClangBinaryOperator_getLHS(*const ZigClangBinaryOperator) *const ZigClangExpr;
pub extern fn ZigClangBinaryOperator_getRHS(*const ZigClangBinaryOperator) *const ZigClangExpr;
+
+pub extern fn ZigClangStringLiteral_getKind(*const ZigClangStringLiteral) ZigClangStringLiteral_StringKind;
+pub extern fn ZigClangStringLiteral_getString_bytes_begin_size(*const ZigClangStringLiteral, *usize) [*c]const u8;
diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig
index bce68f8865..376515c961 100644
--- a/src-self-hosted/translate_c.zig
+++ b/src-self-hosted/translate_c.zig
@@ -336,6 +336,7 @@ fn transStmt(
.ImplicitCastExprClass => return transImplicitCastExpr(rp, scope, @ptrCast(*const ZigClangImplicitCastExpr, stmt), result_used),
.IntegerLiteralClass => return transIntegerLiteral(rp, scope, @ptrCast(*const ZigClangIntegerLiteral, stmt), result_used),
.ReturnStmtClass => return transReturnStmt(rp, scope, @ptrCast(*const ZigClangReturnStmt, stmt)),
+ .StringLiteralClass => return transStringLiteral(rp, scope, @ptrCast(*const ZigClangStringLiteral, stmt), result_used),
else => {
return revertAndWarn(
rp,
@@ -647,6 +648,41 @@ fn transReturnStmt(
};
}
+fn transStringLiteral(
+ rp: RestorePoint,
+ scope: *Scope,
+ stmt: *const ZigClangStringLiteral,
+ result_used: ResultUsed,
+) !TransResult {
+ const kind = ZigClangStringLiteral_getKind(stmt);
+ switch (kind) {
+ .Ascii, .UTF8 => {
+ var len: usize = undefined;
+ const cstr = ZigClangStringLiteral_getString_bytes_begin_size(stmt, &len);
+ const zstr = try rp.c.str(cstr);
+ const token = try appendToken(rp.c, .StringLiteral, zstr);
+ const node = try rp.c.a().create(ast.Node.StringLiteral);
+ node.* = ast.Node.StringLiteral{
+ .base = ast.Node{ .id = .StringLiteral },
+ .token = token,
+ };
+ const res = TransResult{
+ .node = &node.base,
+ .child_scope = scope,
+ .node_scope = scope,
+ };
+ return maybeSuppressResult(rp, scope, result_used, res);
+ },
+ .UTF16, .UTF32, .Wide => return revertAndWarn(
+ rp,
+ error.UnsupportedTranslation,
+ ZigClangStmt_getBeginLoc(@ptrCast(*const ZigClangStmt, stmt)),
+ "TODO: support string literal kind {}",
+ kind,
+ ),
+ }
+}
+
fn transCCast(
rp: RestorePoint,
scope: *Scope,