aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/exercises/093_hello_c.zig
diff options
context:
space:
mode:
authorChris Boesch <chrboesch@noreply.codeberg.org>2023-02-16 19:42:24 +0100
committerGitHub <noreply@github.com>2023-02-16 19:42:24 +0100
commit5d7d811298e714226cc706534135c52cdc7fef82 (patch)
treec7e74dad18322d064ed2ad15d1cdc6b87b65ef0a /exercises/093_hello_c.zig
parent120cf0c15887638da4d23f0f7d0e98ffa1b4bcc2 (diff)
parentdc187889c1a0cec8cb0e7de67df96ebc9e981995 (diff)
Merge pull request #183 from chrboesch/hello_c
added the first C exercise
Diffstat (limited to 'exercises/093_hello_c.zig')
-rw-r--r--exercises/093_hello_c.zig68
1 files changed, 68 insertions, 0 deletions
diff --git a/exercises/093_hello_c.zig b/exercises/093_hello_c.zig
new file mode 100644
index 0000000..b294f38
--- /dev/null
+++ b/exercises/093_hello_c.zig
@@ -0,0 +1,68 @@
+//
+// When Andrew Kelley announced the idea of a new programming language
+// - namely Zig - in his blog on February 8, 2016, he also immediately
+// stated his ambitious goal: to replace the C language!
+//
+// In order to be able to achieve this goal at all, Zig should be
+// as compatible as possible with its "predecessor".
+// Only if it is possible to exchange individual modules in existing
+// C programs without having to use complicated wrappers,
+// the undertaking has a chance of success.
+//
+// So it is not surprising that calling C functions and vice versa
+// is extremely "smooth".
+//
+// To call C functions in Zig, you only need to specify the library
+// that contains said function. For this purpose there is a built-in
+// function corresponding to the well-known @import():
+//
+// @cImport()
+//
+// All required libraries can now be included in the usual Zig notation:
+//
+// const c = @cImport({
+// @cInclude("stdio.h");
+// @cInclude("...");
+// });
+//
+// Now a function can be called via the (in this example) constant 'c':
+//
+// c.puts("Hello world!");
+//
+// By the way, most C functions have return values in the form of an
+// integer value. Errors can then be evaluated (return < 0) or other
+// information can be obtained. For example, 'puts' returns the number
+// of characters output.
+//
+// So that all this does not remain a dry theroy now, let's just start
+// and call a C function out of Zig.
+
+// our well-known "import" for Zig
+const std = @import("std");
+
+// and here the new the import for C
+const c = @cImport({
+ @cInclude("unistd.h");
+});
+
+pub fn main() void {
+
+ // In order to output a text that can be evaluated by the
+ // Zig Builder, we need to write it to the Error output.
+ // In Zig we do this with "std.debug.print" and in C we can
+ // specify a file descriptor i.e. 2 for error console.
+ //
+ // In this exercise we use 'write' to output 17 chars,
+ // but something is missing...
+ const c_res = write(2, "Hello C from Zig!", 17);
+
+ // let's see what the result from C is:
+ std.debug.print(" - C result ist {d} chars\n", .{c_res});
+}
+//
+// Something must be considered when compiling with C functions.
+// Namely that the Zig compiler knows that it should include
+// corresponding libraries. For this purpose we call the compiler
+// with the parameter "lc" for such a program,
+// e.g. "zig run -lc hello_c.zig".
+//