summaryrefslogtreecommitdiffstats
path: root/test cases/unit/77 nostdlib/subprojects/mylibc/libc.c
diff options
context:
space:
mode:
Diffstat (limited to 'test cases/unit/77 nostdlib/subprojects/mylibc/libc.c')
-rw-r--r--test cases/unit/77 nostdlib/subprojects/mylibc/libc.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/test cases/unit/77 nostdlib/subprojects/mylibc/libc.c b/test cases/unit/77 nostdlib/subprojects/mylibc/libc.c
new file mode 100644
index 0000000..67261cb
--- /dev/null
+++ b/test cases/unit/77 nostdlib/subprojects/mylibc/libc.c
@@ -0,0 +1,35 @@
+/* Do not use this as the basis of your own libc.
+ * The code is probably unoptimal or wonky, as I
+ * had no prior experience with this, but instead
+ * just fiddled with the code until it worked.
+ */
+
+#include<stdio.h>
+
+#define STDOUT 1
+#define SYS_WRITE 4
+
+int simple_print(const char *msg, const long bufsize) {
+ int count;
+ long total_written = 0;
+ while(total_written < bufsize) {
+ asm(
+ "int $0x80\n\t"
+ : "=a"(count)
+ : "0"(SYS_WRITE), "b"(STDOUT), "c"(msg+total_written), "d"(bufsize-total_written)
+ :);
+ if(count == 0) {
+ return 1;
+ }
+ total_written += count;
+ }
+ return 0;
+}
+
+int simple_strlen(const char *str) {
+ int len = 0;
+ while(str[len] != '\0') {
+ len++;
+ }
+ return len;
+}