mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
187:0387e8f68319
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 167:e84263d55307 1 /* mbed Microcontroller Library
AnnaBridge 167:e84263d55307 2 * Copyright (c) 2006-2013 ARM Limited
AnnaBridge 189:f392fc9709a3 3 * SPDX-License-Identifier: Apache-2.0
AnnaBridge 167:e84263d55307 4 *
AnnaBridge 167:e84263d55307 5 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 167:e84263d55307 6 * you may not use this file except in compliance with the License.
AnnaBridge 167:e84263d55307 7 * You may obtain a copy of the License at
AnnaBridge 167:e84263d55307 8 *
AnnaBridge 167:e84263d55307 9 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 167:e84263d55307 10 *
AnnaBridge 167:e84263d55307 11 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 167:e84263d55307 12 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 167:e84263d55307 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 167:e84263d55307 14 * See the License for the specific language governing permissions and
AnnaBridge 167:e84263d55307 15 * limitations under the License.
AnnaBridge 167:e84263d55307 16 */
AnnaBridge 167:e84263d55307 17 #include "platform/Stream.h"
AnnaBridge 167:e84263d55307 18 #include "platform/mbed_error.h"
AnnaBridge 167:e84263d55307 19 #include <errno.h>
AnnaBridge 167:e84263d55307 20
AnnaBridge 167:e84263d55307 21 namespace mbed {
AnnaBridge 167:e84263d55307 22
AnnaBridge 187:0387e8f68319 23 Stream::Stream(const char *name) : FileLike(name), _file(NULL)
AnnaBridge 187:0387e8f68319 24 {
AnnaBridge 167:e84263d55307 25 // No lock needed in constructor
AnnaBridge 167:e84263d55307 26 /* open ourselves */
AnnaBridge 167:e84263d55307 27 _file = fdopen(this, "w+");
AnnaBridge 167:e84263d55307 28 // fdopen() will make us buffered because Stream::isatty()
AnnaBridge 167:e84263d55307 29 // wrongly returns zero which is not being changed for
AnnaBridge 187:0387e8f68319 30 // backward compatibility
AnnaBridge 167:e84263d55307 31 if (_file) {
AnnaBridge 167:e84263d55307 32 mbed_set_unbuffered_stream(_file);
AnnaBridge 167:e84263d55307 33 } else {
Anna Bridge 186:707f6e361f3e 34 MBED_ERROR1(MBED_MAKE_ERROR(MBED_MODULE_PLATFORM, MBED_ERROR_CODE_OPEN_FAILED), "Stream obj failure", _file);
AnnaBridge 167:e84263d55307 35 }
AnnaBridge 167:e84263d55307 36 }
AnnaBridge 167:e84263d55307 37
AnnaBridge 187:0387e8f68319 38 Stream::~Stream()
AnnaBridge 187:0387e8f68319 39 {
AnnaBridge 167:e84263d55307 40 // No lock can be used in destructor
AnnaBridge 167:e84263d55307 41 fclose(_file);
AnnaBridge 167:e84263d55307 42 }
AnnaBridge 167:e84263d55307 43
AnnaBridge 187:0387e8f68319 44 int Stream::putc(int c)
AnnaBridge 187:0387e8f68319 45 {
AnnaBridge 167:e84263d55307 46 lock();
AnnaBridge 189:f392fc9709a3 47 std::fseek(_file, 0, SEEK_CUR);
AnnaBridge 167:e84263d55307 48 int ret = std::fputc(c, _file);
AnnaBridge 167:e84263d55307 49 unlock();
AnnaBridge 167:e84263d55307 50 return ret;
AnnaBridge 167:e84263d55307 51 }
AnnaBridge 187:0387e8f68319 52 int Stream::puts(const char *s)
AnnaBridge 187:0387e8f68319 53 {
AnnaBridge 167:e84263d55307 54 lock();
AnnaBridge 189:f392fc9709a3 55 std::fseek(_file, 0, SEEK_CUR);
AnnaBridge 167:e84263d55307 56 int ret = std::fputs(s, _file);
AnnaBridge 167:e84263d55307 57 unlock();
AnnaBridge 167:e84263d55307 58 return ret;
AnnaBridge 167:e84263d55307 59 }
AnnaBridge 187:0387e8f68319 60 int Stream::getc()
AnnaBridge 187:0387e8f68319 61 {
AnnaBridge 167:e84263d55307 62 lock();
AnnaBridge 167:e84263d55307 63 fflush(_file);
AnnaBridge 189:f392fc9709a3 64 int ret = std::fgetc(_file);
AnnaBridge 167:e84263d55307 65 unlock();
AnnaBridge 167:e84263d55307 66 return ret;
AnnaBridge 167:e84263d55307 67 }
AnnaBridge 187:0387e8f68319 68 char *Stream::gets(char *s, int size)
AnnaBridge 187:0387e8f68319 69 {
AnnaBridge 167:e84263d55307 70 lock();
AnnaBridge 167:e84263d55307 71 fflush(_file);
AnnaBridge 189:f392fc9709a3 72 char *ret = std::fgets(s, size, _file);
AnnaBridge 167:e84263d55307 73 unlock();
AnnaBridge 167:e84263d55307 74 return ret;
AnnaBridge 167:e84263d55307 75 }
AnnaBridge 167:e84263d55307 76
AnnaBridge 187:0387e8f68319 77 int Stream::close()
AnnaBridge 187:0387e8f68319 78 {
AnnaBridge 167:e84263d55307 79 return 0;
AnnaBridge 167:e84263d55307 80 }
AnnaBridge 167:e84263d55307 81
AnnaBridge 187:0387e8f68319 82 ssize_t Stream::write(const void *buffer, size_t length)
AnnaBridge 187:0387e8f68319 83 {
AnnaBridge 187:0387e8f68319 84 const char *ptr = (const char *)buffer;
AnnaBridge 187:0387e8f68319 85 const char *end = ptr + length;
AnnaBridge 167:e84263d55307 86
AnnaBridge 167:e84263d55307 87 lock();
AnnaBridge 167:e84263d55307 88 while (ptr != end) {
AnnaBridge 167:e84263d55307 89 if (_putc(*ptr++) == EOF) {
AnnaBridge 167:e84263d55307 90 break;
AnnaBridge 167:e84263d55307 91 }
AnnaBridge 167:e84263d55307 92 }
AnnaBridge 167:e84263d55307 93 unlock();
AnnaBridge 167:e84263d55307 94
AnnaBridge 187:0387e8f68319 95 return ptr - (const char *)buffer;
AnnaBridge 167:e84263d55307 96 }
AnnaBridge 167:e84263d55307 97
AnnaBridge 187:0387e8f68319 98 ssize_t Stream::read(void *buffer, size_t length)
AnnaBridge 187:0387e8f68319 99 {
AnnaBridge 187:0387e8f68319 100 char *ptr = (char *)buffer;
AnnaBridge 187:0387e8f68319 101 char *end = ptr + length;
AnnaBridge 167:e84263d55307 102
AnnaBridge 167:e84263d55307 103 lock();
AnnaBridge 167:e84263d55307 104 while (ptr != end) {
AnnaBridge 167:e84263d55307 105 int c = _getc();
AnnaBridge 187:0387e8f68319 106 if (c == EOF) {
AnnaBridge 187:0387e8f68319 107 break;
AnnaBridge 187:0387e8f68319 108 }
AnnaBridge 167:e84263d55307 109 *ptr++ = c;
AnnaBridge 167:e84263d55307 110 }
AnnaBridge 167:e84263d55307 111 unlock();
AnnaBridge 167:e84263d55307 112
AnnaBridge 187:0387e8f68319 113 return ptr - (const char *)buffer;
AnnaBridge 167:e84263d55307 114 }
AnnaBridge 167:e84263d55307 115
AnnaBridge 187:0387e8f68319 116 off_t Stream::seek(off_t offset, int whence)
AnnaBridge 187:0387e8f68319 117 {
AnnaBridge 167:e84263d55307 118 return 0;
AnnaBridge 167:e84263d55307 119 }
AnnaBridge 167:e84263d55307 120
AnnaBridge 187:0387e8f68319 121 off_t Stream::tell()
AnnaBridge 187:0387e8f68319 122 {
AnnaBridge 167:e84263d55307 123 return 0;
AnnaBridge 167:e84263d55307 124 }
AnnaBridge 167:e84263d55307 125
AnnaBridge 187:0387e8f68319 126 void Stream::rewind()
AnnaBridge 187:0387e8f68319 127 {
AnnaBridge 167:e84263d55307 128 }
AnnaBridge 167:e84263d55307 129
AnnaBridge 187:0387e8f68319 130 int Stream::isatty()
AnnaBridge 187:0387e8f68319 131 {
AnnaBridge 167:e84263d55307 132 return 0;
AnnaBridge 167:e84263d55307 133 }
AnnaBridge 167:e84263d55307 134
AnnaBridge 187:0387e8f68319 135 int Stream::sync()
AnnaBridge 187:0387e8f68319 136 {
AnnaBridge 167:e84263d55307 137 return 0;
AnnaBridge 167:e84263d55307 138 }
AnnaBridge 167:e84263d55307 139
AnnaBridge 187:0387e8f68319 140 off_t Stream::size()
AnnaBridge 187:0387e8f68319 141 {
AnnaBridge 167:e84263d55307 142 return 0;
AnnaBridge 167:e84263d55307 143 }
AnnaBridge 167:e84263d55307 144
AnnaBridge 187:0387e8f68319 145 int Stream::printf(const char *format, ...)
AnnaBridge 187:0387e8f68319 146 {
AnnaBridge 167:e84263d55307 147 lock();
AnnaBridge 167:e84263d55307 148 std::va_list arg;
AnnaBridge 167:e84263d55307 149 va_start(arg, format);
AnnaBridge 189:f392fc9709a3 150 std::fseek(_file, 0, SEEK_CUR);
AnnaBridge 167:e84263d55307 151 int r = vfprintf(_file, format, arg);
AnnaBridge 167:e84263d55307 152 va_end(arg);
AnnaBridge 167:e84263d55307 153 unlock();
AnnaBridge 167:e84263d55307 154 return r;
AnnaBridge 167:e84263d55307 155 }
AnnaBridge 167:e84263d55307 156
AnnaBridge 187:0387e8f68319 157 int Stream::scanf(const char *format, ...)
AnnaBridge 187:0387e8f68319 158 {
AnnaBridge 167:e84263d55307 159 lock();
AnnaBridge 167:e84263d55307 160 std::va_list arg;
AnnaBridge 167:e84263d55307 161 va_start(arg, format);
AnnaBridge 167:e84263d55307 162 fflush(_file);
AnnaBridge 167:e84263d55307 163 int r = vfscanf(_file, format, arg);
AnnaBridge 167:e84263d55307 164 va_end(arg);
AnnaBridge 167:e84263d55307 165 unlock();
AnnaBridge 167:e84263d55307 166 return r;
AnnaBridge 167:e84263d55307 167 }
AnnaBridge 167:e84263d55307 168
AnnaBridge 187:0387e8f68319 169 int Stream::vprintf(const char *format, std::va_list args)
AnnaBridge 187:0387e8f68319 170 {
AnnaBridge 167:e84263d55307 171 lock();
AnnaBridge 189:f392fc9709a3 172 std::fseek(_file, 0, SEEK_CUR);
AnnaBridge 167:e84263d55307 173 int r = vfprintf(_file, format, args);
AnnaBridge 167:e84263d55307 174 unlock();
AnnaBridge 167:e84263d55307 175 return r;
AnnaBridge 167:e84263d55307 176 }
AnnaBridge 167:e84263d55307 177
AnnaBridge 187:0387e8f68319 178 int Stream::vscanf(const char *format, std::va_list args)
AnnaBridge 187:0387e8f68319 179 {
AnnaBridge 167:e84263d55307 180 lock();
AnnaBridge 167:e84263d55307 181 fflush(_file);
AnnaBridge 167:e84263d55307 182 int r = vfscanf(_file, format, args);
AnnaBridge 167:e84263d55307 183 unlock();
AnnaBridge 167:e84263d55307 184 return r;
AnnaBridge 167:e84263d55307 185 }
AnnaBridge 167:e84263d55307 186
AnnaBridge 167:e84263d55307 187 } // namespace mbed