[libc-commits] [libc] [libc] Implement fgetpos/fsetpos (PR #221349)

Jeff Bailey via libc-commits libc-commits at lists.llvm.org
Fri Oct 9 04:04:03 PDT 2026


================
@@ -424,20 +429,60 @@ ErrorOr<int> File::seek(off_t offset, int whence) {
   return 0;
 }
 
-ErrorOr<off_t> File::tell() {
-  FileLock lock(this);
-  auto seek_target = eof ? SEEK_END : SEEK_CUR;
+ErrorOr<off_t> File::tell_unlocked() {
+  bool is_append = (mode & static_cast<ModeFlags>(OpenMode::APPEND)) != 0;
+  int seek_target =
+      (eof || (is_append && prev_op == FileOp::WRITE)) ? SEEK_END : SEEK_CUR;
   auto result = platform_seek(this, 0, seek_target);
-  if (!result.has_value() || result.value() < 0)
+  if (!result.has_value())
     return Error(result.error());
-  off_t platform_offset = result.value();
-  if (prev_op == FileOp::READ)
-    return platform_offset - (read_limit - pos);
+  if (result.value() < 0)
+    return Error(EOVERFLOW);
+  const off_t platform_offset = result.value();
   if (prev_op == FileOp::WRITE)
-    return platform_offset + pos;
+    return platform_offset + static_cast<off_t>(pos);
+  if (prev_op == FileOp::READ)
+    return platform_offset - static_cast<off_t>(read_limit - pos);
   return platform_offset;
 }
 
+ErrorOr<File::Position> File::get_pos_unlocked() {
+  auto pos_result = tell_unlocked();
+  if (!pos_result.has_value())
+    return Error(pos_result.error());
+
+  Position fpos;
----------------
kaladron wrote:

Something like this might be simpler:

```c++
return Position{
    pos_result.value(),
    orientation == Orientation::WIDE ? mbstate : internal::mbstate(),
};
```

And ensure RVO plus eliminate an uninitialised variable spot.

https://github.com/llvm/llvm-project/pull/221349


More information about the libc-commits mailing list