Mouse code for the MacroRat

Dependencies:   ITG3200 QEI

Committer:
sahilmgandhi
Date:
Sat Jun 03 00:22:44 2017 +0000
Revision:
46:b156ef445742
Parent:
18:6a4db94011d3
Final code for internal battlebot competition.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sahilmgandhi 18:6a4db94011d3 1 /* mbed Microcontroller Library
sahilmgandhi 18:6a4db94011d3 2 * Copyright (c) 2006-2015 ARM Limited
sahilmgandhi 18:6a4db94011d3 3 *
sahilmgandhi 18:6a4db94011d3 4 * Licensed under the Apache License, Version 2.0 (the "License");
sahilmgandhi 18:6a4db94011d3 5 * you may not use this file except in compliance with the License.
sahilmgandhi 18:6a4db94011d3 6 * You may obtain a copy of the License at
sahilmgandhi 18:6a4db94011d3 7 *
sahilmgandhi 18:6a4db94011d3 8 * http://www.apache.org/licenses/LICENSE-2.0
sahilmgandhi 18:6a4db94011d3 9 *
sahilmgandhi 18:6a4db94011d3 10 * Unless required by applicable law or agreed to in writing, software
sahilmgandhi 18:6a4db94011d3 11 * distributed under the License is distributed on an "AS IS" BASIS,
sahilmgandhi 18:6a4db94011d3 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
sahilmgandhi 18:6a4db94011d3 13 * See the License for the specific language governing permissions and
sahilmgandhi 18:6a4db94011d3 14 * limitations under the License.
sahilmgandhi 18:6a4db94011d3 15 */
sahilmgandhi 18:6a4db94011d3 16 #include "platform/platform.h"
sahilmgandhi 18:6a4db94011d3 17 #include "drivers/FilePath.h"
sahilmgandhi 18:6a4db94011d3 18 #include "hal/serial_api.h"
sahilmgandhi 18:6a4db94011d3 19 #include "platform/mbed_toolchain.h"
sahilmgandhi 18:6a4db94011d3 20 #include "platform/mbed_semihost_api.h"
sahilmgandhi 18:6a4db94011d3 21 #include "platform/mbed_interface.h"
sahilmgandhi 18:6a4db94011d3 22 #include "platform/SingletonPtr.h"
sahilmgandhi 18:6a4db94011d3 23 #include "platform/PlatformMutex.h"
sahilmgandhi 18:6a4db94011d3 24 #include "platform/mbed_error.h"
sahilmgandhi 18:6a4db94011d3 25 #include "platform/mbed_stats.h"
sahilmgandhi 18:6a4db94011d3 26 #if MBED_CONF_FILESYSTEM_PRESENT
sahilmgandhi 18:6a4db94011d3 27 #include "filesystem/FileSystem.h"
sahilmgandhi 18:6a4db94011d3 28 #include "filesystem/File.h"
sahilmgandhi 18:6a4db94011d3 29 #include "filesystem/Dir.h"
sahilmgandhi 18:6a4db94011d3 30 #endif
sahilmgandhi 18:6a4db94011d3 31 #include <stdlib.h>
sahilmgandhi 18:6a4db94011d3 32 #include <string.h>
sahilmgandhi 18:6a4db94011d3 33 #if DEVICE_STDIO_MESSAGES
sahilmgandhi 18:6a4db94011d3 34 #include <stdio.h>
sahilmgandhi 18:6a4db94011d3 35 #endif
sahilmgandhi 18:6a4db94011d3 36 #include <errno.h>
sahilmgandhi 18:6a4db94011d3 37 #include "platform/mbed_retarget.h"
sahilmgandhi 18:6a4db94011d3 38
sahilmgandhi 18:6a4db94011d3 39
sahilmgandhi 18:6a4db94011d3 40 #if defined(__ARMCC_VERSION)
sahilmgandhi 18:6a4db94011d3 41 # include <rt_sys.h>
sahilmgandhi 18:6a4db94011d3 42 # define PREFIX(x) _sys##x
sahilmgandhi 18:6a4db94011d3 43 # define OPEN_MAX _SYS_OPEN
sahilmgandhi 18:6a4db94011d3 44 # ifdef __MICROLIB
sahilmgandhi 18:6a4db94011d3 45 # pragma import(__use_full_stdio)
sahilmgandhi 18:6a4db94011d3 46 # endif
sahilmgandhi 18:6a4db94011d3 47
sahilmgandhi 18:6a4db94011d3 48 #elif defined(__ICCARM__)
sahilmgandhi 18:6a4db94011d3 49 # include <yfuns.h>
sahilmgandhi 18:6a4db94011d3 50 # define PREFIX(x) _##x
sahilmgandhi 18:6a4db94011d3 51 # define OPEN_MAX 16
sahilmgandhi 18:6a4db94011d3 52
sahilmgandhi 18:6a4db94011d3 53 # define STDIN_FILENO 0
sahilmgandhi 18:6a4db94011d3 54 # define STDOUT_FILENO 1
sahilmgandhi 18:6a4db94011d3 55 # define STDERR_FILENO 2
sahilmgandhi 18:6a4db94011d3 56
sahilmgandhi 18:6a4db94011d3 57 #else
sahilmgandhi 18:6a4db94011d3 58 # include <sys/stat.h>
sahilmgandhi 18:6a4db94011d3 59 # include <sys/syslimits.h>
sahilmgandhi 18:6a4db94011d3 60 # define PREFIX(x) x
sahilmgandhi 18:6a4db94011d3 61 #endif
sahilmgandhi 18:6a4db94011d3 62
sahilmgandhi 18:6a4db94011d3 63 #define FILE_HANDLE_RESERVED 0xFFFFFFFF
sahilmgandhi 18:6a4db94011d3 64
sahilmgandhi 18:6a4db94011d3 65 using namespace mbed;
sahilmgandhi 18:6a4db94011d3 66
sahilmgandhi 18:6a4db94011d3 67 #if defined(__MICROLIB) && (__ARMCC_VERSION>5030000)
sahilmgandhi 18:6a4db94011d3 68 // Before version 5.03, we were using a patched version of microlib with proper names
sahilmgandhi 18:6a4db94011d3 69 extern const char __stdin_name[] = ":tt";
sahilmgandhi 18:6a4db94011d3 70 extern const char __stdout_name[] = ":tt";
sahilmgandhi 18:6a4db94011d3 71 extern const char __stderr_name[] = ":tt";
sahilmgandhi 18:6a4db94011d3 72
sahilmgandhi 18:6a4db94011d3 73 #else
sahilmgandhi 18:6a4db94011d3 74 extern const char __stdin_name[] = "/stdin";
sahilmgandhi 18:6a4db94011d3 75 extern const char __stdout_name[] = "/stdout";
sahilmgandhi 18:6a4db94011d3 76 extern const char __stderr_name[] = "/stderr";
sahilmgandhi 18:6a4db94011d3 77 #endif
sahilmgandhi 18:6a4db94011d3 78
sahilmgandhi 18:6a4db94011d3 79 // Heap limits - only used if set
sahilmgandhi 18:6a4db94011d3 80 unsigned char *mbed_heap_start = 0;
sahilmgandhi 18:6a4db94011d3 81 uint32_t mbed_heap_size = 0;
sahilmgandhi 18:6a4db94011d3 82
sahilmgandhi 18:6a4db94011d3 83 /* newlib has the filehandle field in the FILE struct as a short, so
sahilmgandhi 18:6a4db94011d3 84 * we can't just return a Filehandle* from _open and instead have to
sahilmgandhi 18:6a4db94011d3 85 * put it in a filehandles array and return the index into that array
sahilmgandhi 18:6a4db94011d3 86 * (or rather index+3, as filehandles 0-2 are stdin/out/err).
sahilmgandhi 18:6a4db94011d3 87 */
sahilmgandhi 18:6a4db94011d3 88 static FileLike *filehandles[OPEN_MAX];
sahilmgandhi 18:6a4db94011d3 89 static SingletonPtr<PlatformMutex> filehandle_mutex;
sahilmgandhi 18:6a4db94011d3 90
sahilmgandhi 18:6a4db94011d3 91 namespace mbed {
sahilmgandhi 18:6a4db94011d3 92 void remove_filehandle(FileLike *file) {
sahilmgandhi 18:6a4db94011d3 93 filehandle_mutex->lock();
sahilmgandhi 18:6a4db94011d3 94 /* Remove all open filehandles for this */
sahilmgandhi 18:6a4db94011d3 95 for (unsigned int fh_i = 0; fh_i < sizeof(filehandles)/sizeof(*filehandles); fh_i++) {
sahilmgandhi 18:6a4db94011d3 96 if (filehandles[fh_i] == file) {
sahilmgandhi 18:6a4db94011d3 97 filehandles[fh_i] = NULL;
sahilmgandhi 18:6a4db94011d3 98 }
sahilmgandhi 18:6a4db94011d3 99 }
sahilmgandhi 18:6a4db94011d3 100 filehandle_mutex->unlock();
sahilmgandhi 18:6a4db94011d3 101 }
sahilmgandhi 18:6a4db94011d3 102 }
sahilmgandhi 18:6a4db94011d3 103
sahilmgandhi 18:6a4db94011d3 104 #if DEVICE_SERIAL
sahilmgandhi 18:6a4db94011d3 105 extern int stdio_uart_inited;
sahilmgandhi 18:6a4db94011d3 106 extern serial_t stdio_uart;
sahilmgandhi 18:6a4db94011d3 107 #if MBED_CONF_PLATFORM_STDIO_CONVERT_NEWLINES
sahilmgandhi 18:6a4db94011d3 108 static char stdio_in_prev;
sahilmgandhi 18:6a4db94011d3 109 static char stdio_out_prev;
sahilmgandhi 18:6a4db94011d3 110 #endif
sahilmgandhi 18:6a4db94011d3 111 #endif
sahilmgandhi 18:6a4db94011d3 112
sahilmgandhi 18:6a4db94011d3 113 static void init_serial() {
sahilmgandhi 18:6a4db94011d3 114 #if DEVICE_SERIAL
sahilmgandhi 18:6a4db94011d3 115 if (stdio_uart_inited) return;
sahilmgandhi 18:6a4db94011d3 116 serial_init(&stdio_uart, STDIO_UART_TX, STDIO_UART_RX);
sahilmgandhi 18:6a4db94011d3 117 #if MBED_CONF_PLATFORM_STDIO_BAUD_RATE
sahilmgandhi 18:6a4db94011d3 118 serial_baud(&stdio_uart, MBED_CONF_PLATFORM_STDIO_BAUD_RATE);
sahilmgandhi 18:6a4db94011d3 119 #endif
sahilmgandhi 18:6a4db94011d3 120 #endif
sahilmgandhi 18:6a4db94011d3 121 }
sahilmgandhi 18:6a4db94011d3 122
sahilmgandhi 18:6a4db94011d3 123 #if MBED_CONF_FILESYSTEM_PRESENT
sahilmgandhi 18:6a4db94011d3 124 static inline int openmode_to_posix(int openmode) {
sahilmgandhi 18:6a4db94011d3 125 int posix = openmode;
sahilmgandhi 18:6a4db94011d3 126 #ifdef __ARMCC_VERSION
sahilmgandhi 18:6a4db94011d3 127 if (openmode & OPEN_PLUS) {
sahilmgandhi 18:6a4db94011d3 128 posix = O_RDWR;
sahilmgandhi 18:6a4db94011d3 129 } else if(openmode & OPEN_W) {
sahilmgandhi 18:6a4db94011d3 130 posix = O_WRONLY;
sahilmgandhi 18:6a4db94011d3 131 } else if(openmode & OPEN_A) {
sahilmgandhi 18:6a4db94011d3 132 posix = O_WRONLY|O_APPEND;
sahilmgandhi 18:6a4db94011d3 133 } else {
sahilmgandhi 18:6a4db94011d3 134 posix = O_RDONLY;
sahilmgandhi 18:6a4db94011d3 135 }
sahilmgandhi 18:6a4db94011d3 136 /* a, w, a+, w+ all create if file does not already exist */
sahilmgandhi 18:6a4db94011d3 137 if (openmode & (OPEN_A|OPEN_W)) {
sahilmgandhi 18:6a4db94011d3 138 posix |= O_CREAT;
sahilmgandhi 18:6a4db94011d3 139 }
sahilmgandhi 18:6a4db94011d3 140 /* w and w+ truncate */
sahilmgandhi 18:6a4db94011d3 141 if (openmode & OPEN_W) {
sahilmgandhi 18:6a4db94011d3 142 posix |= O_TRUNC;
sahilmgandhi 18:6a4db94011d3 143 }
sahilmgandhi 18:6a4db94011d3 144 #elif defined(__ICCARM__)
sahilmgandhi 18:6a4db94011d3 145 switch (openmode & _LLIO_RDWRMASK) {
sahilmgandhi 18:6a4db94011d3 146 case _LLIO_RDONLY: posix = O_RDONLY; break;
sahilmgandhi 18:6a4db94011d3 147 case _LLIO_WRONLY: posix = O_WRONLY; break;
sahilmgandhi 18:6a4db94011d3 148 case _LLIO_RDWR : posix = O_RDWR ; break;
sahilmgandhi 18:6a4db94011d3 149 }
sahilmgandhi 18:6a4db94011d3 150 if (openmode & _LLIO_CREAT ) posix |= O_CREAT;
sahilmgandhi 18:6a4db94011d3 151 if (openmode & _LLIO_APPEND) posix |= O_APPEND;
sahilmgandhi 18:6a4db94011d3 152 if (openmode & _LLIO_TRUNC ) posix |= O_TRUNC;
sahilmgandhi 18:6a4db94011d3 153 #elif defined(TOOLCHAIN_GCC)
sahilmgandhi 18:6a4db94011d3 154 posix &= ~O_BINARY;
sahilmgandhi 18:6a4db94011d3 155 #endif
sahilmgandhi 18:6a4db94011d3 156 return posix;
sahilmgandhi 18:6a4db94011d3 157 }
sahilmgandhi 18:6a4db94011d3 158 #endif
sahilmgandhi 18:6a4db94011d3 159
sahilmgandhi 18:6a4db94011d3 160 extern "C" WEAK void mbed_sdk_init(void);
sahilmgandhi 18:6a4db94011d3 161 extern "C" WEAK void mbed_sdk_init(void) {
sahilmgandhi 18:6a4db94011d3 162 }
sahilmgandhi 18:6a4db94011d3 163
sahilmgandhi 18:6a4db94011d3 164 #if MBED_CONF_FILESYSTEM_PRESENT
sahilmgandhi 18:6a4db94011d3 165 // Internally used file objects with managed memory on close
sahilmgandhi 18:6a4db94011d3 166 class ManagedFile : public File {
sahilmgandhi 18:6a4db94011d3 167 public:
sahilmgandhi 18:6a4db94011d3 168 virtual int close() {
sahilmgandhi 18:6a4db94011d3 169 int err = File::close();
sahilmgandhi 18:6a4db94011d3 170 delete this;
sahilmgandhi 18:6a4db94011d3 171 return err;
sahilmgandhi 18:6a4db94011d3 172 }
sahilmgandhi 18:6a4db94011d3 173 };
sahilmgandhi 18:6a4db94011d3 174
sahilmgandhi 18:6a4db94011d3 175 class ManagedDir : public Dir {
sahilmgandhi 18:6a4db94011d3 176 public:
sahilmgandhi 18:6a4db94011d3 177 virtual int close() {
sahilmgandhi 18:6a4db94011d3 178 int err = Dir::close();
sahilmgandhi 18:6a4db94011d3 179 delete this;
sahilmgandhi 18:6a4db94011d3 180 return err;
sahilmgandhi 18:6a4db94011d3 181 }
sahilmgandhi 18:6a4db94011d3 182 };
sahilmgandhi 18:6a4db94011d3 183 #endif
sahilmgandhi 18:6a4db94011d3 184
sahilmgandhi 18:6a4db94011d3 185 /* @brief standard c library fopen() retargeting function.
sahilmgandhi 18:6a4db94011d3 186 *
sahilmgandhi 18:6a4db94011d3 187 * This function is invoked by the standard c library retargeting to handle fopen()
sahilmgandhi 18:6a4db94011d3 188 *
sahilmgandhi 18:6a4db94011d3 189 * @return
sahilmgandhi 18:6a4db94011d3 190 * On success, a valid FILEHANDLE is returned.
sahilmgandhi 18:6a4db94011d3 191 * On failure, -1 is returned and errno is set to an appropriate value e.g.
sahilmgandhi 18:6a4db94011d3 192 * EBADF a bad file descriptor was found (default errno setting)
sahilmgandhi 18:6a4db94011d3 193 * EMFILE the maximum number of open files was exceeded.
sahilmgandhi 18:6a4db94011d3 194 *
sahilmgandhi 18:6a4db94011d3 195 * */
sahilmgandhi 18:6a4db94011d3 196 extern "C" FILEHANDLE PREFIX(_open)(const char* name, int openmode) {
sahilmgandhi 18:6a4db94011d3 197 #if defined(__MICROLIB) && (__ARMCC_VERSION>5030000)
sahilmgandhi 18:6a4db94011d3 198 // Before version 5.03, we were using a patched version of microlib with proper names
sahilmgandhi 18:6a4db94011d3 199 // This is the workaround that the microlib author suggested us
sahilmgandhi 18:6a4db94011d3 200 static int n = 0;
sahilmgandhi 18:6a4db94011d3 201 static int mbed_sdk_inited = 0;
sahilmgandhi 18:6a4db94011d3 202 if (!mbed_sdk_inited) {
sahilmgandhi 18:6a4db94011d3 203 mbed_sdk_inited = 1;
sahilmgandhi 18:6a4db94011d3 204 mbed_sdk_init();
sahilmgandhi 18:6a4db94011d3 205 }
sahilmgandhi 18:6a4db94011d3 206 if (!std::strcmp(name, ":tt")) return n++;
sahilmgandhi 18:6a4db94011d3 207 #else
sahilmgandhi 18:6a4db94011d3 208 /* Use the posix convention that stdin,out,err are filehandles 0,1,2.
sahilmgandhi 18:6a4db94011d3 209 */
sahilmgandhi 18:6a4db94011d3 210 if (std::strcmp(name, __stdin_name) == 0) {
sahilmgandhi 18:6a4db94011d3 211 init_serial();
sahilmgandhi 18:6a4db94011d3 212 return 0;
sahilmgandhi 18:6a4db94011d3 213 } else if (std::strcmp(name, __stdout_name) == 0) {
sahilmgandhi 18:6a4db94011d3 214 init_serial();
sahilmgandhi 18:6a4db94011d3 215 return 1;
sahilmgandhi 18:6a4db94011d3 216 } else if (std::strcmp(name, __stderr_name) == 0) {
sahilmgandhi 18:6a4db94011d3 217 init_serial();
sahilmgandhi 18:6a4db94011d3 218 return 2;
sahilmgandhi 18:6a4db94011d3 219 }
sahilmgandhi 18:6a4db94011d3 220 #endif
sahilmgandhi 18:6a4db94011d3 221
sahilmgandhi 18:6a4db94011d3 222 /* if something goes wrong and errno is not explicly set, errno will be set to EBADF */
sahilmgandhi 18:6a4db94011d3 223 errno = EBADF;
sahilmgandhi 18:6a4db94011d3 224
sahilmgandhi 18:6a4db94011d3 225 // find the first empty slot in filehandles
sahilmgandhi 18:6a4db94011d3 226 filehandle_mutex->lock();
sahilmgandhi 18:6a4db94011d3 227 unsigned int fh_i;
sahilmgandhi 18:6a4db94011d3 228 for (fh_i = 0; fh_i < sizeof(filehandles)/sizeof(*filehandles); fh_i++) {
sahilmgandhi 18:6a4db94011d3 229 /* Take a next free filehandle slot available. */
sahilmgandhi 18:6a4db94011d3 230 if (filehandles[fh_i] == NULL) break;
sahilmgandhi 18:6a4db94011d3 231 }
sahilmgandhi 18:6a4db94011d3 232 if (fh_i >= sizeof(filehandles)/sizeof(*filehandles)) {
sahilmgandhi 18:6a4db94011d3 233 /* Too many file handles have been opened */
sahilmgandhi 18:6a4db94011d3 234 errno = EMFILE;
sahilmgandhi 18:6a4db94011d3 235 filehandle_mutex->unlock();
sahilmgandhi 18:6a4db94011d3 236 return -1;
sahilmgandhi 18:6a4db94011d3 237 }
sahilmgandhi 18:6a4db94011d3 238 filehandles[fh_i] = (FileLike*)FILE_HANDLE_RESERVED;
sahilmgandhi 18:6a4db94011d3 239 filehandle_mutex->unlock();
sahilmgandhi 18:6a4db94011d3 240
sahilmgandhi 18:6a4db94011d3 241 FileLike *res = NULL;
sahilmgandhi 18:6a4db94011d3 242
sahilmgandhi 18:6a4db94011d3 243 /* FILENAME: ":0x12345678" describes a FileLike* */
sahilmgandhi 18:6a4db94011d3 244 if (name[0] == ':') {
sahilmgandhi 18:6a4db94011d3 245 void *p;
sahilmgandhi 18:6a4db94011d3 246 sscanf(name, ":%p", &p);
sahilmgandhi 18:6a4db94011d3 247 res = (FileLike*)p;
sahilmgandhi 18:6a4db94011d3 248
sahilmgandhi 18:6a4db94011d3 249 /* FILENAME: "/file_system/file_name" */
sahilmgandhi 18:6a4db94011d3 250 } else {
sahilmgandhi 18:6a4db94011d3 251 FilePath path(name);
sahilmgandhi 18:6a4db94011d3 252
sahilmgandhi 18:6a4db94011d3 253 if (!path.exists()) {
sahilmgandhi 18:6a4db94011d3 254 /* The first part of the filename (between first 2 '/') is not a
sahilmgandhi 18:6a4db94011d3 255 * registered mount point in the namespace.
sahilmgandhi 18:6a4db94011d3 256 * Free file handle.
sahilmgandhi 18:6a4db94011d3 257 */
sahilmgandhi 18:6a4db94011d3 258 filehandles[fh_i] = NULL;
sahilmgandhi 18:6a4db94011d3 259 errno = ENOENT;
sahilmgandhi 18:6a4db94011d3 260 return -1;
sahilmgandhi 18:6a4db94011d3 261 } else if (path.isFile()) {
sahilmgandhi 18:6a4db94011d3 262 res = path.file();
sahilmgandhi 18:6a4db94011d3 263 #if MBED_CONF_FILESYSTEM_PRESENT
sahilmgandhi 18:6a4db94011d3 264 } else {
sahilmgandhi 18:6a4db94011d3 265 FileSystem *fs = path.fileSystem();
sahilmgandhi 18:6a4db94011d3 266 if (fs == NULL) {
sahilmgandhi 18:6a4db94011d3 267 /* The filesystem instance managing the namespace under the mount point
sahilmgandhi 18:6a4db94011d3 268 * has not been found. Free file handle */
sahilmgandhi 18:6a4db94011d3 269 errno = ENOENT;
sahilmgandhi 18:6a4db94011d3 270 filehandles[fh_i] = NULL;
sahilmgandhi 18:6a4db94011d3 271 return -1;
sahilmgandhi 18:6a4db94011d3 272 }
sahilmgandhi 18:6a4db94011d3 273 int posix_mode = openmode_to_posix(openmode);
sahilmgandhi 18:6a4db94011d3 274 File *file = new ManagedFile;
sahilmgandhi 18:6a4db94011d3 275 int err = file->open(fs, path.fileName(), posix_mode);
sahilmgandhi 18:6a4db94011d3 276 if (err < 0) {
sahilmgandhi 18:6a4db94011d3 277 errno = -err;
sahilmgandhi 18:6a4db94011d3 278 delete file;
sahilmgandhi 18:6a4db94011d3 279 } else {
sahilmgandhi 18:6a4db94011d3 280 res = file;
sahilmgandhi 18:6a4db94011d3 281 }
sahilmgandhi 18:6a4db94011d3 282 #endif
sahilmgandhi 18:6a4db94011d3 283 }
sahilmgandhi 18:6a4db94011d3 284 }
sahilmgandhi 18:6a4db94011d3 285
sahilmgandhi 18:6a4db94011d3 286 if (res == NULL) {
sahilmgandhi 18:6a4db94011d3 287 // Free file handle
sahilmgandhi 18:6a4db94011d3 288 filehandles[fh_i] = NULL;
sahilmgandhi 18:6a4db94011d3 289 return -1;
sahilmgandhi 18:6a4db94011d3 290 }
sahilmgandhi 18:6a4db94011d3 291 filehandles[fh_i] = res;
sahilmgandhi 18:6a4db94011d3 292
sahilmgandhi 18:6a4db94011d3 293 return fh_i + 3; // +3 as filehandles 0-2 are stdin/out/err
sahilmgandhi 18:6a4db94011d3 294 }
sahilmgandhi 18:6a4db94011d3 295
sahilmgandhi 18:6a4db94011d3 296 extern "C" int PREFIX(_close)(FILEHANDLE fh) {
sahilmgandhi 18:6a4db94011d3 297 if (fh < 3) return 0;
sahilmgandhi 18:6a4db94011d3 298
sahilmgandhi 18:6a4db94011d3 299 errno = EBADF;
sahilmgandhi 18:6a4db94011d3 300 FileLike* fhc = filehandles[fh-3];
sahilmgandhi 18:6a4db94011d3 301 filehandles[fh-3] = NULL;
sahilmgandhi 18:6a4db94011d3 302 if (fhc == NULL) return -1;
sahilmgandhi 18:6a4db94011d3 303
sahilmgandhi 18:6a4db94011d3 304 int err = fhc->close();
sahilmgandhi 18:6a4db94011d3 305 if (err < 0) {
sahilmgandhi 18:6a4db94011d3 306 errno = -err;
sahilmgandhi 18:6a4db94011d3 307 return -1;
sahilmgandhi 18:6a4db94011d3 308 } else {
sahilmgandhi 18:6a4db94011d3 309 return 0;
sahilmgandhi 18:6a4db94011d3 310 }
sahilmgandhi 18:6a4db94011d3 311 }
sahilmgandhi 18:6a4db94011d3 312
sahilmgandhi 18:6a4db94011d3 313 #if defined(__ICCARM__)
sahilmgandhi 18:6a4db94011d3 314 extern "C" size_t __write (int fh, const unsigned char *buffer, size_t length) {
sahilmgandhi 18:6a4db94011d3 315 #else
sahilmgandhi 18:6a4db94011d3 316 extern "C" int PREFIX(_write)(FILEHANDLE fh, const unsigned char *buffer, unsigned int length, int mode) {
sahilmgandhi 18:6a4db94011d3 317 #endif
sahilmgandhi 18:6a4db94011d3 318 int n; // n is the number of bytes written
sahilmgandhi 18:6a4db94011d3 319
sahilmgandhi 18:6a4db94011d3 320 errno = EBADF;
sahilmgandhi 18:6a4db94011d3 321 if (fh < 3) {
sahilmgandhi 18:6a4db94011d3 322 #if DEVICE_SERIAL
sahilmgandhi 18:6a4db94011d3 323 if (!stdio_uart_inited) init_serial();
sahilmgandhi 18:6a4db94011d3 324 #if MBED_CONF_PLATFORM_STDIO_CONVERT_NEWLINES
sahilmgandhi 18:6a4db94011d3 325 for (unsigned int i = 0; i < length; i++) {
sahilmgandhi 18:6a4db94011d3 326 if (buffer[i] == '\n' && stdio_out_prev != '\r') {
sahilmgandhi 18:6a4db94011d3 327 serial_putc(&stdio_uart, '\r');
sahilmgandhi 18:6a4db94011d3 328 }
sahilmgandhi 18:6a4db94011d3 329 serial_putc(&stdio_uart, buffer[i]);
sahilmgandhi 18:6a4db94011d3 330 stdio_out_prev = buffer[i];
sahilmgandhi 18:6a4db94011d3 331 }
sahilmgandhi 18:6a4db94011d3 332 #else
sahilmgandhi 18:6a4db94011d3 333 for (unsigned int i = 0; i < length; i++) {
sahilmgandhi 18:6a4db94011d3 334 serial_putc(&stdio_uart, buffer[i]);
sahilmgandhi 18:6a4db94011d3 335 }
sahilmgandhi 18:6a4db94011d3 336 #endif
sahilmgandhi 18:6a4db94011d3 337 #endif
sahilmgandhi 18:6a4db94011d3 338 n = length;
sahilmgandhi 18:6a4db94011d3 339 } else {
sahilmgandhi 18:6a4db94011d3 340 FileLike* fhc = filehandles[fh-3];
sahilmgandhi 18:6a4db94011d3 341 if (fhc == NULL) return -1;
sahilmgandhi 18:6a4db94011d3 342
sahilmgandhi 18:6a4db94011d3 343 n = fhc->write(buffer, length);
sahilmgandhi 18:6a4db94011d3 344 if (n < 0) {
sahilmgandhi 18:6a4db94011d3 345 errno = -n;
sahilmgandhi 18:6a4db94011d3 346 }
sahilmgandhi 18:6a4db94011d3 347 }
sahilmgandhi 18:6a4db94011d3 348 #ifdef __ARMCC_VERSION
sahilmgandhi 18:6a4db94011d3 349 return length-n;
sahilmgandhi 18:6a4db94011d3 350 #else
sahilmgandhi 18:6a4db94011d3 351 return n;
sahilmgandhi 18:6a4db94011d3 352 #endif
sahilmgandhi 18:6a4db94011d3 353 }
sahilmgandhi 18:6a4db94011d3 354
sahilmgandhi 18:6a4db94011d3 355 #if defined(__ICCARM__)
sahilmgandhi 18:6a4db94011d3 356 extern "C" size_t __read (int fh, unsigned char *buffer, size_t length) {
sahilmgandhi 18:6a4db94011d3 357 #else
sahilmgandhi 18:6a4db94011d3 358 extern "C" int PREFIX(_read)(FILEHANDLE fh, unsigned char *buffer, unsigned int length, int mode) {
sahilmgandhi 18:6a4db94011d3 359 #endif
sahilmgandhi 18:6a4db94011d3 360 int n; // n is the number of bytes read
sahilmgandhi 18:6a4db94011d3 361
sahilmgandhi 18:6a4db94011d3 362 errno = EBADF;
sahilmgandhi 18:6a4db94011d3 363 if (fh < 3) {
sahilmgandhi 18:6a4db94011d3 364 // only read a character at a time from stdin
sahilmgandhi 18:6a4db94011d3 365 #if DEVICE_SERIAL
sahilmgandhi 18:6a4db94011d3 366 if (!stdio_uart_inited) init_serial();
sahilmgandhi 18:6a4db94011d3 367 #if MBED_CONF_PLATFORM_STDIO_CONVERT_NEWLINES
sahilmgandhi 18:6a4db94011d3 368 while (true) {
sahilmgandhi 18:6a4db94011d3 369 char c = serial_getc(&stdio_uart);
sahilmgandhi 18:6a4db94011d3 370 if ((c == '\r' && stdio_in_prev != '\n') ||
sahilmgandhi 18:6a4db94011d3 371 (c == '\n' && stdio_in_prev != '\r')) {
sahilmgandhi 18:6a4db94011d3 372 stdio_in_prev = c;
sahilmgandhi 18:6a4db94011d3 373 *buffer = '\n';
sahilmgandhi 18:6a4db94011d3 374 break;
sahilmgandhi 18:6a4db94011d3 375 } else if ((c == '\r' && stdio_in_prev == '\n') ||
sahilmgandhi 18:6a4db94011d3 376 (c == '\n' && stdio_in_prev == '\r')) {
sahilmgandhi 18:6a4db94011d3 377 stdio_in_prev = c;
sahilmgandhi 18:6a4db94011d3 378 // onto next character
sahilmgandhi 18:6a4db94011d3 379 continue;
sahilmgandhi 18:6a4db94011d3 380 } else {
sahilmgandhi 18:6a4db94011d3 381 stdio_in_prev = c;
sahilmgandhi 18:6a4db94011d3 382 *buffer = c;
sahilmgandhi 18:6a4db94011d3 383 break;
sahilmgandhi 18:6a4db94011d3 384 }
sahilmgandhi 18:6a4db94011d3 385 }
sahilmgandhi 18:6a4db94011d3 386 #else
sahilmgandhi 18:6a4db94011d3 387 *buffer = serial_getc(&stdio_uart);
sahilmgandhi 18:6a4db94011d3 388 #endif
sahilmgandhi 18:6a4db94011d3 389 #endif
sahilmgandhi 18:6a4db94011d3 390 n = 1;
sahilmgandhi 18:6a4db94011d3 391 } else {
sahilmgandhi 18:6a4db94011d3 392 FileLike* fhc = filehandles[fh-3];
sahilmgandhi 18:6a4db94011d3 393 if (fhc == NULL) return -1;
sahilmgandhi 18:6a4db94011d3 394
sahilmgandhi 18:6a4db94011d3 395 n = fhc->read(buffer, length);
sahilmgandhi 18:6a4db94011d3 396 if (n < 0) {
sahilmgandhi 18:6a4db94011d3 397 errno = -n;
sahilmgandhi 18:6a4db94011d3 398 }
sahilmgandhi 18:6a4db94011d3 399 }
sahilmgandhi 18:6a4db94011d3 400 #ifdef __ARMCC_VERSION
sahilmgandhi 18:6a4db94011d3 401 return length-n;
sahilmgandhi 18:6a4db94011d3 402 #else
sahilmgandhi 18:6a4db94011d3 403 return n;
sahilmgandhi 18:6a4db94011d3 404 #endif
sahilmgandhi 18:6a4db94011d3 405 }
sahilmgandhi 18:6a4db94011d3 406
sahilmgandhi 18:6a4db94011d3 407 #ifdef __ARMCC_VERSION
sahilmgandhi 18:6a4db94011d3 408 extern "C" int PREFIX(_istty)(FILEHANDLE fh)
sahilmgandhi 18:6a4db94011d3 409 #else
sahilmgandhi 18:6a4db94011d3 410 extern "C" int _isatty(FILEHANDLE fh)
sahilmgandhi 18:6a4db94011d3 411 #endif
sahilmgandhi 18:6a4db94011d3 412 {
sahilmgandhi 18:6a4db94011d3 413 errno = EBADF;
sahilmgandhi 18:6a4db94011d3 414 /* stdin, stdout and stderr should be tty */
sahilmgandhi 18:6a4db94011d3 415 if (fh < 3) return 1;
sahilmgandhi 18:6a4db94011d3 416
sahilmgandhi 18:6a4db94011d3 417 FileLike* fhc = filehandles[fh-3];
sahilmgandhi 18:6a4db94011d3 418 if (fhc == NULL) return -1;
sahilmgandhi 18:6a4db94011d3 419
sahilmgandhi 18:6a4db94011d3 420 int err = fhc->isatty();
sahilmgandhi 18:6a4db94011d3 421 if (err < 0) {
sahilmgandhi 18:6a4db94011d3 422 errno = -err;
sahilmgandhi 18:6a4db94011d3 423 return -1;
sahilmgandhi 18:6a4db94011d3 424 } else {
sahilmgandhi 18:6a4db94011d3 425 return 0;
sahilmgandhi 18:6a4db94011d3 426 }
sahilmgandhi 18:6a4db94011d3 427 }
sahilmgandhi 18:6a4db94011d3 428
sahilmgandhi 18:6a4db94011d3 429 extern "C"
sahilmgandhi 18:6a4db94011d3 430 #if defined(__ARMCC_VERSION)
sahilmgandhi 18:6a4db94011d3 431 int _sys_seek(FILEHANDLE fh, long position)
sahilmgandhi 18:6a4db94011d3 432 #elif defined(__ICCARM__)
sahilmgandhi 18:6a4db94011d3 433 long __lseek(int fh, long offset, int whence)
sahilmgandhi 18:6a4db94011d3 434 #else
sahilmgandhi 18:6a4db94011d3 435 int _lseek(FILEHANDLE fh, int offset, int whence)
sahilmgandhi 18:6a4db94011d3 436 #endif
sahilmgandhi 18:6a4db94011d3 437 {
sahilmgandhi 18:6a4db94011d3 438 errno = EBADF;
sahilmgandhi 18:6a4db94011d3 439 if (fh < 3) return 0;
sahilmgandhi 18:6a4db94011d3 440
sahilmgandhi 18:6a4db94011d3 441 FileLike* fhc = filehandles[fh-3];
sahilmgandhi 18:6a4db94011d3 442 if (fhc == NULL) return -1;
sahilmgandhi 18:6a4db94011d3 443
sahilmgandhi 18:6a4db94011d3 444 #if defined(__ARMCC_VERSION)
sahilmgandhi 18:6a4db94011d3 445 return fhc->seek(position, SEEK_SET);
sahilmgandhi 18:6a4db94011d3 446 #else
sahilmgandhi 18:6a4db94011d3 447 return fhc->seek(offset, whence);
sahilmgandhi 18:6a4db94011d3 448 #endif
sahilmgandhi 18:6a4db94011d3 449 }
sahilmgandhi 18:6a4db94011d3 450
sahilmgandhi 18:6a4db94011d3 451 #ifdef __ARMCC_VERSION
sahilmgandhi 18:6a4db94011d3 452 extern "C" int PREFIX(_ensure)(FILEHANDLE fh) {
sahilmgandhi 18:6a4db94011d3 453 errno = EBADF;
sahilmgandhi 18:6a4db94011d3 454 if (fh < 3) return 0;
sahilmgandhi 18:6a4db94011d3 455
sahilmgandhi 18:6a4db94011d3 456 FileLike* fhc = filehandles[fh-3];
sahilmgandhi 18:6a4db94011d3 457 if (fhc == NULL) return -1;
sahilmgandhi 18:6a4db94011d3 458
sahilmgandhi 18:6a4db94011d3 459 int err = fhc->sync();
sahilmgandhi 18:6a4db94011d3 460 if (err < 0) {
sahilmgandhi 18:6a4db94011d3 461 errno = -err;
sahilmgandhi 18:6a4db94011d3 462 return -1;
sahilmgandhi 18:6a4db94011d3 463 } else {
sahilmgandhi 18:6a4db94011d3 464 return 0;
sahilmgandhi 18:6a4db94011d3 465 }
sahilmgandhi 18:6a4db94011d3 466 }
sahilmgandhi 18:6a4db94011d3 467
sahilmgandhi 18:6a4db94011d3 468 extern "C" long PREFIX(_flen)(FILEHANDLE fh) {
sahilmgandhi 18:6a4db94011d3 469 errno = EBADF;
sahilmgandhi 18:6a4db94011d3 470 if (fh < 3) return 0;
sahilmgandhi 18:6a4db94011d3 471
sahilmgandhi 18:6a4db94011d3 472 FileLike* fhc = filehandles[fh-3];
sahilmgandhi 18:6a4db94011d3 473 if (fhc == NULL) return -1;
sahilmgandhi 18:6a4db94011d3 474
sahilmgandhi 18:6a4db94011d3 475 return fhc->size();
sahilmgandhi 18:6a4db94011d3 476 }
sahilmgandhi 18:6a4db94011d3 477 #endif
sahilmgandhi 18:6a4db94011d3 478
sahilmgandhi 18:6a4db94011d3 479
sahilmgandhi 18:6a4db94011d3 480 #if !defined(__ARMCC_VERSION) && !defined(__ICCARM__)
sahilmgandhi 18:6a4db94011d3 481 extern "C" int _fstat(int fd, struct stat *st) {
sahilmgandhi 18:6a4db94011d3 482 if (fd < 3) {
sahilmgandhi 18:6a4db94011d3 483 st->st_mode = S_IFCHR;
sahilmgandhi 18:6a4db94011d3 484 return 0;
sahilmgandhi 18:6a4db94011d3 485 }
sahilmgandhi 18:6a4db94011d3 486 errno = EBADF;
sahilmgandhi 18:6a4db94011d3 487 return -1;
sahilmgandhi 18:6a4db94011d3 488 }
sahilmgandhi 18:6a4db94011d3 489 #endif
sahilmgandhi 18:6a4db94011d3 490
sahilmgandhi 18:6a4db94011d3 491 namespace std {
sahilmgandhi 18:6a4db94011d3 492 extern "C" int remove(const char *path) {
sahilmgandhi 18:6a4db94011d3 493 #if MBED_CONF_FILESYSTEM_PRESENT
sahilmgandhi 18:6a4db94011d3 494 errno = EBADF;
sahilmgandhi 18:6a4db94011d3 495 FilePath fp(path);
sahilmgandhi 18:6a4db94011d3 496 FileSystem *fs = fp.fileSystem();
sahilmgandhi 18:6a4db94011d3 497 if (fs == NULL) return -1;
sahilmgandhi 18:6a4db94011d3 498
sahilmgandhi 18:6a4db94011d3 499 int err = fs->remove(fp.fileName());
sahilmgandhi 18:6a4db94011d3 500 if (err < 0) {
sahilmgandhi 18:6a4db94011d3 501 errno = -err;
sahilmgandhi 18:6a4db94011d3 502 return -1;
sahilmgandhi 18:6a4db94011d3 503 } else {
sahilmgandhi 18:6a4db94011d3 504 return 0;
sahilmgandhi 18:6a4db94011d3 505 }
sahilmgandhi 18:6a4db94011d3 506 #else
sahilmgandhi 18:6a4db94011d3 507 errno = ENOSYS;
sahilmgandhi 18:6a4db94011d3 508 return -1;
sahilmgandhi 18:6a4db94011d3 509 #endif
sahilmgandhi 18:6a4db94011d3 510 }
sahilmgandhi 18:6a4db94011d3 511
sahilmgandhi 18:6a4db94011d3 512 extern "C" int rename(const char *oldname, const char *newname) {
sahilmgandhi 18:6a4db94011d3 513 #if MBED_CONF_FILESYSTEM_PRESENT
sahilmgandhi 18:6a4db94011d3 514 errno = EBADF;
sahilmgandhi 18:6a4db94011d3 515 FilePath fpOld(oldname);
sahilmgandhi 18:6a4db94011d3 516 FilePath fpNew(newname);
sahilmgandhi 18:6a4db94011d3 517 FileSystem *fsOld = fpOld.fileSystem();
sahilmgandhi 18:6a4db94011d3 518 FileSystem *fsNew = fpNew.fileSystem();
sahilmgandhi 18:6a4db94011d3 519
sahilmgandhi 18:6a4db94011d3 520 /* rename only if both files are on the same FS */
sahilmgandhi 18:6a4db94011d3 521 if (fsOld != fsNew || fsOld == NULL) return -1;
sahilmgandhi 18:6a4db94011d3 522
sahilmgandhi 18:6a4db94011d3 523 int err = fsOld->rename(fpOld.fileName(), fpNew.fileName());
sahilmgandhi 18:6a4db94011d3 524 if (err < 0) {
sahilmgandhi 18:6a4db94011d3 525 errno = -err;
sahilmgandhi 18:6a4db94011d3 526 return -1;
sahilmgandhi 18:6a4db94011d3 527 } else {
sahilmgandhi 18:6a4db94011d3 528 return 0;
sahilmgandhi 18:6a4db94011d3 529 }
sahilmgandhi 18:6a4db94011d3 530 #else
sahilmgandhi 18:6a4db94011d3 531 errno = ENOSYS;
sahilmgandhi 18:6a4db94011d3 532 return -1;
sahilmgandhi 18:6a4db94011d3 533 #endif
sahilmgandhi 18:6a4db94011d3 534 }
sahilmgandhi 18:6a4db94011d3 535
sahilmgandhi 18:6a4db94011d3 536 extern "C" char *tmpnam(char *s) {
sahilmgandhi 18:6a4db94011d3 537 errno = EBADF;
sahilmgandhi 18:6a4db94011d3 538 return NULL;
sahilmgandhi 18:6a4db94011d3 539 }
sahilmgandhi 18:6a4db94011d3 540
sahilmgandhi 18:6a4db94011d3 541 extern "C" FILE *tmpfile() {
sahilmgandhi 18:6a4db94011d3 542 errno = EBADF;
sahilmgandhi 18:6a4db94011d3 543 return NULL;
sahilmgandhi 18:6a4db94011d3 544 }
sahilmgandhi 18:6a4db94011d3 545 } // namespace std
sahilmgandhi 18:6a4db94011d3 546
sahilmgandhi 18:6a4db94011d3 547 #ifdef __ARMCC_VERSION
sahilmgandhi 18:6a4db94011d3 548 extern "C" char *_sys_command_string(char *cmd, int len) {
sahilmgandhi 18:6a4db94011d3 549 return NULL;
sahilmgandhi 18:6a4db94011d3 550 }
sahilmgandhi 18:6a4db94011d3 551 #endif
sahilmgandhi 18:6a4db94011d3 552
sahilmgandhi 18:6a4db94011d3 553 extern "C" DIR *opendir(const char *path) {
sahilmgandhi 18:6a4db94011d3 554 #if MBED_CONF_FILESYSTEM_PRESENT
sahilmgandhi 18:6a4db94011d3 555 errno = EBADF;
sahilmgandhi 18:6a4db94011d3 556
sahilmgandhi 18:6a4db94011d3 557 FilePath fp(path);
sahilmgandhi 18:6a4db94011d3 558 FileSystem* fs = fp.fileSystem();
sahilmgandhi 18:6a4db94011d3 559 if (fs == NULL) return NULL;
sahilmgandhi 18:6a4db94011d3 560
sahilmgandhi 18:6a4db94011d3 561 Dir *dir = new ManagedDir;
sahilmgandhi 18:6a4db94011d3 562 int err = dir->open(fs, fp.fileName());
sahilmgandhi 18:6a4db94011d3 563 if (err < 0) {
sahilmgandhi 18:6a4db94011d3 564 errno = -err;
sahilmgandhi 18:6a4db94011d3 565 delete dir;
sahilmgandhi 18:6a4db94011d3 566 dir = NULL;
sahilmgandhi 18:6a4db94011d3 567 }
sahilmgandhi 18:6a4db94011d3 568
sahilmgandhi 18:6a4db94011d3 569 return dir;
sahilmgandhi 18:6a4db94011d3 570 #else
sahilmgandhi 18:6a4db94011d3 571 errno = ENOSYS;
sahilmgandhi 18:6a4db94011d3 572 return 0;
sahilmgandhi 18:6a4db94011d3 573 #endif
sahilmgandhi 18:6a4db94011d3 574 }
sahilmgandhi 18:6a4db94011d3 575
sahilmgandhi 18:6a4db94011d3 576 extern "C" struct dirent *readdir(DIR *dir) {
sahilmgandhi 18:6a4db94011d3 577 #if MBED_CONF_FILESYSTEM_PRESENT
sahilmgandhi 18:6a4db94011d3 578 static struct dirent ent;
sahilmgandhi 18:6a4db94011d3 579 int err = dir->read(&ent);
sahilmgandhi 18:6a4db94011d3 580 if (err < 1) {
sahilmgandhi 18:6a4db94011d3 581 if (err < 0) {
sahilmgandhi 18:6a4db94011d3 582 errno = -err;
sahilmgandhi 18:6a4db94011d3 583 }
sahilmgandhi 18:6a4db94011d3 584 return NULL;
sahilmgandhi 18:6a4db94011d3 585 }
sahilmgandhi 18:6a4db94011d3 586
sahilmgandhi 18:6a4db94011d3 587 return &ent;
sahilmgandhi 18:6a4db94011d3 588 #else
sahilmgandhi 18:6a4db94011d3 589 errno = ENOSYS;
sahilmgandhi 18:6a4db94011d3 590 return 0;
sahilmgandhi 18:6a4db94011d3 591 #endif
sahilmgandhi 18:6a4db94011d3 592 }
sahilmgandhi 18:6a4db94011d3 593
sahilmgandhi 18:6a4db94011d3 594 extern "C" int closedir(DIR *dir) {
sahilmgandhi 18:6a4db94011d3 595 #if MBED_CONF_FILESYSTEM_PRESENT
sahilmgandhi 18:6a4db94011d3 596 int err = dir->close();
sahilmgandhi 18:6a4db94011d3 597 if (err < 0) {
sahilmgandhi 18:6a4db94011d3 598 errno = -err;
sahilmgandhi 18:6a4db94011d3 599 return -1;
sahilmgandhi 18:6a4db94011d3 600 } else {
sahilmgandhi 18:6a4db94011d3 601 return 0;
sahilmgandhi 18:6a4db94011d3 602 }
sahilmgandhi 18:6a4db94011d3 603 #else
sahilmgandhi 18:6a4db94011d3 604 errno = ENOSYS;
sahilmgandhi 18:6a4db94011d3 605 return -1;
sahilmgandhi 18:6a4db94011d3 606 #endif
sahilmgandhi 18:6a4db94011d3 607 }
sahilmgandhi 18:6a4db94011d3 608
sahilmgandhi 18:6a4db94011d3 609 extern "C" void rewinddir(DIR *dir) {
sahilmgandhi 18:6a4db94011d3 610 #if MBED_CONF_FILESYSTEM_PRESENT
sahilmgandhi 18:6a4db94011d3 611 dir->rewind();
sahilmgandhi 18:6a4db94011d3 612 #else
sahilmgandhi 18:6a4db94011d3 613 errno = ENOSYS;
sahilmgandhi 18:6a4db94011d3 614 #endif
sahilmgandhi 18:6a4db94011d3 615 }
sahilmgandhi 18:6a4db94011d3 616
sahilmgandhi 18:6a4db94011d3 617 extern "C" off_t telldir(DIR *dir) {
sahilmgandhi 18:6a4db94011d3 618 #if MBED_CONF_FILESYSTEM_PRESENT
sahilmgandhi 18:6a4db94011d3 619 return dir->tell();
sahilmgandhi 18:6a4db94011d3 620 #else
sahilmgandhi 18:6a4db94011d3 621 errno = ENOSYS;
sahilmgandhi 18:6a4db94011d3 622 return 0;
sahilmgandhi 18:6a4db94011d3 623 #endif
sahilmgandhi 18:6a4db94011d3 624 }
sahilmgandhi 18:6a4db94011d3 625
sahilmgandhi 18:6a4db94011d3 626 extern "C" void seekdir(DIR *dir, off_t off) {
sahilmgandhi 18:6a4db94011d3 627 #if MBED_CONF_FILESYSTEM_PRESENT
sahilmgandhi 18:6a4db94011d3 628 dir->seek(off);
sahilmgandhi 18:6a4db94011d3 629 #else
sahilmgandhi 18:6a4db94011d3 630 errno = ENOSYS;
sahilmgandhi 18:6a4db94011d3 631 #endif
sahilmgandhi 18:6a4db94011d3 632 }
sahilmgandhi 18:6a4db94011d3 633
sahilmgandhi 18:6a4db94011d3 634 extern "C" int mkdir(const char *path, mode_t mode) {
sahilmgandhi 18:6a4db94011d3 635 #if MBED_CONF_FILESYSTEM_PRESENT
sahilmgandhi 18:6a4db94011d3 636 FilePath fp(path);
sahilmgandhi 18:6a4db94011d3 637 FileSystem *fs = fp.fileSystem();
sahilmgandhi 18:6a4db94011d3 638 if (fs == NULL) return -1;
sahilmgandhi 18:6a4db94011d3 639
sahilmgandhi 18:6a4db94011d3 640 int err = fs->mkdir(fp.fileName(), mode);
sahilmgandhi 18:6a4db94011d3 641 if (err < 0) {
sahilmgandhi 18:6a4db94011d3 642 errno = -err;
sahilmgandhi 18:6a4db94011d3 643 return -1;
sahilmgandhi 18:6a4db94011d3 644 } else {
sahilmgandhi 18:6a4db94011d3 645 return 0;
sahilmgandhi 18:6a4db94011d3 646 }
sahilmgandhi 18:6a4db94011d3 647 #else
sahilmgandhi 18:6a4db94011d3 648 errno = ENOSYS;
sahilmgandhi 18:6a4db94011d3 649 return -1;
sahilmgandhi 18:6a4db94011d3 650 #endif
sahilmgandhi 18:6a4db94011d3 651 }
sahilmgandhi 18:6a4db94011d3 652
sahilmgandhi 18:6a4db94011d3 653 extern "C" int stat(const char *path, struct stat *st) {
sahilmgandhi 18:6a4db94011d3 654 #if MBED_CONF_FILESYSTEM_PRESENT
sahilmgandhi 18:6a4db94011d3 655 FilePath fp(path);
sahilmgandhi 18:6a4db94011d3 656 FileSystem *fs = fp.fileSystem();
sahilmgandhi 18:6a4db94011d3 657 if (fs == NULL) return -1;
sahilmgandhi 18:6a4db94011d3 658
sahilmgandhi 18:6a4db94011d3 659 int err = fs->stat(fp.fileName(), st);
sahilmgandhi 18:6a4db94011d3 660 if (err < 0) {
sahilmgandhi 18:6a4db94011d3 661 errno = -err;
sahilmgandhi 18:6a4db94011d3 662 return -1;
sahilmgandhi 18:6a4db94011d3 663 } else {
sahilmgandhi 18:6a4db94011d3 664 return 0;
sahilmgandhi 18:6a4db94011d3 665 }
sahilmgandhi 18:6a4db94011d3 666 #else
sahilmgandhi 18:6a4db94011d3 667 errno = ENOSYS;
sahilmgandhi 18:6a4db94011d3 668 return -1;
sahilmgandhi 18:6a4db94011d3 669 #endif
sahilmgandhi 18:6a4db94011d3 670 }
sahilmgandhi 18:6a4db94011d3 671
sahilmgandhi 18:6a4db94011d3 672 #if defined(TOOLCHAIN_GCC)
sahilmgandhi 18:6a4db94011d3 673 /* prevents the exception handling name demangling code getting pulled in */
sahilmgandhi 18:6a4db94011d3 674 #include "mbed_error.h"
sahilmgandhi 18:6a4db94011d3 675 namespace __gnu_cxx {
sahilmgandhi 18:6a4db94011d3 676 void __verbose_terminate_handler() {
sahilmgandhi 18:6a4db94011d3 677 error("Exception");
sahilmgandhi 18:6a4db94011d3 678 }
sahilmgandhi 18:6a4db94011d3 679 }
sahilmgandhi 18:6a4db94011d3 680 extern "C" WEAK void __cxa_pure_virtual(void);
sahilmgandhi 18:6a4db94011d3 681 extern "C" WEAK void __cxa_pure_virtual(void) {
sahilmgandhi 18:6a4db94011d3 682 exit(1);
sahilmgandhi 18:6a4db94011d3 683 }
sahilmgandhi 18:6a4db94011d3 684
sahilmgandhi 18:6a4db94011d3 685 #endif
sahilmgandhi 18:6a4db94011d3 686
sahilmgandhi 18:6a4db94011d3 687 #if defined(TOOLCHAIN_GCC)
sahilmgandhi 18:6a4db94011d3 688
sahilmgandhi 18:6a4db94011d3 689 #ifdef FEATURE_UVISOR
sahilmgandhi 18:6a4db94011d3 690 #include "uvisor-lib/uvisor-lib.h"
sahilmgandhi 18:6a4db94011d3 691 #endif/* FEATURE_UVISOR */
sahilmgandhi 18:6a4db94011d3 692
sahilmgandhi 18:6a4db94011d3 693
sahilmgandhi 18:6a4db94011d3 694 extern "C" WEAK void software_init_hook_rtos(void)
sahilmgandhi 18:6a4db94011d3 695 {
sahilmgandhi 18:6a4db94011d3 696 // Do nothing by default.
sahilmgandhi 18:6a4db94011d3 697 }
sahilmgandhi 18:6a4db94011d3 698
sahilmgandhi 18:6a4db94011d3 699 extern "C" void software_init_hook(void)
sahilmgandhi 18:6a4db94011d3 700 {
sahilmgandhi 18:6a4db94011d3 701 #ifdef FEATURE_UVISOR
sahilmgandhi 18:6a4db94011d3 702 int return_code;
sahilmgandhi 18:6a4db94011d3 703
sahilmgandhi 18:6a4db94011d3 704 return_code = uvisor_lib_init();
sahilmgandhi 18:6a4db94011d3 705 if (return_code) {
sahilmgandhi 18:6a4db94011d3 706 mbed_die();
sahilmgandhi 18:6a4db94011d3 707 }
sahilmgandhi 18:6a4db94011d3 708 #endif/* FEATURE_UVISOR */
sahilmgandhi 18:6a4db94011d3 709 mbed_sdk_init();
sahilmgandhi 18:6a4db94011d3 710 software_init_hook_rtos();
sahilmgandhi 18:6a4db94011d3 711 }
sahilmgandhi 18:6a4db94011d3 712 #endif
sahilmgandhi 18:6a4db94011d3 713
sahilmgandhi 18:6a4db94011d3 714 // ****************************************************************************
sahilmgandhi 18:6a4db94011d3 715 // mbed_main is a function that is called before main()
sahilmgandhi 18:6a4db94011d3 716 // mbed_sdk_init() is also a function that is called before main(), but unlike
sahilmgandhi 18:6a4db94011d3 717 // mbed_main(), it is not meant for user code, but for the SDK itself to perform
sahilmgandhi 18:6a4db94011d3 718 // initializations before main() is called.
sahilmgandhi 18:6a4db94011d3 719
sahilmgandhi 18:6a4db94011d3 720 extern "C" WEAK void mbed_main(void);
sahilmgandhi 18:6a4db94011d3 721 extern "C" WEAK void mbed_main(void) {
sahilmgandhi 18:6a4db94011d3 722 }
sahilmgandhi 18:6a4db94011d3 723
sahilmgandhi 18:6a4db94011d3 724 #if defined(TOOLCHAIN_ARM)
sahilmgandhi 18:6a4db94011d3 725 extern "C" int $Super$$main(void);
sahilmgandhi 18:6a4db94011d3 726
sahilmgandhi 18:6a4db94011d3 727 extern "C" int $Sub$$main(void) {
sahilmgandhi 18:6a4db94011d3 728 mbed_main();
sahilmgandhi 18:6a4db94011d3 729 return $Super$$main();
sahilmgandhi 18:6a4db94011d3 730 }
sahilmgandhi 18:6a4db94011d3 731
sahilmgandhi 18:6a4db94011d3 732 extern "C" void _platform_post_stackheap_init (void) {
sahilmgandhi 18:6a4db94011d3 733 mbed_sdk_init();
sahilmgandhi 18:6a4db94011d3 734 }
sahilmgandhi 18:6a4db94011d3 735
sahilmgandhi 18:6a4db94011d3 736 #elif defined(TOOLCHAIN_GCC)
sahilmgandhi 18:6a4db94011d3 737 extern "C" int __real_main(void);
sahilmgandhi 18:6a4db94011d3 738
sahilmgandhi 18:6a4db94011d3 739 extern "C" int __wrap_main(void) {
sahilmgandhi 18:6a4db94011d3 740 mbed_main();
sahilmgandhi 18:6a4db94011d3 741 return __real_main();
sahilmgandhi 18:6a4db94011d3 742 }
sahilmgandhi 18:6a4db94011d3 743 #elif defined(TOOLCHAIN_IAR)
sahilmgandhi 18:6a4db94011d3 744 // IAR doesn't have the $Super/$Sub mechanism of armcc, nor something equivalent
sahilmgandhi 18:6a4db94011d3 745 // to ld's --wrap. It does have a --redirect, but that doesn't help, since redirecting
sahilmgandhi 18:6a4db94011d3 746 // 'main' to another symbol looses the original 'main' symbol. However, its startup
sahilmgandhi 18:6a4db94011d3 747 // code will call a function to setup argc and argv (__iar_argc_argv) if it is defined.
sahilmgandhi 18:6a4db94011d3 748 // Since mbed doesn't use argc/argv, we use this function to call our mbed_main.
sahilmgandhi 18:6a4db94011d3 749 extern "C" void __iar_argc_argv() {
sahilmgandhi 18:6a4db94011d3 750 mbed_main();
sahilmgandhi 18:6a4db94011d3 751 }
sahilmgandhi 18:6a4db94011d3 752 #endif
sahilmgandhi 18:6a4db94011d3 753
sahilmgandhi 18:6a4db94011d3 754 // Provide implementation of _sbrk (low-level dynamic memory allocation
sahilmgandhi 18:6a4db94011d3 755 // routine) for GCC_ARM which compares new heap pointer with MSP instead of
sahilmgandhi 18:6a4db94011d3 756 // SP. This make it compatible with RTX RTOS thread stacks.
sahilmgandhi 18:6a4db94011d3 757 #if defined(TOOLCHAIN_GCC_ARM) || defined(TOOLCHAIN_GCC_CR)
sahilmgandhi 18:6a4db94011d3 758 // Linker defined symbol used by _sbrk to indicate where heap should start.
sahilmgandhi 18:6a4db94011d3 759 extern "C" int __end__;
sahilmgandhi 18:6a4db94011d3 760
sahilmgandhi 18:6a4db94011d3 761 #if defined(TARGET_CORTEX_A)
sahilmgandhi 18:6a4db94011d3 762 extern "C" uint32_t __HeapLimit;
sahilmgandhi 18:6a4db94011d3 763 #endif
sahilmgandhi 18:6a4db94011d3 764
sahilmgandhi 18:6a4db94011d3 765 // Turn off the errno macro and use actual global variable instead.
sahilmgandhi 18:6a4db94011d3 766 #undef errno
sahilmgandhi 18:6a4db94011d3 767 extern "C" int errno;
sahilmgandhi 18:6a4db94011d3 768
sahilmgandhi 18:6a4db94011d3 769 // For ARM7 only
sahilmgandhi 18:6a4db94011d3 770 register unsigned char * stack_ptr __asm ("sp");
sahilmgandhi 18:6a4db94011d3 771
sahilmgandhi 18:6a4db94011d3 772 // Dynamic memory allocation related syscall.
sahilmgandhi 18:6a4db94011d3 773 #if defined(TARGET_NUMAKER_PFM_NUC472) || defined(TARGET_NUMAKER_PFM_M453)
sahilmgandhi 18:6a4db94011d3 774 // Overwrite _sbrk() to support two region model (heap and stack are two distinct regions).
sahilmgandhi 18:6a4db94011d3 775 // __wrap__sbrk() is implemented in:
sahilmgandhi 18:6a4db94011d3 776 // TARGET_NUMAKER_PFM_NUC472 hal/targets/cmsis/TARGET_NUVOTON/TARGET_NUC472/TARGET_NUMAKER_PFM_NUC472/TOOLCHAIN_GCC_ARM/retarget.c
sahilmgandhi 18:6a4db94011d3 777 // TARGET_NUMAKER_PFM_M453 hal/targets/cmsis/TARGET_NUVOTON/TARGET_M451/TARGET_NUMAKER_PFM_M453/TOOLCHAIN_GCC_ARM/retarget.c
sahilmgandhi 18:6a4db94011d3 778 extern "C" void *__wrap__sbrk(int incr);
sahilmgandhi 18:6a4db94011d3 779 extern "C" caddr_t _sbrk(int incr) {
sahilmgandhi 18:6a4db94011d3 780 return (caddr_t) __wrap__sbrk(incr);
sahilmgandhi 18:6a4db94011d3 781 }
sahilmgandhi 18:6a4db94011d3 782 #else
sahilmgandhi 18:6a4db94011d3 783 extern "C" caddr_t _sbrk(int incr) {
sahilmgandhi 18:6a4db94011d3 784 static unsigned char* heap = (unsigned char*)&__end__;
sahilmgandhi 18:6a4db94011d3 785 unsigned char* prev_heap = heap;
sahilmgandhi 18:6a4db94011d3 786 unsigned char* new_heap = heap + incr;
sahilmgandhi 18:6a4db94011d3 787
sahilmgandhi 18:6a4db94011d3 788 #if defined(TARGET_ARM7)
sahilmgandhi 18:6a4db94011d3 789 if (new_heap >= stack_ptr) {
sahilmgandhi 18:6a4db94011d3 790 #elif defined(TARGET_CORTEX_A)
sahilmgandhi 18:6a4db94011d3 791 if (new_heap >= (unsigned char*)&__HeapLimit) { /* __HeapLimit is end of heap section */
sahilmgandhi 18:6a4db94011d3 792 #else
sahilmgandhi 18:6a4db94011d3 793 if (new_heap >= (unsigned char*)__get_MSP()) {
sahilmgandhi 18:6a4db94011d3 794 #endif
sahilmgandhi 18:6a4db94011d3 795 errno = ENOMEM;
sahilmgandhi 18:6a4db94011d3 796 return (caddr_t)-1;
sahilmgandhi 18:6a4db94011d3 797 }
sahilmgandhi 18:6a4db94011d3 798
sahilmgandhi 18:6a4db94011d3 799 // Additional heap checking if set
sahilmgandhi 18:6a4db94011d3 800 if (mbed_heap_size && (new_heap >= mbed_heap_start + mbed_heap_size)) {
sahilmgandhi 18:6a4db94011d3 801 errno = ENOMEM;
sahilmgandhi 18:6a4db94011d3 802 return (caddr_t)-1;
sahilmgandhi 18:6a4db94011d3 803 }
sahilmgandhi 18:6a4db94011d3 804
sahilmgandhi 18:6a4db94011d3 805 heap = new_heap;
sahilmgandhi 18:6a4db94011d3 806 return (caddr_t) prev_heap;
sahilmgandhi 18:6a4db94011d3 807 }
sahilmgandhi 18:6a4db94011d3 808 #endif
sahilmgandhi 18:6a4db94011d3 809 #endif
sahilmgandhi 18:6a4db94011d3 810
sahilmgandhi 18:6a4db94011d3 811 #if defined(TOOLCHAIN_GCC_ARM) || defined(TOOLCHAIN_GCC_CR)
sahilmgandhi 18:6a4db94011d3 812 extern "C" void _exit(int return_code) {
sahilmgandhi 18:6a4db94011d3 813 #else
sahilmgandhi 18:6a4db94011d3 814 namespace std {
sahilmgandhi 18:6a4db94011d3 815 extern "C" void exit(int return_code) {
sahilmgandhi 18:6a4db94011d3 816 #endif
sahilmgandhi 18:6a4db94011d3 817
sahilmgandhi 18:6a4db94011d3 818 #if DEVICE_STDIO_MESSAGES
sahilmgandhi 18:6a4db94011d3 819 #if MBED_CONF_PLATFORM_STDIO_FLUSH_AT_EXIT
sahilmgandhi 18:6a4db94011d3 820 fflush(stdout);
sahilmgandhi 18:6a4db94011d3 821 fflush(stderr);
sahilmgandhi 18:6a4db94011d3 822 #endif
sahilmgandhi 18:6a4db94011d3 823 #endif
sahilmgandhi 18:6a4db94011d3 824
sahilmgandhi 18:6a4db94011d3 825 #if DEVICE_SEMIHOST
sahilmgandhi 18:6a4db94011d3 826 if (mbed_interface_connected()) {
sahilmgandhi 18:6a4db94011d3 827 semihost_exit();
sahilmgandhi 18:6a4db94011d3 828 }
sahilmgandhi 18:6a4db94011d3 829 #endif
sahilmgandhi 18:6a4db94011d3 830 if (return_code) {
sahilmgandhi 18:6a4db94011d3 831 mbed_die();
sahilmgandhi 18:6a4db94011d3 832 }
sahilmgandhi 18:6a4db94011d3 833
sahilmgandhi 18:6a4db94011d3 834 while (1);
sahilmgandhi 18:6a4db94011d3 835 }
sahilmgandhi 18:6a4db94011d3 836
sahilmgandhi 18:6a4db94011d3 837 #if !defined(TOOLCHAIN_GCC_ARM) && !defined(TOOLCHAIN_GCC_CR)
sahilmgandhi 18:6a4db94011d3 838 } //namespace std
sahilmgandhi 18:6a4db94011d3 839 #endif
sahilmgandhi 18:6a4db94011d3 840
sahilmgandhi 18:6a4db94011d3 841 #if defined(TOOLCHAIN_ARM) || defined(TOOLCHAIN_GCC)
sahilmgandhi 18:6a4db94011d3 842
sahilmgandhi 18:6a4db94011d3 843 // This series of function disable the registration of global destructors
sahilmgandhi 18:6a4db94011d3 844 // in a dynamic table which will be called when the application exit.
sahilmgandhi 18:6a4db94011d3 845 // In mbed, program never exit properly, it dies.
sahilmgandhi 18:6a4db94011d3 846 // More informations about this topic for ARMCC here:
sahilmgandhi 18:6a4db94011d3 847 // http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/6449.html
sahilmgandhi 18:6a4db94011d3 848 extern "C" {
sahilmgandhi 18:6a4db94011d3 849 int __aeabi_atexit(void *object, void (*dtor)(void* /*this*/), void *handle) {
sahilmgandhi 18:6a4db94011d3 850 return 1;
sahilmgandhi 18:6a4db94011d3 851 }
sahilmgandhi 18:6a4db94011d3 852
sahilmgandhi 18:6a4db94011d3 853 int __cxa_atexit(void (*dtor)(void* /*this*/), void *object, void *handle) {
sahilmgandhi 18:6a4db94011d3 854 return 1;
sahilmgandhi 18:6a4db94011d3 855 }
sahilmgandhi 18:6a4db94011d3 856
sahilmgandhi 18:6a4db94011d3 857 void __cxa_finalize(void *handle) {
sahilmgandhi 18:6a4db94011d3 858 }
sahilmgandhi 18:6a4db94011d3 859
sahilmgandhi 18:6a4db94011d3 860 } // end of extern "C"
sahilmgandhi 18:6a4db94011d3 861
sahilmgandhi 18:6a4db94011d3 862 #endif
sahilmgandhi 18:6a4db94011d3 863
sahilmgandhi 18:6a4db94011d3 864
sahilmgandhi 18:6a4db94011d3 865 #if defined(TOOLCHAIN_GCC)
sahilmgandhi 18:6a4db94011d3 866
sahilmgandhi 18:6a4db94011d3 867 /*
sahilmgandhi 18:6a4db94011d3 868 * Depending on how newlib is configured, it is often not enough to define
sahilmgandhi 18:6a4db94011d3 869 * __aeabi_atexit, __cxa_atexit and __cxa_finalize in order to override the
sahilmgandhi 18:6a4db94011d3 870 * behavior regarding the registration of handlers with atexit.
sahilmgandhi 18:6a4db94011d3 871 *
sahilmgandhi 18:6a4db94011d3 872 * To overcome this limitation, exit and atexit are overriden here.
sahilmgandhi 18:6a4db94011d3 873 */
sahilmgandhi 18:6a4db94011d3 874 extern "C"{
sahilmgandhi 18:6a4db94011d3 875
sahilmgandhi 18:6a4db94011d3 876 /**
sahilmgandhi 18:6a4db94011d3 877 * @brief Retarget of exit for GCC.
sahilmgandhi 18:6a4db94011d3 878 * @details Unlike the standard version, this function doesn't call any function
sahilmgandhi 18:6a4db94011d3 879 * registered with atexit before calling _exit.
sahilmgandhi 18:6a4db94011d3 880 */
sahilmgandhi 18:6a4db94011d3 881 void __wrap_exit(int return_code) {
sahilmgandhi 18:6a4db94011d3 882 _exit(return_code);
sahilmgandhi 18:6a4db94011d3 883 }
sahilmgandhi 18:6a4db94011d3 884
sahilmgandhi 18:6a4db94011d3 885 /**
sahilmgandhi 18:6a4db94011d3 886 * @brief Retarget atexit from GCC.
sahilmgandhi 18:6a4db94011d3 887 * @details This function will always fail and never register any handler to be
sahilmgandhi 18:6a4db94011d3 888 * called at exit.
sahilmgandhi 18:6a4db94011d3 889 */
sahilmgandhi 18:6a4db94011d3 890 int __wrap_atexit(void (*func)()) {
sahilmgandhi 18:6a4db94011d3 891 return 1;
sahilmgandhi 18:6a4db94011d3 892 }
sahilmgandhi 18:6a4db94011d3 893
sahilmgandhi 18:6a4db94011d3 894 }
sahilmgandhi 18:6a4db94011d3 895
sahilmgandhi 18:6a4db94011d3 896 #endif
sahilmgandhi 18:6a4db94011d3 897
sahilmgandhi 18:6a4db94011d3 898
sahilmgandhi 18:6a4db94011d3 899
sahilmgandhi 18:6a4db94011d3 900 namespace mbed {
sahilmgandhi 18:6a4db94011d3 901
sahilmgandhi 18:6a4db94011d3 902 void mbed_set_unbuffered_stream(FILE *_file) {
sahilmgandhi 18:6a4db94011d3 903 #if defined (__ICCARM__)
sahilmgandhi 18:6a4db94011d3 904 char buf[2];
sahilmgandhi 18:6a4db94011d3 905 std::setvbuf(_file,buf,_IONBF,NULL);
sahilmgandhi 18:6a4db94011d3 906 #else
sahilmgandhi 18:6a4db94011d3 907 setbuf(_file, NULL);
sahilmgandhi 18:6a4db94011d3 908 #endif
sahilmgandhi 18:6a4db94011d3 909 }
sahilmgandhi 18:6a4db94011d3 910
sahilmgandhi 18:6a4db94011d3 911 int mbed_getc(FILE *_file){
sahilmgandhi 18:6a4db94011d3 912 #if defined (__ICCARM__)
sahilmgandhi 18:6a4db94011d3 913 /*This is only valid for unbuffered streams*/
sahilmgandhi 18:6a4db94011d3 914 int res = std::fgetc(_file);
sahilmgandhi 18:6a4db94011d3 915 if (res>=0){
sahilmgandhi 18:6a4db94011d3 916 _file->_Mode = (unsigned short)(_file->_Mode & ~ 0x1000);/* Unset read mode */
sahilmgandhi 18:6a4db94011d3 917 _file->_Rend = _file->_Wend;
sahilmgandhi 18:6a4db94011d3 918 _file->_Next = _file->_Wend;
sahilmgandhi 18:6a4db94011d3 919 }
sahilmgandhi 18:6a4db94011d3 920 return res;
sahilmgandhi 18:6a4db94011d3 921 #else
sahilmgandhi 18:6a4db94011d3 922 return std::fgetc(_file);
sahilmgandhi 18:6a4db94011d3 923 #endif
sahilmgandhi 18:6a4db94011d3 924 }
sahilmgandhi 18:6a4db94011d3 925
sahilmgandhi 18:6a4db94011d3 926 char* mbed_gets(char*s, int size, FILE *_file){
sahilmgandhi 18:6a4db94011d3 927 #if defined (__ICCARM__)
sahilmgandhi 18:6a4db94011d3 928 /*This is only valid for unbuffered streams*/
sahilmgandhi 18:6a4db94011d3 929 char *str = fgets(s,size,_file);
sahilmgandhi 18:6a4db94011d3 930 if (str!=NULL){
sahilmgandhi 18:6a4db94011d3 931 _file->_Mode = (unsigned short)(_file->_Mode & ~ 0x1000);/* Unset read mode */
sahilmgandhi 18:6a4db94011d3 932 _file->_Rend = _file->_Wend;
sahilmgandhi 18:6a4db94011d3 933 _file->_Next = _file->_Wend;
sahilmgandhi 18:6a4db94011d3 934 }
sahilmgandhi 18:6a4db94011d3 935 return str;
sahilmgandhi 18:6a4db94011d3 936 #else
sahilmgandhi 18:6a4db94011d3 937 return std::fgets(s,size,_file);
sahilmgandhi 18:6a4db94011d3 938 #endif
sahilmgandhi 18:6a4db94011d3 939 }
sahilmgandhi 18:6a4db94011d3 940
sahilmgandhi 18:6a4db94011d3 941 } // namespace mbed
sahilmgandhi 18:6a4db94011d3 942
sahilmgandhi 18:6a4db94011d3 943 #if defined (__ICCARM__)
sahilmgandhi 18:6a4db94011d3 944 // Stub out locks when an rtos is not present
sahilmgandhi 18:6a4db94011d3 945 extern "C" WEAK void __iar_system_Mtxinit(__iar_Rmtx *mutex) {}
sahilmgandhi 18:6a4db94011d3 946 extern "C" WEAK void __iar_system_Mtxdst(__iar_Rmtx *mutex) {}
sahilmgandhi 18:6a4db94011d3 947 extern "C" WEAK void __iar_system_Mtxlock(__iar_Rmtx *mutex) {}
sahilmgandhi 18:6a4db94011d3 948 extern "C" WEAK void __iar_system_Mtxunlock(__iar_Rmtx *mutex) {}
sahilmgandhi 18:6a4db94011d3 949 extern "C" WEAK void __iar_file_Mtxinit(__iar_Rmtx *mutex) {}
sahilmgandhi 18:6a4db94011d3 950 extern "C" WEAK void __iar_file_Mtxdst(__iar_Rmtx *mutex) {}
sahilmgandhi 18:6a4db94011d3 951 extern "C" WEAK void __iar_file_Mtxlock(__iar_Rmtx *mutex) {}
sahilmgandhi 18:6a4db94011d3 952 extern "C" WEAK void __iar_file_Mtxunlock(__iar_Rmtx *mutex) {}
sahilmgandhi 18:6a4db94011d3 953 #elif defined(__CC_ARM)
sahilmgandhi 18:6a4db94011d3 954 // Do nothing
sahilmgandhi 18:6a4db94011d3 955 #elif defined (__GNUC__)
sahilmgandhi 18:6a4db94011d3 956 struct _reent;
sahilmgandhi 18:6a4db94011d3 957 // Stub out locks when an rtos is not present
sahilmgandhi 18:6a4db94011d3 958 extern "C" WEAK void __rtos_malloc_lock( struct _reent *_r ) {}
sahilmgandhi 18:6a4db94011d3 959 extern "C" WEAK void __rtos_malloc_unlock( struct _reent *_r ) {}
sahilmgandhi 18:6a4db94011d3 960 extern "C" WEAK void __rtos_env_lock( struct _reent *_r ) {}
sahilmgandhi 18:6a4db94011d3 961 extern "C" WEAK void __rtos_env_unlock( struct _reent *_r ) {}
sahilmgandhi 18:6a4db94011d3 962
sahilmgandhi 18:6a4db94011d3 963 extern "C" void __malloc_lock( struct _reent *_r )
sahilmgandhi 18:6a4db94011d3 964 {
sahilmgandhi 18:6a4db94011d3 965 __rtos_malloc_lock(_r);
sahilmgandhi 18:6a4db94011d3 966 }
sahilmgandhi 18:6a4db94011d3 967
sahilmgandhi 18:6a4db94011d3 968 extern "C" void __malloc_unlock( struct _reent *_r )
sahilmgandhi 18:6a4db94011d3 969 {
sahilmgandhi 18:6a4db94011d3 970 __rtos_malloc_unlock(_r);
sahilmgandhi 18:6a4db94011d3 971 }
sahilmgandhi 18:6a4db94011d3 972
sahilmgandhi 18:6a4db94011d3 973 extern "C" void __env_lock( struct _reent *_r )
sahilmgandhi 18:6a4db94011d3 974 {
sahilmgandhi 18:6a4db94011d3 975 __rtos_env_lock(_r);
sahilmgandhi 18:6a4db94011d3 976 }
sahilmgandhi 18:6a4db94011d3 977
sahilmgandhi 18:6a4db94011d3 978 extern "C" void __env_unlock( struct _reent *_r )
sahilmgandhi 18:6a4db94011d3 979 {
sahilmgandhi 18:6a4db94011d3 980 __rtos_env_unlock(_r);
sahilmgandhi 18:6a4db94011d3 981 }
sahilmgandhi 18:6a4db94011d3 982
sahilmgandhi 18:6a4db94011d3 983 #define CXA_GUARD_INIT_DONE (1 << 0)
sahilmgandhi 18:6a4db94011d3 984 #define CXA_GUARD_INIT_IN_PROGRESS (1 << 1)
sahilmgandhi 18:6a4db94011d3 985 #define CXA_GUARD_MASK (CXA_GUARD_INIT_DONE | CXA_GUARD_INIT_IN_PROGRESS)
sahilmgandhi 18:6a4db94011d3 986
sahilmgandhi 18:6a4db94011d3 987 extern "C" int __cxa_guard_acquire(int *guard_object_p)
sahilmgandhi 18:6a4db94011d3 988 {
sahilmgandhi 18:6a4db94011d3 989 uint8_t *guard_object = (uint8_t *)guard_object_p;
sahilmgandhi 18:6a4db94011d3 990 if (CXA_GUARD_INIT_DONE == (*guard_object & CXA_GUARD_MASK)) {
sahilmgandhi 18:6a4db94011d3 991 return 0;
sahilmgandhi 18:6a4db94011d3 992 }
sahilmgandhi 18:6a4db94011d3 993 singleton_lock();
sahilmgandhi 18:6a4db94011d3 994 if (CXA_GUARD_INIT_DONE == (*guard_object & CXA_GUARD_MASK)) {
sahilmgandhi 18:6a4db94011d3 995 singleton_unlock();
sahilmgandhi 18:6a4db94011d3 996 return 0;
sahilmgandhi 18:6a4db94011d3 997 }
sahilmgandhi 18:6a4db94011d3 998 MBED_ASSERT(0 == (*guard_object & CXA_GUARD_MASK));
sahilmgandhi 18:6a4db94011d3 999 *guard_object = *guard_object | CXA_GUARD_INIT_IN_PROGRESS;
sahilmgandhi 18:6a4db94011d3 1000 return 1;
sahilmgandhi 18:6a4db94011d3 1001 }
sahilmgandhi 18:6a4db94011d3 1002
sahilmgandhi 18:6a4db94011d3 1003 extern "C" void __cxa_guard_release(int *guard_object_p)
sahilmgandhi 18:6a4db94011d3 1004 {
sahilmgandhi 18:6a4db94011d3 1005 uint8_t *guard_object = (uint8_t *)guard_object_p;
sahilmgandhi 18:6a4db94011d3 1006 MBED_ASSERT(CXA_GUARD_INIT_IN_PROGRESS == (*guard_object & CXA_GUARD_MASK));
sahilmgandhi 18:6a4db94011d3 1007 *guard_object = (*guard_object & ~CXA_GUARD_MASK) | CXA_GUARD_INIT_DONE;
sahilmgandhi 18:6a4db94011d3 1008 singleton_unlock();
sahilmgandhi 18:6a4db94011d3 1009 }
sahilmgandhi 18:6a4db94011d3 1010
sahilmgandhi 18:6a4db94011d3 1011 extern "C" void __cxa_guard_abort(int *guard_object_p)
sahilmgandhi 18:6a4db94011d3 1012 {
sahilmgandhi 18:6a4db94011d3 1013 uint8_t *guard_object = (uint8_t *)guard_object_p;
sahilmgandhi 18:6a4db94011d3 1014 MBED_ASSERT(CXA_GUARD_INIT_IN_PROGRESS == (*guard_object & CXA_GUARD_MASK));
sahilmgandhi 18:6a4db94011d3 1015 *guard_object = *guard_object & ~CXA_GUARD_INIT_IN_PROGRESS;
sahilmgandhi 18:6a4db94011d3 1016 singleton_unlock();
sahilmgandhi 18:6a4db94011d3 1017 }
sahilmgandhi 18:6a4db94011d3 1018
sahilmgandhi 18:6a4db94011d3 1019 #endif
sahilmgandhi 18:6a4db94011d3 1020
sahilmgandhi 18:6a4db94011d3 1021 void *operator new(std::size_t count)
sahilmgandhi 18:6a4db94011d3 1022 {
sahilmgandhi 18:6a4db94011d3 1023 void *buffer = malloc(count);
sahilmgandhi 18:6a4db94011d3 1024 if (NULL == buffer) {
sahilmgandhi 18:6a4db94011d3 1025 error("Operator new out of memory\r\n");
sahilmgandhi 18:6a4db94011d3 1026 }
sahilmgandhi 18:6a4db94011d3 1027 return buffer;
sahilmgandhi 18:6a4db94011d3 1028 }
sahilmgandhi 18:6a4db94011d3 1029
sahilmgandhi 18:6a4db94011d3 1030 void *operator new[](std::size_t count)
sahilmgandhi 18:6a4db94011d3 1031 {
sahilmgandhi 18:6a4db94011d3 1032 void *buffer = malloc(count);
sahilmgandhi 18:6a4db94011d3 1033 if (NULL == buffer) {
sahilmgandhi 18:6a4db94011d3 1034 error("Operator new[] out of memory\r\n");
sahilmgandhi 18:6a4db94011d3 1035 }
sahilmgandhi 18:6a4db94011d3 1036 return buffer;
sahilmgandhi 18:6a4db94011d3 1037 }
sahilmgandhi 18:6a4db94011d3 1038
sahilmgandhi 18:6a4db94011d3 1039 void operator delete(void *ptr)
sahilmgandhi 18:6a4db94011d3 1040 {
sahilmgandhi 18:6a4db94011d3 1041 if (ptr != NULL) {
sahilmgandhi 18:6a4db94011d3 1042 free(ptr);
sahilmgandhi 18:6a4db94011d3 1043 }
sahilmgandhi 18:6a4db94011d3 1044 }
sahilmgandhi 18:6a4db94011d3 1045 void operator delete[](void *ptr)
sahilmgandhi 18:6a4db94011d3 1046 {
sahilmgandhi 18:6a4db94011d3 1047 if (ptr != NULL) {
sahilmgandhi 18:6a4db94011d3 1048 free(ptr);
sahilmgandhi 18:6a4db94011d3 1049 }
sahilmgandhi 18:6a4db94011d3 1050 }