Rahul Dahiya / Mbed OS STM32F7 Ethernet
Committer:
rahul_dahiya
Date:
Wed Jan 15 15:57:15 2020 +0530
Revision:
0:fb8047b156bb
STM32F7 LWIP

Who changed what in which revision?

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