Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions runtime-light/k2-platform/k2-api.h
Original file line number Diff line number Diff line change
Expand Up @@ -216,8 +216,8 @@ inline size_t pread(k2::descriptor descriptor, std::span<std::byte> buffer, uint
return k2_pread(descriptor, buffer.size(), static_cast<void*>(buffer.data()), offset);
}

inline size_t fgets(k2::descriptor descriptor, std::span<std::byte> buffer) noexcept {
return k2_fgets(descriptor, buffer.size(), static_cast<void*>(buffer.data()));
inline size_t readline(k2::descriptor descriptor, std::span<std::byte> buffer) noexcept {
return k2_readline(descriptor, buffer.size(), static_cast<void*>(buffer.data()));
}

inline void* mmap(k2::descriptor* md, void* addr, size_t length, int32_t prot, int32_t flags, k2::descriptor fd, uint64_t offset) noexcept {
Expand Down
4 changes: 2 additions & 2 deletions runtime-light/k2-platform/k2-header.h
Original file line number Diff line number Diff line change
Expand Up @@ -357,11 +357,11 @@ size_t k2_read(uint64_t stream_d, size_t buf_len, void* buf);
size_t k2_pread(uint64_t stream_d, size_t buf_len, void* buf, uint64_t offset);

/**
* equivalent to libc's `fgets` function
* behavior is similar to libc's `fgets` function, except that EOF and empty string return the same result.
*
* @return `0` if EOF is reached or an error occurs. total number of bytes read otherwise
*/
size_t k2_fgets(uint64_t stream_d, size_t buf_len, void* buf);
size_t k2_readline(uint64_t stream_d, size_t buf_len, void* buf);

/**
* Semantically equivalent to libc's `mmap` function.
Expand Down
6 changes: 5 additions & 1 deletion runtime-light/stdlib/file/file-system-functions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -396,6 +396,10 @@ Optional<string> f$fgets(const resource& stream, int64_t length) noexcept {
return false;
}

if (length == 1) {
return string{};
}

auto file_resource{from_mixed<class_instance<kphp::fs::file>>(stream, {})};
if (file_resource.is_null()) {
return false;
Expand All @@ -418,7 +422,7 @@ Optional<string> f$fgets(const resource& stream, int64_t length) noexcept {
return false;
}
string res{static_cast<string::size_type>(length), false};
auto read_res{k2::fgets(file.descriptor(), std::as_writable_bytes(std::span<char>{res.buffer(), res.size()}))};
auto read_res{k2::readline(file.descriptor(), std::as_writable_bytes(std::span<char>{res.buffer(), res.size()}))};

if (read_res == 0) {
return false;
Expand Down
3 changes: 2 additions & 1 deletion tests/phpt/dl/473_fgets.php
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
@ok
<?php

function init() {
$stream = fopen(__DIR__.'/fgets.txt', 'w');
fwrite ($stream, "123\n");
Expand All @@ -20,7 +21,7 @@ function test_fgets() {
var_dump (fgets ($stream)); // line = "\n"

var_dump (fgets ($stream, 4)); // `length` less than length of the line. line = "php < kphp\n"
var_dump (fgets ($stream, 1)); // always false
// var_dump (fgets ($stream, 1)); kphp expects "", php expects false
var_dump (fgets ($stream)); // rest of the line

var_dump (fgets ($stream)); // last line. line = "bang"
Expand Down
Loading