/*
 * Copyright 2024 Google LLC
 *
 * 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.
 */

/* This file provides clear error messages when developer 
 * attempts to use a function call supported by newlib-c but
 * not provided by the pebble libraries.
 *
 * ex. use of fopen("test.txt", "r") will display...
 * src/main.c:123:3 error: static assertion failed: "fopen() is not supported"
*/

// Rather than asserting on printf, 
// lets map it to app_log for simple cross-compiles
#define printf(format, ...) \
  app_log(APP_LOG_LEVEL_DEBUG, __FILE_NAME__, __LINE__, format, ##__VA_ARGS__)

// List of unsupported file io calls
#define fopen(...)    _Static_assert(0, "fopen() is not supported")
#define fclose(...)   _Static_assert(0, "fclose() is not supported")
#define fread(...)    _Static_assert(0, "fread() is not supported")
#define fwrite(...)   _Static_assert(0, "fwrite() is not supported")
#define fseek(...)    _Static_assert(0, "fseek() is not supported")
#define ftell(...)    _Static_assert(0, "ftell() is not supported")
#define fsetpos(...)  _Static_assert(0, "fsetpos() is not supported")
#define fscanf(...)   _Static_assert(0, "fscanf() is not supported")
#define fgetc(...)    _Static_assert(0, "fgetc() is not supported")
#define fgets(...)    _Static_assert(0, "fgets() is not supported")
#define fputc(...)    _Static_assert(0, "fputc() is not supported")
#define fputs(...)    _Static_assert(0, "fputs() is not supported")

// List of unsupported print calls
#define fprintf(...)    _Static_assert(0, "fprintf() is not supported")
#define sprintf(...)    _Static_assert(0, "sprintf() is not supported")
#define vfprintf(...)   _Static_assert(0, "vfprintf() is not supported")
#define vsprintf(...)   _Static_assert(0, "vsprintf() is not supported")
#define vsnprintf(...)  _Static_assert(0, "vsnprintf() is not supported")

// List of unsupported io calls
#define open(...)   _Static_assert(0, "open() is not supported")
#define close(...)  _Static_assert(0, "close() is not supported")
#define creat(...)  _Static_assert(0, "creat() is not supported")
#define read(...)   _Static_assert(0, "read() is not supported")
#define write(...)  _Static_assert(0, "write() is not supported")
#define stat(...)   _Static_assert(0, "stat() is not supported")

// List of unsupported memory calls
#define alloca(...)   _Static_assert(0, "alloca() is not supported")
#define mmap(...)     _Static_assert(0, "mmap() is not supported")
#define brk(...)      _Static_assert(0, "brk() is not supported")
#define sbrk(...)     _Static_assert(0, "sbrk() is not supported")

