Browse Source

Clean-up fallback `io.read_at` and `io.write_at` behaviour

gingerBill 4 years ago
parent
commit
8827818b1d
1 changed files with 13 additions and 9 deletions
  1. 13 9
      core/io/io.odin

+ 13 - 9
core/io/io.odin

@@ -218,17 +218,17 @@ read_at :: proc(r: Reader_At, p: []byte, offset: i64) -> (n: int, err: Error) {
 		return 0, .Empty;
 	}
 
-	current_offset: i64;
-	current_offset, err = r->impl_seek(offset, .Current);
+	curr_offset: i64;
+	curr_offset, err = r->impl_seek(offset, .Current);
 	if err != nil {
 		return 0, err;
 	}
 
 	n, err = r->impl_read(p);
-	if err != nil {
-		return;
+	_, err1 := r->impl_seek(curr_offset, .Start);
+	if err1 != nil && err == nil {
+		err = err1;
 	}
-	_, err = r->impl_seek(current_offset, .Start);
 	return;
 
 }
@@ -244,14 +244,18 @@ write_at :: proc(w: Writer_At, p: []byte, offset: i64) -> (n: int, err: Error) {
 		return 0, .Empty;
 	}
 
-	current_offset: i64;
-	current_offset, err = w->impl_seek(offset, .Current);
+	curr_offset: i64;
+	curr_offset, err = w->impl_seek(offset, .Current);
 	if err != nil {
 		return 0, err;
 	}
-	defer w->impl_seek(current_offset, .Start);
 
-	return w->impl_write(p);
+	n, err = w->impl_write(p);
+	_, err1 := w->impl_seek(curr_offset, .Start);
+	if err1 != nil && err == nil {
+		err = err1;
+	}
+	return;
 }
 
 write_to :: proc(r: Writer_To, w: Writer) -> (n: i64, err: Error) {