177 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			177 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /******************************************************************************
 | |
|  * The MIT License
 | |
|  *
 | |
|  * Copyright (c) 2010 Perry Hung.
 | |
|  * Copyright (c) 2011, 2012 LeafLabs, LLC.
 | |
|  *
 | |
|  * Permission is hereby granted, free of charge, to any person
 | |
|  * obtaining a copy of this software and associated documentation
 | |
|  * files (the "Software"), to deal in the Software without
 | |
|  * restriction, including without limitation the rights to use, copy,
 | |
|  * modify, merge, publish, distribute, sublicense, and/or sell copies
 | |
|  * of the Software, and to permit persons to whom the Software is
 | |
|  * furnished to do so, subject to the following conditions:
 | |
|  *
 | |
|  * The above copyright notice and this permission notice shall be
 | |
|  * included in all copies or substantial portions of the Software.
 | |
|  *
 | |
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 | |
|  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 | |
|  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 | |
|  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
 | |
|  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 | |
|  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | |
|  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | |
|  * SOFTWARE.
 | |
|  *****************************************************************************/
 | |
| 
 | |
| /**
 | |
|  * @file wirish/syscalls.c
 | |
|  * @brief newlib stubs
 | |
|  *
 | |
|  * Low level system routines used by newlib for basic I/O and memory
 | |
|  * allocation. You can override most of these.
 | |
|  */
 | |
| 
 | |
| #include <libmaple/libmaple.h>
 | |
| 
 | |
| #include <sys/stat.h>
 | |
| #include <errno.h>
 | |
| #include <stddef.h>
 | |
| 
 | |
| /* If CONFIG_HEAP_START (or CONFIG_HEAP_END) isn't defined, then
 | |
|  * assume _lm_heap_start (resp. _lm_heap_end) is appropriately set by
 | |
|  * the linker */
 | |
| #ifndef CONFIG_HEAP_START
 | |
| extern char _lm_heap_start;
 | |
| #define CONFIG_HEAP_START               ((void *)&_lm_heap_start)
 | |
| #endif
 | |
| #ifndef CONFIG_HEAP_END
 | |
| extern char _lm_heap_end;
 | |
| #define CONFIG_HEAP_END                 ((void *)&_lm_heap_end)
 | |
| #endif
 | |
| 
 | |
| /*
 | |
|  * _sbrk -- Increment the program break.
 | |
|  *
 | |
|  * Get incr bytes more RAM (for use by the heap).  malloc() and
 | |
|  * friends call this function behind the scenes.
 | |
|  */
 | |
| void *_sbrk(int incr) {
 | |
|     static void * pbreak = NULL; /* current program break */
 | |
|     void * ret;
 | |
| 
 | |
|     if (pbreak == NULL) {
 | |
|         pbreak = CONFIG_HEAP_START;
 | |
|     }
 | |
| 
 | |
|     if ((CONFIG_HEAP_END - pbreak < incr) ||
 | |
|         (pbreak - CONFIG_HEAP_START < -incr)) {
 | |
|         errno = ENOMEM;
 | |
|         return (void *)-1;
 | |
|     }
 | |
| 
 | |
|     ret = pbreak;
 | |
|     pbreak += incr;
 | |
|     return ret;
 | |
| }
 | |
| 
 | |
| __weak int _open(const char *path, int flags, ...) {
 | |
|     return 1;
 | |
| }
 | |
| 
 | |
| __weak int _close(int fd) {
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| __weak int _fstat(int fd, struct stat *st) {
 | |
|     st->st_mode = S_IFCHR;
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| __weak int _isatty(int fd) {
 | |
|     return 1;
 | |
| }
 | |
| 
 | |
| __weak int isatty(int fd) {
 | |
|     return 1;
 | |
| }
 | |
| 
 | |
| __weak int _lseek(int fd, off_t pos, int whence) {
 | |
|     return -1;
 | |
| }
 | |
| 
 | |
| __weak unsigned char getch(void) {
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| 
 | |
| __weak int _read(int fd, char *buf, size_t cnt) {
 | |
|     *buf = getch();
 | |
| 
 | |
|     return 1;
 | |
| }
 | |
| 
 | |
| __weak void putch(unsigned char c) {
 | |
| }
 | |
| 
 | |
| __weak void cgets(char *s, int bufsize) {
 | |
|     char *p;
 | |
|     int c;
 | |
|     int i;
 | |
| 
 | |
|     for (i = 0; i < bufsize; i++) {
 | |
|         *(s+i) = 0;
 | |
|     }
 | |
| //    memset(s, 0, bufsize);
 | |
| 
 | |
|     p = s;
 | |
| 
 | |
|     for (p = s; p < s + bufsize-1;) {
 | |
|         c = getch();
 | |
|         switch (c) {
 | |
|         case '\r' :
 | |
|         case '\n' :
 | |
|             putch('\r');
 | |
|             putch('\n');
 | |
|             *p = '\n';
 | |
|             return;
 | |
| 
 | |
|         case '\b' :
 | |
|             if (p > s) {
 | |
|                 *p-- = 0;
 | |
|                 putch('\b');
 | |
|                 putch(' ');
 | |
|                 putch('\b');
 | |
|             }
 | |
|             break;
 | |
| 
 | |
|         default :
 | |
|             putch(c);
 | |
|             *p++ = c;
 | |
|             break;
 | |
|         }
 | |
|     }
 | |
|     return;
 | |
| }
 | |
| 
 | |
| __weak int _write(int fd, const char *buf, size_t cnt) {
 | |
|     int i;
 | |
| 
 | |
|     for (i = 0; i < cnt; i++)
 | |
|         putch(buf[i]);
 | |
| 
 | |
|     return cnt;
 | |
| }
 | |
| 
 | |
| /* Override fgets() in newlib with a version that does line editing */
 | |
| __weak char *fgets(char *s, int bufsize, void *f) {
 | |
|     cgets(s, bufsize);
 | |
|     return s;
 | |
| }
 | |
| 
 | |
| __weak void _exit(int exitcode) {
 | |
|     while (1)
 | |
|         ;
 | |
| }
 |