mirror of
https://github.com/InstanceBrick/nightcap.git
synced 2026-10-17 13:00:45 +02:00
87 lines
3.3 KiB
C++
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_
|