Implement ftell

This commit is contained in:
jD91mZM2
2018-09-26 17:48:46 +02:00
parent 21559bb503
commit 243ce18ecd
11 changed files with 74 additions and 58 deletions
-31
View File
@@ -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
View File
@@ -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
View File
@@ -18,6 +18,7 @@ EXPECT_BINS=\
stdio/buffer \
stdio/fgets \
stdio/freopen \
stdio/fseek \
stdio/fwrite \
stdio/getc_unget \
stdio/printf \
View File
+5
View File
@@ -0,0 +1,5 @@
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTest
Hello
World
It works
No buffering issues here
View File
+31
View File
@@ -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
View File
+2
View File
@@ -0,0 +1,2 @@
Line 2
ftell: 21
+1 -3
View File
@@ -1,6 +1,4 @@
H
ello World!
Line 2
Hello World!
Hello
+12
View File
@@ -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));
}