📄 fgetc.c
字号:
/* Copyright (C) 2004 Manuel Novoa III <mjn3@codepoet.org> * * GNU Library General Public License (LGPL) version 2 or later. * * Dedicated to Toni. See uClibc/DEDICATION.mjn3 for details. */#include "_stdio.h"#undef fgetc#undef fgetc_unlocked#undef getc#undef getc_unlockedextern int __fgetc_unlocked(FILE *stream);#ifdef __DO_UNLOCKEDweak_alias(__fgetc_unlocked,fgetc_unlocked);weak_alias(__fgetc_unlocked,getc_unlocked);#ifndef __UCLIBC_HAS_THREADS__weak_alias(__fgetc_unlocked,fgetc);weak_alias(__fgetc_unlocked,getc);#endifint __fgetc_unlocked(FILE *stream){ __STDIO_STREAM_VALIDATE(stream); /* First the fast path. We're good to go if getc macro enabled. */ if (__STDIO_STREAM_CAN_USE_BUFFER_GET(stream)) { return __STDIO_STREAM_BUFFER_GET(stream); } /* Next quickest... reading and narrow oriented, but macro * disabled and/or buffer is exhausted. */ if (__STDIO_STREAM_IS_NARROW_READING(stream) || !__STDIO_STREAM_TRANS_TO_READ(stream, __FLAG_NARROW) ) { if (stream->__modeflags & __FLAG_UNGOT) { /* Use ungots first. */ unsigned char uc = stream->__ungot[(stream->__modeflags--) & 1]; stream->__ungot[1] = 0; __STDIO_STREAM_VALIDATE(stream); return uc; } if (__STDIO_STREAM_BUFFER_RAVAIL(stream)) { /* Have buffered? */ return __STDIO_STREAM_BUFFER_GET(stream); } /* Is this a fake stream for *sscanf? */ if (__STDIO_STREAM_IS_FAKE_VSSCANF(stream)) { __STDIO_STREAM_SET_EOF(stream); return EOF; } /* We need to read from the host environment, so we must * flush all line buffered streams if the stream is not * fully buffered. */ if (!__STDIO_STREAM_IS_FBF(stream)) { __STDIO_FLUSH_LBF_STREAMS; } if (__STDIO_STREAM_BUFFER_SIZE(stream)) { /* Do we have a buffer? */ __STDIO_STREAM_DISABLE_GETC(stream); if(__STDIO_FILL_READ_BUFFER(stream)) { /* Refill succeeded? */ __STDIO_STREAM_ENABLE_GETC(stream); /* FBF or LBF */ return __STDIO_STREAM_BUFFER_GET(stream); } } else { unsigned char uc; if (__stdio_READ(stream, &uc, 1)) { return uc; } } } return EOF;}#elif defined __UCLIBC_HAS_THREADS__weak_alias(fgetc,getc);int fgetc(register FILE *stream){ if (stream->__user_locking != 0) { return __GETC_UNLOCKED_MACRO(stream); } else { int retval; __STDIO_ALWAYS_THREADLOCK(stream); retval = __GETC_UNLOCKED_MACRO(stream); __STDIO_ALWAYS_THREADUNLOCK(stream); return retval; }}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -