You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

393 lines
11 KiB

/*
* Copyright (c) 2009 - 2013 Monoidics ltd.
* Copyright (c) 2013 - present Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
// modelling of wide character functions
#include "infer_builtins.h"
#define __asm(N)
// standard headers on mac don't use USE_CPP_OVERLOADS the way it's expected
#if defined __CORRECT_ISO_CPP_WCHAR_H_PROTO && !defined __APPLE__
#define USE_CPP_OVERLOADS
#endif
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include <wchar.h>
#define restrict
#ifdef _WIN32
#define CLIBCALL __cdecl
#else
#define CLIBCALL
#endif
int CLIBCALL fwscanf(FILE* restrict stream,
const wchar_t* restrict format,
...); // builtin: modeled internally
int CLIBCALL swscanf(const wchar_t* restrict s,
const wchar_t* restrict format,
...); // builtin: modeled internally
int CLIBCALL vfwscanf(FILE* restrict stream,
const wchar_t* restrict format,
va_list arg); // builtin: modeled internally
int CLIBCALL vswscanf(const wchar_t* restrict s,
const wchar_t* restrict format,
va_list arg); // builtin: modeled internally
int CLIBCALL vwscanf(const wchar_t* restrict format,
va_list arg); // builtin: modeled internally
int CLIBCALL wscanf(const wchar_t* restrict format,
...); // builtin: modeled internally
wint_t CLIBCALL btowc(int c) { return __infer_nondet_int(); }
wint_t CLIBCALL fgetwc(FILE* stream) { return __infer_nondet_int(); }
// modelled like fgets
wchar_t* CLIBCALL fgetws(wchar_t* restrict s, int n, FILE* restrict stream) {
return (wchar_t*)fgets((char*)s, n, stream);
}
wint_t CLIBCALL fputwc(wchar_t c, FILE* stream) { return __infer_nondet_int(); }
// modeled using fputs
int CLIBCALL fputws(const wchar_t* restrict s, FILE* restrict stream) {
return fputs((char*)s, stream);
}
int CLIBCALL fwide(FILE* stream, int mode) { return __infer_nondet_int(); }
// return a nondeterministic nonnegative integer
int CLIBCALL fwprintf(FILE* restrict stream,
const wchar_t* restrict format,
...) {
int res;
res = __infer_nondet_int();
INFER_EXCLUDE_CONDITION(res < 0);
return res;
}
#ifdef getwc
#undef getwc // disable expansion of getwc
#endif
wint_t CLIBCALL getwc(FILE* stream) { return __infer_nondet_int(); }
#ifdef getwchar
#undef getwchar // disable expansion of getwchar
#endif
wint_t CLIBCALL getwchar() { return __infer_nondet_int(); }
size_t CLIBCALL mbrlen(const char* restrict s,
size_t n,
mbstate_t* restrict ps) {
return __infer_nondet_int();
}
size_t CLIBCALL mbrtowc(wchar_t* restrict pwc,
const char* restrict s,
size_t n,
mbstate_t* restrict ps) {
return __infer_nondet_int();
}
int CLIBCALL mbsinit(const mbstate_t* ps) { return __infer_nondet_int(); }
size_t CLIBCALL mbsrtowcs(wchar_t* restrict dst,
const char** restrict src,
size_t len,
mbstate_t* restrict ps) {
return __infer_nondet_int();
}
#ifdef putwc
#undef putwc // disable expansion of putwc
#endif
wint_t CLIBCALL putwc(wchar_t c, FILE* stream) { return __infer_nondet_int(); }
#ifdef putwchar
#undef putwchar // disable expansion of putwchar
#endif
wint_t CLIBCALL putwchar(wchar_t c) { return __infer_nondet_int(); }
// s must be allocated
// return a nondeterministic nonnegative integer
int CLIBCALL swprintf(wchar_t* restrict s,
size_t n,
const wchar_t* restrict format,
...) {
int res;
int size1;
size1 = __get_array_length(s);
res = __infer_nondet_int();
INFER_EXCLUDE_CONDITION(res < 0);
return res;
}
wint_t CLIBCALL ungetwc(wint_t c, FILE* stream) { return __infer_nondet_int(); }
// return a nondeterministic nonnegative integer
int CLIBCALL vfwprintf(FILE* restrict stream,
const wchar_t* restrict format,
va_list arg) {
int res;
res = __infer_nondet_int();
INFER_EXCLUDE_CONDITION(res < 0);
return res;
}
// return a nondeterministic nonnegative integer
int CLIBCALL vswprintf(wchar_t* restrict s,
size_t n,
const wchar_t* restrict format,
va_list arg) {
int res;
res = __infer_nondet_int();
INFER_EXCLUDE_CONDITION(res < 0);
return res;
}
// return a nondeterministic nonnegative integer
int CLIBCALL vwprintf(const wchar_t* restrict format, va_list arg) {
int res;
res = __infer_nondet_int();
INFER_EXCLUDE_CONDITION(res < 0);
return res;
}
size_t CLIBCALL wcrtomb(char* restrict s, wchar_t wc, mbstate_t* restrict ps) {
return __infer_nondet_int();
}
size_t CLIBCALL wcsrtombs(char* restrict dst,
const wchar_t** restrict src,
size_t len,
mbstate_t* restrict ps) {
return __infer_nondet_int();
}
// return a nondeterministic nonnegative integer
int CLIBCALL wprintf(const wchar_t* restrict format, ...) {
int res;
res = __infer_nondet_int();
INFER_EXCLUDE_CONDITION(res < 0);
return res;
}
// modeled using strcat
wchar_t* CLIBCALL wcscat(wchar_t* restrict s1, const wchar_t* restrict s2) {
return (wchar_t*)strcat((char*)s1, (char*)s2);
}
// modeled using strchr
#ifndef USE_CPP_OVERLOADS
wchar_t* CLIBCALL wcschr(const wchar_t* s, wchar_t c)
#else
const wchar_t* CLIBCALL wcschr(const wchar_t* s, wchar_t c) {
return wcschr((wchar_t*)s, c);
}
wchar_t* CLIBCALL wcschr(wchar_t* s, wchar_t c)
#endif
{
return (wchar_t*)strchr((char*)s, c);
}
// modeled using strcmp
int CLIBCALL wcscmp(const wchar_t* s1, const wchar_t* s2) {
return strcmp((char*)s1, (char*)s2);
}
// modeled using strcmp
int CLIBCALL wcscoll(const wchar_t* s1, const wchar_t* s2) {
return strcmp((char*)s1, (char*)s2);
}
// return a nondeterministic nonnegative integer
size_t CLIBCALL wcsftime(wchar_t* restrict s,
size_t maxsize,
const wchar_t* restrict format,
const struct tm* restrict timeptr) {
int res;
res = __infer_nondet_int();
INFER_EXCLUDE_CONDITION(res < 0);
return res;
}
// modeled using strcpy
wchar_t* CLIBCALL wcscpy(wchar_t* restrict s1, const wchar_t* restrict s2) {
return (wchar_t*)strcpy((char*)s1, (char*)s2);
}
// modeled using strcmp
size_t CLIBCALL wcscspn(const wchar_t* s1, const wchar_t* s2) {
return strcmp((char*)s1, (char*)s2);
}
// modeled using strlen
size_t CLIBCALL wcslen(const wchar_t* s) { return strlen((char*)s); }
// modeled using strncat
wchar_t* CLIBCALL wcsncat(wchar_t* restrict s1,
const wchar_t* restrict s2,
size_t n) {
return (wchar_t*)strncat((char*)s1, (char*)s2, n);
}
// modeled using strncmp
int CLIBCALL wcsncmp(const wchar_t* s1, const wchar_t* s2, size_t n) {
return strncmp((char*)s1, (char*)s2, n);
}
// modeled using strpbrk
#ifndef USE_CPP_OVERLOADS
wchar_t* CLIBCALL wcspbrk(const wchar_t* s1, const wchar_t* s2)
#else
const wchar_t* CLIBCALL wcspbrk(const wchar_t* s1, const wchar_t* s2) {
return wcspbrk((wchar_t*)s1, s2);
}
wchar_t* CLIBCALL wcspbrk(wchar_t* s1, const wchar_t* s2)
#endif
{
return (wchar_t*)strpbrk((char*)s1, (char*)s2);
}
// modeled using strchr
#ifndef USE_CPP_OVERLOADS
wchar_t* CLIBCALL wcsrchr(const wchar_t* s, wchar_t c)
#else
const wchar_t* CLIBCALL wcsrchr(const wchar_t* s, wchar_t c) {
return wcsrchr((wchar_t*)s, c);
}
wchar_t* CLIBCALL wcsrchr(wchar_t* s, wchar_t c)
#endif
{
return (wchar_t*)strchr((char*)s, c);
}
// modeled using strncpy
wchar_t* CLIBCALL wcsncpy(wchar_t* restrict s1,
const wchar_t* restrict s2,
size_t n) {
return (wchar_t*)strncpy((char*)s1, (char*)s2, n);
}
// modeled using strspn
size_t CLIBCALL wcsspn(const wchar_t* s1, const wchar_t* s2) {
return strspn((char*)s1, (char*)s2);
}
// modeled using strstr
#ifndef USE_CPP_OVERLOADS
wchar_t* CLIBCALL wcsstr(const wchar_t* s1, const wchar_t* s2)
#else
const wchar_t* CLIBCALL wcsstr(const wchar_t* s1, const wchar_t* s2) {
return wcsstr((wchar_t*)s1, s2);
}
wchar_t* CLIBCALL wcsstr(wchar_t* s1, const wchar_t* s2)
#endif
{
return (wchar_t*)strstr((char*)s1, (char*)s2);
}
int CLIBCALL wctob(wint_t c) { return __infer_nondet_int(); }
double CLIBCALL wcstod(const wchar_t* restrict nptr,
wchar_t** restrict endptr) {
return __infer_nondet_double();
}
float CLIBCALL wcstof(const wchar_t* restrict nptr, wchar_t** restrict endptr) {
return __infer_nondet_float();
}
// simplified modeling which returns s1
wchar_t* CLIBCALL wcstok(wchar_t* restrict s1,
const wchar_t* restrict s2,
wchar_t** restrict ptr) {
return s1;
}
long double CLIBCALL wcstold(const wchar_t* restrict nptr,
wchar_t** restrict endptr) {
return __infer_nondet_long_double();
}
long int CLIBCALL wcstol(const wchar_t* restrict nptr,
wchar_t** restrict endptr,
int base) {
return __infer_nondet_long_int();
}
long long int CLIBCALL wcstoll(const wchar_t* restrict nptr,
wchar_t** restrict endptr,
int base) {
return __infer_nondet_long_long_int();
}
unsigned long int CLIBCALL wcstoul(const wchar_t* restrict nptr,
wchar_t** restrict endptr,
int base) {
return __infer_nondet_unsigned_long_int();
}
unsigned long long int CLIBCALL wcstoull(const wchar_t* restrict nptr,
wchar_t** restrict endptr,
int base) {
return __infer_nondet_long_long_int();
}
// modeled using strncmp
size_t CLIBCALL wcsxfrm(wchar_t* restrict s1,
const wchar_t* restrict s2,
size_t n) {
return strncmp((char*)s1, (char*)s2, n);
}
// modeled using memchr
#ifndef USE_CPP_OVERLOADS
wchar_t* CLIBCALL wmemchr(const wchar_t* s, wchar_t c, size_t n)
#else
const wchar_t* CLIBCALL wmemchr(const wchar_t* s, wchar_t c, size_t n) {
return wmemchr((wchar_t*)s, c, n);
}
wchar_t* CLIBCALL wmemchr(wchar_t* s, wchar_t c, size_t n)
#endif
{
return (wchar_t*)memchr((char*)s, c, n);
}
// modeled using memcmp
int CLIBCALL wmemcmp(const wchar_t* s1, const wchar_t* s2, size_t n) {
return memcmp((char*)s1, (char*)s2, n);
}
// modeled using memcpy
wchar_t* CLIBCALL wmemcpy(wchar_t* restrict s1,
const wchar_t* restrict s2,
size_t n) {
return (wchar_t*)memcpy((char*)s1, (char*)s2, n);
}
// modeled using memmove
wchar_t* CLIBCALL wmemmove(wchar_t* s1, const wchar_t* s2, size_t n) {
return (wchar_t*)memmove((char*)s1, (char*)s2, n);
}
// modeled using memset
wchar_t* CLIBCALL wmemset(wchar_t* s, wchar_t c, size_t n) {
return (wchar_t*)memset((char*)s, c, n);
}