Browse Source

Implement ftell

jD91mZM2 6 years ago
parent
commit
243ce18ecd

+ 0 - 31
src/header/stdio/internal.rs

@@ -1,31 +0,0 @@
-//use super::{constants, FILE};
-//use platform::types::*;
-//
-//pub fn ftello(stream: &mut FILE) -> off_t {
-//    let pos = stream.seek(
-//        0,
-//        if let Some((wbase, wpos, _)) = stream.write {
-//            if (stream.flags & constants::F_APP > 0) && wpos > wbase {
-//                constants::SEEK_END
-//            } else {
-//                constants::SEEK_CUR
-//            }
-//        } else {
-//            constants::SEEK_CUR
-//        },
-//    );
-//    if pos < 0 {
-//        return pos;
-//    }
-//    let rdiff = if let Some((rpos, rend)) = stream.read {
-//        rend - rpos
-//    } else {
-//        0
-//    };
-//    let wdiff = if let Some((wbase, wpos, _)) = stream.write {
-//        wpos - wbase
-//    } else {
-//        0
-//    };
-//    pos - rdiff as i64 + wdiff as i64
-//}

+ 22 - 24
src/header/stdio/mod.rs

@@ -16,7 +16,7 @@ use header::errno::{self, STR_ERROR};
 use header::fcntl;
 use header::stdlib::mkstemp;
 use header::string::strlen;
-use io::{self, BufRead, LineWriter, Read, Write};
+use io::{self, BufRead, LineWriter, SeekFrom, Read, Write};
 use platform::types::*;
 use platform::{Pal, Sys};
 use platform::{errno, WriteByte};
@@ -33,8 +33,6 @@ mod constants;
 
 mod helpers;
 
-mod internal;
-
 enum Buffer<'a> {
     Borrowed(&'a mut [u8]),
     Owned(Vec<u8>)
@@ -233,19 +231,16 @@ pub extern "C" fn fgetc(stream: *mut FILE) -> c_int {
 }
 
 /// Get the position of the stream and store it in pos
-// #[no_mangle]
-pub extern "C" fn fgetpos(stream: *mut FILE, pos: Option<&mut fpos_t>) -> c_int {
-    unimplemented!()
-    //let off = internal::ftello(stream);
-    //if off < 0 {
-    //    return -1;
-    //}
-    //if let Some(pos) = pos {
-    //    *pos = off;
-    //    0
-    //} else {
-    //    -1
-    //}
+#[no_mangle]
+pub extern "C" fn fgetpos(stream: *mut FILE, pos: *mut fpos_t) -> c_int {
+    let off = ftello(stream);
+    if off < 0 {
+        return -1;
+    }
+    unsafe {
+        *pos = off;
+    }
+    0
 }
 
 /// Get a string from the stream
@@ -489,18 +484,21 @@ pub unsafe extern "C" fn fsetpos(stream: *mut FILE, pos: *const fpos_t) -> c_int
 }
 
 /// Get the current position of the cursor in the file
-// #[no_mangle]
+#[no_mangle]
 pub extern "C" fn ftell(stream: *mut FILE) -> c_long {
-    unimplemented!();
-    // ftello(stream) as c_long
+    ftello(stream) as c_long
 }
 
 /// Get the current position of the cursor in the file
-// #[no_mangle]
-pub extern "C" fn ftello(stream: &mut FILE) -> off_t {
-    unimplemented!();
-    // let mut stream = stream.lock();
-    // internal::ftello(&mut stream)
+#[no_mangle]
+pub extern "C" fn ftello(stream: *mut FILE) -> off_t {
+    let mut stream = unsafe { &mut *stream }.lock();
+    let pos = Sys::lseek(*stream.file, 0, SEEK_CUR);
+    if pos < 0 {
+        return -1;
+    }
+
+    pos - (stream.read_size - stream.read_pos) as off_t
 }
 
 /// Try to lock the file. Returns 0 for success, 1 for failure

+ 1 - 0
tests/Makefile

@@ -18,6 +18,7 @@ EXPECT_BINS=\
 	stdio/buffer \
 	stdio/fgets \
 	stdio/freopen \
+	stdio/fseek \
 	stdio/fwrite \
 	stdio/getc_unget \
 	stdio/printf \

+ 0 - 0
tests/expected/stdio/buffer.stderr


+ 5 - 0
tests/expected/stdio/buffer.stdout

@@ -0,0 +1,5 @@
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTest
+Hello
+World
+It works
+No buffering issues here

+ 0 - 0
tests/expected/stdio/fgets.stderr


+ 31 - 0
tests/expected/stdio/fgets.stdout

@@ -0,0 +1,31 @@
+Hello World!
+
+Line 2
+
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
+ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
+eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
+nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
+ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
+ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp
+qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
+rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
+sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
+ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt
+uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
+vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
+zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
+EOF

+ 0 - 0
tests/expected/stdio/fseek.stderr


+ 2 - 0
tests/expected/stdio/fseek.stdout

@@ -0,0 +1,2 @@
+Line 2
+ftell: 21

+ 1 - 3
tests/expected/stdio/setvbuf.stdout

@@ -1,6 +1,4 @@
 H
-ello World!
-
-Line 2
+Hello World!
 
 Hello

+ 12 - 0
tests/stdio/fseek.c

@@ -0,0 +1,12 @@
+#include <stdio.h>
+
+int main() {
+	FILE *f = fopen("stdio/stdio.in", "r");
+    if (fseek(f, 14, SEEK_CUR) < 0) {
+        puts("fseek error");
+        return 1;
+    }
+    char buffer[256];
+    printf("%s", fgets(buffer, 256, f));
+    printf("ftell: %d\n", ftello(f));
+}