stdio_.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #ifndef AFUN_STDIO_H
  2. #define AFUN_STDIO_H
  3. #include <cstdio>
  4. #include "macro.h"
  5. #include "aFunToolExport.h"
  6. namespace aFuntool {
  7. AFUN_TOOL_EXPORT int fgets_stdin(char **dest, int len);
  8. AFUN_TOOL_EXPORT bool checkStdin();
  9. AFUN_TOOL_EXPORT bool fclear_stdin();
  10. static bool clear_ferror(FILE *file) {return ferror(file) && (clearerr(file), ferror(file));}
  11. static bool clear_stdin() {
  12. return (ferror(stdin) || feof(stdin)) &&
  13. (clearerr(stdin), (ferror(stdin) || feof(stdin)));
  14. }
  15. }
  16. #ifdef aFunWIN32_NO_CYGWIN
  17. #ifdef _MSC_VER
  18. #pragma warning(disable : 5105) // 关闭 5105 的警告输出 (Windows.h中使用)
  19. #endif
  20. #include <conio.h>
  21. #include <io.h>
  22. #include <Windows.h>
  23. namespace aFuntool {
  24. AFUN_TOOL_EXPORT void stdio_signal_init(bool signal);
  25. AFUN_TOOL_EXPORT bool stdio_check_signal();
  26. AFUN_TOOL_EXPORT int convertMultiByte(char **dest, const char *str, UINT from, UINT to); // win32 特有函数
  27. AFUN_TOOL_EXPORT int convertWideByte(wchar_t **dest, const char *str, UINT from); // win32 特有函数
  28. AFUN_TOOL_EXPORT int convertFromWideByte(char **dest, const wchar_t *str, UINT to);
  29. AFUN_TOOL_EXPORT int fgetc_stdin();
  30. AFUN_TOOL_EXPORT char *fgets_stdin_(char *buf, size_t len);
  31. AFUN_TOOL_EXPORT int fungetc_stdin(int ch);
  32. AFUN_TOOL_EXPORT int fputs_std_(const char *str, FILE *std);
  33. static int fputs_stdout(const char *str) {return fputs_std_(str, stdout);}
  34. static int fputs_stderr(const char *str) {return fputs_std_(str, stderr);}
  35. AFUN_TOOL_EXPORT size_t vprintf_std_(FILE *std, size_t buf_len, const char *format, va_list ap);
  36. static size_t vprintf_stderr(size_t buf_len, const char *format, va_list ap) {
  37. return vprintf_std_(stderr, buf_len, format, ap);
  38. }
  39. static size_t vprintf_stdout(size_t buf_len, const char *format, va_list ap) {
  40. return vprintf_std_(stdout, buf_len, format, ap);
  41. }
  42. static size_t printf_stdout(size_t buf_len, const char *format, ...) {
  43. va_list ap;
  44. va_start(ap, format);
  45. size_t re = vprintf_std_(stdout, buf_len, format, ap);
  46. va_end(ap);
  47. return re;
  48. }
  49. static size_t printf_stderr(size_t buf_len, const char *format, ...) {
  50. va_list ap;
  51. va_start(ap, format);
  52. size_t re = vprintf_std_(stderr, buf_len, format, ap);
  53. va_end(ap);
  54. return re;
  55. }
  56. }
  57. #else
  58. namespace aFuntool {
  59. static int fgetc_stdin(){ return fgetc(stdout); }
  60. static int fgets_stdin_(char *buf, int len, FILE *file){ return fgets(buf, len, file) != nullptr; }
  61. static int fungetc_stdin(char ch){ return ungetc(ch, stdin); }
  62. static int fputs_stdout(const char *str){ return fputs(str, stdout); }
  63. static int fputs_stderr(const char *str){ return fputs(str, stderr); }
  64. static int vprintf_stdout(size_t, const char *format, va_list ap){ return vfprintf(stdout, format, ap); }
  65. static int vprintf_stderr(size_t, const char *format, va_list ap){ return vfprintf(stderr, format, ap); }
  66. static size_t printf_stdout(size_t, const char *format, ...) {
  67. va_list ap;
  68. va_start(ap, format);
  69. size_t re = vfprintf(stdout, format, ap);
  70. va_end(ap);
  71. return re;
  72. }
  73. static size_t printf_stderr(size_t, const char *format, ...) {
  74. va_list ap;
  75. va_start(ap, format);
  76. size_t re = vfprintf(stderr, format, ap);
  77. va_end(ap);
  78. return re;
  79. }
  80. }
  81. #endif
  82. #endif //AFUN_STDIO_H