Files
InstanceBrick--nightcap/include/compat/bionic_stdio_runtime.h
T
2026-08-12 01:58:18 +03:00

87 lines
3.3 KiB
C++

// Copyright 2026 Mocktail Project Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef MOCKTAIL_COMPAT_BIONIC_STDIO_RUNTIME_H_
#define MOCKTAIL_COMPAT_BIONIC_STDIO_RUNTIME_H_
#include <sys/types.h>
#include <cstdarg>
#include <cstddef>
#include <cstdio>
#include <cwchar>
namespace mocktail::compat {
// Android's public LP64 FILE ABI is opaque but has a fixed 152-byte stride.
// Old NDK clients derive stdin/stdout/stderr by indexing the exported __sF
// array, so its size and alignment are part of the binary interface even when
// all actual I/O is delegated to host stdio.
constexpr size_t kBionicFileSize = 152;
constexpr size_t kBionicStandardStreamCount = 3;
FILE* TranslateBionicFile(FILE* stream) noexcept;
void* BionicFileArraySymbolAddress() noexcept;
void* BionicStdinSymbolAddress() noexcept;
void* BionicStdoutSymbolAddress() noexcept;
void* BionicStderrSymbolAddress() noexcept;
} // namespace mocktail::compat
extern "C" {
alignas(sizeof(void*)) extern unsigned char
__sF[mocktail::compat::kBionicStandardStreamCount]
[mocktail::compat::kBionicFileSize];
}
// FILE values returned by host fopen/fdopen pass through unchanged. Pointers
// into Bionic's ABI-sized __sF array are translated to the corresponding host
// standard stream at this single boundary.
extern "C" {
size_t mocktail_fwrite(const void* buffer, size_t size, size_t count,
FILE* stream);
size_t mocktail_fread(void* buffer, size_t size, size_t count, FILE* stream);
int mocktail_fflush(FILE* stream);
int mocktail_fclose(FILE* stream);
int mocktail_feof(FILE* stream);
int mocktail_ferror(FILE* stream);
void mocktail_clearerr(FILE* stream);
int mocktail_fileno(FILE* stream);
int mocktail_fseek(FILE* stream, long offset, int whence);
long mocktail_ftell(FILE* stream);
int mocktail_fseeko(FILE* stream, off_t offset, int whence);
off_t mocktail_ftello(FILE* stream);
char* mocktail_fgets(char* string, int count, FILE* stream);
int mocktail_fputc(int character, FILE* stream);
int mocktail_fputs(const char* string, FILE* stream);
int mocktail_getc(FILE* stream);
wint_t mocktail_fputwc(wchar_t character, FILE* stream);
int mocktail_setvbuf(FILE* stream, char* buffer, int mode, size_t size);
int mocktail_ungetc(int character, FILE* stream);
int mocktail_vfprintf(FILE* stream, const char* format, va_list arguments);
int mocktail_fprintf(FILE* stream, const char* format, ...);
int mocktail_vfscanf(FILE* stream, const char* format, va_list arguments);
int mocktail_fscanf(FILE* stream, const char* format, ...);
size_t mocktail___fread_chk(void* buffer, size_t buffer_size, size_t size,
size_t count, FILE* stream);
size_t mocktail___fwrite_chk(const void* buffer, size_t buffer_size,
size_t size, size_t count, FILE* stream);
} // extern "C"
#endif // MOCKTAIL_COMPAT_BIONIC_STDIO_RUNTIME_H_