X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Flibc.so_src%2Fstdio.c;h=39d37a4b0e17e358ce8ae6d79fe373df8f99ba84;hb=0ab008276f88801b5a5a2ed8e96c285e524ead2c;hp=1dde9ade69c55a9e17622d469b98dab3c9961144;hpb=52fad670ab81459de0ff1bd0fa99a3396a6999e3;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libc.so_src/stdio.c b/Usermode/Libraries/libc.so_src/stdio.c index 1dde9ade..39d37a4b 100644 --- a/Usermode/Libraries/libc.so_src/stdio.c +++ b/Usermode/Libraries/libc.so_src/stdio.c @@ -300,7 +300,7 @@ EXPORT int fprintf(FILE *fp, const char *format, ...) * \fn EXPORT size_t fwrite(void *ptr, size_t size, size_t num, FILE *fp) * \brief Write to a stream */ -EXPORT size_t fwrite(void *ptr, size_t size, size_t num, FILE *fp) +EXPORT size_t fwrite(const void *ptr, size_t size, size_t num, FILE *fp) { size_t ret; @@ -348,12 +348,45 @@ EXPORT size_t fread(void *ptr, size_t size, size_t num, FILE *fp) } else { ret = _SysRead(fp->FD, ptr, size*num); + if( ret == (size_t)-1) + return -1; + if( ret == 0 && size*num > 0 ) { + fp->Flags |= FILE_FLAG_EOF; + return 0; + } ret /= size; } return ret; } +/** + * \brief Write a string to a stream (without trailing \n) + */ +EXPORT int fputs(const char *s, FILE *fp) +{ + int len = strlen(s); + return fwrite(s, 1, len, fp); +} + +/** + * \brief Read a line (and possible trailing \n into a buffer) + */ +EXPORT char *fgets(char *s, int size, FILE *fp) +{ + int ofs = 0; + char ch = '\0'; + while( ofs < size && ch != '\n' ) + { + if( fread(&ch, 1, 1, fp) != 1 ) + break; + s[ofs ++] = ch; + } + if( ofs < size ) + s[ofs] = '\0'; + return s; +} + /** * \fn EXPORT int fputc(int c, FILE *fp) * \brief Write a single character to the stream @@ -376,7 +409,7 @@ EXPORT int putchar(int c) EXPORT int fgetc(FILE *fp) { char ret = 0; - if( fread(&ret, 1, 1, fp) == (size_t)-1 ) + if( fread(&ret, 1, 1, fp) != 1 ) return -1; return ret; } @@ -425,7 +458,7 @@ EXPORT int vsprintf(char * __s, const char *__format, va_list __args) return vsnprintf(__s, 0x7FFFFFFF, __format, __args); } -//sprintfv + /** * \fn EXPORT void vsnprintf(char *buf, const char *format, va_list args) * \brief Prints a formatted string to a buffer @@ -443,11 +476,11 @@ EXPORT int vsnprintf(char *buf, size_t __maxlen, const char *format, va_list arg uint64_t arg; int bLongLong, bPadLeft; - void _addchar(char ch) - { - if(buf && pos < __maxlen) buf[pos] = ch; - pos ++; - } + #define _addchar(ch) do { \ + if(buf && pos < __maxlen) buf[pos] = (ch); \ + else (void)(ch); \ + pos ++; \ + } while(0) tmp[32] = '\0'; @@ -610,6 +643,7 @@ EXPORT int vsnprintf(char *buf, size_t __maxlen, const char *format, va_list arg } _addchar('\0'); pos --; + #undef _addchar //_SysDebug("vsnprintf: buf = '%s'", buf); @@ -681,7 +715,7 @@ EXPORT int printf(const char *format, ...) va_end(args); // Send to stdout - _SysWrite(_stdout, buf, size+1); + _SysWrite(_stdout, buf, size); // Free buffer free(buf);