summaryrefslogtreecommitdiff
path: root/04a/in03
diff options
context:
space:
mode:
Diffstat (limited to '04a/in03')
-rw-r--r--04a/in0374
1 files changed, 74 insertions, 0 deletions
diff --git a/04a/in03 b/04a/in03
new file mode 100644
index 0000000..acd18ab
--- /dev/null
+++ b/04a/in03
@@ -0,0 +1,74 @@
+I=8S
+A=d3
+?I!A:usage_error
+; open input file
+ J=S
+ ; argv[1] is at *(rsp+16)
+ J+=d16
+ J=8J
+ I=d0
+ syscall x2
+ J=A
+ ?J<0:input_file_error
+; open output file
+ J=S
+ ; argv[2] is at *(rsp+24)
+ J+=d24
+ J=8J
+ I=x241
+ D=x1ed
+ syscall x2
+ J=A
+ ?J<0:output_file_error
+J=d0
+syscall x3c
+
+:usage_error
+ B=:usage_error_message
+ call :error
+
+:usage_error_message
+ str Please provide an input and an output file.
+ xa
+ x0
+
+:input_file_error
+ B=:input_file_error_message
+ !:error
+
+:input_file_error_message
+ str Couldn't open input file.
+ xa
+ x0
+
+:output_file_error
+ B=:output_file_error_message
+ !:error
+
+:output_file_error_message
+ str Couldn't open output file.
+ xa
+ x0
+
+:error
+ J=B
+ call :strlen
+ D=A
+ I=J
+ J=d2
+ syscall x1
+ J=d1
+ syscall x3c
+
+:strlen
+ I=B
+ D=B
+ :strlen_loop
+ C=1I
+ ?C=0:strlen_ret
+ I+=d1
+ !:strlen_loop
+ :strlen_ret
+ I-=D
+ A=I
+ return