1 /* 2 * Copyright 2003-2006, Axel Dörfler, axeld@pinc-software.de. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 7 #include <boot/vfs.h> 8 #include <boot/stdio.h> 9 #include <util/kernel_cpp.h> 10 11 #include <errno.h> 12 #include <stdarg.h> 13 #include <string.h> 14 15 #include <algorithm> 16 17 18 //#undef stdout 19 //#undef stdin 20 //extern FILE *stdout; 21 //extern FILE *stdin; 22 23 24 #undef errno 25 int errno; 26 27 28 int* 29 _errnop(void) 30 { 31 return &errno; 32 } 33 34 35 int 36 vfprintf(FILE *file, const char *format, va_list list) 37 { 38 ConsoleNode *node = (ConsoleNode *)file; 39 char buffer[512]; 40 // the buffer handling could (or should) be done better... 41 42 int length = vsnprintf(buffer, sizeof(buffer), format, list); 43 length = std::min(length, (int)sizeof(buffer) - 1); 44 if (length > 0) 45 node->Write(buffer, length); 46 47 return length; 48 } 49 50 51 int 52 vprintf(const char *format, va_list args) 53 { 54 return vfprintf(stdout, format, args); 55 } 56 57 58 int 59 printf(const char *format, ...) 60 { 61 va_list args; 62 63 va_start(args, format); 64 int status = vfprintf(stdout, format, args); 65 va_end(args); 66 67 return status; 68 } 69 70 71 int 72 fprintf(FILE *file, const char *format, ...) 73 { 74 va_list args; 75 76 va_start(args, format); 77 int status = vfprintf(file, format, args); 78 va_end(args); 79 80 return status; 81 } 82 83 84 int 85 fputc(int c, FILE *file) 86 { 87 if (file == NULL) 88 return B_FILE_ERROR; 89 90 status_t status; 91 char character = (char)c; 92 93 // we only support direct console output right now... 94 status = ((ConsoleNode *)file)->Write(&character, 1); 95 96 if (status > 0) 97 return character; 98 99 return status; 100 } 101 102 103 int 104 fputs(const char *string, FILE *file) 105 { 106 if (file == NULL) 107 return B_FILE_ERROR; 108 109 status_t status = ((ConsoleNode *)file)->Write(string, strlen(string)); 110 fputc('\n', file); 111 112 return status; 113 } 114 115 116 int 117 putc(int character) 118 { 119 return fputc(character, stdout); 120 } 121 122 123 int 124 putchar(int character) 125 { 126 return fputc(character, stdout); 127 } 128 129 130 int 131 puts(const char *string) 132 { 133 return fputs(string, stdout); 134 } 135 136