TUKS MCU Introductory course / TUKS-COURSE-TIMER
Committer:
elmot
Date:
Fri Feb 24 21:13:56 2017 +0000
Revision:
1:d0dfbce63a89
Ready-to-copy

Who changed what in which revision?

UserRevisionLine numberNew contents of line
elmot 1:d0dfbce63a89 1 /* mbed Microcontroller Library
elmot 1:d0dfbce63a89 2 * Copyright (c) 2006-2013 ARM Limited
elmot 1:d0dfbce63a89 3 *
elmot 1:d0dfbce63a89 4 * Licensed under the Apache License, Version 2.0 (the "License");
elmot 1:d0dfbce63a89 5 * you may not use this file except in compliance with the License.
elmot 1:d0dfbce63a89 6 * You may obtain a copy of the License at
elmot 1:d0dfbce63a89 7 *
elmot 1:d0dfbce63a89 8 * http://www.apache.org/licenses/LICENSE-2.0
elmot 1:d0dfbce63a89 9 *
elmot 1:d0dfbce63a89 10 * Unless required by applicable law or agreed to in writing, software
elmot 1:d0dfbce63a89 11 * distributed under the License is distributed on an "AS IS" BASIS,
elmot 1:d0dfbce63a89 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
elmot 1:d0dfbce63a89 13 * See the License for the specific language governing permissions and
elmot 1:d0dfbce63a89 14 * limitations under the License.
elmot 1:d0dfbce63a89 15 */
elmot 1:d0dfbce63a89 16 #include "drivers/Stream.h"
elmot 1:d0dfbce63a89 17
elmot 1:d0dfbce63a89 18 namespace mbed {
elmot 1:d0dfbce63a89 19
elmot 1:d0dfbce63a89 20 Stream::Stream(const char *name) : FileLike(name), _file(NULL) {
elmot 1:d0dfbce63a89 21 // No lock needed in constructor
elmot 1:d0dfbce63a89 22 /* open ourselves */
elmot 1:d0dfbce63a89 23 char buf[12]; /* :0x12345678 + null byte */
elmot 1:d0dfbce63a89 24 std::sprintf(buf, ":%p", this);
elmot 1:d0dfbce63a89 25 _file = std::fopen(buf, "w+");
elmot 1:d0dfbce63a89 26 mbed_set_unbuffered_stream(_file);
elmot 1:d0dfbce63a89 27 }
elmot 1:d0dfbce63a89 28
elmot 1:d0dfbce63a89 29 Stream::~Stream() {
elmot 1:d0dfbce63a89 30 // No lock can be used in destructor
elmot 1:d0dfbce63a89 31 fclose(_file);
elmot 1:d0dfbce63a89 32 }
elmot 1:d0dfbce63a89 33
elmot 1:d0dfbce63a89 34 int Stream::putc(int c) {
elmot 1:d0dfbce63a89 35 lock();
elmot 1:d0dfbce63a89 36 fflush(_file);
elmot 1:d0dfbce63a89 37 int ret = std::fputc(c, _file);
elmot 1:d0dfbce63a89 38 unlock();
elmot 1:d0dfbce63a89 39 return ret;
elmot 1:d0dfbce63a89 40 }
elmot 1:d0dfbce63a89 41 int Stream::puts(const char *s) {
elmot 1:d0dfbce63a89 42 lock();
elmot 1:d0dfbce63a89 43 fflush(_file);
elmot 1:d0dfbce63a89 44 int ret = std::fputs(s, _file);
elmot 1:d0dfbce63a89 45 unlock();
elmot 1:d0dfbce63a89 46 return ret;
elmot 1:d0dfbce63a89 47 }
elmot 1:d0dfbce63a89 48 int Stream::getc() {
elmot 1:d0dfbce63a89 49 lock();
elmot 1:d0dfbce63a89 50 fflush(_file);
elmot 1:d0dfbce63a89 51 int ret = mbed_getc(_file);
elmot 1:d0dfbce63a89 52 unlock();
elmot 1:d0dfbce63a89 53 return ret;
elmot 1:d0dfbce63a89 54 }
elmot 1:d0dfbce63a89 55 char* Stream::gets(char *s, int size) {
elmot 1:d0dfbce63a89 56 lock();
elmot 1:d0dfbce63a89 57 fflush(_file);
elmot 1:d0dfbce63a89 58 char *ret = mbed_gets(s,size,_file);
elmot 1:d0dfbce63a89 59 unlock();
elmot 1:d0dfbce63a89 60 return ret;
elmot 1:d0dfbce63a89 61 }
elmot 1:d0dfbce63a89 62
elmot 1:d0dfbce63a89 63 int Stream::close() {
elmot 1:d0dfbce63a89 64 return 0;
elmot 1:d0dfbce63a89 65 }
elmot 1:d0dfbce63a89 66
elmot 1:d0dfbce63a89 67 ssize_t Stream::write(const void* buffer, size_t length) {
elmot 1:d0dfbce63a89 68 const char* ptr = (const char*)buffer;
elmot 1:d0dfbce63a89 69 const char* end = ptr + length;
elmot 1:d0dfbce63a89 70
elmot 1:d0dfbce63a89 71 lock();
elmot 1:d0dfbce63a89 72 while (ptr != end) {
elmot 1:d0dfbce63a89 73 if (_putc(*ptr++) == EOF) {
elmot 1:d0dfbce63a89 74 break;
elmot 1:d0dfbce63a89 75 }
elmot 1:d0dfbce63a89 76 }
elmot 1:d0dfbce63a89 77 unlock();
elmot 1:d0dfbce63a89 78
elmot 1:d0dfbce63a89 79 return ptr - (const char*)buffer;
elmot 1:d0dfbce63a89 80 }
elmot 1:d0dfbce63a89 81
elmot 1:d0dfbce63a89 82 ssize_t Stream::read(void* buffer, size_t length) {
elmot 1:d0dfbce63a89 83 char* ptr = (char*)buffer;
elmot 1:d0dfbce63a89 84 char* end = ptr + length;
elmot 1:d0dfbce63a89 85
elmot 1:d0dfbce63a89 86 lock();
elmot 1:d0dfbce63a89 87 while (ptr != end) {
elmot 1:d0dfbce63a89 88 int c = _getc();
elmot 1:d0dfbce63a89 89 if (c==EOF) break;
elmot 1:d0dfbce63a89 90 *ptr++ = c;
elmot 1:d0dfbce63a89 91 }
elmot 1:d0dfbce63a89 92 unlock();
elmot 1:d0dfbce63a89 93
elmot 1:d0dfbce63a89 94 return ptr - (const char*)buffer;
elmot 1:d0dfbce63a89 95 }
elmot 1:d0dfbce63a89 96
elmot 1:d0dfbce63a89 97 off_t Stream::lseek(off_t offset, int whence) {
elmot 1:d0dfbce63a89 98 return 0;
elmot 1:d0dfbce63a89 99 }
elmot 1:d0dfbce63a89 100
elmot 1:d0dfbce63a89 101 int Stream::isatty() {
elmot 1:d0dfbce63a89 102 return 0;
elmot 1:d0dfbce63a89 103 }
elmot 1:d0dfbce63a89 104
elmot 1:d0dfbce63a89 105 int Stream::fsync() {
elmot 1:d0dfbce63a89 106 return 0;
elmot 1:d0dfbce63a89 107 }
elmot 1:d0dfbce63a89 108
elmot 1:d0dfbce63a89 109 off_t Stream::flen() {
elmot 1:d0dfbce63a89 110 return 0;
elmot 1:d0dfbce63a89 111 }
elmot 1:d0dfbce63a89 112
elmot 1:d0dfbce63a89 113 int Stream::printf(const char* format, ...) {
elmot 1:d0dfbce63a89 114 lock();
elmot 1:d0dfbce63a89 115 std::va_list arg;
elmot 1:d0dfbce63a89 116 va_start(arg, format);
elmot 1:d0dfbce63a89 117 fflush(_file);
elmot 1:d0dfbce63a89 118 int r = vfprintf(_file, format, arg);
elmot 1:d0dfbce63a89 119 va_end(arg);
elmot 1:d0dfbce63a89 120 unlock();
elmot 1:d0dfbce63a89 121 return r;
elmot 1:d0dfbce63a89 122 }
elmot 1:d0dfbce63a89 123
elmot 1:d0dfbce63a89 124 int Stream::scanf(const char* format, ...) {
elmot 1:d0dfbce63a89 125 lock();
elmot 1:d0dfbce63a89 126 std::va_list arg;
elmot 1:d0dfbce63a89 127 va_start(arg, format);
elmot 1:d0dfbce63a89 128 fflush(_file);
elmot 1:d0dfbce63a89 129 int r = vfscanf(_file, format, arg);
elmot 1:d0dfbce63a89 130 va_end(arg);
elmot 1:d0dfbce63a89 131 unlock();
elmot 1:d0dfbce63a89 132 return r;
elmot 1:d0dfbce63a89 133 }
elmot 1:d0dfbce63a89 134
elmot 1:d0dfbce63a89 135 int Stream::vprintf(const char* format, std::va_list args) {
elmot 1:d0dfbce63a89 136 lock();
elmot 1:d0dfbce63a89 137 fflush(_file);
elmot 1:d0dfbce63a89 138 int r = vfprintf(_file, format, args);
elmot 1:d0dfbce63a89 139 unlock();
elmot 1:d0dfbce63a89 140 return r;
elmot 1:d0dfbce63a89 141 }
elmot 1:d0dfbce63a89 142
elmot 1:d0dfbce63a89 143 int Stream::vscanf(const char* format, std::va_list args) {
elmot 1:d0dfbce63a89 144 lock();
elmot 1:d0dfbce63a89 145 fflush(_file);
elmot 1:d0dfbce63a89 146 int r = vfscanf(_file, format, args);
elmot 1:d0dfbce63a89 147 unlock();
elmot 1:d0dfbce63a89 148 return r;
elmot 1:d0dfbce63a89 149 }
elmot 1:d0dfbce63a89 150
elmot 1:d0dfbce63a89 151 } // namespace mbed